Fission FSN
Loading...
Searching...
No Matches
gfCHOGHint.h
Go to the documentation of this file.
1/********************************************************************
2*
3* File: fsCHOGHint.h
4*
5* Purpose: Wrap up all the hint behaviour
6*
7*********************************************************************/
8
9#ifndef gfCHOGHinthdr
10#define gfCHOGHinthdr
11
12#include <algorithm>
13#include <vector>
14
15#include <fsCore/fsBaseTypes.h>
16#include <fsCore/src/fsNRnd.h>
17
19
21
23#include "src/fsCEntity.h"
24
25
27{
28public:
29
30 fsBool hinted() const;
31
32 fsBool activate(fsCEntity* pStartEnt, fsCEntity* pEndEnt);
33 fsBool activate(std::vector<fsCEntity*>& pCandidates);
34
35 gfCHOGHint(fsCGameGui* pParent);
37
38protected:
39
40private:
41
42 template<typename TMinigameType>
43 std::vector<fsCEntity*>
44 minigameEntsGet() const;
45
46 template<typename T>
47 fsBool hintOnMinigames() const;
48
49 fsBool hintOnSubSceneNavigationComponents() const;
50 fsBool hintOnWordSearch() const;
51
52 void zoomedLevelReset() const;
53
54 void hintEffectActivate(fsCEntity* pTargetEntity) const;
55
56 fsBool previoustlyHinted(fsCEntity* pEnt) const;
57
58 std::vector<fsCEntity*> mPreviouslyHintedEnts;
59
60 fsCGameGui* mParent;
61};
62
63template<typename TMinigameType>
64std::vector<fsCEntity*>
65gfCHOGHint::minigameEntsGet() const
66{
67 std::vector<fsCEntity*> minigameEnts;
68
70 for (fsCEntity* subSceneEnt : subSceneEnts)
71 {
72 if (subSceneEnt->visibleGet())
73 {
74 minigameEnts = subSceneEnt->childEntitiesWithComponentsOfFamilyType<TMinigameType>();
75 }
76 }
77
78 if (minigameEnts.empty()) // linked to minigame logic not sub scene
79 {
80 minigameEnts = mParent->grandparentGet()->childEntitiesWithComponentsOfFamilyType<TMinigameType>();
81 }
82
83 minigameEnts.erase(std::remove_if(std::begin(minigameEnts), std::end(minigameEnts),
84 [](fsCEntity* ent)
85 {
86 return nullptr == ent->componentGet<TMinigameType>();
87 }),
88 minigameEnts.end());
89
90 return minigameEnts;
91}
92
93template<typename T>
94fsBool gfCHOGHint::hintOnMinigames() const
95{
96 auto minigameEnts = minigameEntsGet<T>();
97
98 minigameEnts.erase(std::remove_if(std::begin(minigameEnts), std::end(minigameEnts),
99 [](fsCEntity* const ent) { return !ent->componentGet<T>()->isHintableGet(); }),
100 std::end(minigameEnts));
101
102 if (minigameEnts.empty())
103 return false;
104
105 auto active = std::find_if(std::begin(minigameEnts), std::end(minigameEnts),
106 [](fsCEntity* ent) { return ent->componentGet<T>()->isActiveGet(); });
107
108 fsCEntity* chosen;
109 if (active != std::end(minigameEnts))
110 {
111 chosen = *active;
112 }
113 else
114 {
115 std::shuffle(std::begin(minigameEnts), std::end(minigameEnts), fsNRnd::randomDeviceGet());
116 chosen = minigameEnts.front();
117 }
118
119 if (!chosen->componentGet<T>()->hintDo())
120 {
121 auto* const gameGui = fsILevelBasedAppCoreMain::instanceGet()->sceneGet()
122 ->firstEntityWithComponentsOfFamilyType<fsCGameGui>()->componentGet<fsCGameGui>();
123 return gameGui->hintActivate(chosen, nullptr);
124 }
125 return true;
126}
127
128#endif
fsIScene * sceneGet() const
Definition fsCAppCoreMain.cpp:278
Definition fsCEntity.h:39
TComponent * componentGet() const
Definition fsCEntity.h:209
Definition gfCGameGui.h:23
std::vector< fsCEntity * > appSceneEntitiesWithComponentOfFamilyType() const
Definition fsIComponent.h:89
static fsILevelBasedAppCoreMain * instanceGet()
Definition fsILevelBasedAppCoreMain.cpp:209
fsCEntity * firstEntityWithComponentsOfFamilyType() const
Definition fsIScene.h:65
fsBool activate(fsCEntity *pStartEnt, fsCEntity *pEndEnt)
Definition gfCHOGHint.cpp:78
~gfCHOGHint()
Definition gfCHOGHint.cpp:156
gfCHOGHint(fsCGameGui *pParent)
Definition gfCHOGHint.cpp:151
fsBool hinted() const
Definition gfCHOGHint.cpp:29
Definition gfCSubSceneComponent.h:22
bool fsBool
Definition fsBaseTypes.h:26
std::random_device & randomDeviceGet()
Definition fsNRnd.cpp:32