-
Notifications
You must be signed in to change notification settings - Fork 3
/
ScriptWorld.h
81 lines (55 loc) · 2.33 KB
/
ScriptWorld.h
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
#pragma once
struct IEngineBinder;
class ScriptWorld {
public: // Construction and destruction
ScriptWorld (TokenPool * pool, IEngineBinder * binder);
~ScriptWorld ();
public: // Setup interface
void AddScriptable(const std::string & name, Scriptable && scriptable);
void AddArchetype(const std::string & name, Scriptable && archetype);
void AddMagicBag(unsigned nametoken);
Scriptable * GetArchetype(unsigned token);
Scriptable * GetScriptable(unsigned token);
TextPropertyBag * GetMagicBag(unsigned token);
TokenPool & GetTokenPool() { return *m_tokens; }
Scriptable * InstantiateArchetype(unsigned token, IFormulaPropertyBag * paramBag);
Scriptable * InstantiateArchetype(unsigned nameOfInstance, unsigned token, IFormulaPropertyBag * paramBag);
public: // Event pump interface
void QueueEvent(unsigned targetToken, const std::string & eventName);
void QueueEvent(Scriptable * scriptable, unsigned eventToken, IFormulaPropertyBag * paramBag);
void QueueBroadcastEvent(const std::string & eventName);
void QueueDelayedEvent (Scriptable * target, unsigned eventToken, IFormulaPropertyBag * paramBag, ValueT delaySeconds);
void QueueDelayedEvent (unsigned targetToken, unsigned eventToken, IFormulaPropertyBag * paramBag, ValueT delaySeconds);
bool DispatchEvents();
unsigned PeekTimeUntilNextEvent () const;
unsigned GetMagicTokenForEvent () const {
return m_magicTokenEvent;
}
unsigned GetMagicTokenForOther () const {
return m_magicTokenOther;
}
public: // Debugging interface
void DumpOverview() const;
private: // Internal helpers
void DispatchEvent(Scriptable * target, unsigned eventToken, const IFormulaPropertyBag * paramBag);
void TransferTimedEvents ();
private: // Internal structures
struct Event {
unsigned nameToken;
Scriptable * directTarget;
unsigned targetToken;
IFormulaPropertyBag * parameterBag = nullptr;
std::chrono::time_point<std::chrono::system_clock> timestamp;
};
private: // Internal state
TokenPool * m_tokens;
std::map<unsigned, Scriptable> m_scriptables;
std::map<unsigned, Scriptable> m_archetypes;
std::vector<std::pair<unsigned, TextPropertyBag>> m_magicBags;
std::vector<Event> m_eventQueue;
std::vector<Event> m_eventQueueTimed;
std::vector<Scriptable *> m_instances;
IEngineBinder * m_binder;
unsigned m_magicTokenEvent = 0;
unsigned m_magicTokenOther = 0;
};