ScummVM API documentation
effect.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef NUVIE_CORE_EFFECT_H
23 #define NUVIE_CORE_EFFECT_H
24 
25 
26 #include "ultima/nuvie/misc/call_back.h"
27 #include "ultima/nuvie/core/map.h"
28 #include "ultima/nuvie/core/obj_manager.h"
29 #include "ultima/nuvie/core/anim_manager.h"
30 
31 namespace Ultima {
32 namespace Nuvie {
33 
34 //class Actor;
35 class EffectManager;
36 class Game;
37 class MapWindow;
38 class NuvieAnim;
39 class Screen;
40 class TimedAdvance;
41 class TimedCallback;
42 class ObjManager;
43 
44 // Effects add themselves to EffectManager and most start immediately.
45 
46 /* Effects: * = unwritten or untested
47  * Quake - earthquake from cyclops or volcanos
48  * Hit - hit actor anim + sfx
49  * Explosive - explosion caused by powder keg, volcanos, or cannonball hit
50  * ThrowObject - any thrown object or tile
51  * Cannonball (FIX: change to UseCodeThrow)
52  * Missile - throw object to ground or actor; optionally cause damage
53  * *Boomerang - spin Missile and return to sender
54  * Drop - throw obj from inventory to ground
55  * Sleep - pause game & advance time quickly
56  * Fade - fade the mapwindow in or out
57  * GameFadeIn - blocks user-input until Fade is complete
58  * *Palette - do something with the color palette
59  * Vanish - fade from an image of the mapwindow to the real mapwindow
60  * *FadeObject - might not need this since Vanish can be used
61  * U6WhitePotion - will probably make PaletteEffect to do this
62  */
63 
64 
65 /* Control animation and sounds in the game world.
66  */
67 class Effect : public CallBack {
68 protected:
69  Game *game;
70  EffectManager *effect_manager;
71  bool defunct;
72 
73  uint32 retain_count;
74 
75 public:
76  Effect();
77  ~Effect() override;
78 
79  void retain() {
80  retain_count++;
81  }
82  void release() {
83  if (retain_count > 0) retain_count--;
84  }
85  bool is_retained() const {
86  return retain_count == 0 ? false : true;
87  }
88 
89  void delete_self() {
90  defunct = true;
91  }
92  void add_anim(NuvieAnim *anim);
93 
94  bool is_defunct() const {
95  return defunct;
96  }
97  uint16 callback(uint16, CallBack *, void *) override {
98  return 0;
99  }
100 };
101 
102 /* Toss a cannon ball from one actor to another, or from an object towards
103  * a numbered direction.
104  */
105 class CannonballEffect : public Effect {
106  UseCode *usecode;
107  NuvieAnim *anim;
108 // *sfx;
109  Obj *obj;
110  MapCoord target_loc; // where cannonball will hit
111 
112  void start_anim();
113 
114 public:
115  CannonballEffect(Obj *src_obj, sint8 direction = -1);
116 // CannonballEffect(Actor *src_actor, Actor *target_actor); from a ship
117 
118  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
119 };
120 
121 class ProjectileEffect : public Effect {
122 protected:
123  uint16 tile_num;
124 
125  MapCoord start_loc; // where explosion will start
126  vector<MapCoord> targets;
127  uint8 anim_speed;
128  bool trail;
129  uint16 initial_tile_rotation;
130  uint16 rotation_amount;
131  uint8 src_tile_y_offset;
132  uint16 finished_tiles;
133 
134  vector<MapEntity> hit_entities;
135 
136  virtual void start_anim();
137 
138 public:
139  ProjectileEffect() : tile_num(0), anim_speed(0), trail(false),
140  initial_tile_rotation(0), rotation_amount(0), src_tile_y_offset(0),
141  finished_tiles(0) {
142  }
143  ProjectileEffect(uint16 tileNum, MapCoord start, MapCoord target, uint8 speed, bool trailFlag, uint16 initialTileRotation, uint16 rotationAmount, uint8 src_y_offset);
144  ProjectileEffect(uint16 tileNum, MapCoord start, const vector<MapCoord> &t, uint8 speed, bool trailFlag, uint16 initialTileRotation);
145 
146  void init(uint16 tileNum, MapCoord start, const vector<MapCoord> &t, uint8 speed, bool trailFlag, uint16 initialTileRotation, uint16 rotationAmount, uint8 src_y_offset);
147 
148  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
149 
150  vector<MapEntity> *get_hit_entities() {
151  return &hit_entities;
152  }
153 };
154 
155 class ExpEffect : public ProjectileEffect {
156  //UseCode *usecode;
157  NuvieAnim *anim;
158 
159  //Obj *obj;
160  uint16 exp_tile_num;
161 
162 protected:
163  void start_anim() override;
164 public:
165  ExpEffect(uint16 tileNum, const MapCoord &location);
166 
167 };
168 
169 /* Use to add an effect with timed activity. Self-contained timer must be
170  * stopped/started with the included methods.
171  */
172 class TimedEffect : public Effect {
173 protected:
174  TimedCallback *timer;
175 public:
176  TimedEffect() {
177  timer = nullptr;
178  }
179  TimedEffect(uint32 delay) {
180  timer = nullptr;
181  start_timer(delay);
182  }
183  ~TimedEffect() override {
184  stop_timer();
185  }
186 
187  void start_timer(uint32 delay);
188  void stop_timer();
189 
190  void delete_self() {
191  stop_timer();
192  Effect::delete_self();
193  }
194 
195  uint16 callback(uint16 msg, CallBack *caller, void *data) override {
196  if (msg == MESG_TIMED) delete_self(); //= 0;
197  return 0;
198  }
199 };
200 
201 
202 /* Shake the visible play area around.
203  */
204 class QuakeEffect : public TimedEffect {
205  MapWindow *map_window;
206  static QuakeEffect *current_quake; // do nothing if already active
207  sint32 sx, sy; // last map_window movement amount
208  MapCoord orig; // map_window location at start
209  Actor *orig_actor; // center map_window on actor
210  uint32 stop_time;
211  uint8 strength; // magnitude
212 
213 public:
214  QuakeEffect(uint8 magnitude, uint32 duration, Actor *keep_on = nullptr);
215  ~QuakeEffect() override;
216  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
217 
218  void init_directions();
219  void recenter_map();
220  void stop_quake();
221 };
222 
223 
224 /* Hit target actor.
225  */
226 class HitEffect : public Effect {
227 public:
228  HitEffect(Actor *target, uint32 duration = 300);
229  HitEffect(const MapCoord &location);
230  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
231 };
232 
233 /* Print text to MapWindow for a given duration
234  */
235 class TextEffect : public Effect {
236 
237 public:
238  TextEffect(Std::string text);
239  TextEffect(Std::string text, const MapCoord &location);
240  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
241 };
242 
243 
244 /* Create explosion animation and sounds from the source location out to
245  * specified radius. Hit actors and objects for `dmg'.
246  */
247 class ExplosiveEffect : public Effect {
248 protected:
249  NuvieAnim *anim;
250 // *sfx;
251  MapCoord start_at;
252  uint32 radius;
253  uint16 hit_damage; // hp taken off actors hit by explosion
254 
255  void start_anim();
256 
257 public:
258  ExplosiveEffect(uint16 x, uint16 y, uint32 size, uint16 dmg = 0);
259  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
260 
261  // children can override
262  virtual void delete_self() {
263  Effect::delete_self();
264  }
265  virtual bool hit_object(Obj *obj) {
266  return false; // explosion hit something
267  }
268  // true return=end effect
269 };
270 
271 
272 /* Explosion that sends usecode event to an object on completion.
273  */
275  Obj *obj; // explosion came from this object (can be nullptr)
276  Obj *original_obj; // don't hit this object (chain-reaction avoidance hack)
277 
278 public:
279  UseCodeExplosiveEffect(Obj *src_obj, uint16 x, uint16 y, uint32 size, uint16 dmg = 0, Obj *dont_hit_me = nullptr)
280  : ExplosiveEffect(x, y, size, dmg), obj(src_obj), original_obj(dont_hit_me) {
281  }
282  void delete_self() override;
283  bool hit_object(Obj *hit_obj) override; // explosion hit something
284 
285 
286 
287 };
288 
289 
290 /* Toss object tile from one location to another with a TossAnim, and play a
291  * sound effect. The ThrowObjectEffect is constructed with uninitialized
292  * parameters and isn't started until start_anim() is called.
293  */
294 class ThrowObjectEffect : public Effect {
295 protected:
296  ObjManager *obj_manager;
297  NuvieAnim *anim; // TossAnim
298 // *sfx;
299  MapCoord start_at, stop_at; // start_at -> stop_at
300  Obj *throw_obj; // object being thrown
301  const Tile *throw_tile; // graphic to use (default is object's tile)
302  uint16 throw_speed; // used in animation
303  uint16 degrees; // rotation of tile
304  uint8 stop_flags; // TossAnim blocking flags
305 
306 public:
308  ~ThrowObjectEffect() override { }
309 
310  void hit_target(); // stops effect
311  void start_anim();
312 
313  uint16 callback(uint16 msg, CallBack *caller, void *data) override = 0;
314 };
315 
316 
317 /* Drop an object from an actor's inventory. Object is removed from the actor
318  * after starting the effect, and added to the map when the effect is complete.
319  * Effect speed is gametype-defined.
320  */
322  Actor *drop_from_actor;
323 public:
324  DropEffect(Obj *obj, uint16 qty, Actor *actor, MapCoord *drop_loc);
325 
326  void hit_target();
327 
328  void get_obj(Obj *obj, uint16 qty);
329  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
330 };
331 
332 #define MISSILE_DEFAULT_SPEED 200
333 #define MISSILE_HIT_TARGET TOSS_TO_BLOCKING
334 #define MISSILE_HIT_OBJECTS (TOSS_TO_BLOCKING|TOSS_TO_OBJECT)
335 #define MISSILE_HIT_ACTORS (TOSS_TO_BLOCKING|TOSS_TO_ACTOR)
336 #define MISSILE_HIT_ALL (TOSS_TO_BLOCKING|TOSS_TO_OBJECT|TOSS_TO_ACTOR)
337 
338 /* Throw a missile towards a target location. If the target is an actor or
339  * object, it will be hit for the requested damage. If the target is an empty
340  * map location, the object will be added to the map. The missile always stops
341  * if hitting a blocking tile.
342  *
343  * Decide in the attack logic, before constructing this, whether or not it was
344  * successful, and use the appropriate constructor. You can set the effect to
345  * hit any actors or objects in the way if the attack missed.
346  */
348  ActorManager *actor_manager;
349 
350  uint16 hit_damage; // hp taken off actor/object hit by missile
351  Actor *hit_actor;
352  Obj *hit_obj;
353 
354 public:
355  MissileEffect(uint16 tile_num, uint16 obj_n, const MapCoord &source,
356  const MapCoord &target, uint8 dmg, uint8 intercept = MISSILE_HIT_TARGET, uint16 speed = MISSILE_DEFAULT_SPEED);
357 
358  void init(uint16 tile_num, uint16 obj_n, const MapCoord &source,
359  const MapCoord &target, uint32 dmg, uint8 intercept, uint32 speed);
360  void hit_target();
361  void hit_blocking();
362  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
363 };
364 
365 #if 0
366 /* Throw an object and bring it back.
367  */
368 class BoomerangEffect : public ThrowObjectEffect {
369 // I might even add an arc from the center line for a cool effect.
370 };
371 
372 
373 /* Cycle or modify the game palette in some way.
374  */
375 class PaletteEffect : public TimedEffect {
376 // palette effects are created from child classes (new BlackPotionEffect();)
377 // ...and these can include SFX like any other effect
378 // but PaletteEffect is not abstract (new PaletteEffect(timing & color params...);)
379 };
380 
381 
382 #endif
383 
384 
385 /* For sleeping at inns. Fade-out, advance time, and fade-in.
386  */
387 class SleepEffect : public Effect {
388  TimedAdvance *timer; // timed event
389  uint8 stop_hour, stop_minute; // sleep until this time
390  Std::string stop_time;
391 public:
392  SleepEffect(Std::string until);
393  SleepEffect(uint8 to_hour);
394  ~SleepEffect() override;
395 
396  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
397  void delete_self();
398 };
399 
400 
401 typedef enum { FADE_PIXELATED, FADE_CIRCLE, FADE_PIXELATED_ONTOP } FadeType;
402 typedef enum { FADE_IN, FADE_OUT } FadeDirection;
403 
404 /* Manipulate the MapWindow for two types of fades. One is a stippled-like fade
405  * that draws pixels to random locations on the screen until completely flooded
406  * with a set color. The other changes the ambient light until fully black.
407  */
408 class FadeEffect : public TimedEffect {
409 protected:
410  static FadeEffect *current_fade; // do nothing if already active
411 
412  MapWindow *map_window;
413  Screen *screen; // for PIXELATED, the overlay is blitted to the screen...
414  Common::Rect *viewport; // ...at the MapWindow coordinates set here
415  Graphics::ManagedSurface *overlay; // this is what gets blitted
416 
417  FadeType fade_type; // PIXELATED[_ONTOP] or CIRCLE
418  FadeDirection fade_dir; // IN (removing color) or OUT (adding color)
419  uint32 fade_speed; // meaning of this depends on fade_type
420  uint8 pixelated_color; // color from palette that is being faded to/from
421  Graphics::ManagedSurface *fade_from; // image being faded from or to (or nullptr if coloring)
422  uint16 fade_x, fade_y; // start fade from this point (to fade_from size)
423 
424  uint32 evtime, prev_evtime; // time of last message to callback()
425  uint32 pixel_count, colored_total; // number of pixels total/colored
426  uint16 fade_iterations; // number of times we've updated the fade effect
427 
428 public:
429  FadeEffect(FadeType fade, FadeDirection dir, uint32 color = 0, uint32 speed = 0);
430  FadeEffect(FadeType fade, FadeDirection dir, Graphics::ManagedSurface *capture, uint32 speed = 0);
431  FadeEffect(FadeType fade, FadeDirection dir, Graphics::ManagedSurface *capture, uint16 x, uint16 y, uint32 speed = 0);
432  ~FadeEffect() override;
433  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
434 
435  bool pixelated_fade_out();
436  bool pixelated_fade_in();
437  bool circle_fade_out();
438  bool circle_fade_in();
439 
440  void delete_self();
441 
442 protected:
443  void init(FadeType fade, FadeDirection dir, uint32 color, Graphics::ManagedSurface *capture, uint16 x, uint16 y, uint32 speed);
444  void init_pixelated_fade();
445  void init_circle_fade();
446 
447  inline bool find_free_pixel(uint32 &rnum, uint32 pixel_count);
448  uint32 pixels_to_check();
449  bool pixelated_fade_core(uint32 pixels_to_check, sint16 fade_to);
450 // inline uint32 get_random_pixel(uint16 center_thresh = 0);
451 };
452 
453 
454 /* Front-end to FadeEffect that fades in, and resumes game.
455  */
456 class GameFadeInEffect : public FadeEffect {
457 public:
458  GameFadeInEffect(uint32 color);
459  ~GameFadeInEffect() override;
460  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
461 };
462 
463 
464 /* Captures an image of the MapWindow without an object, then places the object
465  * on the map and fades to the new image. (or the opposite if FADE_OUT is used)
466  */
467 class FadeObjectEffect : public Effect {
468  ObjManager *obj_manager;
469  Obj *fade_obj;
470  FadeDirection fade_dir;
471 public:
472  FadeObjectEffect(Obj *obj, FadeDirection dir);
473  ~FadeObjectEffect() override;
474  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
475 };
476 
477 
478 /* Do a blocking fade-to (FADE_OUT) from a captured image of the game area, to
479  * the active game area. (transparent) This is used for vanish or morph effects.
480  */
481 #define VANISH_WAIT true
482 #define VANISH_NOWAIT false
483 class VanishEffect : public Effect {
484  bool input_blocked;
485 public:
486  VanishEffect(bool pause_user = VANISH_NOWAIT);
487  ~VanishEffect() override;
488  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
489 };
490 
491 class TileFadeEffect : public TimedEffect {
492  //TileAnim *anim;
493  //Tile *to_tile;
494  //Tile *anim_tile;
495  Actor *actor;
496  //uint8 color_from, color_to;
497  bool inc_reverse;
498  uint16 spd;
499 
500  uint16 num_anim_running;
501 public:
502  TileFadeEffect(const MapCoord &loc, Tile *from, Tile *to, FadeType type, uint16 speed);
503  //TileFadeEffect(MapCoord loc, Tile *from, uint8 color_from, uint8 color_to, bool reverse, uint16 speed);
504  TileFadeEffect(Actor *a, uint16 speed);
505  ~TileFadeEffect() override;
506  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
507 
508 protected:
509  void add_actor_anim();
510  void add_fade_anim(const MapCoord &loc, Tile *tile);
511  void add_tile_anim(const MapCoord &loc, Tile *tile);
512  void add_obj_anim(Obj *obj);
513 };
514 
516  Actor *actor;
517  Obj *obj;
518  uint8 color;
519  bool reverse;
520  uint16 fade_speed;
521 
522  uint16 num_anim_running;
523 public:
524  TileBlackFadeEffect(Actor *a, uint8 fade_color, uint16 speed);
525  TileBlackFadeEffect(Obj *o, uint8 fade_color, uint16 speed);
526  ~TileBlackFadeEffect() override;
527  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
528 protected:
529  void init(uint8 fade_color, uint16 speed);
530  void add_actor_anim();
531  void add_obj_anim(Obj *o);
532  void add_tile_anim(const MapCoord &loc, Tile *tile);
533 };
534 
535 /* Briefly modify the mapwindow colors, disable map-blacking and player
536  * movement for a few seconds, then enable both.
537  */
538 class XorEffect : public TimedEffect {
539  MapWindow *map_window;
540  uint32 length;
541  Graphics::ManagedSurface *capture; // this is what gets blitted
542 
543  void xor_capture(uint8 mod);
544  void init_effect();
545 
546 public:
547  /* eff_ms=length of visual effect */
548  XorEffect(uint32 eff_ms);
549  ~XorEffect() override { }
550 
551  /* Called by the timer between each effect stage. */
552  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
553 };
554 
555 /* Briefly modify the mapwindow colors, disable map-blacking and player
556  * movement for a few seconds, then enable both.
557  */
559  MapWindow *map_window;
560  uint8 state; // 0=start, 1=eff1, 2=eff2, 3=x-ray, 4=complete
561  uint32 start_length, eff1_length, eff2_length, xray_length;
562  Graphics::ManagedSurface *capture; // this is what gets blitted
563  Obj *potion; // allows effect to call usecode and delete object
564 
565  void xor_capture(uint8 mod);
566  void init_effect();
567 
568 public:
569  /* eff_ms=length of visual effect; delay_ms=length of x-ray effect */
570  U6WhitePotionEffect(uint32 eff_ms, uint32 delay_ms, Obj *callback_obj = nullptr);
571  ~U6WhitePotionEffect() override { }
572 
573  /* Called by the timer between each effect stage. */
574  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
575 };
576 
577 
578 class XRayEffect : public TimedEffect {
579  uint32 xray_length;
580  void init_effect();
581 
582 public:
583  /* eff_ms=length of x-ray effect */
584  XRayEffect(uint32 eff_ms);
585  ~XRayEffect() override { }
586 
587  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
588 };
589 
590 /* Pause the game, create an effect, and wait for user input to continue. */
591 class PauseEffect: public Effect {
592 public:
593  /* Called by the Effect handler when input is available. */
594  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
595  virtual void delete_self() {
596  Effect::delete_self();
597  }
598  PauseEffect();
599  ~PauseEffect() override { }
600 };
601 
602 /* Gather text from scroll input then continue. */
603 class TextInputEffect: public Effect {
604  Std::string input;
605 public:
606  /* Called by the Effect handler when input is available. */
607  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
608  TextInputEffect(const char *allowed_chars, bool can_escape);
609  ~TextInputEffect() override { }
610  Std::string get_input() {
611  return input;
612  }
613 };
614 
615 class WizardEyeEffect: public Effect {
616 public:
617  /* Called by the Effect handler when input is available. */
618  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
619  virtual void delete_self() {
620  Effect::delete_self();
621  }
622  WizardEyeEffect(const MapCoord &location, uint16 duration);
623  ~WizardEyeEffect() override { }
624 };
625 
626 /* colors for PeerEffect */
627 const uint8 peer_tilemap[4] = {
628  0x0A, // GROUND/PASSABLE
629  0x09, // WATER
630  0x07, // WALLS/BLOCKED
631  0x0C // DANGER/DAMAGING
632 };
633 
634 #define PEER_TILEW 4
635 const uint8 peer_tile[PEER_TILEW * PEER_TILEW] = {
636  0, 1, 0, 1,
637  1, 0, 1, 0,
638  0, 1, 0, 1,
639  1, 0, 1, 0
640 };
641 
642 /* Display an overview of the current area in the MapWindow. Any new actions
643  * cancel the effect and return to the prompt.
644  * (area is 48x48 tiles around the player, regardless of MapWindow size)
645  */
646 class PeerEffect : public PauseEffect {
647  MapWindow *map_window;
648  Graphics::ManagedSurface *overlay; // this is what gets blitted
649  Obj *gem; // allows effect to call usecode and delete object
650  MapCoord area; // area to display (top-left corner)
651  uint8 tile_trans; // peer_tile transparency mask (0 or 1)
652  uint16 map_pitch;
653 
654  inline void blit_tile(uint16 x, uint16 y, uint8 c);
655  inline void blit_actor(Actor *actor);
656  inline uint8 get_tilemap_type(uint16 wx, uint16 wy, uint8 wz);
657  void fill_buffer(uint8 *mapbuffer, uint16 x, uint16 y);
658  void peer();
659 
660 public:
661  PeerEffect(uint16 x, uint16 y, uint8 z, Obj *callback_obj = 0);
662  ~PeerEffect() override { }
663  void init_effect();
664  void delete_self() override;
665 };
666 
667 class WingStrikeEffect : public Effect {
668 protected:
669 
670  Actor *actor;
671 
672 public:
673  WingStrikeEffect(Actor *target_actor);
674 
675  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
676 };
677 
678 class HailStormEffect : public Effect {
679 public:
680  HailStormEffect(const MapCoord &target);
681 
682  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
683 };
684 
685 #define EFFECT_PROCESS_GUI_INPUT true
686 
687 /* Run an effect asynchronously and keep updating the world until the effect completes. */
688 class AsyncEffect : public Effect {
689 protected:
690  Effect *effect;
691  bool effect_complete;
692 
693 public:
694  AsyncEffect(Effect *e);
695  ~AsyncEffect() override;
696  void run(bool process_gui_input = false);
697  uint16 callback(uint16 msg, CallBack *caller, void *data) override;
698 };
699 
700 } // End of namespace Nuvie
701 } // End of namespace Ultima
702 
703 #endif
Definition: managed_surface.h:51
Definition: vector.h:39
Definition: map_window.h:73
Definition: actor.h:178
Definition: effect.h:483
Definition: effect.h:578
Definition: obj.h:84
Definition: effect.h:456
Definition: usecode.h:151
Definition: effect.h:558
Definition: effect_manager.h:34
Definition: effect.h:204
Definition: effect.h:121
Definition: rect.h:144
Definition: atari-screen.h:60
Definition: effect.h:155
Definition: effect.h:247
Definition: actor_manager.h:42
Definition: timed_event.h:209
Definition: effect.h:591
Definition: screen.h:41
Definition: effect.h:226
Definition: detection.h:27
Definition: effect.h:467
Definition: effect.h:603
Definition: effect.h:67
Definition: call_back.h:50
Definition: effect.h:387
Definition: string.h:30
Definition: effect.h:105
Definition: effect.h:347
Definition: map.h:84
Definition: effect.h:294
Definition: effect.h:515
Definition: effect.h:646
Definition: effect.h:235
Definition: obj_manager.h:75
Definition: effect.h:172
Definition: effect.h:408
Definition: anim_manager.h:112
Definition: effect.h:321
Definition: timed_event.h:231
Definition: effect.h:615
Definition: tile_manager.h:113
Definition: effect.h:688
Definition: effect.h:667
Definition: effect.h:538
Definition: game.h:73
Definition: effect.h:678
Definition: effect.h:491