00001 00008 #ifndef _EFFECTS_H 00009 #define _EFFECTS_H 00010 00011 #include "main.h" 00012 #include "object.h" 00013 00014 #include <map> 00015 #include <list> 00016 using namespace std; 00017 00023 class Effect { 00024 public: 00025 00033 typedef map<Object*, EffectHandler> RecList; 00034 00039 Effect( void ) : _sender( NULL ) { } 00040 00045 Effect( Actor *sender ) : _sender( sender ) { } 00046 00056 virtual void pre_apply( Object *who ); 00057 00063 virtual void apply_to( Object *who ); 00064 00069 virtual void apply_to_all( void ); 00070 00074 virtual RecList& get_receiver_list( void ) = 0; 00075 00082 virtual void add_handler(Object *who); 00083 00087 virtual void clear_handlers(); 00088 00094 EffectHandler Effect::find_handler( Object *who ) 00095 { return ( get_receiver_list() )[ who ]; } 00096 00100 Actor *get_sender( void ) { return _sender; } 00101 00102 const Vec3 get_origin( void ); 00103 00104 protected: 00105 00106 Actor *_sender; 00107 }; 00108 00109 #define TO_EFFECT(pobj, type) (dynamic_cast<type*>(pobj)) 00110 00121 class RegisterEffect { 00122 public: 00123 typedef list<Effect*> EffectList; 00124 typedef EffectList::iterator iterator; 00125 00134 RegisterEffect( Effect *effect ); 00135 00139 static iterator begin( void ); 00140 00144 static iterator end( void ); 00145 }; 00146 00147 #endif // header guard