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/
/*
 * anchor.cpp
 *   Magical anchors
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * 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
 *
 */
#include "mud.h"

//*********************************************************************
//						Anchor
//*********************************************************************

Anchor::Anchor() {
	reset();
}

Anchor::Anchor(bstring a, const Player* player) {
	reset();
	alias = a;
	bind(player);
}

Anchor::~Anchor() {
	if(mapmarker)
		delete mapmarker;
}

//*********************************************************************
//						getRoom
//*********************************************************************

CatRef Anchor::getRoom() const { return(room); }

//*********************************************************************
//						setRoom
//*********************************************************************

void Anchor::setRoom(CatRef r) { room = r; }

//*********************************************************************
//						getMapMarker
//*********************************************************************

const MapMarker* Anchor::getMapMarker() const { return(mapmarker); }

//*********************************************************************
//						getAlias
//*********************************************************************

bstring Anchor::getAlias() const { return(alias); }

//*********************************************************************
//						getRoomName
//*********************************************************************

bstring Anchor::getRoomName() const { return(roomName); }

//*********************************************************************
//						reset
//*********************************************************************

void Anchor::reset() {
	alias = roomName = "";
	mapmarker = 0;
}

//*********************************************************************
//						bind
//*********************************************************************

void Anchor::bind(const Player* player) {

	if(player->inUniqueRoom())
		bind(player->getConstUniqueRoomParent());
	else
		bind(player->getConstAreaRoomParent());
}
void Anchor::bind(const UniqueRoom* uRoom) {
	roomName = uRoom->getName();
	room = uRoom->info;
}
void Anchor::bind(const AreaRoom* aRoom) {
	roomName = aRoom->area->getTile(
			aRoom->area->getTerrain(0, &aRoom->mapmarker, 0, 0, 0, true), false
		)->getName().c_str();
	if(mapmarker)
		delete mapmarker;
	mapmarker = new MapMarker;
	*mapmarker = *&aRoom->mapmarker;
}

//*********************************************************************
//						is
//*********************************************************************

bool Anchor::is(const BaseRoom* room) const {
	const UniqueRoom* uRoom = room->getAsConstUniqueRoom();
	if(uRoom)
		return(is(uRoom));
	else
		return(is(room->getAsConstAreaRoom()));
}
bool Anchor::is(const Player* player) const {
	if(player->inUniqueRoom())
		return(is(player->getConstUniqueRoomParent()));
	else
		return(is(player->getConstAreaRoomParent()));
}
bool Anchor::is(const UniqueRoom* uRoom) const {
	return(room.id && room == uRoom->info);
}
bool Anchor::is(const AreaRoom* aRoom) const {
	return(mapmarker && *mapmarker == *&aRoom->mapmarker);
}

//*********************************************************************
//						operator=
//*********************************************************************

Anchor& Anchor::operator=(const Anchor& a) {
	alias = a.alias;
	roomName = a.roomName;
	room = a.room;
	if(a.mapmarker) {
		if(mapmarker)
			delete mapmarker;
		mapmarker = new MapMarker;
		*mapmarker = *a.mapmarker;
	}
	return(*this);
}

//*********************************************************************
//						load
//*********************************************************************

void Anchor::load(xmlNodePtr curNode) {
	xmlNodePtr childNode = curNode->children;

	while(childNode) {
		if(NODE_NAME(childNode, "Alias")) xml::copyToBString(alias, childNode);
		else if(NODE_NAME(childNode, "RoomName")) xml::copyToBString(roomName, childNode);
		else if(NODE_NAME(childNode, "Room")) room.load(childNode);
		else if(NODE_NAME(childNode, "MapMarker")) {
			mapmarker = new MapMarker;
			mapmarker->load(childNode);
		}

		childNode = childNode->next;
	}
}

//*********************************************************************
//						save
//*********************************************************************

void Anchor::save(xmlNodePtr curNode) const {
	xml::newStringChild(curNode, "Alias", alias);
	xml::newStringChild(curNode, "RoomName", roomName);
	room.save(curNode, "Room", false);
	if(mapmarker) {
		xmlNodePtr childNode = xml::newStringChild(curNode, "MapMarker");
		mapmarker->save(childNode);
	}
}