Etterna 0.74.4
Loading...
Searching...
No Matches
ActorUtil.h
1#ifndef ActorUtil_H
2#define ActorUtil_H
3
4#include "Actor.h"
5
6class XNode;
7
8using CreateActorFn = Actor* (*)();
9
10template<typename T>
11auto
12CreateActor() -> Actor*
13{
14 return new T;
15}
16
21#define REGISTER_ACTOR_CLASS_WITH_NAME(className, externalClassName) \
22 struct Register##className \
23 { \
24 Register##className() \
25 { \
26 ActorUtil::Register(#externalClassName, CreateActor<className>); \
27 } \
28 }; \
29 className* className::Copy() const { return new className(*this); } \
30 static Register##className register##className
31
36#define REGISTER_ACTOR_CLASS(className) \
37 REGISTER_ACTOR_CLASS_WITH_NAME(className, className)
38
39enum FileType
40{
41 FT_Bitmap,
42 FT_Sprite,
43 FT_Sound,
44 FT_Movie,
45 FT_Directory,
46 FT_Xml,
47 FT_Model,
48 FT_Lua,
49 FT_Ini,
50 NUM_FileType,
51 FileType_Invalid
52};
53auto
54FileTypeToString(FileType ft) -> const std::string&;
55
57namespace ActorUtil {
58void
59InitFileTypeLists();
60auto
61GetTypeExtensionList(FileType ft) -> std::vector<std::string> const&;
62void
63AddTypeExtensionsToList(FileType ft, std::vector<std::string>& add_to);
64
65// Every screen should register its class at program initialization.
66void
67Register(const std::string& sClassName, CreateActorFn pfn);
68
69auto
70ParseActorCommands(const std::string& sCommands, const std::string& sName = "")
71 -> apActorCommands;
72void
73SetXY(Actor& actor, const std::string& sMetricsGroup);
74inline void
75PlayCommand(Actor& actor, const std::string& sCommandName)
76{
77 actor.PlayCommand(sCommandName);
78}
79inline void
80OnCommand(Actor& actor)
81{
82 ASSERT_M(
83 actor.HasCommand("On"),
84 ssprintf("%s is missing an OnCommand.", actor.GetLineage().c_str()));
85 actor.PlayCommand("On");
86}
87inline void
88OffCommand(Actor& actor)
89{
90 // HACK: It's very often that we command things to TweenOffScreen
91 // that we aren't drawing. We know that an Actor is not being
92 // used if its name is blank. So, do nothing on Actors with a blank name.
93 // (Do "playcommand" anyway; BGAs often have no name.)
94 if (actor.GetName().empty()) {
95 return;
96 }
97 ASSERT_M(actor.HasCommand("Off"),
98 ssprintf("Actor %s is missing an OffCommand.",
99 actor.GetLineage().c_str()));
100 actor.PlayCommand("Off");
101}
102
103void
104LoadCommand(Actor& actor,
105 const std::string& sMetricsGroup,
106 const std::string& sCommandName);
107void
108LoadCommandFromName(Actor& actor,
109 const std::string& sMetricsGroup,
110 const std::string& sCommandName,
111 const std::string& sName);
112void
113LoadAllCommands(Actor& actor, const std::string& sMetricsGroup);
114void
115LoadAllCommandsFromName(Actor& actor,
116 const std::string& sMetricsGroup,
117 const std::string& sName);
118
119inline void
120LoadAllCommandsAndSetXY(Actor& actor, const std::string& sMetricsGroup)
121{
122 LoadAllCommands(actor, sMetricsGroup);
123 SetXY(actor, sMetricsGroup);
124}
125inline void
126LoadAllCommandsAndOnCommand(Actor& actor, const std::string& sMetricsGroup)
127{
128 LoadAllCommands(actor, sMetricsGroup);
129 OnCommand(actor);
130}
131inline void
132SetXYAndOnCommand(Actor& actor, const std::string& sMetricsGroup)
133{
134 SetXY(actor, sMetricsGroup);
135 OnCommand(actor);
136}
137inline void
138LoadAllCommandsAndSetXYAndOnCommand(Actor& actor,
139 const std::string& sMetricsGroup)
140{
141 LoadAllCommands(actor, sMetricsGroup);
142 SetXY(actor, sMetricsGroup);
143 OnCommand(actor);
144}
145
146/* convenience */
147inline void
148SetXY(Actor* pActor, const std::string& sMetricsGroup)
149{
150 SetXY(*pActor, sMetricsGroup);
151}
152inline void
153PlayCommand(Actor* pActor, const std::string& sCommandName)
154{
155 if (pActor != nullptr) {
156 pActor->PlayCommand(sCommandName);
157 }
158}
159inline void
160OnCommand(Actor* pActor)
161{
162 if (pActor != nullptr) {
163 ActorUtil::OnCommand(*pActor);
164 }
165}
166inline void
167OffCommand(Actor* pActor)
168{
169 if (pActor != nullptr) {
170 ActorUtil::OffCommand(*pActor);
171 }
172}
173
174inline void
175LoadAllCommands(Actor* pActor, const std::string& sMetricsGroup)
176{
177 if (pActor != nullptr) {
178 LoadAllCommands(*pActor, sMetricsGroup);
179 }
180}
181
182inline void
183LoadAllCommandsAndSetXY(Actor* pActor, const std::string& sMetricsGroup)
184{
185 if (pActor != nullptr) {
186 LoadAllCommandsAndSetXY(*pActor, sMetricsGroup);
187 }
188}
189inline void
190LoadAllCommandsAndOnCommand(Actor* pActor, const std::string& sMetricsGroup)
191{
192 if (pActor != nullptr) {
193 LoadAllCommandsAndOnCommand(*pActor, sMetricsGroup);
194 }
195}
196inline void
197SetXYAndOnCommand(Actor* pActor, const std::string& sMetricsGroup)
198{
199 if (pActor != nullptr) {
200 SetXYAndOnCommand(*pActor, sMetricsGroup);
201 }
202}
203inline void
204LoadAllCommandsAndSetXYAndOnCommand(Actor* pActor,
205 const std::string& sMetricsGroup)
206{
207 if (pActor != nullptr) {
208 LoadAllCommandsAndSetXYAndOnCommand(*pActor, sMetricsGroup);
209 }
210}
211
212// Return a Sprite, BitmapText, or Model depending on the file type
213auto
214LoadFromNode(const XNode* pNode, Actor* pParentActor = nullptr) -> Actor*;
215auto
216MakeActor(const std::string& sPath, Actor* pParentActor = nullptr) -> Actor*;
217auto
218GetSourcePath(const XNode* pNode) -> std::string;
219auto
220GetWhere(const XNode* pNode) -> std::string;
221auto
222GetAttrPath(const XNode* pNode,
223 const std::string& sName,
224 std::string& sOut,
225 bool optional = false) -> bool;
226auto
227LoadTableFromStackShowErrors(Lua* L) -> bool;
228
229auto
230ResolvePath(std::string& sPath, const std::string& sName, bool optional = false)
231 -> bool;
232
233void
234SortByZPosition(std::vector<Actor*>& vActors);
235
236auto
237GetFileType(const std::string& sPath) -> FileType;
238} // namespace ActorUtil
239
240#define SET_XY(actor) ActorUtil::SetXY(actor, m_sName)
241#define ON_COMMAND(actor) ActorUtil::OnCommand(actor)
242#define OFF_COMMAND(actor) ActorUtil::OffCommand(actor)
243#define SET_XY_AND_ON_COMMAND(actor) \
244 ActorUtil::SetXYAndOnCommand(actor, m_sName)
245#define COMMAND(actor, command_name) ActorUtil::PlayCommand(actor, command_name)
246#define LOAD_ALL_COMMANDS(actor) ActorUtil::LoadAllCommands(actor, m_sName)
247#define LOAD_ALL_COMMANDS_AND_SET_XY(actor) \
248 ActorUtil::LoadAllCommandsAndSetXY(actor, m_sName)
249#define LOAD_ALL_COMMANDS_AND_ON_COMMAND(actor) \
250 ActorUtil::LoadAllCommandsAndOnCommand(actor, m_sName)
251#define LOAD_ALL_COMMANDS_AND_SET_XY_AND_ON_COMMAND(actor) \
252 ActorUtil::LoadAllCommandsAndSetXYAndOnCommand(actor, m_sName)
253
254#endif
Base class for all objects that appear on the screen.
Definition Actor.h:77
auto GetName() const -> const std::string &
Retrieve the Actor's name.
Definition Actor.h:262
auto GetLineage() const -> std::string
Retrieve the Actor's lineage.
Definition Actor.cpp:1002
Definition XmlFile.h:95
Utility functions for creating and manipulating Actors.
Definition ActorUtil.h:57