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/
/*
 * cmd.cpp
 *   Handle player/pet input commands.
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * 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 "bstring.h"
#include "import.h"
#include "help.h"
#include "commands.h"
#include "dm.h"
#include <dirent.h>
#include "ships.h"
#include "unique.h"
#include "web.h"
#include "server.h"
#include "math.h"
#include "socials.h"

#include <sstream>
#include <iomanip>
#include <locale>
#include <iostream>
#include <fstream>
#include <boost/tokenizer.hpp>



int dmTest(Player* player, cmd* cmnd) {
    *player << gConfig->getProxyList();

	return(0);
}


int pcast(Player* player, cmd* cmnd) {
	int retVal = 0;

	const Spell* spell = gConfig->getSpell(cmnd->str[1], retVal);

	if(retVal == CMD_NOT_UNIQUE) {
		player->print("The command \"%s\" does not exist.\n", cmnd->str[0]);
		return(0);
	} else if(retVal == CMD_NOT_UNIQUE ) {
		player->print("Song name is not unique.\n");
		return(0);
	}

	if(!spell) {
		player->print("Error loading spell \"%s\"\n", cmnd->str[1]);
		return(0);
	}

	bstring args = getFullstrText(cmnd->fullstr, 2);
	MudObject *target = NULL;

	//target = player->getParent()->findTarget(cmnd->fullstr);

	gServer->runPython(spell->script, args, player, target);
	return(0);
}




//**********************************************************************
//						compileSocialList
//**********************************************************************

template<class Type>
void compileSocialList(std::map<bstring, bstring>& list, const std::map<bstring, Type>& cList) {
	bstring name = "";

	for(std::pair<bstring, Type> pp : cList) {
		ASSERTLOG(pp.second);
		Command* cmnd = pp.second;

		CrtCommand* cc = dynamic_cast<CrtCommand*>(cmnd);
		PlyCommand* pc = dynamic_cast<PlyCommand*>(cmnd);
		SocialCommand* sc = dynamic_cast<SocialCommand*>(cmnd);

		if(	(!cc || (int(*)(Creature*, cmd*))cc->fn != cmdAction) &&
			(!pc || (int(*)(Player*, cmd*))pc->fn != plyAction) &&
			!sc )
			continue;

		name = cmnd->getName();

		if(name == "vomjom" || name == "usagi" || name == "defenestrate")
			continue;

		list[name] = "";
	}

	return;
}

//**********************************************************************
//						writeSocialFile
//**********************************************************************
// Updates helpfiles for the game's socials.

bool Config::writeSocialFile() const {
	char	file[100], fileLink[100];
	std::map<bstring,bstring> list;
	std::map<bstring,bstring>::iterator it;

	sprintf(file, "%s/socials.txt", Path::Help);
	sprintf(fileLink, "%s/social.txt", Path::Help);

	// prepare to write the help file
	std::ofstream out(file);
	out.setf(std::ios::left, std::ios::adjustfield);
	out.imbue(std::locale(""));

	out << Help::loadHelpTemplate("socials");


	compileSocialList<PlyCommand*>(list, playerCommands);
	compileSocialList<CrtCommand*>(list, generalCommands);
	compileSocialList<SocialCommand*>(list, socials);


	int i = 0;
	for(it = list.begin(); it != list.end(); it++) {
		if(i && !(i%6))
			out << "\n";
		out << std::setw(13) << (*it).first;
		i++;
	}

	out << "\n";
	

	out << Help::loadHelpTemplate("socials.post");

	out.close();
	link(file, fileLink);
	return(true);
}

//**********************************************************************
//						compileCommandList
//**********************************************************************
// Updates helpfiles for the various game commands.

template<class Type>
std::map<bstring,bstring> compileCommandList(std::map<bstring, bstring>& list, int cls, std::map<bstring, Type>& cList) {
	char	line[100];

	for(std::pair<bstring, Type> pp : cList) {
		ASSERTLOG(pp.second);
		Command* cmd = pp.second;
		
		if(cmd->getDescription() == "")
			continue;
		if(	cls == BUILDER &&
			cmd->auth &&
			(bool(*)(const Creature*))cmd->auth != builderMob &&
			(bool(*)(const Creature*))cmd->auth != builderObj
		)
			continue;

		sprintf(line, " ^W%-19s^x %s\n", cmd->getName().c_str(), cmd->getDescription().c_str());
		list[cmd->getName()] = line;
	}

	return(list);
}

//**********************************************************************
//						writeCommandFile
//**********************************************************************
// Updates helpfiles for the various game commands.

void writeCommandFile(int cls, const char* path, const char* tpl) {
	char	file[100], fileLink[100];
	std::map<bstring,bstring> list;
	std::map<bstring,bstring> list2;
	std::map<bstring,bstring>::iterator it;

	sprintf(file, "%s/commands.txt", path);
	sprintf(fileLink, "%s/command.txt", path);

	// prepare to write the help file
	std::ofstream out(file);
	out.setf(std::ios::left, std::ios::adjustfield);
	out.imbue(std::locale(""));

	out << Help::loadHelpTemplate(tpl);


	if(cls == DUNGEONMASTER || cls == BUILDER) {
		compileCommandList<PlyCommand*>(list, cls, gConfig->staffCommands);
	} else {
		compileCommandList<PlyCommand*>(list, 0, gConfig->playerCommands);
		compileCommandList<CrtCommand*>(list, 0, gConfig->generalCommands);
		compileCommandList<SkillCommand*>(list, 0, gConfig->skillCommands);
	}

	for(it = list.begin(); it != list.end(); it++) {
		out << (*it).second;
	}

	out << "\n";
	out.close();
	link(file, fileLink);
}


//**********************************************************************
//						initCommands
//**********************************************************************
// everything on the staff array already checks isStaff - the listed
// authorization is an additional requirement to use the command.

bool Config::initCommands() {
// *************************************************************************************
// Staff Commands

	staffCommands["play"] = new PlyCommand("play", 			        100,	cmdPlay,			isCt,	"Play a song.");
	staffCommands["*cache"] = new PlyCommand("*cache",				100,	dmCache,			isDm,	"Show DNS cache.");
	staffCommands["*test"] = new PlyCommand("*test",				100,	dmTest,				isDm,	"");
	staffCommands["pcast"] = new PlyCommand("pcast",				100,	pcast,				isDm,	"");

	// channels
//	staffCommands["*s"] = new PlyCommand("*s",						100,	channel,			isCt,	"");
	staffCommands["*send"] = new PlyCommand("*send",				 10,	channel,			isCt,	"");
	staffCommands["dm"] = new PlyCommand("dm",						100,	channel,			isDm,	"");
	staffCommands["admin"] = new PlyCommand("admin",				100,	channel,			isDm,	"");
	staffCommands["dmrace"] = new PlyCommand("dmrace",				100,	channel,			isCt,	"Use specified race channel.");
	staffCommands["dmclass"] = new PlyCommand("dmclass",			100,	channel,			isCt,	"Use specified class channel.");
	staffCommands["dmcls"] = new PlyCommand("dmcls",				100,	channel,			isCt,	"");
	staffCommands["dmclan"] = new PlyCommand("dmclan",				100,	channel,			isCt,	"Use specified clan channel.");
	staffCommands["dmguild"] = new PlyCommand("dmguild",			100,	channel,			isCt,	"Use specified guild channel.");
	staffCommands["*msg"] = new PlyCommand("*msg",					100,	channel,			0,		"");

	// dm.c
	staffCommands["*reboot"] = new PlyCommand("*reboot",			100,	dmReboot,			isCt,	"Reboot the mud.");
	staffCommands["*inv"] = new PlyCommand("*inv",					100,	dmMobInventory,		0,		"");
	staffCommands["*sockets"] = new PlyCommand("*sockets",			100,	dmSockets,			isDm,	"Show all connected sockets.");
	staffCommands["*dmload"] = new PlyCommand("*dmload",			100,	dmLoad,				isDm,	"Reload configuration files.");
	staffCommands["*txtoncrash"] = new PlyCommand("*txtoncrash",	100,	dmTxtOnCrash,		isDm,	"Toggle whether the mud sends a text message when it crashes.");
	staffCommands["*dmsave"] = new PlyCommand("*dmsave",			100,	dmSave,				isDm,	"Resave configuration files.");
	staffCommands["*teleport"] = new PlyCommand("*teleport",		 10,	dmTeleport,			0,		"Teleport to rooms or players, or teleport players to each other.");
	//staffCommands["*t"] = new PlyCommand("*t",						100,	dmTeleport,			0,		"");
	staffCommands["*users"] = new PlyCommand("*users",				 10,	dmUsers,			isCt,	"See a list of connected users.");
	//staffCommands["*u"] = new PlyCommand("*u",						100,	dmUsers,			isCt,	"");
	staffCommands["*shutdown"] = new PlyCommand("*shutdown",		100,	dmShutdown,			isDm,	"Shut down the mud (may auto-restart).");
	staffCommands["*flushrooms"] = new PlyCommand("*flushrooms",	100,	dmFlushSave,		isDm,	"Flush rooms from memory.");
	staffCommands["*flushcrtobj"] = new PlyCommand("*flushcrtobj",	100,	dmFlushCrtObj,		0,		"Flush creatures and objects from memory.");
	staffCommands["*save"] = new PlyCommand("*save",				100,	dmResave,			0,		"Save the room, creature, or object.");
	staffCommands["*perm"] = new PlyCommand("*perm",				100,	dmPerm,				0,		"");
	//staffCommands["*i"] = new PlyCommand("*i",						100,	dmInvis,			0,		"");
	staffCommands["*invis"] = new PlyCommand("*invis",				 10,	dmInvis,			0,		"Toggle DM invis (only staff can see you).");
	staffCommands["*incog"] = new PlyCommand("*incog",				 20,	dmIncog,			0,		"");
	staffCommands["incog"] = new PlyCommand("incog",				100,	dmIncog,			0,		"Toggle incognito status (only people in the room can see you).");
	staffCommands["*ac"] = new PlyCommand("*ac",					100,	dmAc,				0,		"Show your Weapon/Defense/Armor and completely heal yourself.");
	staffCommands["*wipe"] = new PlyCommand("*wipe",				100,	dmWipe,				0,		"");
	staffCommands["*clear"] = new PlyCommand("*clear",				100,	dmDeleteDb,			isDm,	"");
	staffCommands["*gamestat"] = new PlyCommand("*gamestat",		100,	dmGameStatus,		isDm,	"Show configuration options.");
	staffCommands["*weather"] = new PlyCommand("*weather",			100,	dmWeather,			0,		"Show weather strings.");
	staffCommands["*questlist"] = new PlyCommand("*questlist",		100,	dmQuestList,		isCt,	"Show quests in memory.");
	staffCommands["*alchemylist"] = new PlyCommand("*alchemylist",	100,	dmAlchemyList,		isCt,	"Show the Alchemy List.");
	staffCommands["*clanlist"] = new PlyCommand("*clanlist",		100,	dmClanList,			isCt,	"Show clans in memory.");
	staffCommands["*bane"] = new PlyCommand("*bane",				500,	dmBane,				isDm,	"Crash the game");
	staffCommands["*dmhelp"] = new PlyCommand("*dmhelp",			 50,	dmHelp,				isCt,	"Access help files.");
	staffCommands["*bhelp"] = new PlyCommand("*bhelp",				 50,	bhHelp,				0,		"Access help files.");
	staffCommands["*fishing"] = new PlyCommand("*fishing",			100,	dmFishing,			0,		"View fishing lists.");
	staffCommands["*parameter"] = new PlyCommand("*parameter",		100,	dmParam,			isDm,	"");
	staffCommands["*outlaw"] = new PlyCommand("*outlaw",			100,	dmOutlaw,			isCt,	"Make a player an outlaw.");
	staffCommands["*broadcast"] = new PlyCommand("*broadcast",		 20,	dmBroadecho,		isCt,	"Broadcast a message to all players.");
	staffCommands["*gcast"] = new PlyCommand("*gcast",				100,	dmCast,				isCt,	"Cast a spell on all players.");
	staffCommands["*set"] = new PlyCommand("*set",					100,	dmSet,				0,		"Modify a room/object/exit/player/object/monster.");
	staffCommands["*log"] = new PlyCommand("*log",					100,	dmLog,				isCt,	"");
	staffCommands["*list"] = new PlyCommand("*list",				100,	dmList,				isCt,	"");
	staffCommands["*info"] = new PlyCommand("*info",				100,	dmInfo,				isCt,	"Show game info (includes some memory).");
	staffCommands["*md5"] = new PlyCommand("*md5",					100,	dmMd5,				isCt,	"Show md5 of input string.");
	staffCommands["*ids"] = new PlyCommand("*ids",					100,	dmIds,				isDm,	"Shows registered ids.");
	staffCommands["*status"] = new PlyCommand("*status",			 80,	dmStat,				0,		"Show info about a room/player/object/monster.");
	staffCommands["*sd"] = new PlyCommand("*sd",                    100,    dmStatDetail,       isCt,   "Show detailed information about a creature's stats.");


	// dmcrt.c
	staffCommands["*monster"] = new PlyCommand("*monster",			100,	dmCreateMob,		builderMob,	"Summon a monster.");
	staffCommands["*cname"] = new PlyCommand("*cname",				100,	dmCrtName,			builderMob,	"Rename a monster.");
	staffCommands["*possess"] = new PlyCommand("*possess",			100,	dmAlias,			isCt,	"Possess a monster.");
	staffCommands["*cfollow"] = new PlyCommand("*cfollow",			100,	dmFollow,			isDm,	"Make a monster follow you.");
	staffCommands["*attack"] = new PlyCommand("*attack",			100,	dmAttack,			builderMob,	"Make a monster attack a player/monster.");
	staffCommands["*enemy"] = new PlyCommand("*enemy",				100,	dmListEnemy,		isCt,	"Show the enemies of a monster.");
	staffCommands["*charm"] = new PlyCommand("*charm",				100,	dmListCharm,		isCt,	"Show the charm list of a player.");
	staffCommands["*wander"] = new PlyCommand("*wander",			100,	dmForceWander,		builderMob,	"Force a monster to wander away.");
	staffCommands["*balance"] = new PlyCommand("*balance",			 95,	dmBalance,			builderMob,	"Balance a monster to a certain level.");


	// dmobj.c
	staffCommands["*create"] = new PlyCommand("*create",			 20,	dmCreateObj,		builderObj,	"Summon an object.");
	staffCommands["*object"] = new PlyCommand("*object",			 20,	dmCreateObj,		builderObj,	"Summon an object.");
	staffCommands["*oname"] = new PlyCommand("*oname",				100,	dmObjName,			builderObj,	"Rename an object");
	staffCommands["*size"] = new PlyCommand("*size",				100,	dmSize,				builderObj,	"");
	staffCommands["*clone"] = new PlyCommand("*clone",				100,	dmClone,			builderObj,	"Create an armor set from a single piece of armor.");


	// dmply.c
	staffCommands["*force"] = new PlyCommand("*force",				 20,	dmForce,			isDm,	"Force a player to perform an action.");
	staffCommands["*spy"] = new PlyCommand("*spy",					100,	dmSpy,				isCt,	"Spy on a player.");
	staffCommands["*silence"] = new PlyCommand("*silence",			100,	dmSilence,			isCt,	"Toggle broadcast silence on a player.");
	staffCommands["*title"] = new PlyCommand("*title",				100,	dmTitle,			isCt,	"Set a title on a player.");
	staffCommands["*surname"] = new PlyCommand("*surname",			100,	dmSurname,			isCt,	"Set a surname on a player.");
	staffCommands["*group"] = new PlyCommand("*group",				100,	dmGroup,			isCt,	"See who is grouped with a player.");
	staffCommands["*dust"] = new PlyCommand("*dust",				100,	dmDust,				isCt,	"Permanently delete a player.");
	staffCommands["*tell"] = new PlyCommand("*tell",				100,	dmFlash,			isDm,	"Send a player a message.");
	staffCommands["*award"] = new PlyCommand("*award",				100,	dmAward,			isCt,	"Award a player roleplaying exp/gold.");
	staffCommands["*beep"] = new PlyCommand("*beep",				100,	dmBeep,				isDm,	"Make the player's terminal beep.");
	staffCommands["*advance"] = new PlyCommand("*advance",			100,	dmAdvance,			isDm,	"Change the player's level and adjust stats appropriately.");
	staffCommands["dmfinger"] = new PlyCommand("dmfinger",			100,	dmFinger,			isDm,	"fup an offline player's information.");
	staffCommands["*disconnect"] = new PlyCommand("*disconnect",	100,	dmDisconnect,		isCt,	"Disconnect a player.");
	staffCommands["*take"] = new PlyCommand("*take",				100,	dmTake,				isCt,	"Take an item from a player.");
	staffCommands["*remove"] = new PlyCommand("*remove",			100,	dmRemove,			isCt,	"Unequip and take an item from a player.");
	staffCommands["*put"] = new PlyCommand("*put",					100,	dmPut,				isCt,	"Put an item into a player's inventory.");
	staffCommands["*move"] = new PlyCommand("*move",				100,	dmMove,				isCt,	"Move and offline player.");
	staffCommands["*word"] = new PlyCommand("*word",				100,	dmWordAll,			isDm,	"Send all players to their recall room.");
	staffCommands["*pass"] = new PlyCommand("*pass",				100,	dmPassword,			isDm,	"Change a player's password.");
	staffCommands["*restore"] = new PlyCommand("*restore",			100,	dmRestorePlayer,	isDm,	"Restore a player's experience.");
	staffCommands["*bank"] = new PlyCommand("*bank",				100,	dmBank,				isCt,	"");
	staffCommands["*assets"] = new PlyCommand("*assets",			100,	dmInventoryValue,	isCt,	"");
	staffCommands["*proxy"] = new PlyCommand("*proxy",				100,	dmProxy,			isCt,	"Allow a player to double log.");
	staffCommands["*2x"] = new PlyCommand("*2x",					100,	dm2x,				isCt,	"Allow two accounts to double log.");
	staffCommands["*bug"] = new PlyCommand("*bug",					100,	dmBugPlayer,		isCt,	"Record a player's actions.");
	staffCommands["*kill"] = new PlyCommand("*kill",				100,	dmKillSwitch,		isDm,	"Kill a player.");
	staffCommands["*nomnom"] = new PlyCommand("*nomnom",			100,	dmKillSwitch,		isDm,	"Kill a player.");
	staffCommands["*combust"] = new PlyCommand("*combust",			100,	dmKillSwitch,		isDm,	"Kill a player.");
	staffCommands["*slime"] = new PlyCommand("*slime",				100,	dmKillSwitch,		isDm,	"Kill a player.");
	staffCommands["*gnat"] = new PlyCommand("*gnat",				100,	dmKillSwitch,		isDm,	"Kill a player.");
	staffCommands["*trip"] = new PlyCommand("*trip",				100,	dmKillSwitch,		isDm,	"Kill a player.");
	staffCommands["*crush"] = new PlyCommand("*crush",				100,	dmKillSwitch,		isDm,	"Kill a player.");
	staffCommands["*missile"] = new PlyCommand("*missile",			100,	dmKillSwitch,		isDm,	"Kill a player.");
	staffCommands["*bomb"] = new PlyCommand("*bomb",				100,	dmKillSwitch,		isDm,	"Kill a player and everyone in room.");
	staffCommands["*nuke"] = new PlyCommand("*nuke",				100,	dmKillSwitch,		isDm,	"Kill a player and everyone in room.");
	staffCommands["*arma"] = new PlyCommand("*arma",				100,	dmKillSwitch,		isDm,	"");
	staffCommands["*armageddon"] = new PlyCommand("*armageddon",	100,	dmKillSwitch,		isDm,	"Kill all players.");
	staffCommands["*supernova"] = new PlyCommand("*supernova",		100,	dmKillSwitch,		isDm,	"Kill all players.");
	staffCommands["*igmoo"] = new PlyCommand("*igmoo",				100,	dmKillSwitch,		isDm,	"Kill all players.");
	staffCommands["*rape"] = new PlyCommand("*rape",				100,	dmKillSwitch,		isDm,	"Set a player to 1hp and 1mp.");
	staffCommands["*drain"] = new PlyCommand("*drain",				100,	dmKillSwitch,		isDm,	"Set a player to 1hp and 1mp.");
	staffCommands["*repair"] = new PlyCommand("*repair",			100,	dmRepair,			isDm,	"Fix a player's armor.");
	staffCommands["*max"] = new PlyCommand("*max",					100,	dmMax,				0,		"Set your stats to max.");
	staffCommands["*backup"] = new PlyCommand("*backup",			100,	dmBackupPlayer,		isDm,	"Backup a player or restore a player from backup.");
	staffCommands["*changestats"] = new PlyCommand("*changestats",	100,	dmChangeStats,		isCt,	"Allow a player to pick new stats.");
	staffCommands["*lt"] = new PlyCommand("*lt",					100,	dmLts,				isDm,	"Show a player's last times.");
	staffCommands["*ltclear"] = new PlyCommand("*ltclear",			100,	dmLtClear,			isDm,	"Clear a player's last times.");


	// dmroom.c
	staffCommands["*swap"] = new PlyCommand("*swap",				100,	dmSwap,				0,		"Swap utility.");
	staffCommands["*rswap"] = new PlyCommand("*rswap",				100,	dmRoomSwap,			0,		"Swap current room with another.");
	staffCommands["*oswap"] = new PlyCommand("*oswap",				100,	dmObjSwap,			0,		"Swap object with another.");
	staffCommands["*mswap"] = new PlyCommand("*mswap",				100,	dmMobSwap,			0,		"Swap monster with another.");
	staffCommands["*purge"] = new PlyCommand("*purge",				100,	dmPurge,			0,		"Purge all objects and monsters (not pets) in room.");
	staffCommands["*echo"] = new PlyCommand("*echo",				100,	dmEcho,				0,		"Send a message to all players in the room.");
	staffCommands["*reload"] = new PlyCommand("*reload",			100,	dmReloadRoom,		0,		"Reload the room from disk.");
	staffCommands["*reset"] = new PlyCommand("*reset",				100,	dmResetPerms,		0,		"Reset perm timeouts.");
	staffCommands["*add"] = new PlyCommand("*add",					100,	dmAddRoom,			0,		"Create a new room/object/monster.");
	staffCommands["*replace"] = new PlyCommand("*replace",			100,	dmReplace,			0,		"Replace text in a room description.");
	staffCommands["*substitute"] = new PlyCommand("*substitute",	100,	dmReplace,			0,		"");
	staffCommands["*delete"] = new PlyCommand("*delete",			100,	dmDelete,			0,		"Delete text from a room description.");
	staffCommands["*name"] = new PlyCommand("*name",				100,	dmNameRoom,			0,		"Rename the room.");
	staffCommands["*append"] = new PlyCommand("*append",			100,	dmAppend,			0,		"Add text to a room description.");
	staffCommands["*app"] = new PlyCommand("*app",					100,	dmAppend,			0,		"");
	staffCommands["*prepend"] = new PlyCommand("*prepend",			100,	dmPrepend,			0,		"Prepend text to a room description.");
	staffCommands["*moblist"] = new PlyCommand("*moblist",			100,	dmMobList,			builderMob,	"List wandering monsters in the room.");
	staffCommands["*wrap"] = new PlyCommand("*wrap",				100,	dmWrap,				0,		"Wrap the room description to a number of characters.");
	staffCommands["*xdelete"] = new PlyCommand("*xdelete",			100,	dmDeleteAllExits,	0,		"Delete all exits in the room.");
	staffCommands["*xarrange"] = new PlyCommand("*xarrange",		100,	dmArrangeExits,		0,		"Arrange all the exits in the room according to standards.");
	staffCommands["*fixup"] = new PlyCommand("*fixup",				100,	dmFixExit,			0,		"Remove an underscore from an exit.");
	staffCommands["*unfixup"] = new PlyCommand("*unfixup",			100,	dmUnfixExit,		0,		"Add an underscore to an exit.");
	staffCommands["*xrename"] = new PlyCommand("*xrename",			100,	dmRenameExit,		0,		"Rename an exit.");
	staffCommands["*destroy"] = new PlyCommand("*destroy",			100,	dmDestroyRoom,		0,		"Destroy the room.");
	staffCommands["*find"] = new PlyCommand("*find",				100,	dmFind,				0,		"Find the next available room/object/monster.");


	// post.c
	staffCommands["*readmail"] = new PlyCommand("*readmail",		100,	dmReadmail,			isDm,	"Read a player's mail.");
	staffCommands["*rmmail"] = new PlyCommand("*rmmail",			100,	dmDeletemail,		isDm,	"Delete a player's mail.");
	staffCommands["*notepad"] = new PlyCommand("*notepad",			100,	notepad,			0,		"Access your staff notepad.");
	staffCommands["*rmhist"] = new PlyCommand("*rmhist",			100,	dmDeletehist,		isDm,	"Delete a player's history.");


	// skills.c
	staffCommands["*skills"] = new PlyCommand("*skills",			100,	dmSkills,			isDm,	"Show a list of skills / a player/monsters's skills.");
	staffCommands["*setskills"] = new PlyCommand("*setskills",		100,	dmSetSkills,		isDm,	"Set a player's skills to an appropriate level.");
//	staffCommands["*addskills"] = new PlyCommand("*addskills",		100,	dmAddSkills			0,		"");


	// guilds.c
	staffCommands["*guildlist"] = new PlyCommand("*guildlist",		100,	dmListGuilds,		isDm,	"Show all guilds.");
	staffCommands["*approve"] = new PlyCommand("*approve",			100,	dmApproveGuild,		isCt,	"Approve a proposed guild.");
	staffCommands["*reject"] = new PlyCommand("*reject",			100,	dmRejectGuild,		isCt,	"Reject a proposed guild.");


	// bans.c
	staffCommands["*ban"] = new PlyCommand("*ban",					 60,	dmBan,				isCt,	"Ban a player.");
	staffCommands["*unban"] = new PlyCommand("*unban",				100,	dmUnban,			isCt,	"Delete a ban.");
	staffCommands["*banlist"] = new PlyCommand("*banlist",			100,	dmListbans,			isDm,	"Show a list of bans.");


	// various files
	staffCommands["*fifo"] = new PlyCommand("*fifo",				100,	dmFifo,				0,		"Delete and recreate the web interface fifos.");
	staffCommands["*locations"] = new PlyCommand("*locations",		100,	dmStartLocs,		isCt,	"Show starting locations.");
	staffCommands["*specials"] = new PlyCommand("*specials",		100,	dmSpecials,			0,		"Show a monster's special attacks.");
	staffCommands["*range"] = new PlyCommand("*range",				100,	dmRange,			0,		"Show your assigned room range.");
	staffCommands["*builder"] = new PlyCommand("*builder",			100,	dmMakeBuilder,		isCt,	"Make a new character a builder.");
	staffCommands["*wat"] = new PlyCommand("*wat",					100,	dmWatcherBroad,		isCt,	"Force a watcher to broadcast.");
	staffCommands["*demographics"] = new PlyCommand("*demographics",100,	cmdDemographics,	isDm,	"Start the demographics routine.");
	staffCommands["*unique"] = new PlyCommand("*unique",			100,	dmUnique,			isCt,	"Work with uniques.");
	staffCommands["*shipquery"] = new PlyCommand("*shipquery",		100,	dmQueryShips,		isDm,	"See data about ships.");
	staffCommands["*spelling"] = new PlyCommand("*spelling",		 50,	dmSpelling,			0,		"Spell-check a room.");
	staffCommands["*spells"] = new PlyCommand("*spells",			100,	dmSpellList,		0,		"List spells in the game.");
	staffCommands["*effects"] = new PlyCommand("*effects",			90,		dmEffectList,		0,		"List effects in the game.");
	staffCommands["*effindex"] = new PlyCommand("*effindex",		100,	dmShowEffectsIndex,	isCt,	"List rooms in the effects index.");
	staffCommands["*songs"] = new PlyCommand("*songs",				100,	dmSongList,			0,		"List songs in the game.");
	staffCommands["*lottery"] = new PlyCommand("*lottery",			100,	dmLottery,			isDm,	"Run the lottery.");
	staffCommands["*memory"] = new PlyCommand("*memory",			100,	dmMemory,			isCt,	"Show memory usage.");
	staffCommands["*active"] = new PlyCommand("*active",			100,	list_act,			isCt,	"Show monsters on the active list.");
	staffCommands["*classlist"] = new PlyCommand("*classlist",		100,	dmShowClasses,		0,		"List all classes.");
	staffCommands["*racelist"] = new PlyCommand("*racelist",		100,	dmShowRaces,		0,		"List all races.");
	staffCommands["*deitylist"] = new PlyCommand("*deitylist",		100,	dmShowDeities,		0,		"List all deities.");
	staffCommands["*faction"] = new PlyCommand("*faction",			100,	dmShowFactions,		0,		"List all factions or show a player/monster's faction.");
	staffCommands["bfart"] = new PlyCommand("bfart",				100,	plyAction,			isDm,	"");
	staffCommands["*arealist"] = new PlyCommand("*arealist",		100,	dmListArea,			isCt,	"List area information.");
	staffCommands["*recipes"] = new PlyCommand("*recipes",			100,	dmRecipes,			0,		"List recipes.");
	staffCommands["*combine"] = new PlyCommand("*combine",			100,	dmCombine,			0,		"Create new recipes.");
	staffCommands["*property"] = new PlyCommand("*property",		100,	dmProperties,		isCt,	"List properties.");
	staffCommands["*catrefinfo"] = new PlyCommand("*catrefinfo",	100,	dmCatRefInfo,		0,		"Show CatRefInfo.");

	// unused functions
	//staffCommands["*task"] = new PlyCommand("*task",			100,	dmTask,				0,		"");
	//staffCommands["boards"] = new PlyCommand("boards",			100,	listboards,			0,		"");
	//staffCommands["bug"] = new PlyCommand("bug",				100,	bugReport,			0,		"");
	//staffCommands["petition"] = new PlyCommand("petition",		100,	plyPetition,		0,		"");
	//staffCommands["*message"] = new PlyCommand("*message",		100,	dmMsg,				0,		"");
	//staffCommands["gamble"] = new PlyCommand("gamble",			100,	cmdGamble,			0,		"");
	//staffCommands["*wlog"] = new PlyCommand("*wlog",			100,	watcher_log,		0,		"");

// *************************************************************************************
// Player Commands

	playerCommands["target"] = new PlyCommand("target",				100,	cmdTarget,			0,		"Target a creature or player." );
	playerCommands["assist"] = new PlyCommand("assist",				100,	cmdAssist,			0,		"Assist a player, targeting their target." );
	// watcher functions
	playerCommands["*rename"] = new PlyCommand("*rename",			100,	dmRename,			0,		"");
	playerCommands["*warn"] = new PlyCommand("*warn",				100,	dmWarn,				0,		"");
	playerCommands["*jail"] = new PlyCommand("*jail",				100,	dmJailPlayer,		0,		"");
	playerCommands["*checkstats"] = new PlyCommand("*checkstats",	100,	dmCheckStats,		0,		"");
	playerCommands["*locate"] = new PlyCommand("*locate",			100,	dmLocatePlayer,		0,		"");
	playerCommands["*typo"] = new PlyCommand("*typo",				100,	reportTypo,			0,		"");
	playerCommands["*gag"] = new PlyCommand("*gag",					100,	dmGag,				0,		"");
	playerCommands["*wts"] = new PlyCommand("*wts",					100,	channel,			0,		"");

	playerCommands["compare"] = new PlyCommand("compare",           90,    cmdCompare,         0,      "Compare two items.");
	playerCommands["weapons"] = new PlyCommand("weapons",			100,	cmdWeapons,			0,		"Use weapon trains.");
	playerCommands["fish"] = new PlyCommand("fish",					100,	cmdFish,			0,		"Go fishing.");
	playerCommands["religion"] = new PlyCommand("religion",			100,	cmdReligion,		0,		"");
	playerCommands["craft"] = new PlyCommand("craft",				100,	cmdCraft,			0,		"Create new items.");
	playerCommands["cook"] = new PlyCommand("cook",					100,	cmdCraft,			0,		"Create new items.");
	playerCommands["smith"] = new PlyCommand("smith",				100,	cmdCraft,			0,		"Create new items.");
	playerCommands["tailor"] = new PlyCommand("tailor",				100,	cmdCraft,			0,		"Create new items.");
	playerCommands["carpenter"] = new PlyCommand("carpenter",		100,	cmdCraft,			0,		"");
//	playerCommands["alchemy"] = new PlyCommand("alchemy",			100,	cmdCraft,			0,		"");
//	playerCommands["brew"] = new PlyCommand("brew",					100,	cmdCraft,			0,		"");
	playerCommands["prepare"] = new PlyCommand("prepare",			100,	cmdPrepare,			0,		"Prepare for traps or prepare an item for crafting.");
	playerCommands["unprepare"] = new PlyCommand("unprepare",		100,	cmdUnprepareObject,	0,		"Unprepare an item.");
	playerCommands["combine"] = new PlyCommand("combine",			100,	cmdCraft,			0,		"Create new items.");


	// player functions
	playerCommands["forum"] = new PlyCommand("forum",				100,	cmdForum,			0,		"Information on your forum account.");
	playerCommands["brew"] = new PlyCommand("brew",					100,	cmdBrew,			0,		"");
	playerCommands["house"] = new PlyCommand("house",				100,	cmdHouse,			0,		"");
	playerCommands["property"] = new PlyCommand("property",			100,	cmdProperties,		0,		"Manage your properties.");
	playerCommands["title"] = new PlyCommand("title",				100,	cmdTitle,			0,		"Choose a custom title.");
	playerCommands["defecate"] = new PlyCommand("defecate",			 80,	plyAction,			0,		"");
	playerCommands["tnl"] = new PlyCommand("tnl",					100,	plyAction,			0,		"Show the room how much experience you have to level.");
	playerCommands["mark"] = new PlyCommand("mark",					100,	plyAction,			0,		"");
	playerCommands["show"] = new PlyCommand("show",					100,	plyAction,			0,		"");
	playerCommands["dream"] = new PlyCommand("dream",				100,	plyAction,			0,		"");
	playerCommands["rollover"] = new PlyCommand("rollover",			100,	plyAction,			0,		"");
	playerCommands["where"] = new PlyCommand("where",				100,	cmdLook,			0,		"");
	playerCommands["look"] = new PlyCommand("look",					 10,	cmdLook,			0,		"");
	playerCommands["consider"] = new PlyCommand("consider",			 50,	cmdLook,			0,		"");
	playerCommands["examine"] = new PlyCommand("examine",			100,	cmdLook,			0,		"");
	playerCommands["reconnect"] = new PlyCommand("reconnect",		100,	cmdReconnect,		0,		"Log in as another character.");
	playerCommands["relog"] = new PlyCommand("relog",				100,	cmdReconnect,		0,		"");
	playerCommands["quit"] = new PlyCommand("quit",					110,	cmdQuit,			0,		"Log off.");
	playerCommands["goodbye"] = new PlyCommand("goodbye",			100,	cmdQuit,			0,		"");
	playerCommands["logout"] = new PlyCommand("logout",				100,	cmdQuit,			0,		"");
	playerCommands["inventory"] = new PlyCommand("inventory",		 10,	cmdInventory,		0,		"View your inventory.");
//	playerCommands["inv"] = new PlyCommand("inv",					100,	cmdInventory,		0,		"");
//	playerCommands["i"] = new PlyCommand("i",						100,	cmdInventory,		0,		"");
	playerCommands["who"] = new PlyCommand("who",					 15,	cmdWho,				0,		"See who is online.");
	playerCommands["scan"] = new PlyCommand("scan",					100,	cmdWho,				0,		"");
	playerCommands["classwho"] = new PlyCommand("classwho",			 90,	cmdClasswho,		0,		"");
	playerCommands["whois"] = new PlyCommand("whois",				100,	cmdWhois,			0,		"View information about a specific character.");
	playerCommands["wear"] = new PlyCommand("wear",					100,	cmdWear,			0,		"");
	playerCommands["remove"] = new PlyCommand("remove",				100,	cmdRemoveObj,		0,		"");
	playerCommands["rm"] = new PlyCommand("rm",						110,	cmdRemoveObj,		0,		"");
	playerCommands["equipment"] = new PlyCommand("equipment",		100,	cmdEquipment,		0,		"View the equipment you are currently wearing.");
	playerCommands["hold"] = new PlyCommand("hold",					100,	cmdHold,			0,		"");
	playerCommands["wield"] = new PlyCommand("wield",				100,	cmdReady,			0,		"");
	playerCommands["ready"] = new PlyCommand("ready",				100,	cmdReady,			0,		"");
	playerCommands["second"] = new PlyCommand("second",				100,	cmdSecond,			0,		"");
	playerCommands["help"] = new PlyCommand("help",					100,	cmdHelp,			0,		"");
	playerCommands["?"] = new PlyCommand("?",						100,	cmdHelp,			0,		"");
	playerCommands["wiki"] = new PlyCommand("wiki",					100,	cmdWiki,			0,		"Look up a wiki entry.");
	playerCommands["health"] = new PlyCommand("health",				100,	cmdScore,			0,		"");
	playerCommands["score"] = new PlyCommand("score",				 50,	cmdScore,			0,		"Show brief information about your character.");
	playerCommands["status"] = new PlyCommand("status",				100,	cmdInfo,			0,		"");
	playerCommands["levelhistory"] = new PlyCommand("levelhistory", 100,	cmdLevelHistory,	0,		"Show character level history.");
	playerCommands["stats"] = new PlyCommand("stats",				100,	cmdStatistics,		0,		"");
	playerCommands["statistics"] = new PlyCommand("statistics",		100,	cmdStatistics,		0,		"Show character-related statistics.");
	playerCommands["information"] = new PlyCommand("information",	 50,	cmdInfo,			0,		"Show extended information about your character.");
	playerCommands["attributes"] = new PlyCommand("attributes",		100,	cmdInfo,			0,		"");
	playerCommands["skills"] = new PlyCommand("skills",				100,	cmdSkills,			0,		"Show what skills your character knows");
	playerCommands["version"] = new PlyCommand("version",			100,	cmdVersion,			0,		"");
	playerCommands["age"] = new PlyCommand("age",					100,	cmdAge,				0,		"Show your character's age and time played.");
	playerCommands["birthday"] = new PlyCommand("birthday",			100,	checkBirthdays,		0,		"Show which players online have birthdays.");
	playerCommands["colors"] = new PlyCommand("colors",				100,	cmdColors,			0,		"Show colors and set custom colors.");
	playerCommands["colours"] = new PlyCommand("colours",			100,	cmdColors,			0,		"");
	playerCommands["factions"] = new PlyCommand("factions",			100,	cmdFactions,		0,		"Show your standing with various factions.");
	playerCommands["recipes"] = new PlyCommand("recipes",			100,	cmdRecipes,			0,		"Show what recipes you know.");

	// player-only communication functions
	playerCommands["send"] = new PlyCommand("send",					100,	communicateWith,	0,		"");
	playerCommands["tell"] = new PlyCommand("tell",					100,	communicateWith,	0,		"Send a message to another player.");
	playerCommands["osend"] = new PlyCommand("osend",				100,	communicateWith,	0,		"");
	playerCommands["otell"] = new PlyCommand("otell",				100,	communicateWith,	0,		"");
	playerCommands["reply"] = new PlyCommand("reply",				100,	communicateWith,	0,		"Reply to a direct message.");
	playerCommands["sign"] = new PlyCommand("sign",					100,	communicateWith,	0,		"");
	playerCommands["whisper"] = new PlyCommand("whisper",			100,	communicateWith,	0,		"Whisper a message to another player.");
	playerCommands["yell"] = new PlyCommand("yell",					100,	pCommunicate,		0,		"Yell something that everyone in the room and nearby rooms can hear.");
	playerCommands["recite"] = new PlyCommand("recite",				100,	pCommunicate,		0,		"Recite a phrase to open certain locked doors.");
//	playerCommands["os"] = new PlyCommand("os",						 90,	pCommunicate,		0,		"");
	playerCommands["osay"] = new PlyCommand("osay",					 90,	pCommunicate,		0,		"");
	playerCommands["gtoc"] = new PlyCommand("gtoc",					100,	pCommunicate,		0,		"");
	playerCommands["gtalk"] = new PlyCommand("gtalk",				100,	pCommunicate,		0,		"Send a message to your group.");
	playerCommands["gt"] = new PlyCommand("gt",						100,	pCommunicate,		0,		"");
	playerCommands["ignore"] = new PlyCommand("ignore",				100,	cmdIgnore,			0,		"Ignore a player.");
	playerCommands["speak"] = new PlyCommand("speak",				100,	cmdSpeak,			0,		"Speak a different language.");
	playerCommands["languages"] = new PlyCommand("languages",		100,	cmdLanguages,		0,		"Show what languages you know.");
	playerCommands["talk"] = new PlyCommand("talk",					100,	cmdTalk,			0,		"Talk to a monster.");
	//playerCommands["ask"] = new PlyCommand("ask",					100,	cmdTalkNew,			0,		"");
	playerCommands["ask"] = new PlyCommand("ask",					100,	cmdTalk,			0,		"");
	playerCommands["parley"] = new PlyCommand("parley",				100,	cmdTalk,			0,		"");
	playerCommands["sendclan"] = new PlyCommand("sendclan",			100,	channel,			0,		"");
	playerCommands["clansend"] = new PlyCommand("clansend",			100,	channel,			0,		"Communicate via the clan channel.");
	playerCommands["bemote"] = new PlyCommand("bemote",				100,	channel,			0,		"");
	playerCommands["broademote"] = new PlyCommand("broademote",		100,	channel,			0,		"");
	playerCommands["raemote"] = new PlyCommand("raemote",			100,	channel,			0,		"");
	playerCommands["sendrace"] = new PlyCommand("sendrace",			100,	channel,			0,		"");
	playerCommands["racesend"] = new PlyCommand("racesend",			100,	channel,			0,		"Communicate via the race channel.");
	playerCommands["cls"] = new PlyCommand("cls",					100,	channel,			0,		"");
	playerCommands["sendclass"] = new PlyCommand("sendclass",		100,	channel,			0,		"");
	playerCommands["classsend"] = new PlyCommand("classsend",		100,	channel,			0,		"Communicate via the class channel.");
	playerCommands["clem"] = new PlyCommand("clem",					100,	channel,			0,		"");
	playerCommands["classemote"] = new PlyCommand("classemote",		100,	channel,			0,		"");
	playerCommands["newbie"] = new PlyCommand("newbie",				100,	channel,			0,		"Communicate via the newbie channel.");
	playerCommands["ptest"] = new PlyCommand("ptest",				100,	channel,			0,		"");
	playerCommands["gossip"] = new PlyCommand("gossip",				100,	channel,			0,		"Communicate via the gossip channel.");
	//playerCommands["gloat"] = new PlyCommand("gloat",				100,	channel,			0,		"");
	playerCommands["adult"] = new PlyCommand("adult",				100,	channel,			0,		"");
	playerCommands["broadcast"] = new PlyCommand("broadcast",		 80,	channel,			0,		"");
	playerCommands["gsend"] = new PlyCommand("gsend",				100,	cmdGuildSend,		0,		"Communicate via the guild channel.");

	// import functions
	playerCommands["lookup"] = new PlyCommand("lookup",				100,	lookup,				0,		"");
	playerCommands["restore"] = new PlyCommand("restore",			100,	restore,			0,		"");

	playerCommands["guild"] = new PlyCommand("guild",				100,	cmdGuild,			0,		"Perform guild-related commands.");
	playerCommands["guildhall"] = new PlyCommand("guildhall",		100,	cmdGuildHall,		0,		"");
	playerCommands["gh"] = new PlyCommand("gh",						100,	cmdGuildHall,		0,		"");
	playerCommands["follow"] = new PlyCommand("follow",				100,	cmdFollow,			0,		"Follow another player.");
	playerCommands["lose"] = new PlyCommand("lose",					100,	cmdLose,			0,		"Stop following another player.");
	playerCommands["group"] = new PlyCommand("group",				100,	cmdGroup,			0,		"Show group members.");
	playerCommands["party"] = new PlyCommand("party",				100,	cmdGroup,			0,		"");
	playerCommands["pay"] = new PlyCommand("pay",					100,	cmdPayToll,			0,		"Pay a monster a toll.");
	playerCommands["track"] = new PlyCommand("track",				100,	cmdTrack,			0,		"");
	playerCommands["peek"] = new PlyCommand("peek",					100,	cmdPeek,			0,		"");
	playerCommands["search"] = new PlyCommand("search",				100,	cmdSearch,			0,		"Search for anything hidden.");
	playerCommands["hide"] = new PlyCommand("hide",					100,	cmdHide,			0,		"Hide from view.");
	playerCommands["telnet"] = new PlyCommand("telnet",				100,	cmdTelOpts,			0,		"Shows what telnet options have been negotiated.");
	playerCommands["telopts"] = new PlyCommand("telopts",			100,	cmdTelOpts,			0,		"Shows what telnet options have been negotiated.");
	playerCommands["set"] = new PlyCommand("set",					100,	cmdPrefs,			0,		"Set a preference.");
	playerCommands["clear"] = new PlyCommand("clear",				100,	cmdPrefs,			0,		"Clear a preference.");
	playerCommands["toggle"] = new PlyCommand("toggle",				100,	cmdPrefs,			0,		"Toggle a preference.");
	playerCommands["preferences"] = new PlyCommand("preferences",	100,	cmdPrefs,			0,		"Show preferences.");
	playerCommands["open"] = new PlyCommand("open",					100,	cmdOpen,			0,		"Open a door.");
	playerCommands["close"] = new PlyCommand("close",				100,	cmdClose,			0,		"Close a door.");
	playerCommands["shut"] = new PlyCommand("shut",					100,	cmdClose,			0,		"");
	playerCommands["unlock"] = new PlyCommand("unlock",				100,	cmdUnlock,			0,		"");
	playerCommands["lock"] = new PlyCommand("lock",					100,	cmdLock,			0,		"");
	playerCommands["pick"] = new PlyCommand("pick",					100,	cmdPickLock,		0,		"");
	playerCommands["steal"] = new PlyCommand("steal",				100,	cmdSteal,			0,		"");
	playerCommands["flee"] = new PlyCommand("flee",					 40,	cmdFlee,			0,		"");
	playerCommands["run"] = new PlyCommand("run",					 90,	cmdFlee,			0,		"");
	playerCommands["study"] = new PlyCommand("study",				100,	cmdStudy,			0,		"Study a scroll to learn a spell.");
	playerCommands["learn"] = new PlyCommand("learn",				100,	cmdStudy,			0,		"");
	playerCommands["read"] = new PlyCommand("read",					100,	cmdReadScroll,		0,		"");
	playerCommands["commune"] = new PlyCommand("commune",			100,	cmdCommune,			0,		"");
	playerCommands["bs"] = new PlyCommand("bs",						100,	cmdBackstab,		0,		"");
	playerCommands["backstab"] = new PlyCommand("backstab",			100,	cmdBackstab,		0,		"");
	playerCommands["ambush"] = new PlyCommand("ambush",				100,	cmdAmbush,			0,		"");
	playerCommands["ab"] = new PlyCommand("ab",						100,	cmdAmbush,			0,		"");
	playerCommands["train"] = new PlyCommand("train",				100,	cmdTrain,			0,		"Go up a level.");
	playerCommands["save"] = new PlyCommand("save",					100,	cmdSave,			0,		"");
	playerCommands["time"] = new PlyCommand("time",					100,	cmdTime,			0,		"Show the current time");
	playerCommands["circle"] = new PlyCommand("circle",				 50,	cmdCircle,			0,		"");
	playerCommands["bash"] = new PlyCommand("bash",					 50,	cmdBash,			0,		"");
	playerCommands["barkskin"] = new PlyCommand("barkskin",			100,	cmdBarkskin,		0,		"");
	playerCommands["kick"] = new PlyCommand("kick",					100,	cmdKick,			0,		"");
	playerCommands["gamestat"] = new PlyCommand("gamestat",			100,	infoGamestat,		0,		"Game time statistics.");

	playerCommands["list"] = new PlyCommand("list",					100,	cmdList,			0,		"Show items for sale.");
	playerCommands["shop"] = new PlyCommand("shop",					100,	cmdShop,			0,		"Perform player-shop-related commands.");
	playerCommands["buy"] = new PlyCommand("buy",					100,	cmdBuy,				0,		"Purchase an item.");
	playerCommands["refund"] = new PlyCommand("refund",				100,	cmdRefund,			0,		"Refund an item you just purchased.");
	playerCommands["reclaim"] = new PlyCommand("reclaim",			100,	cmdReclaim,			0,		"Reclaim an item you just pawned.");
	playerCommands["shoplift"] = new PlyCommand("shoplift",			100,	cmdShoplift,		0,		"");
	playerCommands["sell"] = new PlyCommand("sell",					100,	cmdSell,			0,		"Sell an item.");
	playerCommands["value"] = new PlyCommand("value",				100,	cmdValue,			0,		"Check the value of an item.");
	playerCommands["cost"] = new PlyCommand("cost",					100,	cmdCost,			0,		"");
	playerCommands["purchase"] = new PlyCommand("purchase",			90,		cmdPurchase,		0,		"");
	playerCommands["selection"] = new PlyCommand("selection",		100,	cmdSelection,		0,		"");
	playerCommands["trade"] = new PlyCommand("trade",				100,	cmdTrade,			0,		"Trade an item with a monster.");
	playerCommands["auction"] = new PlyCommand("auction",			100,	cmdAuction,			0,		"Auction an item for players to buy.");
	playerCommands["repair"] = new PlyCommand("repair",				100,	cmdRepair,			0,		"Have a smithy repair an item.");
	playerCommands["fix"] = new PlyCommand("fix",					100,	cmdRepair,			0,		"");

	playerCommands["sendmail"] = new PlyCommand("sendmail",			100,	cmdSendMail,		0,		"Send a mudmail to another player.");
	playerCommands["readmail"] = new PlyCommand("readmail",			100,	cmdReadMail,		0,		"Read your mudmail.");
	playerCommands["deletemail"] = new PlyCommand("deletemail",		100,	cmdDeleteMail,		0,		"");
	playerCommands["edithistory"] = new PlyCommand("edithistory",	100,	cmdEditHistory,		0,		"");
	playerCommands["history"] = new PlyCommand("history",			100,	cmdHistory,			0,		"");
	playerCommands["deletehistory"] = new PlyCommand("deletehistory",100,	cmdDeleteHistory,	0,		"");

	playerCommands["drink"] = new PlyCommand("drink",				100,	cmdConsume,			0,		"Drink a potion.");
	playerCommands["quaff"] = new PlyCommand("quaff",				100,	cmdConsume,			0,		"");
	playerCommands["eat"] = new PlyCommand("eat",					100,	cmdConsume,			0,		"Eat some food.");
	playerCommands["recall"] = new PlyCommand("recall",				100,	cmdRecall,			0,		"");
	playerCommands["hazy"] = new PlyCommand("hazy",					100,	cmdRecall,			0,		"");
	playerCommands["teach"] = new PlyCommand("teach",				100,	cmdTeach,			0,		"");
	playerCommands["welcome"] = new PlyCommand("welcome",			100,	cmdWelcome,			0,		"");
	playerCommands["turn"] = new PlyCommand("turn",					100,	cmdTurn,			0,		"");
	playerCommands["renounce"] = new PlyCommand("renounce",			100,	cmdRenounce,		0,		"");
	playerCommands["holyword"] = new PlyCommand("holyword",			100,	cmdHolyword,		0,		"");
	playerCommands["creep"] = new PlyCommand("creep",				100,	cmdCreepingDoom,	0,		"");
	playerCommands["poison"] = new PlyCommand("poison",				100,	cmdPoison,			0,		"");
	playerCommands["smother"] = new PlyCommand("smother",			100,	cmdEarthSmother,	0,		"");
	playerCommands["bribe"] = new PlyCommand("bribe",				100,	cmdBribe,			0,		"Bribe a monster to leave the room.");
	playerCommands["frenzy"] = new PlyCommand("frenzy",				100,	cmdFrenzy,			0,		"");
	playerCommands["pray"] = new PlyCommand("pray",					100,	cmdPray,			0,		"");
	playerCommands["use"] = new PlyCommand("use",					100,	cmdUse,				0,		"");
	playerCommands["us"] = new PlyCommand("us",						100,	cmdUse,				0,		"");
	playerCommands["break"] = new PlyCommand("break",				100,	cmdBreak,			0,		"Break an object.");
	playerCommands["pledge"] = new PlyCommand("pledge",				100,	cmdPledge,			0,		"Pledge your allegience to a clan.");
	playerCommands["rescind"] = new PlyCommand("rescind",			100,	cmdRescind,			0,		"Rescind your allegience from a clan.");
	playerCommands["suicide"] = new PlyCommand("suicide",			100,	cmdSuicide,			0,		"Delete your character.");
	playerCommands["convert"] = new PlyCommand("convert",			100,	cmdConvert,			0,		"Convert from chaotic alignment to lawful alignment.");
	playerCommands["password"] = new PlyCommand("password",			100,	cmdPassword,		0,		"Change your password.");
	playerCommands["proxy"] = new PlyCommand("proxy",				100,	cmdProxy,			0,		"Allow proxy access to this character.");
	playerCommands["finger"] = new PlyCommand("finger",				100,	cmdFinger,			0,		"Look up an offline character.");
	playerCommands["hypnotize"] = new PlyCommand("hypnotize",		100,	cmdHypnotize,		0,		"");
	playerCommands["bite"] = new PlyCommand("bite",					 60,	cmdBite,			0,		"");
	playerCommands["mist"] = new PlyCommand("mist",					100,	cmdMist,			0,		"");
	playerCommands["unmist"] = new PlyCommand("unmist",				100,	cmdUnmist,			0,		"");
	playerCommands["regenerate"] = new PlyCommand("regenerate",		100,	cmdRegenerate,		0,		"");
	playerCommands["drain"] = new PlyCommand("drain",				100,	cmdDrainLife,		0,		"");

	playerCommands["charm"] = new PlyCommand("charm",				100,	cmdCharm,			0,		"");
	playerCommands["identify"] = new PlyCommand("identify",			100,	cmdIdentify,		0,		"");
	playerCommands["songs"] = new PlyCommand("songs",				100,	cmdSongs,			0,		"");

	playerCommands["enthrall"] = new PlyCommand("enthrall",			100,	cmdEnthrall,		0,		"");
	playerCommands["meditate"] = new PlyCommand("meditate",			100,	cmdMeditate,		0,		"");
	playerCommands["focus"] = new PlyCommand("focus",				100,	cmdFocus,			0,		"");
	playerCommands["mistbane"] = new PlyCommand("mistbane",			 90,	cmdMistbane,		0,		"");
	playerCommands["mb"] = new PlyCommand("mb",						100,	cmdMistbane,		0,		"");
	playerCommands["touch"] = new PlyCommand("touch",				100,	cmdTouchOfDeath,	0,		"");
	playerCommands["quests"] = new PlyCommand("quests",				100,	cmdQuests,			0,		"View your quests and perform quest-related commands.");
	playerCommands["hands"] = new PlyCommand("hands",				100,	cmdLayHands,		0,		"");
	playerCommands["harm"] = new PlyCommand("harm",					100,	cmdHarmTouch,		0,		"");
	playerCommands["scout"] = new PlyCommand("scout",				100,	cmdScout,			0,		"");
	playerCommands["berserk"] = new PlyCommand("berserk",			100,	cmdBerserk,			0,		"");
	playerCommands["transmute"] = new PlyCommand("transmute",		100,	cmdTransmute,		0,		"");
	playerCommands["daily"] = new PlyCommand("daily",				100,	cmdDaily,			0,		"See our usage of daily-limited abilities.");
	playerCommands["description"] = new PlyCommand("description",	100,	cmdDescription,		0,		"Change your character's description.");
	playerCommands["bsacrifice"] = new PlyCommand("bsacrifice",     100,    cmdBloodsacrifice,  0,      "");
	playerCommands["bloodsacrifice"] = new PlyCommand("bloodsacrifice",100,	cmdBloodsacrifice,	0,		"");
	playerCommands["disarm"] = new PlyCommand("disarm",				100,	cmdDisarm,			0,		"Disarm an opponent or remove your wielded weapons.");
	playerCommands["visible"] = new PlyCommand("visible",			100,	cmdVisible,			0,		"Cancel invisibility.");
	playerCommands["watch"] = new PlyCommand("watch",				100,	cmdWatch,			0,		"");
	playerCommands["conjure"] = new PlyCommand("conjure",			100,	conjureCmd,			0,		"");
	playerCommands["maul"] = new PlyCommand("maul",					100,	cmdMaul,			0,		"");
	playerCommands["enchant"] = new PlyCommand("enchant",			100,	cmdEnchant,			0,		"");
	playerCommands["envenom"] = new PlyCommand("envenom",			100,	cmdEnvenom,			0,		"");

	playerCommands["balance"] = new PlyCommand("balance",			 90,	cmdBalance,			0,		"See your bank balance.");
	playerCommands["deposit"] = new PlyCommand("deposit",			100,	cmdDeposit,			0,		"Deposit gold in the bank.");
	playerCommands["withdraw"] = new PlyCommand("withdraw",			100,	cmdWithdraw,		0,		"Withdraw gold from the bank.");
	playerCommands["deletestatement"] = new PlyCommand("deletestatement",100,	cmdDeleteStatement,	0,		"");
	playerCommands["transfer"] = new PlyCommand("transfer",			100,	cmdTransfer,		0,		"Transfer gold to another character.");
//	playerCommands["stat"] = new PlyCommand("stat",					100,	cmdStatement,		0,		"");
	playerCommands["statement"] = new PlyCommand("statement",		 90,	cmdStatement,		0,		"View your bank statement.");

	playerCommands["refuse"] = new PlyCommand("refuse",				100,	cmdRefuse,			0,		"");
	playerCommands["duel"] = new PlyCommand("duel",					100,	cmdDuel,			0,		"Challenge another player to a duel.");
	playerCommands["animate"] = new PlyCommand("animate",			100,	animateDeadCmd,		0,		"");
	playerCommands["lottery"] = new PlyCommand("lottery",			100,	cmdLottery,			0,		"View lottery info.");
	playerCommands["claim"] = new PlyCommand("claim",				100,	cmdClaim,			0,		"Claim a lottery ticket.");
	playerCommands["mccp"] = new PlyCommand("mccp",					100,	mccp,				0,		"Toggle mccp (compression).");
	playerCommands["surname"] = new PlyCommand("surname",			100,	cmdSurname,			0,		"Choose a surname.");
	playerCommands["changestats"] = new PlyCommand("changestats",	100,	cmdChangeStats,		0,		"");
	playerCommands["keep"] = new PlyCommand("keep",					100,	cmdKeep,			0,		"Prevent accidentially throwing away an item.");
	playerCommands["unkeep"] = new PlyCommand("unkeep",				100,	cmdUnkeep,			0,		"Unkeep an item.");
	playerCommands["alignment"] = new PlyCommand("alignment",		100,	cmdChooseAlignment,	0,		"Choose your alignment.");
	playerCommands["push"] = new PlyCommand("push",					100,	cmdPush,			0,		"");
	playerCommands["pull"] = new PlyCommand("pull",					100,	cmdPull,			0,		"");
	playerCommands["press"] = new PlyCommand("press",				100,	cmdPress,			0,		"");
	playerCommands["shipquery"] = new PlyCommand("shipquery",		90,		cmdQueryShips,		0,		"See where chartered ships are.");
	playerCommands["ships"] = new PlyCommand("ships",				100,	cmdQueryShips,		0,		"");

	playerCommands["bandage"] = new PlyCommand("bandage",			100,	cmdBandage,			0,		"Use bandages to heal yourself.");

	// movement
//	playerCommands["n"] = new PlyCommand("n",						100,	cmdMove,			0,		"");
	playerCommands["north"] = new PlyCommand("north",				 10,	cmdMove,			0,		"");
//	playerCommands["s"] = new PlyCommand("s",						100,	cmdMove,			0,		"");
	playerCommands["south"] = new PlyCommand("south",				 10,	cmdMove,			0,		"");
//	playerCommands["e"] = new PlyCommand("e",						100,	cmdMove,			0,		"");
	playerCommands["east"] = new PlyCommand("east",					 10,	cmdMove,			0,		"");
//	playerCommands["w"] = new PlyCommand("w",						100,	cmdMove,			0,		"");
	playerCommands["west"] = new PlyCommand("west",				 	 10,	cmdMove,			0,		"");
	playerCommands["northeast"] = new PlyCommand("northeast",		 15,	cmdMove,			0,		"");
	playerCommands["ne"] = new PlyCommand("ne",						 15,	cmdMove,			0,		"");
	playerCommands["northwest"] = new PlyCommand("northwest",		 15,	cmdMove,			0,		"");
	playerCommands["nw"] = new PlyCommand("nw",						 15,	cmdMove,			0,		"");
	playerCommands["southeast"] = new PlyCommand("southeast",		 15,	cmdMove,			0,		"");
	playerCommands["se"] = new PlyCommand("se",						 15,	cmdMove,			0,		"");
	playerCommands["southwest"] = new PlyCommand("southwest",		 15,	cmdMove,			0,		"");
	playerCommands["sw"] = new PlyCommand("sw",						 15,	cmdMove,			0,		"");
//	playerCommands["u"] = new PlyCommand("u",						 10,	cmdMove,			0,		"");
	playerCommands["up"] = new PlyCommand("up",						 10,	cmdMove,			0,		"");
//	playerCommands["d"] = new PlyCommand("d",						100,	cmdMove,			0,		"");
	playerCommands["down"] = new PlyCommand("down",					 10,	cmdMove,			0,		"");
	playerCommands["out"] = new PlyCommand("out",					100,	cmdMove,			0,		"");
	playerCommands["leave"] = new PlyCommand("leave",				100,	cmdMove,			0,		"");
	//		playerCommands["aft"] = new PlyCommand("aft",			100,		move,				0,		"");
	//		playerCommands["fore"] = new PlyCommand("fore",			100,		move,				0,		"");
	//		playerCommands["starb"] = new PlyCommand("starb",		100,		move,				0,		"");
	//		playerCommands["port"] = new PlyCommand("port",			100,		move,				0,		"");
	//playerCommands["sn"] = new PlyCommand("sn",						100,	cmdGo,				0,		"");
	playerCommands["sneak"] = new PlyCommand("sneak",				 50,	cmdGo,				0,		"Sneak to an exit so you are not seen.");
	playerCommands["go"] = new PlyCommand("go",						100,	cmdGo,				0,		"");
	playerCommands["exit"] = new PlyCommand("exit",					100,	cmdGo,				0,		"");
	playerCommands["enter"] = new PlyCommand("enter",				100,	cmdGo,				0,		"");

// *************************************************************************************
// General player/pet Commands

	// general player/pet commands
	generalCommands["say"] = new CrtCommand("say",					100,	communicate,		0,		"");
	generalCommands["\\"] = new CrtCommand("\"",					100,	communicate,		0,		"");
	generalCommands["'"] = new CrtCommand("'",						100,	communicate,		0,		"");
	generalCommands["emote"] = new CrtCommand("emote",				100,	communicate,		0,		"");
	generalCommands[":"] = new CrtCommand(":",						100,	communicate,		0,		"");

	generalCommands["spells"] = new CrtCommand("spells",			100,	cmdSpells,			0,		"Show what spells you know.");
//	generalCommands["c"] = new CrtCommand("c",						100,	cmdCast,			0,		"");
	generalCommands["cast"] = new CrtCommand("cast",				 10,	cmdCast,			0,		"");

	generalCommands["attack"] = new CrtCommand("attack",			 50,	cmdAttack,			0,		"");
	generalCommands["kill"] = new CrtCommand("kill",				 10,	cmdAttack,			0,		"");
//	generalCommands["k"] = new CrtCommand("k",						100,	cmdAttack,			0,		"");

	generalCommands["get"] = new CrtCommand("get",					100,	cmdGet,				0,		"Pick up an item and put it in your inventory.");
	generalCommands["take"] = new CrtCommand("take",				100,	cmdGet,				0,		"");
	generalCommands["drop"] = new CrtCommand("drop",				100,	cmdDrop,			0,		"Remove an item from your inventory and drop it on the ground.");
	generalCommands["put"] = new CrtCommand("put",					100,	cmdDrop,			0,		"");
	generalCommands["give"] = new CrtCommand("give",				100,	cmdGive,			0,		"");

	generalCommands["throw"] = new CrtCommand("throw",				100,	cmdThrow,			0,		"Throw an object.");
	generalCommands["knock"] = new CrtCommand("knock",				100,	cmdKnock,			0,		"Knock on a door to make a noise on the other side.");
	generalCommands["effects"] = new CrtCommand("effects",			100,	cmdEffects,			0,		"Show what effects you are currently under.");
	generalCommands["howl"] = new CrtCommand("howl",				100,	cmdHowl,			0,		"");
	generalCommands["sing"] = new CrtCommand("sing",				100,	cmdSing,			0,		"");

	// socials
	generalCommands["chest"] = new CrtCommand("chest",				100,	cmdAction,				0,		"");
	generalCommands["stab"] = new CrtCommand("stab",				100,	cmdAction,				0,		"");
	generalCommands["vangogh"] = new CrtCommand("vangogh",			100,	cmdAction,				0,		"");
	generalCommands["smooch"] = new CrtCommand("smooch",			100,	cmdAction,				0,		"");
	generalCommands["lobotomy"] = new CrtCommand("lobotomy",		100,	cmdAction,				0,		"");
	generalCommands["sleep"] = new CrtCommand("sleep",				100,	cmdAction,				0,		"Go to sleep to heal faster.");
	generalCommands["stand"] = new CrtCommand("stand",				100,	cmdAction,				0,		"Stand up from a sitting position.");
	generalCommands["sit"] = new CrtCommand("sit",					100,	cmdAction,				0,		"Sit down to heal faster.");
	generalCommands["dismiss"] = new CrtCommand("dismiss",			100,	cmdAction,				0,		"");
	generalCommands["burp"] = new CrtCommand("burp",				100,	cmdAction,				0,		"");
	generalCommands["rps"] = new CrtCommand("rps",					100,	cmdAction,				0,		"");
	generalCommands["masturbate"] = new CrtCommand("masturbate",	90,		cmdAction,				0,		"");
	generalCommands["hum"] = new CrtCommand("hum",					100,	cmdAction,				0,		"");
	// "pet" also links to orderPet within action
	generalCommands["pet"] = new CrtCommand("pet",					100,	cmdAction,				0,		"");
	generalCommands["pat"] = new CrtCommand("pat",					100,	cmdAction,				0,		"");
	generalCommands["glare"] = new CrtCommand("glare",				100,	cmdAction,				0,		"");
	generalCommands["bless"] = new CrtCommand("bless",				100,	cmdAction,				0,		"");
	generalCommands["flip"] = new CrtCommand("flip",				100,	cmdAction,				0,		"");
	generalCommands["point"] = new CrtCommand("point",				100,	cmdAction,				0,		"");
	generalCommands["afk"] = new CrtCommand("afk",					100,	cmdAction,				0,		"");
	generalCommands["fangs"] = new CrtCommand("fangs",				100,	cmdAction,				0,		"");
	generalCommands["hiss"] = new CrtCommand("hiss",				100,	cmdAction,				0,		"");
	generalCommands["hunger"] = new CrtCommand("hunger",			100,	cmdAction,				0,		"");
	generalCommands["freeze"] = new CrtCommand("freeze",			100,	cmdAction,				0,		"");
	generalCommands["ballz"] = new CrtCommand("ballz",				100,	cmdAction,				0,		"");
	generalCommands["wag"] = new CrtCommand("wag",					100,	cmdAction,				0,		"");
	generalCommands["murmur"] = new CrtCommand("murmur",			100,	cmdAction,				0,		"");
	generalCommands["snore"] = new CrtCommand("snore",				100,	cmdAction,				0,		"");
	generalCommands["tag"] = new CrtCommand("tag",					100,	cmdAction,				0,		"");
	generalCommands["narrow"] = new CrtCommand("narrow",			100,	cmdAction,				0,		"");
	generalCommands["gnaw"] = new CrtCommand("gnaw",				100,	cmdAction,				0,		"");
	generalCommands["sneeze"] = new CrtCommand("sneeze",			100,	cmdAction,				0,		"");
	// wake is a special command that you might be able to
	// use while unconscious. rules are in Creature::ableToDoCommand
	generalCommands["wake"] = new CrtCommand("wake",				100,	cmdAction,				0,		"Wake up from being asleep.");

	generalCommands["dice"] = new CrtCommand("dice",				100,	cmdDice,			0,		"Roll dice.");

	
	// Once we've built the command tables, write their help files to the help directory
	writeCommandFile(0, Path::Help, "commands");
	writeCommandFile(DUNGEONMASTER, Path::DMHelp, "dmcommands");
	writeCommandFile(BUILDER, Path::BuilderHelp, "bhcommands");

	return(true);
}

void Config::clearCommands() {

	for(std::pair<bstring, PlyCommand*> pc : staffCommands)
		if(pc.second)
			delete pc.second;

	for(std::pair<bstring, PlyCommand*> pc : playerCommands)
		if(pc.second)
			delete pc.second;

	for(std::pair<bstring, CrtCommand*> cc : generalCommands)
		if(cc.second)
			delete cc.second;

	// Note: Skill commands are cleared as a part of clearSkills!

	staffCommands.clear();
	playerCommands.clear();
	generalCommands.clear();
}

bool MudMethod::exactMatch(bstring toMatch) {
    return(name.equals(toMatch.c_str(), false));
}

bool MudMethod::partialMatch(bstring toMatch) {
    return(!strncasecmp(name.c_str(), toMatch.c_str(), toMatch.length()));
}

bool MysticMethod::exactMatch(bstring toMatch) {
    return(name.equals(toMatch.c_str(), false));
}

bool MysticMethod::partialMatch(bstring toMatch) {
	for(bstring str : nameParts) {
		if(!strncasecmp(str.c_str(), toMatch.c_str(), toMatch.length())) 
			return true;
	}
	return(false);
}      

void MysticMethod::parseName() {
    boost::char_separator<char> sep(" ");
    boost::tokenizer< boost::char_separator<char> > tokens(name, sep);

    for(bstring t : tokens) {
        nameParts.push_back(t);
    }
}

//*********************************************************************
//						getCommand
//*********************************************************************

// bestMethod is a reference to a pointer
template<class Type, class Type2>
void examineList(std::map<bstring, Type>& myMap, bstring& str, int& match, bool& found, Type2*& bestMethod) {

	Type2* curMethod = 0;

	// Narrow down the range of the map we'll be looking at
	typename std::map<bstring, Type>::iterator it = myMap.lower_bound(str);
	typename std::map<bstring, Type>::iterator endIt = myMap.upper_bound(bstring(1,char(str.at(0)+1)));

    while(it != endIt) {
        std::pair<bstring, Type> cp = (*it++);

		if(!cp.second) continue;
		curMethod = cp.second; 

		if(curMethod->exactMatch(str)) {
			// Full match, stop here
			bestMethod = curMethod;
			found = true;
			match = 1;
			//std::cout << "Found an exact match!\n";
			break;
		} else if(curMethod->partialMatch(str)) {
			// Partial Match, see how good of a match
			if(bestMethod == 0) {
				// No best match yet, this is our new best match
				bestMethod = curMethod;
				match = 1;
				//std::cout << "First Match: " << bestMethod->getStr() << "'\n";
			} else {
				// Already have a best match, compare it to this to see which is better

				// Lower priority always wins
				if(curMethod->priority < bestMethod->priority) {
					// New winner
					bestMethod = curMethod;
					match = 1;
					//std::cout << "New Best Match: " << bestMethod->getStr() << "'\n";
				} else if(curMethod->priority == bestMethod->priority) {
					// Same priority, check % of match
					int curLen = curMethod->name.length();
					int bestLen = bestMethod->name.length();

					if(curLen < bestLen) {
						// Current command's length is lower, so we match a higher percentage of it.
						// It is the new winner
						//std::cout << "New Best Match: " << bestMethod->getStr() << "'\n";
						bestMethod = curMethod;
						match = 1;
					} else if(curLen == bestLen) {
						// Drats we have a tie
						match++;
						//std::cout << "Tied!\n";
					} else {
						// Best command still wins, do nothing
					}
				}
			}
		}
	}
}

void getCommand(Creature *user, cmd* cmnd) {
	bstring str = "";
	// Match - Partial matches
	int		match=0;
	// Found - Exact match
	bool	found=false;
//	int		i=0;

	Player* pUser = user->getAsPlayer();
	str = cmnd->str[0];

	//std::cout << "Looking for a match for '" << str << "'\n";

	examineList<CrtCommand*, Command>(gConfig->generalCommands, str, match, found, cmnd->myCommand);
	if(!found)
		examineList<SkillCommand*, Command>(gConfig->skillCommands, str, match, found, cmnd->myCommand);
	// If we're a player, examine a few extra lists
	if(!found && pUser) {
		if(!found) // No exact match so far, check player list
			examineList<PlyCommand*, Command>(gConfig->playerCommands, str, match, found, cmnd->myCommand);
		if(!found && pUser->isStaff()) // Still no exact match, check staff commands
			examineList<PlyCommand*, Command>(gConfig->staffCommands, str, match, found, cmnd->myCommand);
	}
	if(!found)
	    examineList<SocialCommand*, Command>(gConfig->socials, str, match, found, cmnd->myCommand);

	if(!match)
		cmnd->ret = CMD_NOT_FOUND;
	else if(match > 1)
		cmnd->ret = CMD_NOT_UNIQUE;
	else if(cmnd->myCommand->auth && !cmnd->myCommand->auth(user))
		cmnd->ret = CMD_NOT_AUTH;
	else
		cmnd->ret = 0;
}



//*********************************************************************
//						getSpell
//*********************************************************************

Spell *Config::getSpell(bstring id, int& ret) {
	Spell *toReturn = 0;
	int match = 0;
	bool found = false;

	examineList<Spell*, Spell>(gConfig->spells, id, match, found, toReturn);

	if(!match)
		ret = CMD_NOT_FOUND;
	else if(match > 1)
		ret = CMD_NOT_UNIQUE;
	else
		ret = 0;


	return(toReturn);
}

//*********************************************************************
//						getSong
//*********************************************************************

Song *Config::getSong(bstring pName) {
	Song *toReturn = 0;
	int match = 0;
	bool found = false;

	examineList<Song*, Song>(gConfig->songs, pName, match, found, toReturn);

	return(toReturn);
}

Song *Config::getSong(bstring name, int& ret){
	Song *toReturn = 0;
	int match = 0;
	bool found = false;

	examineList<Song*, Song>(gConfig->songs, name, match, found, toReturn);

	if(!match)
		ret = CMD_NOT_FOUND;
	else if(match > 1)
		ret = CMD_NOT_UNIQUE;
	else
		ret = 0;

	return(toReturn);
}

//*********************************************************************
//						allowedWhilePetrified
//*********************************************************************

int allowedWhilePetrified(bstring str) {
	return(	str == "quit" ||
			str == "score" || str == "sc" || str == "health" ||
			str == "set" || str == "clear" || str == "toggle" || str == "prefs" ||
			str == "time" ||
			str == "info" ||
			str == "who" ||
			str == "whois" ||
			str == "finger" ||
			str == "help" ||
			str == "pass" || str == "passwd" || str == "password"
	);
}


//*********************************************************************
//						cmdProcess
//*********************************************************************
// This function takes the command structure of the person at the socket
// in the first parameter and interprets the person's command.

int cmdProcess(Creature *user, cmd* cmnd, Creature* pet) {
	Player	*player=0;
	int		fd = user->fd;

	if(fd > 0) {
		if(!pet) {
			player = user->getAsPlayer();
		} else
			user = pet;
	}

	if(player && player->afterProf) {
		broadcast(isDm, "^RafterProf field set on %s. Last command: %s", player->getCName(), player->getLastCommand().c_str());
		broadcast(isDm, "^RResetting afterProf to 0.");
		player->afterProf = 0;
	}
	if(!user) {
		printf("invalid creature trying to use cmdProcess.\n");
		return(0);
	}

	getCommand(user, cmnd);

	if(cmnd->ret == CMD_NOT_FOUND) {
		if(pet) {
			user->print("Tell %N to do what?\n", user);
		} else if(player)
			return(cmdNoExist(player, cmnd));
		return(0);
	} else if(cmnd->ret == CMD_NOT_UNIQUE) {
		user->print("Command is not unique.\n");
		return(0);
	} else if(cmnd->ret == CMD_NOT_AUTH) {
		if(player)
			return(cmdNoAuth(player));
		return(0);
	}

	if(player && !player->isStaff() && player->isEffected("petrification") && !allowedWhilePetrified(cmnd->myCommand->getName())) {
		player->print("You can't do that. You're petrified!\n");
		return(0);
	}

	cmnd->ret = cmnd->myCommand->execute(user, cmnd);

	return(cmnd->ret);
}

bstring Nameable::getName() const {
	return(name);
}

bstring Nameable::getDescription() const {
	return(description);
}

int PlyCommand::execute(Creature* player, cmd* cmnd) {
	Player *ply = player->getAsPlayer();
	if(!ply)
		return(false);
	return((fn)(ply, cmnd));
}

int CrtCommand::execute(Creature* player, cmd* cmnd) {
	return((fn)(player, cmnd));
}

const bstring& MysticMethod::getScript() const {
	return(script);
}