/* * Container.h * Classes to handle classes that can be containers or contained by a container * ____ _ * | _ \ ___ __ _| |_ __ ___ ___ * | |_) / _ \/ _` | | '_ ` _ \/ __| * | _ < __/ (_| | | | | | | \__ \ * |_| \_\___|\__,_|_|_| |_| |_|___/ * * Permission to use, modify and distribute is granted via the * Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License * http://creativecommons.org/licenses/by-nc-sa/3.0/ * * Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell * Contributions by Tim Callahan, Jonathan Hseu * Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman * */ #ifndef CONTAINER_H_ #define CONTAINER_H_ #include "mudObject.h" #include <set> class Player; class Monster; class Object; class Containable; class Container; class MudObject; class BaseRoom; class AreaRoom; class UniqueRoom; class EffectInfo; class cmd; struct PlayerPtrLess : public std::binary_function<const Player*, const Player*, bool> { bool operator()(const Player* lhs, const Player* rhs) const; }; struct MonsterPtrLess : public std::binary_function<const Monster*, const Monster*, bool> { bool operator()(const Monster* lhs, const Monster* rhs) const; }; struct ObjectPtrLess : public std::binary_function<const Object*, const Object*, bool> { bool operator()(const Object* lhs, const Object* rhs) const; }; typedef std::set<Player*, PlayerPtrLess> PlayerSet; typedef std::set<Monster*, MonsterPtrLess> MonsterSet; typedef std::set<Object*, ObjectPtrLess> ObjectSet; // Any container or containable item is a MudObject. Since an object can be both a container and containable... // make sure we use virtual MudObject as the parent to avoid the "dreaded" diamond class Container : public virtual MudObject { public: Container(); virtual ~Container() {}; PlayerSet players; MonsterSet monsters; ObjectSet objects; bool purge(bool includePets = false); bool purgeMonsters(bool includePets = false); bool purgeObjects(); Container* remove(Containable* toRemove); bool add(Containable* toAdd); void registerContainedItems(); void unRegisterContainedItems(); bool checkAntiMagic(Monster* ignore = 0); void doSocialEcho(bstring str, const Creature* actor, const Creature* target = null); void effectEcho(bstring fmt, const MudObject* actor = NULL, const MudObject* applier = null, Socket* ignore = null); // virtual bool flagIsSet(int flag) const = 0; // virtual void setFlag(int flag) = 0; // virtual bool isEffected(const bstring& effect) const = 0; // virtual bool isEffected(EffectInfo*) const = 0; void wake(bstring str, bool noise) const; bstring listObjects(const Player* player, bool showAll, char endColor ='x' ) const; // Find routines Creature* findCreaturePython(Creature* searcher, const bstring& name, bool monFirst = true, bool firstAggro = false, bool exactMatch = false ); Creature* findCreature(const Creature* searcher, const cmd* cmnd, int num=1) const; Creature* findCreature(const Creature* searcher, const bstring& name, const int num, bool monFirst = true, bool firstAggro = false, bool exactMatch = false) const; Creature* findCreature(const Creature* searcher, const bstring& name, const int num, bool monFirst, bool firstAggro, bool exactMatch, int& match) const; Monster* findMonster(const Creature* searcher, const cmd* cmnd, int num=1) const; Monster* findMonster(const Creature* searcher, const bstring& name, const int num, bool firstAggro = false, bool exactMatch = false) const; Monster* findMonster(const Creature* searcher, const bstring& name, const int num, bool firstAggro, bool exactMatch, int& match) const; Player* findPlayer(const Creature* searcher, const cmd* cmnd, int num=1) const; Player* findPlayer(const Creature* searcher, const bstring& name, const int num, bool exactMatch = false) const; Player* findPlayer(const Creature* searcher, const bstring& name, const int num, bool exactMatch, int& match) const; Object* findObject(const Creature *searcher, const cmd* cmnd, int val) const; Object* findObject(const Creature* searcher, const bstring& name, const int num, bool exactMatch = false) const; Object* findObject(const Creature* searcher, const bstring& name, const int num, bool exactMatch, int& match) const; MudObject* findTarget(const Creature* searcher, const cmd* cmnd, int num=1) const; MudObject* findTarget(const Creature* searcher, const bstring& name, const int num, bool monFirst= true, bool firstAggro = false, bool exactMatch = false) const; MudObject* findTarget(const Creature* searcher, const bstring& name, const int num, bool monFirst, bool firstAggro, bool exactMatch, int& match) const; }; class Containable : public virtual MudObject { public: Containable(); virtual ~Containable() {}; bool addTo(Container* container); Container* removeFrom(void); void setParent(Container* container); Container* getParent() const; // What type of parent are we contained in? bool inRoom() const; bool inUniqueRoom() const; bool inAreaRoom() const; bool inObject() const; bool inPlayer() const; bool inMonster() const; bool inCreature() const; BaseRoom* getRoomParent(); UniqueRoom* getUniqueRoomParent(); AreaRoom* getAreaRoomParent(); Object* getObjectParent(); Player* getPlayerParent(); Monster* getMonsterParent(); Creature* getCreatureParent(); const BaseRoom* getConstRoomParent() const; const UniqueRoom* getConstUniqueRoomParent() const; const AreaRoom* getConstAreaRoomParent() const; const Object* getConstObjectParent() const; const Player* getConstPlayerParent() const; const Monster* getConstMonsterParent() const; const Creature* getConstCreatureParent() const; protected: Container* parent; // Parent Container // Last parent is only used in removeFromSet and addToSet and should not be used anywhere else Container* lastParent; void removeFromSet(); void addToSet(); }; #endif /* CONTAINER_H_ */