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/episodic | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/episodic')
| -rw-r--r-- | game/shared/episodic/achievements_ep1.cpp | 133 | ||||
| -rw-r--r-- | game/shared/episodic/achievements_ep2.cpp | 186 | ||||
| -rw-r--r-- | game/shared/episodic/achievements_epx.cpp | 101 | ||||
| -rw-r--r-- | game/shared/episodic/npc_advisor_shared.h | 32 |
4 files changed, 452 insertions, 0 deletions
diff --git a/game/shared/episodic/achievements_ep1.cpp b/game/shared/episodic/achievements_ep1.cpp new file mode 100644 index 0000000..4fb7399 --- /dev/null +++ b/game/shared/episodic/achievements_ep1.cpp @@ -0,0 +1,133 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + + +#include "cbase.h" +#include "achievementmgr.h" +#include "baseachievement.h" + +#ifdef GAME_DLL + + +class CAchievementEp1KillAntlionsWithCar : public CBaseAchievement +{ +protected: + + void Init() + { + SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME ); + SetInflictorFilter( "prop_physics" ); + SetVictimFilter( "npc_antlion" ); + SetGameDirFilter( "episodic" ); + SetGoal( 15 ); + } + virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) + { + // any model that passed previous filters and begins with "props_vehicles" is a physics car + const char *pszName = GetModelName( pInflictor ); + const char szPrefix[] = "props_vehicles"; + if ( 0 == Q_strncmp( pszName, szPrefix, ARRAYSIZE( szPrefix ) - 1 ) ) + { + IncrementCount(); + } + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp1KillAntlionsWithCar, ACHIEVEMENT_EP1_KILL_ANTLIONS_WITHCARS, "EP1_KILL_ANTLIONS_WITHCARS", 5 ); + +class CAchievementEp1KillEnemiesWithSniperAlyx : public CBaseAchievement +{ +protected: + + void Init() + { + SetFlags( ACH_LISTEN_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME ); + SetInflictorEntityNameFilter( "sniper_alyx" ); + SetGameDirFilter( "episodic" ); + SetGoal( 30 ); + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp1KillEnemiesWithSniperAlyx, ACHIEVEMENT_EP1_KILL_ENEMIES_WITHSNIPERALYX, "EP1_KILL_ENEMIES_WITHSNIPERALYX", 10 ); + +class CAchievementEp1BeatCitizenEscortNoCitizenDeaths : public CFailableAchievement +{ +protected: + + void Init() + { + SetFlags( ACH_LISTEN_MAP_EVENTS | ACH_LISTEN_KILL_EVENTS | ACH_SAVE_WITH_GAME ); + SetGameDirFilter( "episodic" ); + SetGoal( 1 ); + SetVictimFilter( "npc_citizen" ); + } + + virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) + { + // if any citizens die while this achievement is active, achievement fails + SetFailed(); + } + + // map event where achievement is activated + virtual const char *GetActivationEventName() { return "EP1_BEAT_CITIZENESCORT_NOCITIZENDEATHS_START"; } + // map event where achievement is evaluated for success + virtual const char *GetEvaluationEventName() { return "EP1_BEAT_CITIZENESCORT_NOCITIZENDEATHS_END"; } +}; +DECLARE_ACHIEVEMENT( CAchievementEp1BeatCitizenEscortNoCitizenDeaths, ACHIEVEMENT_EP1_BEAT_CITIZENESCORT_NOCITIZENDEATHS, "EP1_BEAT_CITIZENESCORT_NOCITIZENDEATHS", 15 ); + +extern int CalcPlayerAttacks( bool bBulletOnly ); + +class CAchievementEp1BeatGameOneBullet : public CFailableAchievement +{ + DECLARE_CLASS( CAchievementEp1BeatGameOneBullet, CFailableAchievement ); +protected: + + void Init() + { + SetFlags( ACH_LISTEN_MAP_EVENTS | ACH_SAVE_WITH_GAME ); + SetGameDirFilter( "episodic" ); + SetGoal( 1 ); + } + + virtual void OnEvaluationEvent() + { + // get # of attacks w/bullet weapons + int iBulletAttackCount = CalcPlayerAttacks( true ); + // if more than 1 bullet fired, fail + if ( iBulletAttackCount > 1 ) + { + SetFailed(); + } + BaseClass::OnEvaluationEvent(); + } + + // map event where achievement is activated + virtual const char *GetActivationEventName() { return "EP1_START_GAME"; } + // map event where achievement is evaluated for success + virtual const char *GetEvaluationEventName() { return "EP1_BEAT_GAME"; } + + // additional status for debugging + virtual void PrintAdditionalStatus() + { + if ( m_bActivated ) + { + Msg( "Player bullet attacks: %d\n", CalcPlayerAttacks( true ) ); + } + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp1BeatGameOneBullet, ACHIEVEMENT_EP1_BEAT_GAME_ONEBULLET, "EP1_BEAT_GAME_ONEBULLET", 40 ); + +// Ep1-specific macro that sets game dir filter. We need this because Ep1/Ep2/... share a binary so we need runtime check against running game. +#define DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( achievementID, achievementName, iPointValue ) \ + DECLARE_MAP_EVENT_ACHIEVEMENT_( achievementID, achievementName, "episodic", iPointValue, false ) + +// achievements which are won by a map event firing once +DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_MAINELEVATOR, "EP1_BEAT_MAINELEVATOR", 5 ); +DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_CITADELCORE, "EP1_BEAT_CITADELCORE", 5 ); +DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_CITADELCORE_NOSTALKERKILLS, "EP1_BEAT_CITADELCORE_NOSTALKERKILLS", 10 ); +DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_GARAGEELEVATORSTANDOFF, "EP1_BEAT_GARAGEELEVATORSTANDOFF", 10 ); +DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_HOSPITALATTICGUNSHIP, "EP1_BEAT_HOSPITALATTICGUNSHIP", 5 ); +DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_GAME, "EP1_BEAT_GAME", 20 ); + +#endif // GAME_DLL
\ No newline at end of file diff --git a/game/shared/episodic/achievements_ep2.cpp b/game/shared/episodic/achievements_ep2.cpp new file mode 100644 index 0000000..6f47e5c --- /dev/null +++ b/game/shared/episodic/achievements_ep2.cpp @@ -0,0 +1,186 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + + +#include "cbase.h" + +#ifdef GAME_DLL + +#include "achievementmgr.h" +#include "baseachievement.h" +#include "iservervehicle.h" +#include "npc_antlion.h" +#include "npc_hunter.h" + + +class CAchievementEp2KillPoisonAntlion : public CBaseAchievement +{ +protected: + + virtual void Init() + { + SetVictimFilter( "npc_antlion" ); + SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME ); + SetGameDirFilter( "ep2" ); + SetGoal( 1 ); + } + + virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) + { + CNPC_Antlion *pAntlion = dynamic_cast<CNPC_Antlion *>( pVictim ); + if ( pAntlion && pAntlion->IsWorker() ) + { + IncrementCount(); + } + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp2KillPoisonAntlion, ACHIEVEMENT_EP2_KILL_POISONANTLION, "EP2_KILL_POISONANTLION", 5 ); + +class CAchievementEp2KillAllGrubs : public CBaseAchievement +{ +protected: + + virtual void Init() + { + SetVictimFilter( "npc_antlion_grub" ); + SetFlags( ACH_LISTEN_KILL_EVENTS | ACH_SAVE_WITH_GAME ); + SetGameDirFilter( "ep2" ); + SetGoal( 333 ); + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp2KillAllGrubs, ACHIEVEMENT_EP2_KILL_ALLGRUBS, "EP2_KILL_ALLGRUBS", 20 ); + +class CAchievementEp2KillEnemiesWithCar : public CBaseAchievement +{ +protected: + + virtual void Init() + { + SetFlags( ACH_LISTEN_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME ); + SetInflictorFilter( "prop_vehicle_jeep" ); + SetGameDirFilter( "ep2" ); + SetGoal( 20 ); + } + + virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) + { + // count this if the object is a driveable vehicle and local player is driving + CBasePlayer *pLocalPlayer = UTIL_GetLocalPlayer(); + IDrivableVehicle *pDriveableVehicle = dynamic_cast<IDrivableVehicle *>( pInflictor ); + if ( pLocalPlayer && pDriveableVehicle && pDriveableVehicle->GetDriver() == pLocalPlayer ) + { + IncrementCount(); + } + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp2KillEnemiesWithCar, ACHIEVEMENT_EP2_KILL_ENEMIES_WITHCAR, "EP2_KILL_ENEMIES_WITHCAR", 5 ); + +class CAchievementEp2KillHunterWithFlechette : public CBaseAchievement +{ +protected: + void Init() + { + SetFlags( ACH_LISTEN_KILL_EVENTS | ACH_SAVE_WITH_GAME ); + SetVictimFilter( "npc_hunter" ); + SetInflictorFilter( "hunter_flechette" ); + SetGameDirFilter( "ep2" ); + SetGoal( 1 ); + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp2KillHunterWithFlechette, ACHIEVEMENT_EP2_KILL_HUNTER_WITHFLECHETTES, "EP2_KILL_HUNTER_WITHFLECHETTES", 10 ); + +class CAchievementEp2FindAllWebCaches : public CBaseAchievement +{ + virtual void Init() + { + static const char *szComponents[] = + { + "EP2_WEBCACHE_01", "EP2_WEBCACHE_02", "EP2_WEBCACHE_03", "EP2_WEBCACHE_04", + "EP2_WEBCACHE_05", "EP2_WEBCACHE_06", "EP2_WEBCACHE_07", "EP2_WEBCACHE_08", "EP2_WEBCACHE_09" + }; + SetFlags( ACH_HAS_COMPONENTS | ACH_LISTEN_COMPONENT_EVENTS | ACH_SAVE_GLOBAL ); + m_pszComponentNames = szComponents; + m_iNumComponents = ARRAYSIZE( szComponents ); + SetComponentPrefix( "EP2_WEBCACHE" ); + SetGameDirFilter( "ep2" ); + SetGoal( m_iNumComponents ); + } + + // don't show progress notifications for this achievement, it's distracting + virtual bool ShouldShowProgressNotification() { return false; } +}; +DECLARE_ACHIEVEMENT( CAchievementEp2FindAllWebCaches , ACHIEVEMENT_EP2_BREAK_ALLWEBS, "EP2_BREAK_ALLWEBS", 5 ); + +class CAchievementEp2KillChopperNoMisses: public CFailableAchievement +{ +protected: + + void Init() + { + SetFlags( ACH_LISTEN_MAP_EVENTS | ACH_SAVE_WITH_GAME ); + SetGameDirFilter( "ep2" ); + SetGoal( 1 ); + } + + virtual void ListenForEvents() + { + ListenForGameEvent( "helicopter_grenade_punt_miss" ); + } + + // map event where achievement is activated + virtual const char *GetActivationEventName() { return "EP2_KILL_CHOPPER_NOMISSES_START"; } + // map event where achievement is evaluated for success + virtual const char *GetEvaluationEventName() { return "EP2_KILL_CHOPPER_NOMISSES_END"; } + + void FireGameEvent_Internal( IGameEvent *event ) + { + if ( 0 == Q_strcmp( event->GetName(), "helicopter_grenade_punt_miss" ) ) + { + SetFailed(); + } + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp2KillChopperNoMisses, ACHIEVEMENT_EP2_KILL_CHOPPER_NOMISSES, "EP2_KILL_CHOPPER_NOMISSES", 15 ); + +class CAchievementEp2FindAllRadarCaches : public CBaseAchievement +{ + virtual void Init() + { + static const char *szComponents[] = + { + "EP2_RADARCACHE_VAN", "EP2_RADARCACHE_SHACK", "EP2_RADARCACHE_RPG", "EP2_RADARCACHE_CAVE", "EP2_RADARCACHE_HANGING" + }; + SetFlags( ACH_HAS_COMPONENTS | ACH_LISTEN_COMPONENT_EVENTS | ACH_SAVE_GLOBAL ); + m_pszComponentNames = szComponents; + m_iNumComponents = ARRAYSIZE( szComponents ); + SetComponentPrefix( "EP2_RADARCACHE" ); + SetGameDirFilter( "ep2" ); + SetGoal( m_iNumComponents ); + } +}; +DECLARE_ACHIEVEMENT( CAchievementEp2FindAllRadarCaches, ACHIEVEMENT_EP2_FIND_ALLRADARCACHES, "EP2_FIND_ALLRADARCACHES", 10 ); + +// Ep2-specific macro that sets game dir filter. We need this because Ep1/Ep2/... share a binary so we need runtime check against running game. +#define DECLARE_EP2_MAP_EVENT_ACHIEVEMENT( achievementID, achievementName, iPointValue ) \ + DECLARE_MAP_EVENT_ACHIEVEMENT_( achievementID, achievementName, "ep2", iPointValue, false ) + +#define DECLARE_EP2_MAP_EVENT_ACHIEVEMENT_HIDDEN( achievementID, achievementName, iPointValue ) \ + DECLARE_MAP_EVENT_ACHIEVEMENT_( achievementID, achievementName, "ep2", iPointValue, true ) + +// achievements which are won by a map event firing once +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP2_BEAT_ANTLIONINVASION, "EP2_BEAT_ANTLIONINVASION", 5 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_EP2_BEAT_ANTLIONGUARDS, "EP2_BEAT_ANTLIONGUARDS", 5 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_EP2_BEAT_HUNTERAMBUSH, "EP2_BEAT_HUNTERAMBUSH", 10 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_EP2_KILL_COMBINECANNON, "EP2_KILL_COMBINECANNON", 5 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP2_BEAT_RACEWITHDOG, "EP2_BEAT_RACEWITHDOG", 5 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP2_BEAT_ROCKETCACHEPUZZLE, "EP2_BEAT_ROCKETCACHEPUZZLE", 5 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_EP2_BEAT_WHITEFORESTINN, "EP2_BEAT_WHITEFORESTINN", 10 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP2_PUT_ITEMINROCKET, "EP2_PUT_ITEMINROCKET", 30 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_EP2_BEAT_MISSILESILO2, "EP2_BEAT_MISSILESILO2", 5 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP2_BEAT_OUTLAND12_NOBUILDINGSDESTROYED, "EP2_BEAT_OUTLAND12_NOBUILDINGSDESTROYED", 35 ); +DECLARE_EP2_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_EP2_BEAT_GAME, "EP2_BEAT_GAME", 20 ); + +#endif // GAME_DLL
\ No newline at end of file diff --git a/game/shared/episodic/achievements_epx.cpp b/game/shared/episodic/achievements_epx.cpp new file mode 100644 index 0000000..d17c51a --- /dev/null +++ b/game/shared/episodic/achievements_epx.cpp @@ -0,0 +1,101 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + + +#include "cbase.h" + +#include "achievementmgr.h" +#include "baseachievement.h" + +#ifdef GAME_DLL + +#include "basegrenade_shared.h" + +CAchievementMgr g_AchievementMgrEpisodic; // global achievement mgr for episodic + +class CAchievementEpXGetZombineGrenade : public CBaseAchievement +{ +protected: + void Init() + { + SetFlags( ACH_SAVE_GLOBAL ); + SetGoal( 1 ); + + if ( IsPC() ) + { + // only in Ep2 for PC. (Shared across EPX for X360.) + SetGameDirFilter( "ep2" ); + } + } + + virtual void ListenForEvents() + { + ListenForGameEvent( "physgun_pickup" ); + } + + void FireGameEvent_Internal( IGameEvent *event ) + { + if ( 0 == Q_strcmp( event->GetName(), "physgun_pickup" ) ) + { + // was the object picked up a frag grenade? + CBaseEntity *pEntityPickedUp = UTIL_EntityByIndex( event->GetInt( "entindex" ) ); + if ( pEntityPickedUp && pEntityPickedUp->ClassMatches( "npc_grenade_frag" ) ) + { + // get the grenade object + CBaseGrenade *pGrenade = dynamic_cast<CBaseGrenade *>( pEntityPickedUp ); + if ( pGrenade ) + { + // was the original thrower a zombine? + CBaseEntity *pOriginalThrower = pGrenade->GetOriginalThrower(); + if ( pOriginalThrower && pOriginalThrower->ClassMatches( "npc_zombine" ) ) + { + IncrementCount(); + } + } + } + } + } +}; +DECLARE_ACHIEVEMENT( CAchievementEpXGetZombineGrenade, ACHIEVEMENT_EPX_GET_ZOMBINEGRENADE, "EPX_GET_ZOMBINEGRENADE", 5 ); + +class CAchievementEpXKillZombiesWithFlares : public CBaseAchievement +{ +protected: + void Init() + { + SetFlags( ACH_SAVE_WITH_GAME ); + SetGoal( 15 ); + + if ( IsPC() ) + { + // only in Ep1 for PC. (Shared across EPX for X360.) + SetGameDirFilter( "episodic" ); + } + } + + virtual void ListenForEvents() + { + ListenForGameEvent( "flare_ignite_npc" ); + } + + void FireGameEvent_Internal( IGameEvent *event ) + { + if ( 0 == Q_strcmp( event->GetName(), "flare_ignite_npc" ) ) + { + CBaseEntity *pEntityIgnited = UTIL_EntityByIndex( event->GetInt( "entindex" ) ); + // was it a zombie that got set on fire? + if ( pEntityIgnited && + ( ( pEntityIgnited->ClassMatches( "npc_zombie" ) ) || ( pEntityIgnited->ClassMatches( "npc_zombine" ) ) || + ( pEntityIgnited->ClassMatches( "npc_fastzombie" ) ) || ( pEntityIgnited->ClassMatches( "npc_poisonzombie" ) ) ) ) + { + IncrementCount(); + } + } + } +}; +DECLARE_ACHIEVEMENT( CAchievementEpXKillZombiesWithFlares, ACHIEVEMENT_EPX_KILL_ZOMBIES_WITHFLARES, "EPX_KILL_ZOMBIES_WITHFLARES", 5 ); + +#endif // GAME_DLL
\ No newline at end of file diff --git a/game/shared/episodic/npc_advisor_shared.h b/game/shared/episodic/npc_advisor_shared.h new file mode 100644 index 0000000..f275fe8 --- /dev/null +++ b/game/shared/episodic/npc_advisor_shared.h @@ -0,0 +1,32 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Shared data between client and server side npc_advisor classes. +// +// Catchphrase: "It's advising us!!!" +// +//=============================================================================// + +#ifndef NPC_ADVISOR_SHARED_H +#define NPC_ADVISOR_SHARED_H +#ifdef _WIN32 +#pragma once +#endif + + +// Set this to 0 to disable the advisor's special AI behavior (all that object chucking), +// which we did in Ep2 to make him a scripted creature. +#define NPC_ADVISOR_HAS_BEHAVIOR 0 + +#if NPC_ADVISOR_HAS_BEHAVIOR +// Message ID constants used for communciation between client and server. +enum +{ + ADVISOR_MSG_START_BEAM = 10, + ADVISOR_MSG_STOP_BEAM, + ADVISOR_MSG_STOP_ALL_BEAMS, + ADVISOR_MSG_START_ELIGHT, + ADVISOR_MSG_STOP_ELIGHT, +}; +#endif + +#endif // NPC_ADVISOR_SHARED_H |