X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=steam.h;h=a92c3252e66b1b503b993ecaf1afd32db88798aa;hb=47941822dae18a018c985847b052e70214a3ccc6;hp=0be3ff64045ee3efadd110eb7b6ac8549c325d52;hpb=19213f3309ec3c45e5b23ac2f0d91f26f3a8984f;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/steam.h b/steam.h index 0be3ff6..a92c325 100644 --- a/steam.h +++ b/steam.h @@ -12,6 +12,7 @@ #include "vg/vg_steam_auth.h" #include "vg/vg_steam_http.h" #include "vg/vg_steam_friends.h" +#include "vg/vg_steam_user_stats.h" /* * We only want to use steamworks if building for the networked version, @@ -24,9 +25,9 @@ * nothing. */ -static char steam_username_at_startup[128]; +VG_STATIC char steam_username_at_startup[128]; -static void recv_steam_warning( int severity, const char *msg ) +VG_STATIC void recv_steam_warning( int severity, const char *msg ) { if( severity == 0 ) vg_low( "%s\n", msg ); @@ -34,13 +35,149 @@ static void recv_steam_warning( int severity, const char *msg ) vg_info( "%s\n", msg ); } -static int steam_ready = 0; -static void *hSteamNetworkingSockets, +VG_STATIC int steam_ready = 0, + steam_stats_ready = 0; + +VG_STATIC void *hSteamNetworkingSockets, *hSteamUser; -static HSteamPipe hSteamClientPipe; +VG_STATIC ISteamUserStats *hSteamUserStats; +VG_STATIC HSteamPipe hSteamClientPipe; + +VG_STATIC const char *steam_achievement_names[] = +{ + "ALBERT", "MARC", + "ROUTE_MPY", "ROUTE_MPG", "ROUTE_MPB", "ROUTE_MPR", + "ROUTE_TO", "ROUTE_TC" +}; + +VG_STATIC void steam_store_achievements(void) +{ + if( steam_ready && steam_stats_ready ) + { + SteamAPI_ISteamUserStats_StoreStats( hSteamUserStats ); + } +} + +VG_STATIC void steam_set_achievement( const char *name ) +{ + if( steam_ready && steam_stats_ready ) + { + if( SteamAPI_ISteamUserStats_SetAchievement( hSteamUserStats, name ) ) + { + vg_success( "Achievement set! '%s'\n", name ); + } + else + { + vg_warn( "Failed to set achievement: %s\n", name ); + } + } + else + { + vg_warn( "Failed to set achievement (steam not ready): %s\n", name ); + } +} + +VG_STATIC void steam_clear_achievement( const char *name ) +{ + if( steam_ready && steam_stats_ready ) + { + if( SteamAPI_ISteamUserStats_ClearAchievement( hSteamUserStats, name ) ) + { + vg_info( "Achievement cleared: '%s'\n", name ); + } + else + { + vg_warn( "Failed to clear achievement: %s\n", name ); + } + } + else + { + vg_warn( "Failed to clear achievement (steam not ready): %s\n", name ); + } +} + + +VG_STATIC int steam_list_achievements( int argc, char const *argv[] ) +{ + vg_info( "Achievements: \n" ); + + if( steam_ready && steam_stats_ready ) + { + for( int i=0; im_pubParam; + + if( rec->m_eResult == k_EResultOK ) + { + vg_info( "Recieved stats for: %lu (user: %lu)\n", rec->m_nGameID, + rec->m_steamIDUser ); + steam_stats_ready = 1; + } + else + { + vg_error( "Error recieveing stats for user (%u)\n", rec->m_eResult ); + } +} + +VG_STATIC int steam_init(void) { const char *username = NULL; @@ -71,6 +208,38 @@ static int steam_init(void) ISteamFriends *hSteamFriends = SteamAPI_SteamFriends(); username = SteamAPI_ISteamFriends_GetPersonaName( hSteamFriends ); + + /* + * Request stats + * -------------------------------------------------------- + */ + hSteamUserStats = SteamAPI_SteamUserStats(); + + steam_register_callback( k_iUserStatsReceived, + steam_on_recieve_current_stats ); + + if( !SteamAPI_ISteamUserStats_RequestCurrentStats( hSteamUserStats ) ) + vg_warn( "No Steam Logon: Cannot request stats\n" ); + + + vg_function_push( (struct vg_cmd) + { + .name = "ach_list", + .function = steam_list_achievements + }); + + vg_function_push( (struct vg_cmd) + { + .name = "ach_clear_all", + .function = steam_clear_all_achievements + }); + + vg_function_push( (struct vg_cmd) + { + .name = "ach_set", + .function = steam_set_achievemnt_test + }); + #endif /* TODO: On username update callback */ @@ -80,13 +249,13 @@ static int steam_init(void) return 1; } -static void steam_update(void) +VG_STATIC void steam_update(void) { if( steam_ready ) steamworks_event_loop( hSteamClientPipe ); } -static void steam_end(void *nothing) +VG_STATIC void steam_end(void *nothing) { if( steam_ready ) {