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/
/*
 * catRef.cpp
 *	 CatRef object
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * 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"

//*********************************************************************
//						CatRef
//*********************************************************************

CatRef::CatRef() {
	clear();
	if(gConfig)
		setArea(gConfig->defaultArea);
	else
		setArea("misc");
}

//*********************************************************************
//						setDefault
//*********************************************************************

void CatRef::setDefault(const Creature* target) {
	clear();
	setArea(gConfig->defaultArea);

	if(target) {
		if(target->inUniqueRoom()) {
			setArea(target->getConstUniqueRoomParent()->info.area);
		} else if(target->inAreaRoom()) {
			const CatRefInfo* cri = gConfig->getCatRefInfo("area", target->getConstAreaRoomParent()->area->id, true);
			if(cri)
				setArea(cri->getArea());
		}
	}
}

//*********************************************************************
//						clear
//*********************************************************************

void CatRef::clear() {
	area = "";
	id = 0;
}

//*********************************************************************
//						operators
//*********************************************************************

CatRef& CatRef::operator=(const CatRef& cr) {
	area = cr.area;
	id = cr.id;
	return(*this);
}

bool CatRef::operator==(const CatRef& cr) const {
	return(area == cr.area && id == cr.id);
}
bool CatRef::operator!=(const CatRef& cr) const {
	return(!(*this == cr));
}

//*********************************************************************
//						rstr
//*********************************************************************

// version of string for reloading
bstring CatRef::rstr() const {
	std::ostringstream oStr;
	oStr << area << "." << id;
	return(oStr.str());
}

//*********************************************************************
//						str
//*********************************************************************

bstring CatRef::str(bstring current, char color) const {
	std::ostringstream oStr;
	// if we're in an area already, we can chop off some text because they
	// already know what the area is
	if(	id &&
		area != "" &&
		(current == "" || area != current)
	) {
		if(color)
			oStr << "^" << color << area << ":^x" << id;
		else
			oStr << id << " - " << area;
	} else
		oStr << id;
	return(oStr.str());
}

//*********************************************************************
//						setArea
//*********************************************************************

void CatRef::setArea(bstring c) {
	if(c.getLength() > 20)
		c = c.left(20);
	area = c.toLower();
}

//*********************************************************************
//						isArea
//*********************************************************************

bool CatRef::isArea(bstring c) const {
	return(area == c);
}

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

void CatRef::load(xmlNodePtr curNode) {
	xml::copyPropToBString(area, curNode, "Area");
	xml::copyToNum(id, curNode);
}

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

xmlNodePtr CatRef::save(xmlNodePtr curNode, const char* childName, bool saveNonZero, int pos) const {
	if(!saveNonZero && !id)
		return(NULL);
	curNode = xml::newNumChild(curNode, childName, id);
	xml::newProp(curNode, "Area", area.c_str());
	if(pos)
		xml::newNumProp(curNode, "Num", pos);
	return(curNode);
}