diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/portal/achievements_portal.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/portal/achievements_portal.cpp')
| -rw-r--r-- | game/shared/portal/achievements_portal.cpp | 547 |
1 files changed, 547 insertions, 0 deletions
diff --git a/game/shared/portal/achievements_portal.cpp b/game/shared/portal/achievements_portal.cpp new file mode 100644 index 0000000..bf2a49e --- /dev/null +++ b/game/shared/portal/achievements_portal.cpp @@ -0,0 +1,547 @@ +//========= 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 |