Files
funnygame/external/steamworks/steamworksexample/timeline.cpp
2025-07-13 15:47:42 +03:00

122 lines
4.3 KiB
C++

//====== Copyright © 1996-2023 Valve Corporation, All rights reserved. =======
//
// Purpose: Class for adding to the Game Recording Timeline for different game states
//
//=============================================================================
#include "stdafx.h"
#include "timeline.h"
#include "SpaceWarClient.h"
extern uint32 Plat_GetTicks();
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CTimeline::CTimeline( IGameEngine *pGameEngine ) :
m_pGameEngine( pGameEngine ),
m_GameID( SteamUtils()->GetAppID() ),
m_bInGame( false )
{
SteamTimeline()->SetTimelineGameMode( k_ETimelineGameMode_Menus );
m_ulSessionCounter = 0;
m_ulInGameStartTime = 0;
m_unLastTimestampIndexDisplayed = 0;
}
//-----------------------------------------------------------------------------
// Purpose: Game state has changed
//-----------------------------------------------------------------------------
void CTimeline::OnGameStateChange( EClientGameState eNewState )
{
bool bInGameNow = false;
switch ( eNewState )
{
case k_EClientGameWaitingForPlayers:
case k_EClientGameActive:
case k_EClientGameQuitMenu:
case k_EClientGameDraw:
case k_EClientGameWinner:
bInGameNow = true;
break;
case k_EClientStatsAchievements:
case k_EClientGameStartServer:
case k_EClientGameMenu:
case k_EClientGameExiting:
case k_EClientGameInstructions:
case k_EClientGameConnecting:
case k_EClientGameConnectionFailure:
case k_EClientFindInternetServers:
default:
break;
}
// change the timeline bar from gray to blue and add a timeline range covering the game session
if ( m_bInGame != bInGameNow )
{
if ( bInGameNow )
{
SteamTimeline()->SetTimelineGameMode( k_ETimelineGameMode_Playing );
m_unSessionStart = Plat_GetTicks();
// start timers for adding timeline timestamps
m_ulInGameStartTime = m_pGameEngine->GetGameTickCount();
m_unLastTimestampIndexDisplayed = 0;
}
else
{
SteamTimeline()->SetTimelineGameMode( k_ETimelineGameMode_Menus );
uint32 unSessionEnd = Plat_GetTicks();
uint32 unSessionDuration = unSessionEnd - m_unSessionStart;
float flDurationSeconds = (float)unSessionDuration / 1000.f;
float flStartOffsetSeconds = -flDurationSeconds;
SteamTimeline()->AddRangeTimelineEvent( "In Match", nullptr, "steam_starburst", 100, flStartOffsetSeconds, flDurationSeconds, k_ETimelineEventClipPriority_None );
}
m_bInGame = bInGameNow;
}
// add a highlight marker every time the player wins
if ( eNewState == k_EClientGameWinner && SpaceWarClient()->BLocalPlayerWonLastGame() )
{
SteamTimeline()->AddInstantaneousTimelineEvent( "Winner!", "You won a round!", "steam_attack", 10, 0, k_ETimelineEventClipPriority_Standard );
}
else if ( eNewState == k_EClientGameDraw )
{
SteamTimeline()->AddInstantaneousTimelineEvent( "Draw", "This round was a draw.", "steam_defend", 5, 0, k_ETimelineEventClipPriority_None );
}
}
//-----------------------------------------------------------------------------
// Purpose: Run a frame. Does not need to run at full frame rate.
//-----------------------------------------------------------------------------
void CTimeline::RunFrame()
{
if ( m_bInGame )
{
// every 5 minutes, add a new timeline timestamp in the form of "05:00", "10:00", etc.
// Note: we use 5 minutes here for demo purposes, but if appropriate for your game, you
// might want to choose a larger interval to keep the Timeline less cluttered for users
const uint32 k_unMinutesBetweenTimestamps = 5;
const uint64 k_unMaxTimeToDisplayIndex = 95 / k_unMinutesBetweenTimestamps;
uint64 ulSinceStartMS = m_pGameEngine->GetGameTickCount() - m_ulInGameStartTime;
uint32 unTimestampIndex = (int)( ulSinceStartMS / (k_unMinutesBetweenTimestamps * 60 * 1000) );
if ( unTimestampIndex > 0 && unTimestampIndex > m_unLastTimestampIndexDisplayed && unTimestampIndex <= k_unMaxTimeToDisplayIndex )
{
// max string length is "95:00"
char rgchBuffer[ 6 ];
sprintf_safe( rgchBuffer, "%02d:00", unTimestampIndex * k_unMinutesBetweenTimestamps );
SteamTimeline()->SetTimelineTooltip( rgchBuffer, 0 );
m_unLastTimestampIndexDisplayed = unTimestampIndex;
}
}
}