/*
* 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-2009 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 <ext/hash_map> // Gnu gcc specific, switch to <map>
// allow the gnu hash_map to work on std::string
namespace __gnu_cxx {
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
}
//// this is what we would love:
typedef __gnu_cxx::hash_multimap<bstring, bstring> MultiMap; // change to std::map
class MudObject;
class Player;
class Monster;
class Room;
class Object;
class Hooks {
public:
Hooks();
void save(xmlNodePtr curNode, const char* name) const;
void load(xmlNodePtr curNode);
void addHook(const bstring& event, const bstring& code);
bool execute(const bstring& event, MudObject* target=0) const;
void setParent(MudObject* target);
private:
MultiMap hooks;
MudObject* parent;
};
class MudObject {
public:
char name[80];
Hooks hooks;
void moCopy(const MudObject& mo);
public:
virtual ~MudObject() {};
void moReset();
void moDestroy();
Monster* getMonster();
Player* getPlayer();
Object* getObject();
Room* getRoom();
const Monster* getConstMonster() const;
const Player* getConstPlayer() const;
const Object* getObject() const;
const Room* getRoom() const;
const char* getName();
};
#endif