mkRPG
src/editor/Game/gameobject.h
Go to the documentation of this file.
00001 #ifndef GAMEOBJECT_H
00002 #define GAMEOBJECT_H
00003 
00004 
00005 #include <QtGui>
00006 #include <assert.h>
00007 #include <algorithm>
00008 
00084 bool cleverComp(const QString &na, const QString &nb);  
00087 bool isValidName(const QString &n);                     
00091 #define UNUSED(p)                                                                                                                           
00095 #define TypeName(Type) virtual QString typeName() const{return QObject::tr(#Type);}                                                         
00101 #define C(Macro, init,Init,body, ...) Macro(init##body, Init##body, ##__VA_ARGS__)                                                          
00129 #define C0(Macro, init,Init,body) Macro(init##body, Init##body)                                                                             
00142 #define C1(Macro, init,Init,body, arg) Macro(init##body, Init##body, arg)                                                                   
00155 #define ProtectFlag(flag) reserved.insert(QString(#flag));                                                                                  
00161 #define SetFlag(flag, value) setFlag(#flag,value)                                                                                           
00177 #define FlagGetter(flag, Flag) inline bool is##Flag() const{return getFlag(#flag);}                                                         
00195 #define FlagSetter(flag, Flag) inline void set##Flag(bool flag){SetFlag(flag,flag); touch();}                                               
00208 #define Flag(flag, Flag) FlagGetter(flag, Flag) FlagSetter(flag, Flag)                                                                      
00222 #define ProtectParam(param) reserved.insert(QString(#param));                                                                               
00228 #define SetParam(param, value) setParam(#param,value)                                                                                       
00245 #define ParamGetter(param) inline int param() const{return getParam(#param);}                                                               
00261 #define ParamSetter(param, Param) inline void set##Param(int param##Value){SetParam(param,param##Value); touch();}                          
00274 #define ParamMGetter(param, Param, M) inline int param##M() const {return getParam##M(#param);}
00275 #define ParamMSetter(param, Param, M) void set##Param##M(int param##M) {setParam##M(#param, param##M);}
00276 #define ParamMin(param, Param) ParamMGetter(param, Param, Min) ParamMSetter(param, Param, Min)
00277 #define ParamMax(param, Param) ParamMGetter(param, Param, Max) ParamMSetter(param, Param, Max)
00278 #define ParamDom(param, Param) ParamMin(param,Param) ParamMax(param,Param)
00279 // faire les Setter/Getter (min, max);
00280 
00281 #define Param(param, Param) ParamGetter(param) ParamSetter(param, Param) ParamDom(param,Param)                                              
00295 #define AttrGetter(attr, Attr, Type) inline Type* attr() const{return a##Attr;}                                                             
00308 #define AttrFree(Attr) if(a##Attr) a##Attr->removeReference();                                                                              
00314 #define AttrLink(Attr) if(a##Attr) a##Attr->addReference();                                                                                 
00320 #define AttrSetter(attr, Attr, Type) inline void set##Attr(Type* new##Attr){AttrFree(Attr); a##Attr = new##Attr; AttrLink(Attr); touch();}  
00333 #define AttrDef(Attr, Type) private: Type* a##Attr = nullptr; public:                                                                       
00355 #define Attr(attr, Attr, Type) AttrDef(Attr, Type) AttrGetter(attr,Attr,Type) AttrSetter(attr, Attr, Type)                                  
00374 #define AttrT(type,Type) Attr(type, Type, Type)                                                                                             
00398 class Parameter
00399 {
00400 public:
00401     Parameter(int v = 0) : min(0), max(100){setValue(v);}
00402     Parameter(int min, int max, int v = 0): min(min), max(max){setValue(v);}
00403     Parameter(const Parameter &p) : Parameter(p.min, p.max, p.pValue){}
00404     void setValue(int v){pValue = std::min(std::max(min,v),max);}
00405     inline int value() const {return pValue;}
00406     void setMinimum(int m) {min = m; max = std::max(max,min); setValue(pValue);}
00407     inline int minimum() const {return min;}
00408     void setMaximum(int m) {max = m; min = std::min(max,min); setValue(pValue);}
00409     inline int maximum() const {return max;}
00410     void setDomain(int minVal, int maxVal) {min = minVal; max = std::max(maxVal,min); setValue(pValue);}
00411 
00412 private:
00413     int min, max;
00414     int pValue;
00415 };
00416 
00417 
00421 class Event
00422 {
00423 public:
00427     enum EventType{
00428         ParamChanged,
00429         FlagChanged,
00430         ObjectRemoved,
00431         ObjectAdded
00432     };
00433 
00434     Event(){}
00435     Event(const Event *e) : aType(e->aType){}
00436 
00437     QString typeName(){return "event";}
00438 private:
00439     EventType aType;
00440 };
00441 
00445 class Order
00446 {
00447 public:
00451     enum OrderType{
00452         ChangeParam,
00453         ChangeFlag,
00454         EmitEvent,
00455         ConditionalEvent,
00456         WatchDogEvent,
00457         SetTimer,
00458         SetObject
00459     };
00460 
00461     Order(){}
00462     Order(const Order *o) : aType(o->aType){}
00463 
00464     QString typeName(){return "order";}
00465 private:
00466     OrderType aType;
00467 };
00468 
00469 
00470 class GameObject;
00475 class Action
00476 {
00477 public:
00478     Action();
00479     ~Action();
00480     GameObject *emitter() const;
00481     void setEmitter(GameObject *emitter);
00482     const QString &event() const;
00483     void setEvent(const QString &event);
00484     const QList<QPair<GameObject*, QString>> &receivers() const;
00485     void addReceiver(GameObject *receiver, const QString &order);
00486     void removeReceiver(GameObject *receiver);
00487     void removeReceiver(GameObject *receiver, const QString &order);
00488 
00489     bool isValid() const;
00490 private:
00491     GameObject *aEmitter;
00492     QString aEvent;
00493     QList<QPair<GameObject*, QString>> aReceivers;
00494 };
00495 
00496 
00497 
00498 
00499 
00500 class Game;
00533 class GameObject
00534 {
00535 protected:
00536     GameObject(GameObject &parent);                                                             
00539     GameObject(Game *g = nullptr, GameObject *parent = nullptr);                                
00547 public:
00548     virtual ~GameObject();                                                                      
00552     TypeName(GameObject)
00553 
00554     inline int ident() const{return id;}                                                        
00559     virtual bool isEditable() const{return true;}                                               
00563     inline const QDateTime& lastInternalEdition() const{return lastEdit;}                       
00568     inline const QDateTime& lastChildrenEdition() const{return lastChildEdit;}                  
00573     inline const QDateTime& lastEdition() const{return std::max(lastEdit, lastChildEdit);}      
00579     void touch();                                                                               
00584     void addReference();                                                                        
00589     void removeReference();                                                                     
00595     void setParent(GameObject *p);                                                              
00600     inline GameObject* parent() const{return aParent;}                                          
00606     virtual void setName(const QString &n);                                                     
00611     const QString& name() const{return aName;}                                                  
00616     virtual GameObject* child(const int &id) const{return aChildren.value(id, nullptr);}        
00621     virtual QList<GameObject*> children() const{return aChildren.values();}                     
00627     virtual int getParamMin(const QString &param) const;                                        
00636     virtual int getParamMax(const QString &param) const;                                        
00645     virtual void setParamMin(const QString &param, int min);                                    
00654     virtual void setParamMax(const QString &param, int max);                                    
00663     virtual void setParamDomain(const QString &param, int min, int max);                        
00672     virtual int getParam(const QString &param) const;                                           
00681     virtual void setParam(const QString &param, int value);                                     
00689     virtual bool hasParam(const QString &param) const;                                          
00694     virtual QList<QString> params() const;                                                      
00699     virtual void renameParam(const QString &param, const QString &newParam);                    
00707     virtual void addParam(const QString &param, int value = 0, int min = 0, int max = 100);     
00715     virtual void removeParam(const QString &param);                                             
00725     virtual bool getFlag(const QString &flag) const;                                            
00734     virtual void setFlag(const QString &flag, bool enable);                                     
00742     virtual bool hasFlag(const QString &flag) const;                                            
00747     virtual QList<QString> flags() const;                                                       
00752     virtual void renameFlag(const QString &flag, const QString &newFlag);                       
00760     virtual void addFlag(const QString &flag, bool enable = true);                              
00768     virtual void removeFlag(const QString &flag);                                               
00779     virtual bool hasEvent(const QString &event) const;                                          
00784     virtual Event& getEvent(const QString &event) const;                                        
00793     virtual Event& addEvent(const QString &event);                                              
00801     virtual void removeEvent(const QString &event);                                             
00806     virtual QList<QString> events() const;                                                      
00811     virtual void renameEvent(const QString &order, const QString &newOrder);                    
00820     virtual bool hasOrder(const QString &order) const;                                          
00825     virtual Order& getOrder(const QString &order) const;                                        
00834     virtual Order& addOrder(const QString &order);                                              
00842     virtual void removeOrder(const QString &order);                                             
00847     virtual QList<QString> orders() const;                                                      
00852     virtual void renameOrder(const QString &order, const QString &newOrder);                    
00861     void addEmittedAction(Action *action);                                                      
00868     void removeEmittedAction(Action *action);                                                   
00875     void addReceivedAction(Action *action);                                                     
00882     void removeReceivedAction(Action *action);                                                  
00890     Game *getGame(){return game;}                                                               
00893 protected:
00894 
00895     void init(Game *g, GameObject *parent);                                                     
00900     virtual bool isValid() const{return id;}                                                    
00906     void copy(GameObject &obj);                                                                 
00910     virtual void addChild(GameObject *c);                                                       
00915     virtual void removeChild(GameObject *c);                                                    
00923     void childrenTouched(const QDateTime &d);                                                   
00926     QList<QString> filter(QList<QString> l) const;                                              
00930     GameObject *aParent;
00931     QMap<int, GameObject*> aChildren;
00932     Game* game;
00933     int nbRef;
00934     QMap<QString, Parameter> aParams;
00935     QMap<QString, bool> aFlags;
00936     QMap<QString, Event*> aEvents;
00937     QMap<QString, Order*> aOrders;
00938     QString aName;
00939     QString fileName;
00940     QDateTime lastEdit, lastChildEdit;
00941     QSet<QString> reserved;
00942     QList<Action*> aEmittedActions;
00943     QList<Action*> aReceivedActions;
00944 private:
00945     int id;
00946 
00947 };
00948 
00949 
00950 
00951 
00952 
00957 typedef QList<QPair<QString,QList<QString>>> HierarchicalAttr;
00958 
00959 
00971 class InheritableObject : public GameObject
00972 {
00973 protected:
00974     InheritableObject(GameObject &parent, InheritableObject *ancestor = nullptr);
00975 
00976 public:
00977     bool hasAncestor() const;                                       
00982     InheritableObject *ancestor();                                  
00988     virtual bool isInheritedParam(const QString &param) const;      
00994     virtual bool isRedefiniedParam(const QString &param) const;     
01000     virtual int getParamMin(const QString &param) const;            
01010     virtual int getParamMax(const QString &param) const;            
01020     virtual void setParam(const QString &param, int value);         
01025     virtual int getParam(const QString &param) const;               
01031     virtual bool hasParam(const QString &param) const;              
01037     virtual QList<QString> params() const;                          
01043     virtual QList<QString> properParams() const;                    
01049     HierarchicalAttr paramTree() const;                             
01056     virtual bool isInheritedFlag(const QString &flag) const;        
01062     virtual bool isRedefiniedFlag(const QString &flag) const;       
01068     virtual bool getFlag(const QString &flag) const;                
01074     virtual bool hasFlag(const QString &flag) const;                
01080     virtual QList<QString> flags() const;                           
01086     virtual QList<QString> properFlags() const;                     
01092     HierarchicalAttr flagTree() const;                              
01099     virtual bool isInheritedEvent(const QString &event) const;      
01105     virtual bool hasEvent(const QString &event) const;              
01111     virtual Event& getEvent(const QString &event) const;            
01117     virtual QList<QString> events() const;                          
01123     virtual QList<QString> properEvents() const;                    
01129     HierarchicalAttr eventTree() const;                             
01136     virtual bool isInheritedOrder(const QString &order) const;      
01142     virtual bool hasOrder(const QString &order) const;              
01148     virtual Order& getOrder(const QString &order) const;            
01154     virtual QList<QString> orders() const;                          
01160     virtual QList<QString> properOrders() const;                    
01166     HierarchicalAttr orderTree() const;                             
01173 protected:
01174 
01175     InheritableObject *aAncestor;
01176 
01177 private:
01178     static void removeLastRedondances(HierarchicalAttr &attr);
01179 };
01180 
01181 
01182 
01195 class DefaultTypes;
01200 class GameObjectType : public InheritableObject
01201 {
01202 protected:
01203     GameObjectType(DefaultTypes &parent);
01204     GameObjectType(GameObjectType &ancestor);
01205     virtual ~GameObjectType();
01206 public:
01207     const QList<GameObjectType *> &descendants() const; 
01210 private:
01211     void addDescendant(GameObjectType &type);
01212     void removeDescendant(GameObjectType &type);
01213     QList<GameObjectType*> descendantTypes;
01214     GameObjectType* ancestorType;
01215 };
01216 
01217 
01218 
01219 
01220 
01221 #endif // GAMEOBJECT_H
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Properties Defines