summaryrefslogtreecommitdiff
path: root/game/shared/episodic/achievements_ep1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/episodic/achievements_ep1.cpp')
-rw-r--r--game/shared/episodic/achievements_ep1.cpp133
1 files changed, 133 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