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/
/*
 * mudobject.h
 *   The parent MudObject class
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * 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 MUDOBJECTS_H
#define MUDOBJECTS_H

#include <map>
#include <set>
//#include <boost/unordered_map.hpp> // Gnu gcc specific, switch to <map>
//#include <unordered_map>

// allow the gnu hash_map to work on bstring
//namespace std {
//   template<> struct hash< bstring > {
//	  size_t operator()(const bstring& s) const {
//		 return hash< const char* >()( s.c_str() );
//	  }
//   }; // gcc.gnu.org/ml/libstdc++/2002-04/msg00107.html
//}

//typedef std::unordered_map<bstring, bstring> MultiMap;  // change to std::map
class MudObject;
class Player;
class Monster;
class UniqueRoom;
class Object;
class EffectInfo;
class Creature;

#include "hooks.h"

class MudObject {
private:
	bstring name;

public:
	void setName(bstring newName);
	const bstring& getName() const;
	const char* getCName() const;

protected:
	virtual void removeFromSet();
	virtual void addToSet();

public:
	bool isRegistered();
	void setRegistered();
	void setUnRegistered();

	bool registerMo();
	bool unRegisterMo();

	virtual void registerContainedItems();
	virtual void unRegisterContainedItems();

protected:
	bool registered;


public:
	//char name[80];
	bstring id;		// Unique identifier
	Hooks hooks;
	void moCopy(const MudObject& mo);


public:
	MudObject();
	virtual ~MudObject();
	void moReset();
	void moDestroy();

	void setId(bstring newId, bool handleParentSet = true);

	MudObject* getAsMudObject();
	Monster* getAsMonster();
	Player* getAsPlayer();
	Creature* getAsCreature();
	Object* getAsObject();
	UniqueRoom *getAsUniqueRoom();
	AreaRoom *getAsAreaRoom();
	BaseRoom* getAsRoom();
	Exit* getAsExit();

	const Monster* getAsConstMonster() const;
	const Player* getAsConstPlayer() const;
	const Creature* getAsConstCreature() const;
	const Object* getAsConstObject() const;
	const UniqueRoom *getAsConstUniqueRoom() const;
	const AreaRoom *getAsConstAreaRoom() const;
	const BaseRoom* getAsConstRoom() const;
	const Exit* getAsConstExit() const;

	bool isRoom() const;
	bool isUniqueRoom() const;
	bool isAreaRoom() const;
	bool isObject() const;
	bool isPlayer() const;
	bool isMonster() const;
	bool isCreature() const;
	bool isExit() const;

	const bstring& getId() const;
	bstring getIdPython() const;
	virtual void validateId() {};
	Effects effects;



// Effects
	bool isEffected(const bstring& effect, bool exactMatch = false) const;
	bool isEffected(EffectInfo* effect) const;
	bool hasPermEffect(const bstring& effect) const;
	EffectInfo* getEffect(const bstring& effect) const;
	EffectInfo* getExactEffect(const bstring& effect) const;
	//EffectInfo* addEffect(const bstring& effect, MudObject* applier = NULL, bool show = true, const Creature* owner=0, bool keepApplier=false);
	EffectInfo* addEffect(EffectInfo* newEffect, bool show = true, bool keepApplier=false);
	EffectInfo* addEffect(const bstring& effect, long duration = -2, int strength = -2, MudObject* applier = NULL, bool show = true, const Creature* owner=0, bool keepApplier=false);
	EffectInfo* addPermEffect(const bstring& effect, int strength = 1, bool show = true);
	bool removeEffect(const bstring& effect, bool show = true, bool remPerm = true, MudObject* fromApplier=0);
	bool removeEffect(EffectInfo* toDel, bool show = true);
	bool removeOppositeEffect(const EffectInfo *effect);
	virtual bool pulseEffects(time_t t) = 0;

	bool equals(MudObject* other);

	void readCreatures(xmlNodePtr curNode);
	void readObjects(xmlNodePtr curNode);

// Delayed Actions
protected:
	std::list<DelayedAction*> delayedActionQueue;
public:
	void interruptDelayedActions();
	void removeDelayedAction(DelayedAction* action);
	void addDelayedAction(DelayedAction* action);
	void clearDelayedActions();
};


#endif