Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.7 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================
  6. #include "cbase.h"
  7. #include "achievementmgr.h"
  8. #include "baseachievement.h"
  9. #ifdef GAME_DLL
  10. class CAchievementEp1KillAntlionsWithCar : public CBaseAchievement
  11. {
  12. protected:
  13. void Init()
  14. {
  15. SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
  16. SetInflictorFilter( "prop_physics" );
  17. SetVictimFilter( "npc_antlion" );
  18. SetGameDirFilter( "episodic" );
  19. SetGoal( 15 );
  20. }
  21. virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event )
  22. {
  23. // any model that passed previous filters and begins with "props_vehicles" is a physics car
  24. const char *pszName = GetModelName( pInflictor );
  25. const char szPrefix[] = "props_vehicles";
  26. if ( 0 == Q_strncmp( pszName, szPrefix, ARRAYSIZE( szPrefix ) - 1 ) )
  27. {
  28. IncrementCount();
  29. }
  30. }
  31. };
  32. DECLARE_ACHIEVEMENT( CAchievementEp1KillAntlionsWithCar, ACHIEVEMENT_EP1_KILL_ANTLIONS_WITHCARS, "EP1_KILL_ANTLIONS_WITHCARS", 5 );
  33. class CAchievementEp1KillEnemiesWithSniperAlyx : public CBaseAchievement
  34. {
  35. protected:
  36. void Init()
  37. {
  38. SetFlags( ACH_LISTEN_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
  39. SetInflictorEntityNameFilter( "sniper_alyx" );
  40. SetGameDirFilter( "episodic" );
  41. SetGoal( 30 );
  42. }
  43. };
  44. DECLARE_ACHIEVEMENT( CAchievementEp1KillEnemiesWithSniperAlyx, ACHIEVEMENT_EP1_KILL_ENEMIES_WITHSNIPERALYX, "EP1_KILL_ENEMIES_WITHSNIPERALYX", 10 );
  45. class CAchievementEp1BeatCitizenEscortNoCitizenDeaths : public CFailableAchievement
  46. {
  47. protected:
  48. void Init()
  49. {
  50. SetFlags( ACH_LISTEN_MAP_EVENTS | ACH_LISTEN_KILL_EVENTS | ACH_SAVE_WITH_GAME );
  51. SetGameDirFilter( "episodic" );
  52. SetGoal( 1 );
  53. SetVictimFilter( "npc_citizen" );
  54. }
  55. virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event )
  56. {
  57. // if any citizens die while this achievement is active, achievement fails
  58. SetFailed();
  59. }
  60. // map event where achievement is activated
  61. virtual const char *GetActivationEventName() { return "EP1_BEAT_CITIZENESCORT_NOCITIZENDEATHS_START"; }
  62. // map event where achievement is evaluated for success
  63. virtual const char *GetEvaluationEventName() { return "EP1_BEAT_CITIZENESCORT_NOCITIZENDEATHS_END"; }
  64. };
  65. DECLARE_ACHIEVEMENT( CAchievementEp1BeatCitizenEscortNoCitizenDeaths, ACHIEVEMENT_EP1_BEAT_CITIZENESCORT_NOCITIZENDEATHS, "EP1_BEAT_CITIZENESCORT_NOCITIZENDEATHS", 15 );
  66. extern int CalcPlayerAttacks( bool bBulletOnly );
  67. class CAchievementEp1BeatGameOneBullet : public CFailableAchievement
  68. {
  69. DECLARE_CLASS( CAchievementEp1BeatGameOneBullet, CFailableAchievement );
  70. protected:
  71. void Init()
  72. {
  73. SetFlags( ACH_LISTEN_MAP_EVENTS | ACH_SAVE_WITH_GAME );
  74. SetGameDirFilter( "episodic" );
  75. SetGoal( 1 );
  76. }
  77. virtual void OnEvaluationEvent()
  78. {
  79. // get # of attacks w/bullet weapons
  80. int iBulletAttackCount = CalcPlayerAttacks( true );
  81. // if more than 1 bullet fired, fail
  82. if ( iBulletAttackCount > 1 )
  83. {
  84. SetFailed();
  85. }
  86. BaseClass::OnEvaluationEvent();
  87. }
  88. // map event where achievement is activated
  89. virtual const char *GetActivationEventName() { return "EP1_START_GAME"; }
  90. // map event where achievement is evaluated for success
  91. virtual const char *GetEvaluationEventName() { return "EP1_BEAT_GAME"; }
  92. // additional status for debugging
  93. virtual void PrintAdditionalStatus()
  94. {
  95. if ( m_bActivated )
  96. {
  97. Msg( "Player bullet attacks: %d\n", CalcPlayerAttacks( true ) );
  98. }
  99. }
  100. };
  101. DECLARE_ACHIEVEMENT( CAchievementEp1BeatGameOneBullet, ACHIEVEMENT_EP1_BEAT_GAME_ONEBULLET, "EP1_BEAT_GAME_ONEBULLET", 40 );
  102. // 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.
  103. #define DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( achievementID, achievementName, iPointValue ) \
  104. DECLARE_MAP_EVENT_ACHIEVEMENT_( achievementID, achievementName, "episodic", iPointValue, false )
  105. // achievements which are won by a map event firing once
  106. DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_MAINELEVATOR, "EP1_BEAT_MAINELEVATOR", 5 );
  107. DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_CITADELCORE, "EP1_BEAT_CITADELCORE", 5 );
  108. DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_CITADELCORE_NOSTALKERKILLS, "EP1_BEAT_CITADELCORE_NOSTALKERKILLS", 10 );
  109. DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_GARAGEELEVATORSTANDOFF, "EP1_BEAT_GARAGEELEVATORSTANDOFF", 10 );
  110. DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_HOSPITALATTICGUNSHIP, "EP1_BEAT_HOSPITALATTICGUNSHIP", 5 );
  111. DECLARE_EP1_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_EP1_BEAT_GAME, "EP1_BEAT_GAME", 20 );
  112. #endif // GAME_DLL