1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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
|