YAPOG  0.0.1
Yet Another Pokemon Online Game
MapEventManager.cpp
Go to the documentation of this file.
7 
8 namespace yap
9 {
11  : events_ ()
12  , leaveEvents_ ()
13  , enterEvents_ ()
14  , objectsToRemove_ ()
15  , collidableArea_ (nullptr)
16  , abortEvents_ (false)
17  {
18  }
19 
21  {
22  }
23 
25  {
26  collidableArea_ = collidableArea;
27  }
28 
29  void MapEventManager::Update (const Time& dt)
30  {
31  while (!objectsToRemove_.IsEmpty ())
32  {
33  const DynamicWorldObject* object = nullptr;
34  objectsToRemove_.Dequeue (object);
35 
36  events_.Remove (object);
37 
39  for (auto& objectEventsPair : events_)
40  for (auto& eventContextPair : objectEventsPair.second)
41  for (MapEventContext* eventContext : eventContextPair.second)
42  if (&eventContext->GetMapEventInfo ().GetParent () == object)
43  eventsToRemove.Enqueue (eventContext);
44 
45  while (!eventsToRemove.IsEmpty ())
46  {
47  MapEventContext* event = eventsToRemove.Dequeue (event);
48  RemoveEventEntry (event);
49  }
50  }
51 
52  CallEvents (dt);
53 
54  if (abortEvents_)
55  {
56  abortEvents_ = false;
57  Update (dt);
58  }
59  }
60 
62  {
63  while (!leaveEvents_.IsEmpty ())
64  {
65  MapEventContext* event = leaveEvents_.Dequeue (event);
67 
68  if (abortEvents_)
69  return;
70  }
71 
72  while (!enterEvents_.IsEmpty ())
73  {
74  MapEventContext* event = enterEvents_.Dequeue (event);
76 
77  if (abortEvents_)
78  return;
79  }
80 
81  for (auto& objectEvents : events_)
82  {
83  for (auto& eventTriggering : objectEvents.second)
84  {
85  for (MapEventContext* event : eventTriggering.second)
86  {
87  CallEvent (MapEventActionType::In, dt, *event);
88 
89  if (abortEvents_)
90  return;
91  }
92  }
93  }
94  }
95 
97  {
98  UpdateObjectOut (object);
99  UpdateObjectIn (object);
100  }
101 
103  {
104  objectsToRemove_.Enqueue (&object);
105  }
106 
108  {
109  auto objectEvents = events_[&object];
110 
111  for (auto& event : objectEvents)
112  {
113  for (MapEventContext* eventContext : event.second)
114  {
115  if (event.first->CollidesWith (eventContext->GetTriggerCollidable ()))
116  {
117  // Event is still triggered.
118  continue;
119  }
120 
121  RemoveEventEntry (eventContext);
122 
123  AddLeaveEvent (eventContext);
124  }
125  }
126  }
127 
129  {
130  MapEventQueue events;
131 
132  object.GetEventsCollidingWith (*collidableArea_, events);
133 
134  while (!events.IsEmpty ())
135  {
136  MapEventContext& event = events.GetEvent ();
137 
138  if (!AddEventEntry (&event))
139  continue;
140 
141  AddEnterEvent (&event);
142  }
143  }
144 
146  {
147  DynamicWorldObject& object = eventContext->GetTrigger ();
148  MapEvent& event = eventContext->GetMapEventInfo ().GetEvent ();
149 
150  auto eventTriggering = events_.TryGetValue (&object);
151 
152  if (eventTriggering == nullptr)
153  events_.Add (&object, EventTriggeringType ());
154 
155  auto eventTriggers = eventTriggering->TryGetValue (&event);
156 
157  if (eventTriggers == nullptr)
158  {
159  auto triggers = yap::collection::Set<
162 
163  if (!triggers.Add (eventContext))
164  return false;
165 
166  eventTriggering->Add (
167  &event,
168  triggers);
169 
170  return true;
171  }
172 
173  return eventTriggers->Add (eventContext);
174  }
175 
177  {
178  DynamicWorldObject& object = eventContext->GetTrigger ();
179  MapEvent& event = eventContext->GetMapEventInfo ().GetEvent ();
180 
181  auto eventTriggering = events_.TryGetValue (&object);
182 
183  if (eventTriggering == nullptr)
184  return false;
185 
186  auto eventTriggers = eventTriggering->TryGetValue (&event);
187 
188  if (eventTriggers == nullptr)
189  return false;
190 
191  if (!eventTriggers->Remove (eventContext))
192  return false;
193 
194  if (eventTriggers->IsEmpty ())
195  eventTriggering->Remove (&event);
196 
197  if (eventTriggering->IsEmpty ())
198  events_.Remove (&object);
199 
200  return true;
201  }
202 
204  {
205  leaveEvents_.Enqueue (event);
206  }
207 
209  {
210  enterEvents_.Enqueue (event);
211  }
212 
214  MapEventActionType type,
215  const Time& dt,
216  MapEventContext& eventContext)
217  {
218  MapEvent& event = eventContext.GetMapEventInfo ().GetEvent ();
219 
220  MapEventArgs args (
221  dt,
222  eventContext.GetTrigger (),
223  eventContext.GetTriggerCollidable (),
224  eventContext.GetMapEventInfo ());
225 
226  bool successful = event.Call (type, args);
227 
228  if (args.AbortEvents ())
229  AbortEvents ();
230 
231  return successful;
232  }
233 
235  {
236  abortEvents_ = true;
237 
238  leaveEvents_.Clear ();
239  enterEvents_.Clear ();
240  events_.Clear ();
241 
242  OnEventsAborted (*this, EmptyEventArgs ());
243  }
244 } // namespace yap