X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=steam.h;h=f6eadcd1ba81390c1c2aec756482b1f5440ce2f4;hb=0a33f65eecb5e75cddaefa08d3a5eb1a301d0479;hp=c0fb7894d21e97846496e1864f78b83b5cccf153;hpb=c2d67378dd5c82de50b8fbbbe222ec6be2da4eee;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/steam.h b/steam.h index c0fb789..f6eadcd 100644 --- a/steam.h +++ b/steam.h @@ -1,11 +1,19 @@ +/* + * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved + * All trademarks are property of their respective owners + */ + #ifndef STEAM_H #define STEAM_H +#define VG_GAME #include "vg/vg_steam.h" #include "vg/vg_steam_utils.h" #include "vg/vg_steam_networking.h" #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, @@ -18,7 +26,9 @@ * nothing. */ -static void recv_steam_warning( int severity, const char *msg ) +VG_STATIC char steam_username_at_startup[128]; + +VG_STATIC void recv_steam_warning( int severity, const char *msg ) { if( severity == 0 ) vg_low( "%s\n", msg ); @@ -26,19 +36,191 @@ 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 ISteamInput *steam_hInput; + +VG_STATIC u32 utf8_byte0_byte_count( u8 char0 ) +{ + for( u32 k=2; k<4; k++ ){ + if( !(char0 & (0x80 >> k)) ) + return k; + } + + return 0; +} + +VG_STATIC void str_utf8_collapse( const char *str, char *buf, u32 length ) +{ + u8 *ustr = (u8 *)str; + u32 utf32_code = 0x00000000; + u32 i=0, j=0, utf32_byte_ct=0; + + for(;i < length-1;){ + if( ustr[i] == 0x00 ) + break; + + if( ustr[i] & 0x80 ){ + if( utf32_byte_ct ){ + utf32_byte_ct --; + utf32_code |= (ustr[i] & 0x3F) << (utf32_byte_ct*6); + + if( !utf32_byte_ct ){ + const char *match; + size_t chars = anyascii( utf32_code, &match ); + + for( u32 k=0; k> utf32_byte_ct); + utf32_code <<= utf32_byte_ct*6; + } + } + else{ + utf32_byte_ct = 0x00; + buf[j ++] = str[i]; + } + + i++; + } + + buf[j] = 0x00; +} -static int steam_init(void) +VG_STATIC int steam_init(void) { + const char *username = NULL; + #ifdef SR_NETWORKED vg_info( "Initializing steamworks\n" ); - if( !SteamAPI_Init() ) - { + if( !SteamAPI_Init() ){ printf("\n"); vg_error( "Steamworks failed to initialize\n" ); return 1; @@ -58,21 +240,105 @@ static int steam_init(void) printf("\n"); vg_success( "\nSteamworks API running\n" ); + + 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 + }); + + steam_hInput = SteamAPI_SteamInput(); + SteamAPI_ISteamInput_Init( steam_hInput, 0 ); + SteamAPI_ISteamInput_RunFrame( steam_hInput, 0 ); + #endif + /* TODO: On username update callback */ + str_utf8_collapse( username, steam_username_at_startup, + vg_list_size(steam_username_at_startup) ); + return 1; } -static void steam_update(void) +VG_STATIC void steam_update(void) { - if( steam_ready ) + if( steam_ready ){ steamworks_event_loop( hSteamClientPipe ); + + /* TODO + * We can probably request this from SDL too + */ + if( steam_hInput ){ + SteamAPI_ISteamInput_RunFrame( steam_hInput, 0 ); + + InputHandle_t joy0 = SteamAPI_ISteamInput_GetControllerForGamepadIndex( + steam_hInput, 0 ); + + vg_input.controller_should_use_trackpad_look = 0; + if( joy0 != 0 ){ + ESteamInputType type = SteamAPI_ISteamInput_GetInputTypeForHandle( + steam_hInput, joy0 ); + + if( type == k_ESteamInputType_SteamController ){ + vg_input.controller_should_use_trackpad_look = 1; + menu_display_controller = k_menu_controller_type_steam; + } + else if( type == k_ESteamInputType_SteamDeckController ){ + menu_display_controller = k_menu_controller_type_steam_deck; + } + else if( type == k_ESteamInputType_PS3Controller || + type == k_ESteamInputType_PS4Controller || + type == k_ESteamInputType_PS5Controller ) + { + menu_display_controller = k_menu_controller_type_playstation; + } + else if( type == k_ESteamInputType_XBox360Controller || + type == k_ESteamInputType_XBoxOneController ) + { + menu_display_controller = k_menu_controller_type_xbox; + } + else{ + /* currently unsupported controller */ + menu_display_controller = k_menu_controller_type_xbox; + } + } + else + menu_display_controller = k_menu_controller_type_keyboard; + } + } } -static void steam_end(void *nothing) +VG_STATIC void steam_end(void) { - if( steam_ready ) - { + if( steam_ready ){ vg_info( "Shutting down\n..." ); SteamAPI_Shutdown(); }