1+ #pragma once
2+
3+ #include < Spore\App\IMessageListener.h>
4+ #include < Spore\Pollinator\cSPAchievementSerializer.h>
5+ #include < EASTL\hash_map.h>
6+ #include < EASTL\vector_map.h>
7+
8+ #define AchievementsManager (*Pollinator::cAchievementsManager::Get ())
9+
10+ namespace Pollinator
11+ {
12+ // / Manages the achievements of the game.
13+ // / This manager listens to the App::IMessageManager::kMsgCheatInvoked message,
14+ // / and will disable achievements when it receives the message, as you will be considered a cheater.
15+ // / Example code:
16+ // / ```cpp
17+ // / AchievementsManager.AddProgress(id("ADV-MyHero"), 20);
18+ // / ```
19+ class cAchievementsManager
20+ : public App::IUnmanagedMessageListener
21+ {
22+ public:
23+ enum Messages
24+ {
25+ kMsgSaveAchievements = 0x212D3E7
26+ };
27+
28+ static cAchievementsManager* Get ();
29+
30+ cAchievementDefinition* GetAchievementDefinition (uint32_t achievementID);
31+
32+ // / Evaluates whether the current achievement progress exceeds the trigger,
33+ // / which means the achievement should be earned.
34+ // / @param achievementID
35+ // / @returns
36+ bool EvaluateTriggerOp (uint32_t achievementID);
37+
38+ // / Increases or decreases the progress of an achievement. If the achievement is automatic,
39+ // / this will call EvaluateTriggerOp() afterwards, and earn the achievement if it returns true.
40+ // / @param achievementID
41+ // / @param deltaProgress
42+ void AddProgress (uint32_t achievementID, int deltaProgress);
43+
44+ // / Treats the progress as flags, and enables or disables some of them. If the achievement is automatic,
45+ // / this will call EvaluateTriggerOp() afterwards, and earn the achievement if it returns true.
46+ // / @param achievementID
47+ // / @param progressFlags
48+ // / @param value
49+ void SetProgressFlags (uint32_t achievementID, int progressFlags, bool value);
50+
51+ // / Earns an achievement.
52+ // / @param achievementID
53+ // / @returns True if it was earned successfully
54+ bool EarnAchievement (uint32_t achievementID);
55+
56+ public:
57+ /* 04h */ int mpAchievementNotifierUI;
58+ /* 08h */ cSPAchievementSerializerPtr mpSerializer;
59+ /* 0Ch */ eastl::vector_map<uint32_t , cAchievementDefinition> mAchievements ;
60+ // / If true, achievements are disabled.
61+ /* 24h */ bool mIsCheater ;
62+ /* 28h */ cSPAchievementSerializer::CrossGameData mCrossGameData ;
63+ };
64+ ASSERT_SIZE (cAchievementsManager, 0xA8 );
65+
66+ namespace Addresses ( cAchievementsManager)
67+ {
68+ DeclareAddress (Get); // 0x6755E0 0x675210
69+ DeclareAddress (Init); // 0x676D90 0x676C40
70+ DeclareAddress (GetAchievementDefinition); // 0x676770 0x676620
71+ DeclareAddress (EvaluateTriggerOp); // 0x676800 0x6766B0
72+ DeclareAddress (EarnAchievement); // 0x676820 0x6766D0
73+ DeclareAddress (AddProgress); // 0x676FA0 0x676E50
74+ DeclareAddress (SetProgressFlags); // 0x676FE0 0x676E90
75+ }
76+ }
0 commit comments