2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
3 * All trademarks are property of their respective owners
9 #include "vg/vg_steam.h"
10 #include "vg/vg_steam_utils.h"
11 #include "vg/vg_steam_networking.h"
12 #include "vg/vg_steam_auth.h"
13 #include "vg/vg_steam_http.h"
14 #include "vg/vg_steam_friends.h"
15 #include "vg/vg_steam_user_stats.h"
18 * We only want to use steamworks if building for the networked version,
19 * theres not much point otherwise. We mainly want steamworks for setting
20 * achievements etc.. so that includes our own server too.
22 * This file also wraps the functions and interfaces that we want to use to
23 * make them a bit easier to read, since they are the flat API they have very
24 * long names. in non-networked builds they will return default errors or do
28 VG_STATIC
char steam_username_at_startup
[128];
30 VG_STATIC
void recv_steam_warning( int severity
, const char *msg
)
33 vg_low( "%s\n", msg
);
35 vg_info( "%s\n", msg
);
38 VG_STATIC
int steam_ready
= 0,
39 steam_stats_ready
= 0;
41 VG_STATIC
void *hSteamNetworkingSockets
,
44 VG_STATIC ISteamUserStats
*hSteamUserStats
;
45 VG_STATIC HSteamPipe hSteamClientPipe
;
47 VG_STATIC
const char *steam_achievement_names
[] =
50 "ROUTE_MPY", "ROUTE_MPG", "ROUTE_MPB", "ROUTE_MPR",
51 "ROUTE_TO", "ROUTE_TC"
54 VG_STATIC
void steam_store_achievements(void)
56 if( steam_ready
&& steam_stats_ready
)
58 SteamAPI_ISteamUserStats_StoreStats( hSteamUserStats
);
62 VG_STATIC
void steam_set_achievement( const char *name
)
64 if( steam_ready
&& steam_stats_ready
)
66 if( SteamAPI_ISteamUserStats_SetAchievement( hSteamUserStats
, name
) )
68 vg_success( "Achievement set! '%s'\n", name
);
72 vg_warn( "Failed to set achievement: %s\n", name
);
77 vg_warn( "Failed to set achievement (steam not ready): %s\n", name
);
81 VG_STATIC
void steam_clear_achievement( const char *name
)
83 if( steam_ready
&& steam_stats_ready
)
85 if( SteamAPI_ISteamUserStats_ClearAchievement( hSteamUserStats
, name
) )
87 vg_info( "Achievement cleared: '%s'\n", name
);
91 vg_warn( "Failed to clear achievement: %s\n", name
);
96 vg_warn( "Failed to clear achievement (steam not ready): %s\n", name
);
101 VG_STATIC
int steam_list_achievements( int argc
, char const *argv
[] )
103 vg_info( "Achievements: \n" );
105 if( steam_ready
&& steam_stats_ready
)
107 for( int i
=0; i
<vg_list_size(steam_achievement_names
); i
++ )
110 const char *name
= steam_achievement_names
[i
];
112 if( SteamAPI_ISteamUserStats_GetAchievement(
113 hSteamUserStats
, name
, &set
) )
115 vg_info( " %s %s\n", (set
? "[YES]": "[ ]"), name
);
119 vg_warn( " Error while fetching achievement status '%s'\n", name
);
125 vg_warn( " Steam is not initialized, no results\n" );
131 VG_STATIC
int steam_clear_all_achievements( int argc
, char const *argv
[] )
133 if( steam_ready
&& steam_stats_ready
)
135 for( int i
=0; i
<vg_list_size(steam_achievement_names
); i
++ )
137 steam_clear_achievement( steam_achievement_names
[i
] );
140 steam_store_achievements();
144 vg_warn( "steam is not initialized, cannot clear\n" );
150 VG_STATIC
int steam_set_achievemnt_test( int argc
, char const *argv
[] )
155 if( strcmp( argv
[0], "monkey_island" ) )
158 steam_set_achievement( argv
[1] );
159 steam_store_achievements();
164 VG_STATIC
void steam_on_recieve_current_stats( CallbackMsg_t
*msg
)
166 UserStatsReceived_t
*rec
= (UserStatsReceived_t
*)msg
->m_pubParam
;
168 if( rec
->m_eResult
== k_EResultOK
)
170 vg_info( "Recieved stats for: %lu (user: %lu)\n", rec
->m_nGameID
,
171 rec
->m_steamIDUser
);
172 steam_stats_ready
= 1;
176 vg_error( "Error recieveing stats for user (%u)\n", rec
->m_eResult
);
180 VG_STATIC
int steam_init(void)
182 const char *username
= NULL
;
185 vg_info( "Initializing steamworks\n" );
187 if( !SteamAPI_Init() )
190 vg_error( "Steamworks failed to initialize\n" );
196 SteamAPI_ManualDispatch_Init();
198 /* Connect interfaces */
199 hSteamClientPipe
= SteamAPI_GetHSteamPipe();
200 hSteamNetworkingSockets
= SteamAPI_SteamNetworkingSockets_SteamAPI();
201 hSteamUser
= SteamAPI_SteamUser();
203 ISteamUtils
*utils
= SteamAPI_SteamUtils();
204 SteamAPI_ISteamUtils_SetWarningMessageHook( utils
, recv_steam_warning
);
207 vg_success( "\nSteamworks API running\n" );
209 ISteamFriends
*hSteamFriends
= SteamAPI_SteamFriends();
210 username
= SteamAPI_ISteamFriends_GetPersonaName( hSteamFriends
);
214 * --------------------------------------------------------
216 hSteamUserStats
= SteamAPI_SteamUserStats();
218 steam_register_callback( k_iUserStatsReceived
,
219 steam_on_recieve_current_stats
);
221 if( !SteamAPI_ISteamUserStats_RequestCurrentStats( hSteamUserStats
) )
222 vg_warn( "No Steam Logon: Cannot request stats\n" );
225 vg_function_push( (struct vg_cmd
)
228 .function
= steam_list_achievements
231 vg_function_push( (struct vg_cmd
)
233 .name
= "ach_clear_all",
234 .function
= steam_clear_all_achievements
237 vg_function_push( (struct vg_cmd
)
240 .function
= steam_set_achievemnt_test
245 /* TODO: On username update callback */
246 str_utf8_collapse( username
, steam_username_at_startup
,
247 vg_list_size(steam_username_at_startup
) );
252 VG_STATIC
void steam_update(void)
255 steamworks_event_loop( hSteamClientPipe
);
258 VG_STATIC
void steam_end(void *nothing
)
262 vg_info( "Shutting down\n..." );