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/
/*
 * wanderInfo.cpp
 *	 Random monster wandering info
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * Permission to use, modify and distribute is granted via the
 *  Creative Commons - Attribution - Non Commercia4 - 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"

//*********************************************************************
//						WanderInfo
//*********************************************************************

WanderInfo::WanderInfo() {
	traffic = 0;
}

short WanderInfo::getTraffic() const { return(traffic); }
void WanderInfo::setTraffic(short t) { traffic = MAX(0, MIN(100, t)); }

//*********************************************************************
//						getRandom
//*********************************************************************
// This function used to be weighted - it would check 0-9 and if an entry didn't
// exist, no monster would come. If we pick a random entry and the list size is
// less than 10, then we have increased traffic.

CatRef WanderInfo::getRandom() const {
	std::map<int, CatRef>::const_iterator it;
	CatRef cr;
	int	i=0;

	if(!random.size())
		return(cr);

	// past the end
	it = random.end();
	// the last element
	it--;

	if(it == random.begin())
		return(cr);

	// pick a random element, adding weight if <9
	i = (*it).first;
	i = mrand(0, i < 9 ? 9 : i);

	it = random.find(i);
	if(it != random.end())
		cr = (*it).second;
	return(cr);
}

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

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

	while(childNode) {
			 if(NODE_NAME(childNode, "Traffic")) xml::copyToNum(traffic, childNode);
		else if(NODE_NAME(childNode, "RandomMonsters")) {
			loadCatRefArray(childNode, random, "Mob", NUM_RANDOM_SLOTS);
		}
		childNode = childNode->next;
	}
}

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

void WanderInfo::save(xmlNodePtr curNode) const {
	xml::saveNonZeroNum(curNode, "Traffic", traffic);
	saveCatRefArray(curNode, "RandomMonsters", "Mob", random, NUM_RANDOM_SLOTS);
}


//*********************************************************************
//						show
//*********************************************************************

void WanderInfo::show(const Player* player, bstring area) const {
	std::map<int, CatRef>::const_iterator it;
	Monster* monster=0;

	player->print("Traffic: %d%%\n", traffic);
	player->print("Random Monsters:\n");
	for(it = random.begin(); it != random.end() ; it++) {
		loadMonster((*it).second, &monster);

		player->printColor("^c%2d) ^x%14s ^c::^x %s\n", (*it).first+1,
			(*it).second.str("", 'c').c_str(), monster ? monster->getCName() : "");

		if(monster) {
			free_crt(monster);
			monster = 0;
		}
	}
}