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

//*********************************************************************
//						Money
//*********************************************************************

Money::Money() {
	zero();
}

// Create some new money with n amount of Coin c
Money::Money(unsigned long n, Coin c) {
	zero();
	set(n,c);
}
//*********************************************************************
//						load
//*********************************************************************

void Money::load(xmlNodePtr curNode) {
	zero();
	xml::loadNumArray<unsigned long>(curNode, m, "Coin", MAX_COINS+1);
}

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

void Money::save(const char* name, xmlNodePtr curNode) const {
	saveULongArray(curNode, name, "Coin", m, MAX_COINS+1);
}

//*********************************************************************
//						isZero
//*********************************************************************

bool Money::isZero() const {
	for(Coin i = MIN_COINS; i < MAX_COINS; i = (Coin)((int)i + 1))
		if(m[i])
			return(false);
	return(true);
}

//*********************************************************************
//						zero
//*********************************************************************

void Money::zero() { ::zero(m, sizeof(m)); }

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

bool Money::operator==(const Money& mn) const {
	for(Coin i = MIN_COINS; i < MAX_COINS; i = (Coin)((int)i + 1))
		if(m[i] != mn.get(i))
			return(false);
	return(true);
}

bool Money::operator!=(const Money& mn) const {
	return(!(*this==mn));
}

unsigned long Money::operator[](Coin c) const { return(m[c]); }

//*********************************************************************
//						get
//*********************************************************************

unsigned long Money::get(Coin c) const { return(m[c]); }

//*********************************************************************
//						add
//*********************************************************************

void Money::add(unsigned long n, Coin c) { set(m[c] + n, c); }

void Money::add(Money mn) {
	for(Coin i = MIN_COINS; i < MAX_COINS; i = (Coin)((int)i + 1))
		add(mn[i], i);
}

//*********************************************************************
//						sub
//*********************************************************************

void Money::sub(unsigned long n, Coin c) { set(m[c] - n, c); }

void Money::sub(Money mn) {
	for(Coin i = MIN_COINS; i < MAX_COINS; i = (Coin)((int)i + 1))
		sub(mn[i], i);
}

//*********************************************************************
//						set
//*********************************************************************

void Money::set(unsigned long n, Coin c) { m[c] = MIN(2000000000, n); }

void Money::set(Money mn) {
	for(Coin i = MIN_COINS; i < MAX_COINS; i = (Coin)((int)i + 1))
		set(mn[i], i);
}

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

bstring Money::str() const {
	bool found=false;
	std::stringstream oStr;
	oStr.imbue(std::locale(""));

	for(Coin i = MIN_COINS; i < MAX_COINS; i = (Coin)((int)i + 1)) {
		if(m[i]) {
			if(found)
				oStr << ", ";
			found = true;
			oStr << m[i] << " " << coinNames(i).toLower() << " coin" << (m[i] != 1 ? "s" : "");
		}
	}

	if(!found)
		oStr << "0 coins";

	return(oStr.str());
}

//*********************************************************************
//						coinNames
//*********************************************************************

bstring Money::coinNames(Coin c) {
	switch(c) {
	case COPPER:
		return("Copper");
	case SILVER:
		return("Silver");
	case GOLD:
		return("Gold");
	case PLATINUM:
		return("Platinum");
	case ALANTHIUM:
		return("Alanthium");
	default:
		break;
	}
	return("");
}