roh/conf.old/area/
roh/config/code/python/
roh/config/game/area/
roh/config/game/signs/
roh/help/dmhelp/
roh/help/help/
roh/log/
roh/log/staff/
roh/monsters/ocean/
roh/objects/misc/
roh/objects/ocean/
roh/player/
roh/rooms/area/1/
roh/rooms/misc/
roh/rooms/ocean/
roh/src-2.47e/
/*
 * 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-2012 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 UniqueRoom;
class AreaRoom;
class Fishing;

#include "track.h"
#include "wanderInfo.h"
#include "location.h"
#include "exits.h"

typedef std::list<Exit*> ExitList;

class BaseRoom: public Container {
protected:
	void BaseDestroy();
	bstring	version;	// What version of the mud this object was saved under
	bool tempNoKillDarkmetal;

public:
	//xtag	*first_ext;		// Exits
	ExitList exits;

	char	misc[64]; 		// miscellaneous space

public:
	BaseRoom();
	virtual ~BaseRoom() {};
//	virtual bool operator< (const MudObject& t) const = 0;

	void readExitsXml(xmlNodePtr curNode);
	bool delExit(bstring dir);
	bool delExit(Exit *exit);
	void clearExits();

	bool isSunlight() const;
	// handles darkmetal and unique
	void killMortalObjectsOnFloor();
	void killMortalObjects(bool floor=true);
	void killUniques();
	void setTempNoKillDarkmetal(bool noKillDarkmetal);
	void scatterObjects();

	bool isCombat() const;
	bool isConstruction() const;

	int saveExitsXml(xmlNodePtr curNode) const;


	Monster* getGuardingExit(const Exit* exit, const Player* player) 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() 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;
	bool isOutlawSafe() const;
	bool isPkSafe() const;
	bool isFastTick() const;


	virtual bool flagIsSet(int flag) const = 0;
//	virtual void setFlag(int flag) = 0;
	virtual Size getSize() const = 0;
	bool hasRealmBonus(Realm realm) const;
	bool hasOppositeRealmBonus(Realm realm) const;
	WanderInfo* getWanderInfo();
	void expelPlayers(bool useTrapExit, bool expulsionMessage, bool expelStaff);

	bstring fullName() const;
	bstring getVersion() const;
	void setVersion(bstring v);
	int whatTraining(int extra=0) const;

	virtual const Fishing* getFishing() const = 0;

	bool pulseEffects(time_t t);

	void addEffectsIndex();
	bool removeEffectsIndex();
	bool needsEffectsIndex() const;


	void print(Socket* ignore, const char *fmt, ...);
	void print(Socket* ignore1, Socket* ignore2, const char *fmt, ...);

private:
	void doPrint(bool showTo(Socket*), Socket* ignore1, Socket* ignore2, const char *fmt, va_list ap);
};


class UniqueRoom: public BaseRoom {
public:
	UniqueRoom();
	~UniqueRoom();
	bool operator< (const UniqueRoom& t) const;

	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;
	bool canPortHere(const Creature* creature=0) 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);

	bool swap(Swap s);
	bool swapIsInteresting(Swap s) const;
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);

	bstring getFishingStr() const;
	void setFishing(bstring id);
	const Fishing* getFishing() const;
};

class AreaRoom: public BaseRoom {
public:
	AreaRoom(Area *a, const MapMarker *m=0);
	~AreaRoom();
	bool operator< (const AreaRoom& t) const;

	void reset();
	WanderInfo* getRandomWanderInfo();
	Size getSize() const;

	bool	canDelete();
	void	recycle();
	bool	updateExit(bstring dir);
	void	updateExits();
	bool	isInteresting(const Player *viewer) const;
	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	spawnHerbs();

	bool flagIsSet(int flag) const;
	void setFlag(int flag);

	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);

	bool swap(Swap s);
	bool swapIsInteresting(Swap s) const;
protected:
	bool	needsCompass;
	bool	decCompass;
	bool	stayInMemory;
};


#endif /*ROOMS_H_*/