X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=steam.h;h=e2ed9822ceed634aa84106aa87ab91cdb2e8925a;hb=5fa590f62aa7e62a8b6b07e10556c2ecc54cdca6;hp=f6eadcd1ba81390c1c2aec756482b1f5440ce2f4;hpb=0a33f65eecb5e75cddaefa08d3a5eb1a301d0479;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/steam.h b/steam.h index f6eadcd..e2ed982 100644 --- a/steam.h +++ b/steam.h @@ -1,347 +1,19 @@ /* - * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved + * Copyright (C) 2021-2024 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, - * theres not much point otherwise. We mainly want steamworks for setting - * achievements etc.. so that includes our own server too. - * - * This file also wraps the functions and interfaces that we want to use to - * make them a bit easier to read, since they are the flat API they have very - * long names. in non-networked builds they will return default errors or do - * nothing. - */ - -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 ); - else - vg_info( "%s\n", msg ); -} - -VG_STATIC int steam_ready = 0, - steam_stats_ready = 0; - -VG_STATIC void *hSteamNetworkingSockets, - *hSteamUser; - -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; -} - -VG_STATIC int steam_init(void) -{ - const char *username = NULL; - -#ifdef SR_NETWORKED - vg_info( "Initializing steamworks\n" ); - - if( !SteamAPI_Init() ){ - printf("\n"); - vg_error( "Steamworks failed to initialize\n" ); - return 1; - } - - steam_ready = 1; - - SteamAPI_ManualDispatch_Init(); - - /* Connect interfaces */ - hSteamClientPipe = SteamAPI_GetHSteamPipe(); - hSteamNetworkingSockets = SteamAPI_SteamNetworkingSockets_SteamAPI(); - hSteamUser = SteamAPI_SteamUser(); - - ISteamUtils *utils = SteamAPI_SteamUtils(); - SteamAPI_ISteamUtils_SetWarningMessageHook( utils, recv_steam_warning ); - - 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; -} - -VG_STATIC void steam_update(void) -{ - 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; - } - } -} - -VG_STATIC void steam_end(void) -{ - if( steam_ready ){ - vg_info( "Shutting down\n..." ); - SteamAPI_Shutdown(); - } -} - -#endif /* STEAM_H */ +#pragma once + +extern int steam_ready, steam_stats_ready; +extern void *hSteamNetworkingSockets, *hSteamUser, *hSteamUserStats; +extern char steam_username_at_startup[128]; + +int steam_init(void); +void steam_update(void); +void steam_end(void); +u32 str_utf8_collapse( const char *str, char *buf, u32 length ); +int steam_achievement_ccmd( int argc, char const *argv[] ); +void steam_print_all_achievements(void); +void steam_clear_achievement( const char *name ); +void steam_set_achievement( const char *name ); +void steam_store_achievements(void);