source-engine/game/shared/portal/achievements_portal.cpp

548 lines
13 KiB
C++
Raw Normal View History

2022-04-16 09:05:19 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#include "cbase.h"
#include "achievementmgr.h"
#include "baseachievement.h"
#ifdef GAME_DLL
#include "prop_portal.h"
#include "util.h"
CAchievementMgr g_AchievementMgrPortal; // global achievement mgr for Portal
class CAchievementPortalInfiniteFall : public CBaseAchievement
{
DECLARE_CLASS( CAchievementPortalInfiniteFall, CBaseAchievement );
public:
void Init()
{
SetFlags( ACH_SAVE_WITH_GAME );
SetGameDirFilter( "portal" );
SetGoal( 1 );
m_fAccumulatedDistance = 0.0f;
m_bIsFlinging = false;
}
virtual void ListenForEvents()
{
ListenForGameEvent( "portal_player_portaled" );
ListenForGameEvent( "portal_player_touchedground" );
}
virtual void PreRestoreSavedGame()
{
m_fAccumulatedDistance = 0.0f;
m_bIsFlinging = false;
BaseClass::PreRestoreSavedGame();
}
protected:
virtual void FireGameEvent( IGameEvent *event )
{
const char *name = event->GetName();
if ( 0 == Q_strcmp( name, "portal_player_portaled" ) )
{
bool bIsPortal2 = event->GetBool( "portal2", false );
// Get the portals that they teleported through
CProp_Portal *pInPortal = CProp_Portal::FindPortal( 0, bIsPortal2, false );
CProp_Portal *pOutPortal = CProp_Portal::FindPortal( 0, !bIsPortal2, false );
if ( pInPortal && pOutPortal )
{
if ( m_bIsFlinging )
{
// Add up how far we traveled since the last teleport
m_fAccumulatedDistance += m_fZPortalPosition - pInPortal->GetAbsOrigin().z;
if ( m_fAccumulatedDistance > 30000.0f * 12 )
IncrementCount();
}
// Remember the Z position to get the distance when the teleport again or land
m_fZPortalPosition = pOutPortal->GetAbsOrigin().z;
m_bIsFlinging = true;
}
}
else if ( 0 == Q_strcmp( name, "portal_player_touchedground" ) )
{
if ( m_bIsFlinging )
{
CBasePlayer *pLocalPlayer = UTIL_GetLocalPlayer();
if ( pLocalPlayer )
{
m_fAccumulatedDistance += m_fZPortalPosition - pLocalPlayer->GetAbsOrigin().z;
if ( m_fAccumulatedDistance > 30000.0f * 12 )
IncrementCount();
m_fAccumulatedDistance = 0.0f;
m_bIsFlinging = false;
}
}
}
}
private:
bool m_bIsFlinging;
float m_fAccumulatedDistance;
float m_fZPortalPosition;
};
DECLARE_ACHIEVEMENT( CAchievementPortalInfiniteFall, ACHIEVEMENT_PORTAL_INFINITEFALL, "PORTAL_INFINITEFALL", 5 );
class CAchievementPortalLongJump : public CBaseAchievement
{
DECLARE_CLASS( CAchievementPortalLongJump, CBaseAchievement );
public:
void Init()
{
SetFlags( ACH_SAVE_WITH_GAME );
SetGameDirFilter( "portal" );
SetGoal( 1 );
m_fAccumulatedDistance = 0.0f;
m_bIsFlinging = false;
}
virtual void ListenForEvents()
{
ListenForGameEvent( "portal_player_portaled" );
ListenForGameEvent( "portal_player_touchedground" );
}
virtual void PreRestoreSavedGame()
{
m_fAccumulatedDistance = 0.0f;
m_bIsFlinging = false;
BaseClass::PreRestoreSavedGame();
}
protected:
virtual void FireGameEvent( IGameEvent *event )
{
const char *name = event->GetName();
if ( 0 == Q_strcmp( name, "portal_player_portaled" ) )
{
bool bIsPortal2 = event->GetBool( "portal2", false );
// Get the portals that they teleported through
CProp_Portal *pInPortal = CProp_Portal::FindPortal( 0, bIsPortal2, false );
CProp_Portal *pOutPortal = CProp_Portal::FindPortal( 0, !bIsPortal2, false );
if ( pInPortal && pOutPortal )
{
if ( m_bIsFlinging )
{
// Add up how far we traveled since the last teleport
float flDist = pInPortal->GetAbsOrigin().AsVector2D().DistTo( m_vec2DPortalPosition );
// Ignore small distances that can be caused by microadjustments in infinite falls
if ( flDist > 63.0f )
{
m_fAccumulatedDistance += flDist;
}
if ( m_fAccumulatedDistance > 300.0f * 12 )
IncrementCount();
}
// Remember the 2D position to get the distance when the teleport again or land
m_vec2DPortalPosition = pOutPortal->GetAbsOrigin().AsVector2D();
m_bIsFlinging = true;
}
}
else if ( 0 == Q_strcmp( name, "portal_player_touchedground" ) )
{
if ( m_bIsFlinging )
{
CBasePlayer *pLocalPlayer = UTIL_GetLocalPlayer();
if ( pLocalPlayer )
{
float flDist = pLocalPlayer->GetAbsOrigin().AsVector2D().DistTo( m_vec2DPortalPosition );
// Ignore small distances that can be caused by microadjustments in infinite falls
if ( flDist > 63.0f )
{
m_fAccumulatedDistance += flDist;
}
if ( m_fAccumulatedDistance > 300.0f * 12 )
IncrementCount();
m_fAccumulatedDistance = 0.0f;
m_bIsFlinging = false;
}
}
}
}
private:
bool m_bIsFlinging;
float m_fAccumulatedDistance;
Vector2D m_vec2DPortalPosition;
};
DECLARE_ACHIEVEMENT( CAchievementPortalLongJump, ACHIEVEMENT_PORTAL_LONGJUMP, "PORTAL_LONGJUMP", 5 );
class CAchievementPortalBeat2AdvancedMaps: public CBaseAchievement
{
public:
virtual void Init()
{
SetFlags( ACH_SAVE_GLOBAL );
SetGoal( 2 );
m_iProgressMsgMinimum = 0;
}
virtual void ListenForEvents()
{
ListenForGameEvent( "advanced_map_complete" );
}
protected:
virtual void FireGameEvent( IGameEvent* event )
{
if ( !Q_stricmp( event->GetName(), "advanced_map_complete" ) )
{
if ( !IsAchieved() )
{
int iNumAdvanced = event->GetInt( "numadvanced" );
SetCount ( iNumAdvanced );
if ( iNumAdvanced >= GetGoal() )
{
AwardAchievement();
}
else
{
HandleProgressUpdate();
}
}
}
}
virtual void CalcProgressMsgIncrement()
{
// show progress every tick
m_iProgressMsgIncrement = 1;
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalBeat2AdvancedMaps, ACHIEVEMENT_PORTAL_BEAT_2ADVANCEDMAPS, "PORTAL_BEAT_2ADVANCEDMAPS", 10 );
class CAchievementPortalBeat4AdvancedMaps : public CBaseAchievement
{
public:
virtual void Init()
{
SetFlags( ACH_SAVE_GLOBAL );
SetGoal( 4 );
m_iProgressMsgMinimum = 3;
}
virtual void ListenForEvents()
{
ListenForGameEvent( "advanced_map_complete" );
}
protected:
virtual void FireGameEvent( IGameEvent* event )
{
if ( !Q_stricmp( event->GetName(), "advanced_map_complete" ) )
{
if ( !IsAchieved() )
{
int iNumAdvanced = event->GetInt( "numadvanced" );
SetCount ( iNumAdvanced );
if ( iNumAdvanced >= GetGoal() )
{
AwardAchievement();
}
else
{
HandleProgressUpdate();
}
}
}
}
virtual void CalcProgressMsgIncrement()
{
// show progress every tick
m_iProgressMsgIncrement = 1;
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalBeat4AdvancedMaps, ACHIEVEMENT_PORTAL_BEAT_4ADVANCEDMAPS, "PORTAL_BEAT_4ADVANCEDMAPS", 20 );
class CAchievementPortalBeat6AdvancedMaps : public CBaseAchievement
{
public:
virtual void Init()
{
SetFlags( ACH_SAVE_GLOBAL );
SetGoal( 6 );
m_iProgressMsgMinimum = 5;
}
virtual void ListenForEvents()
{
ListenForGameEvent( "advanced_map_complete" );
}
protected:
virtual void FireGameEvent( IGameEvent* event )
{
if ( !Q_stricmp( event->GetName(), "advanced_map_complete" ) )
{
if ( !IsAchieved() )
{
int iNumAdvanced = event->GetInt( "numadvanced" );
SetCount ( iNumAdvanced );
if ( iNumAdvanced >= GetGoal() )
{
AwardAchievement();
}
else
{
HandleProgressUpdate();
}
}
}
}
virtual void CalcProgressMsgIncrement()
{
// show progress every tick
m_iProgressMsgIncrement = 1;
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalBeat6AdvancedMaps, ACHIEVEMENT_PORTAL_BEAT_6ADVANCEDMAPS, "PORTAL_BEAT_6ADVANCEDMAPS", 30 );
class CAchievementPortalGetAllBronze : public CBaseAchievement
{
public:
virtual void Init()
{
SetFlags( ACH_SAVE_GLOBAL );
SetGoal( 18 );
}
virtual void ListenForEvents()
{
ListenForGameEvent( "challenge_map_complete" );
}
protected:
virtual void FireGameEvent( IGameEvent* event )
{
if ( !Q_stricmp( event->GetName(), "challenge_map_complete" ) )
{
if ( !IsAchieved() )
{
int iBronzeCount = event->GetInt( "numbronze" );
SetCount ( iBronzeCount );
if ( iBronzeCount >= GetGoal() )
{
AwardAchievement();
}
else
{
HandleProgressUpdate();
}
}
}
}
virtual void CalcProgressMsgIncrement()
{
// show progress every tick
m_iProgressMsgIncrement = 1;
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalGetAllBronze, ACHIEVEMENT_PORTAL_GET_ALLBRONZE, "PORTAL_GET_ALLBRONZE", 10 );
class CAchievementPortalGetAllSilver : public CBaseAchievement
{
public:
virtual void Init()
{
SetFlags( ACH_SAVE_GLOBAL );
SetGoal( 18 );
}
virtual void ListenForEvents()
{
ListenForGameEvent( "challenge_map_complete" );
}
protected:
virtual void FireGameEvent( IGameEvent* event )
{
if ( !Q_stricmp( event->GetName(), "challenge_map_complete" ) )
{
if ( !IsAchieved() )
{
int iSilverCount = event->GetInt( "numsilver" );
SetCount ( iSilverCount );
if ( iSilverCount >= GetGoal() )
{
AwardAchievement();
}
else
{
HandleProgressUpdate();
}
}
}
}
virtual void CalcProgressMsgIncrement()
{
// show progress every tick
m_iProgressMsgIncrement = 1;
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalGetAllSilver, ACHIEVEMENT_PORTAL_GET_ALLSILVER, "PORTAL_GET_ALLSILVER", 20 );
class CAchievementPortalGetAllGold : public CBaseAchievement
{
public:
virtual void Init()
{
SetFlags( ACH_SAVE_GLOBAL );
SetGoal( 18 );
}
virtual void ListenForEvents()
{
ListenForGameEvent( "challenge_map_complete" );
}
protected:
virtual void FireGameEvent( IGameEvent* event )
{
if ( !Q_stricmp( event->GetName(), "challenge_map_complete" ) )
{
if ( !IsAchieved() )
{
int iGoldCount = event->GetInt( "numgold" );
SetCount ( iGoldCount );
if ( iGoldCount >= GetGoal() )
{
AwardAchievement();
}
else
{
HandleProgressUpdate();
}
}
}
}
virtual void CalcProgressMsgIncrement()
{
// show progress every tick
m_iProgressMsgIncrement = 1;
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalGetAllGold, ACHIEVEMENT_PORTAL_GET_ALLGOLD, "PORTAL_GET_ALLGOLD", 40 );
class CAchievementPortalDetachAllCameras : public CBaseAchievement
{
protected:
virtual void ListenForEvents()
{
ListenForGameEvent( "security_camera_detached" );
}
void FireGameEvent_Internal( IGameEvent *event )
{
if ( 0 == Q_strcmp( event->GetName(), "security_camera_detached" ) )
{
IncrementCount();
}
}
public:
virtual void Init()
{
SetFlags( ACH_SAVE_WITH_GAME );
SetGoal( 33 );
ListenForGameEvent( "security_camera_detached" );
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalDetachAllCameras, ACHIEVEMENT_PORTAL_DETACH_ALL_CAMERAS, "PORTAL_DETACH_ALL_CAMERAS", 5 );
class CAchievementPortalHitTurretWithTurret : public CBaseAchievement
{
protected:
virtual void ListenForEvents()
{
ListenForGameEvent( "turret_hit_turret" );
}
void FireGameEvent_Internal( IGameEvent *event )
{
if ( 0 == Q_strcmp( event->GetName(), "turret_hit_turret" ) )
{
IncrementCount();
}
}
public:
virtual void Init()
{
SetFlags( ACH_SAVE_GLOBAL );
SetGoal( 1 );
ListenForGameEvent( "turret_hit_turret" );
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalHitTurretWithTurret, ACHIEVEMENT_PORTAL_HIT_TURRET_WITH_TURRET, "PORTAL_HIT_TURRET_WITH_TURRET", 5 );
#ifndef _XBOX
class CAchievementPortalFindAllDinosaurs : public CBaseAchievement
{
DECLARE_CLASS( CAchievementPortalFindAllDinosaurs, CBaseAchievement );
void Init()
{
SetFlags( ACH_HAS_COMPONENTS | ACH_SAVE_GLOBAL );
m_iNumComponents = 26;
SetStoreProgressInSteam( true );
SetGoal( m_iNumComponents );
BaseClass::Init();
m_iProgressMsgMinimum = 1;
}
virtual void ListenForEvents()
{
ListenForGameEvent( "dinosaur_signal_found" );
}
virtual void FireGameEvent_Internal( IGameEvent *event )
{
if ( 0 == Q_strcmp( event->GetName(), "dinosaur_signal_found" ) )
{
int id = event->GetInt( "id", -1 );
Assert( id >= 0 && id < m_iNumComponents );
if ( id >= 0 && id < m_iNumComponents )
{
EnsureComponentBitSetAndEvaluate( id );
// Update our Steam stat
steamapicontext->SteamUserStats()->SetStat( "PORTAL_TRANSMISSION_RECEIVED_STAT", m_iCount );
}
else
{
Warning( "Failed to set achievement progress. Dinosaur ID(%d) out of range (0 to %d)\n", id, m_iNumComponents );
}
}
}
virtual void CalcProgressMsgIncrement()
{
// Show progress every tick
m_iProgressMsgIncrement = 1;
}
};
DECLARE_ACHIEVEMENT( CAchievementPortalFindAllDinosaurs, ACHIEVEMENT_PORTAL_TRANSMISSION_RECEIVED, "PORTAL_TRANSMISSION_RECEIVED", 0 );
#endif // _XBOX
// achievements which are won by a map event firing once
DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_PORTAL_GET_PORTALGUNS, "PORTAL_GET_PORTALGUNS", 5 );
DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_PORTAL_KILL_COMPANIONCUBE, "PORTAL_KILL_COMPANIONCUBE", 5 );
DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_PORTAL_ESCAPE_TESTCHAMBERS, "PORTAL_ESCAPE_TESTCHAMBERS", 5 );
DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_PORTAL_BEAT_GAME, "PORTAL_BEAT_GAME", 10 );
#endif // GAME_DLL