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/
/*
 * playerTitle.cpp
 *	 Player titles
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * 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"
#include "commands.h"
#include "login.h"

//*********************************************************************
//						PlayerTitle
//*********************************************************************

PlayerTitle::PlayerTitle() {
	male = "";
	female = "";
}

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

void PlayerTitle::load(xmlNodePtr rootNode) {
	xmlNodePtr curNode = rootNode->children;
	while(curNode) {
			 if(NODE_NAME(curNode, "Female")) xml::copyToBString(female, curNode);
		else if(NODE_NAME(curNode, "Male")) xml::copyToBString(male, curNode);
		curNode = curNode->next;
	}
}

//*********************************************************************
//						getTitle
//*********************************************************************

bstring PlayerTitle::getTitle(bool sexMale) const {
	return(sexMale ? male : female);
}

//*********************************************************************
//						getTitle
//*********************************************************************

bstring getTitle(const std::map<int, PlayerTitle*>& titles, int lvl, bool male, bool ignoreCustom) {
	std::map<int, PlayerTitle*>::const_iterator it;
	if(lvl < 1)
		lvl = 1;
	if(lvl > MAXALVL)
		lvl = MAXALVL;
	while(	lvl > 1 && (
				(it = titles.find(lvl)) == titles.end() ||
				(	ignoreCustom &&
					(*it).second->getTitle(male) == "[custom]"
				)
			)
	)
		lvl--;
	it = titles.find(lvl);
	return((*it).second->getTitle(male));
}

bstring DeityData::getTitle(int lvl, bool male, bool ignoreCustom) const {
	return(::getTitle(titles, lvl, male, ignoreCustom));
}

bstring PlayerClass::getTitle(int lvl, bool male, bool ignoreCustom) const {
	return(::getTitle(titles, lvl, male, ignoreCustom));
}

//********************************************************************
//				titlePunctuation
//********************************************************************

bool titlePunctuation(char c) {
	switch(c) {
	case ' ':
	case '/':
	case '\'':
	case '-':
		return(true);
	default:
		return(false);
	}
}

//********************************************************************
//				cmdTitle
//********************************************************************

int cmdTitle(Player* player, cmd* cmnd) {
	double	punctuation=0;
	bstring title = getFullstrText(cmnd->fullstr, 1);

	if(player->flagIsSet(P_CANNOT_CHOOSE_CUSTOM_TITLE)) {
		player->print("You have lost the privilege of choosing a custom title.\n");
		return(0);
	}
	if(!player->flagIsSet(P_CAN_CHOOSE_CUSTOM_TITLE)) {
		player->print("You cannot currently choose a custom title.\n");
		return(0);
	}
	if(cmnd->num < 2) {
		player->print("Please enter a title.\n");
		return(0);
	}

	for(size_t i = 0; i<title.length(); i++) {
		if(!titlePunctuation(title[i]) && !isalpha(title[i])) {
			player->print("Sorry, ""%c"" cannot be used in your title.\n", title[i]);
			return(0);
		}
		if(titlePunctuation(title[i]))
			punctuation++;
	}

	if(title.length() < 4) {
		player->print("Title must be atleast 4 characters.\n");
		return(0);
	}

	punctuation = punctuation / (float)title.length();
	if(punctuation > 0.25) {
		player->print("This title has too much punctuation.\n");
		return(0);
	}

	player->print("Your new title: %s\n", title.c_str());
	player->print("Is this acceptable? (Y/N)\n");

	player->setTempTitle(title);
	player->getSock()->setState(CON_CONFIRM_TITLE);
	return(0);
}

//*********************************************************************
//						doTitle
//*********************************************************************

void doTitle(Socket* sock, bstring str) {
	Player* player = sock->getPlayer();

	if(low(str[0]) == 'y') {
		player->print("You are now known as %s the %s.\n", player->getCName(), player->getTempTitle().c_str());
		if(!player->isStaff()) {
			broadcast("^y%s the %s is now known as %s the %s.", player->getCName(),
					player->getTitle().c_str(), player->getCName(), player->getTempTitle().c_str());

			sendMail(gConfig->getReviewer(), player->getName() + " has chosen the title " + player->getTempTitle() + ".\n");
		}

		player->setTitle(player->getTempTitle());
		player->clearFlag(P_CAN_CHOOSE_CUSTOM_TITLE);
	} else
		player->print("Aborted.\n");

	player->setTempTitle("");
	sock->setState(CON_PLAYING);
}

//*********************************************************************
//						cmdSurname
//*********************************************************************

int cmdSurname(Player* player, cmd* cmnd) {
	int		nonalpha=0;
	unsigned int i=0;
	bool	illegalNonAlpha=false;

	if(!player->ableToDoCommand())
		return(0);

	if(player->flagIsSet(P_NO_SURNAME)) {
		player->print("You have lost the privilege of choosing a surname.\n");
		return(0);
	}

	if(player->flagIsSet(P_CHOSEN_SURNAME) && !player->isCt()) {
		player->print("You've already chosen your surname.\n");
		return(0);
	}

	if(player->getLevel() < SURNAME_LEVEL && !player->isStaff()) {
		player->print("You must be level %d to choose a surname.\n", SURNAME_LEVEL);
		return(0);
	}

	if(cmnd->num < 2) {
		player->print("Syntax: surname <surname>\n");
		return(0);
	}


	if(strlen(cmnd->str[1]) > 14) {
		player->print("Your surname may only be a max of 14 characters long.\n");
		return(0);
	}

	if(strlen(cmnd->str[1]) < 3) {
		player->print("Your surname must be at least 3 characters in length.\n");
		return(0);
	}

	for(i=0; i< strlen(cmnd->str[1]); i++) {
		if(!isalpha(cmnd->str[1][i])) {
			nonalpha++;
			if(cmnd->str[1][i] != '\'' && cmnd->str[1][i] != '-')
				illegalNonAlpha = true;
		}

	}

	if(illegalNonAlpha) {
		player->print("The only non-alpha characters allowed in surnames are ' and -.\n");
		return(0);
	}


	if(nonalpha && strlen(cmnd->str[1]) < 6) {
		player->print("Your surname must be at least 6 characters in order to contain a - or '.\n");
		return(0);
	}


	if(nonalpha > 1) {
		player->print("Your surname may not have more than one non-alpha character.\n");
		return(0);
	}

	for(i=0; i < strlen(cmnd->str[1]); i++) {
		if(!isalpha(cmnd->str[1][i]) && cmnd->str[1][i] != '\'' && cmnd->str[1][i] != '-') {
			player->print("Your surname must be alphabetic.\n");
			player->print("It may only contain the non-alpha characters ' and -.\n");
			return(0);
		}
	}

	if(cmnd->str[1][0] == '\'' || cmnd->str[1][0] == '-') {
		player->print("The first character of your surname must be a letter.\n");
		return(0);
	}

	if(	cmnd->str[1][strlen(cmnd->str[1])-1] == '\'' ||
		cmnd->str[1][strlen(cmnd->str[1])-1] == '-' ||
		cmnd->str[1][strlen(cmnd->str[1])-2] == '\'' ||
		cmnd->str[1][strlen(cmnd->str[1])-2] == '-'
	) {
		player->print("The last two characters of your surname must be letters.\n");
		return(0);
	}

	lowercize(cmnd->str[1], 1);

	player->setSurname(cmnd->str[1]);

	player->printColor("^WNote that profane or otherwise idiotic surnames, as well as\n");
	player->printColor("idiotic combinations of name and surname, will not be tolerated.^x\n\n");
	player->print("Your full name will be %s %s.\n", player->getCName(), player->getSurname().c_str());
	player->print("Is this acceptable?(Y/N)?\n");

	player->getSock()->setState(CON_CONFIRM_SURNAME);
	return(0);
}

//*********************************************************************
//						doSurname
//*********************************************************************

void doSurname(Socket* sock, bstring str) {
	if(low(str[0]) == 'y') {
		sock->print("You are now known as %s %s.\n", sock->getPlayer()->getCName(), sock->getPlayer()->getSurname().c_str());

		if(!sock->getPlayer()->isStaff()) {
			broadcast("### %s is now known as %s %s.", sock->getPlayer()->getCName(), sock->getPlayer()->getCName(),
				sock->getPlayer()->getSurname().c_str());

			sendMail(gConfig->getReviewer(), (bstring)sock->getPlayer()->getName() + " has chosen the surname " + sock->getPlayer()->getSurname() + ".\n");
		}

		sock->getPlayer()->setFlag(P_CHOSEN_SURNAME);

	} else
		sock->print("Aborted.\n");

	sock->setState(CON_PLAYING);
}