/* * rooms.h * Header file for Exit / BaseRoom / AreaRoom / Room classes * ____ _ * | _ \ ___ __ _| |_ __ ___ ___ * | |_) / _ \/ _` | | '_ ` _ \/ __| * | _ < __/ (_| | | | | | | \__ \ * |_| \_\___|\__,_|_|_| |_| |_|___/ * * 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-2009 Jason Mitchell, Randi Mitchell * Contributions by Tim Callahan, Jonathan Hseu * Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman * */ #ifndef ROOMS_H_ #define ROOMS_H_ // define some limits #define NUM_RANDOM_SLOTS 50 #define NUM_PERM_SLOTS 50 class Room; class AreaRoom; class Fishing; class Track { public: Track(); void load(xmlNodePtr curNode); void save(xmlNodePtr curNode) const; short getNum() const; Size getSize() const; bstring getDirection() const; void setNum(short n); void setSize(Size s); void setDirection(bstring dir); protected: short num; Size size; bstring direction; }; class WanderInfo { public: WanderInfo(); CatRef getRandom() const; void load(xmlNodePtr curNode); void save(xmlNodePtr curNode) const; void show(const Player* player, bstring area="") const; std::map<int, CatRef> random; short getTraffic() const; void setTraffic(short t); protected: short traffic; }; #include "area.h" class Location { public: Location(); void save(xmlNodePtr rootNode, bstring name) const; void load(xmlNodePtr curNode); bstring str() const; bool operator==(const Location& l) const; bool operator!=(const Location& l) const; BaseRoom* loadRoom(Player* player=0) const; short getId() const; CatRef room; MapMarker mapmarker; }; #define EXIT_KEY_LENGTH 20 class Exit: public MudObject { public: Exit(); ~Exit(); int readFromXml(xmlNodePtr rootNode, BaseRoom* room); int saveToXml(xmlNodePtr parentNode) const; void escapeText(); short getLevel() const; bstring getOpen() const; short getTrap() const; short getKey() const; bstring getKeyArea() const; short getToll() const; bstring getPassPhrase() const; short getPassLanguage() const; Size getSize() const; bstring getEnter() const; void setLevel(short lvl); void setOpen(bstring o); void setTrap(short t); void setKey(short k); void setKeyArea(bstring k); void setToll(short t); void setPassPhrase(bstring phrase); void setPassLanguage(short lang); void setSize(Size s); void setEnter(bstring e); bstring blockedByStr(char color, bstring spell, bstring effectName, bool detectMagic, bool canSee) const; Exit* getReturnExit(const BaseRoom* parent, BaseRoom** targetRoom) const; void doDispelMagic(BaseRoom* parent); bool isWall(bstring name) const; bool isConcealed(const Creature* viewer=0) const; // Effects bool isEffected(const bstring& effect) const; bool hasPermEffect(const bstring& effect) const; EffectInfo* getEffect(const bstring& effect) const; bool addEffect(const bstring& effect, void* applier, ApplyFrom aFrom, bool show, BaseRoom* rParent, const Creature* owner=0); bool addEffect(EffectInfo* newEffect, bool show, BaseRoom* rParent); bool addEffect(const bstring& effect, long duration, int strength, bool show, BaseRoom* rParent, const Creature* owner=0); bool addPermEffect(const bstring& effect, int strength, bool show, BaseRoom* rParent); bool removeEffect(const bstring& effect, bool show, bool remPerm, BaseRoom* rParent); bool removeEffect(EffectInfo* toDel, bool show, BaseRoom* rParent); bool removeOppositeEffect(const EffectInfo *effect, BaseRoom* rParent); bool pulseEffects(time_t t, BaseRoom* rParent); bool doEffectDamage(Creature* target); void addEffectReturnExit(bstring effect, long duration, int strength, const Creature* owner); void removeEffectReturnExit(bstring effect, BaseRoom* rParent); protected: short level; bstring open; // output on open short trap; // Exit trap short key; // more keys when short bstring keyArea; short toll; // exit toll cost bstring passphrase; short passlang; Size size; bstring enter; public: // almost ready to be made protected - just need to get // loading of flags done char flags[16]; // Max exit flags 128 now struct lasttime ltime; // Timed open/close char desc_key[3][EXIT_KEY_LENGTH]; // Exit keys char clanFlags[4]; // clan allowed flags char classFlags[4]; // class allowed flags char raceFlags[4]; // race allowed flags short randExit[5]; // Randomly chosen room Location target; Effects effects; bool flagIsSet(int flag) const; void setFlag(int flag); void clearFlag(int flag); bool toggleFlag(int flag); bool raceRestrict(const Creature* creature) const; bool classRestrict(const Creature* creature) const; bool clanRestrict(const Creature* creature) const; bool alignRestrict(const Creature* creature) const; }; class BaseRoom: public MudObject { protected: void BaseDestroy(); bstring version; // What version of the mud this object was saved under public: xtag *first_ext; // Exits otag *first_obj; // Items ctag *first_mon; // Monsters ctag *first_ply; // Players char misc[64]; // miscellaneous space Effects effects; public: BaseRoom(); virtual ~BaseRoom() {}; void readExitsXml(xmlNodePtr curNode); bool isSunlight() const; // handles darkmetal and unique void killMortalObjectsOnFloor(); void killMortalObjects(bool floor=true); void killUniques(); bool isCombat() const; Creature* findCreature(Creature* searcher, const cmd* cmnd, int num=1); Creature* findCreaturePython(Creature* searcher, const bstring& name, bool monFirst = true, bool firstAggro = false, bool exactMatch = false ); Creature* findCreature(Creature* searcher, const bstring& name, const int num, bool monFirst = true, bool firstAggro = false, bool exactMatch = false); Creature* findCreature(Creature* searcher, const bstring& name, const int num, bool monFirst, bool firstAggro, bool exactMatch, int& retVal); Monster* findMonster(Creature* searcher, const cmd* cmnd, int num=1); Monster* findMonster(Creature* searcher, const bstring& name, const int num, bool firstAggro = false, bool exactMatch = false); Player* findPlayer(Creature* searcher, const cmd* cmnd, int num=1); Player* findPlayer(Creature* searcher, const bstring& name, const int num, bool exactMatch = false); MudObject* findTarget(Creature* searcher, const cmd* cmnd, int num=1); MudObject* findTarget(Creature* searcher, const bstring& name, const int num, bool monFirst= true, bool firstAggro = false, bool exactMatch = false); MudObject* findTarget(Creature* searcher, const bstring& name, const int num, bool monFirst, bool firstAggro, bool exactMatch, int& retVal); Monster* getGuardingExit(const Exit* exit) const; void addExit(Exit *ext); void checkExits(); bool deityRestrict(const Creature* creature) const; int maxCapacity() const; bool isFull() const; int countVisPly() const; int countCrt() const; Monster* getTollkeeper(); void wake(bstring str, bool noise) const; bool isMagicDark() const; bool isNormalDark() const; bool isUnderwater() const; bool isOutdoors() const; bool isDropDestroy() const; bool magicBonus() const; bool isForest() const; bool vampCanSleep(Socket* sock) const; int getMaxMobs() const; int dmInRoom() const; void arrangeExits(Player* player=0); bool isWinter() const; Room *getUniqueRoom(); AreaRoom *getAreaRoom(); const Room *getConstUniqueRoom() const; const AreaRoom *getConstAreaRoom() const; virtual bool flagIsSet(int flag) const = 0; bool hasRealmBonus(Realm realm) const; bool hasOppositeRealmBonus(Realm realm) const; WanderInfo* getWanderInfo(); void expelPlayers(); bstring fullName() const; bstring getVersion() const; void setVersion(bstring v); int whatTraining(int extra=0) const; virtual const Fishing* getFishing() const = 0; // Effects bool isEffected(const bstring& effect) const; bool hasPermEffect(const bstring& effect) const; EffectInfo* getEffect(const bstring& effect) const; bool addEffect(const bstring& effect, void* applier, ApplyFrom aFrom, bool show, const Creature* owner=0); bool addEffect(EffectInfo* newEffect, bool show = true); bool addEffect(const bstring& effect, long duration, int strength, bool show, const Creature* owner=0); bool addPermEffect(const bstring& effect, int strength = 1, bool show = true); bool removeEffect(const bstring& effect, bool show = true, bool remPerm = true); bool removeEffect(EffectInfo* toDel, bool show = true); bool removeOppositeEffect(const EffectInfo *effect); bool pulseEffects(time_t t); void addEffectsIndex(); bool removeEffectsIndex(); bool needsEffectsIndex() const; }; class Room: public BaseRoom { public: Room(); ~Room(); void escapeText(); int readFromXml(xmlNodePtr rootNode); int saveToXml(xmlNodePtr rootNode, int permOnly) const; int saveToFile(int permOnly, LoadType saveType=LS_NORMAL); bstring getShortDescription() const; bstring getLongDescription() const; short getLowLevel() const; short getHighLevel() const; short getMaxMobs() const; short getTrap() const; CatRef getTrapExit() const; short getTrapWeight() const; short getTrapStrength() const; bstring getFaction() const; long getBeenHere() const; short getTerrain() const; int getRoomExperience() const; Size getSize() const; void setShortDescription(const bstring& desc); void setLongDescription(const bstring& desc); void appendShortDescription(const bstring& desc); void appendLongDescription(const bstring& desc); void setLowLevel(short lvl); void setHighLevel(short lvl); void setMaxMobs(short m); void setTrap(short t); void setTrapExit(CatRef t); void setTrapWeight(short weight); void setTrapStrength(short strength); void setFaction(bstring f); void incBeenHere(); void setTerrain(short t); void setRoomExperience(int exp); void setSize(Size s); protected: char flags[16]; // Max flags - 128 bstring fishing; bstring short_desc; // Descriptions bstring long_desc; short lowLevel; // Lowest level allowed in short highLevel; // Highest level allowed in short maxmobs; short trap; CatRef trapexit; short trapweight; short trapstrength; bstring faction; long beenhere; // # times room visited int roomExp; Size size; public: CatRef info; Track track; WanderInfo wander; // Random monster info std::map<int, crlasttime> permMonsters; // Permanent/reappearing monsters std::map<int, crlasttime> permObjects; // Permanent/reappearing items char last_mod[24]; // Last staff member to modify room. struct lasttime lasttime[16]; // For timed room things, like darkness spells. char lastModTime[32]; // date created (first *saved) char lastPly[32]; char lastPlyTime[32]; public: int getWeight(); void validatePerms(); void addPermCrt(); void addPermObj(); void destroy(); bool flagIsSet(int flag) const; void setFlag(int flag); void clearFlag(int flag); bool toggleFlag(int flag); bool moveRoom(CatRef origin, CatRef target); bstring getFishingStr() const; void setFishing(bstring id); const Fishing* getFishing() const; }; class AreaRoom: public BaseRoom { public: AreaRoom(Area *a, const MapMarker *m=0); ~AreaRoom(); void reset(); WanderInfo* getRandomWanderInfo(); bool canDelete(); void recycle(); bool updateExit(bstring dir); void updateExits(); bool isInteresting(Player *looker); bool isRoad() const; bool isWater() const; bool canSave() const; void save(Player* player=0) const; void load(xmlNodePtr rootNode); CatRef getUnique(Creature* creature, bool skipDec=false); void setMapMarker(const MapMarker* m); bool moveRoom(CatRef origin, CatRef target); bool spawnHerbs(); bool flagIsSet(int flag) const; const Fishing* doGetFishing(short y, short x) const; const Fishing* getFishing() const; // any attempt to enter this area room (from any direction) // will lead you to a unique room CatRef unique; Area *area; MapMarker mapmarker; bool getNeedsCompass() const; bool getDecCompass() const; bool getStayInMemory() const; void setNeedsCompass(bool need); void setDecCompass(bool dec); void setStayInMemory(bool stay); protected: bool needsCompass; bool decCompass; bool stayInMemory; }; #endif /*ROOMS_H_*/