|
mkRPG
|
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 ¶m) const; 00636 virtual int getParamMax(const QString ¶m) const; 00645 virtual void setParamMin(const QString ¶m, int min); 00654 virtual void setParamMax(const QString ¶m, int max); 00663 virtual void setParamDomain(const QString ¶m, int min, int max); 00672 virtual int getParam(const QString ¶m) const; 00681 virtual void setParam(const QString ¶m, int value); 00689 virtual bool hasParam(const QString ¶m) const; 00694 virtual QList<QString> params() const; 00699 virtual void renameParam(const QString ¶m, const QString &newParam); 00707 virtual void addParam(const QString ¶m, int value = 0, int min = 0, int max = 100); 00715 virtual void removeParam(const QString ¶m); 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 ¶m) const; 00994 virtual bool isRedefiniedParam(const QString ¶m) const; 01000 virtual int getParamMin(const QString ¶m) const; 01010 virtual int getParamMax(const QString ¶m) const; 01020 virtual void setParam(const QString ¶m, int value); 01025 virtual int getParam(const QString ¶m) const; 01031 virtual bool hasParam(const QString ¶m) 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
1.7.6.1