mud++0.35/etc/
mud++0.35/etc/guilds/
mud++0.35/help/propert/
mud++0.35/mudC/
mud++0.35/player/
mud++0.35/src/interface/
mud++0.35/src/os/cygwin32/
mud++0.35/src/os/win32/
mud++0.35/src/os/win32/bcppbuilder/
mud++0.35/src/osaddon/
mud++0.35/src/util/
/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All 
................................................ contributions are welcome. 
....Copyright(C).1995.Melvin.Smith.............. Enjoy. 
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@hom.net 
MUD++ development mailing list    mudpp@van.ml.org
------------------------------------------------------------------------------
utils.cc
*/

#include "config.h"
#include "string.h"
#include "llist.h"
#include "hash.h"
#include "nameable.h"
#include "room.h"
#include "object.h"
#include "npc.h"
#include "pc.h"
#include "global.h"


void wizLog( const String & str, const PC * pc )
{
	PC *ch;
	LList<PC> tlist = pcs;

	Cout << str << endl;

	for_each( tlist, ch )
	{
		if( !ch->isPlaying() || !ch->authorized( WIZARD )
			|| !ch->config( PC_WIZNET ) )
			continue;

		if( pc && ( ch->getLevel() <= pc->getLevel() || ch == pc ) )
			continue;

		ch->out( "\n\r[Wiznet]: " );
		ch->out( str );
		ch->out( "\n\n\r" );
	}
}


void outAllChar( const String & str )
{
	PC *ch;
	LList<PC> tlist = pcs;

	for_each( tlist, ch )
	{
		if( !ch->isPlaying() )
			continue;
		ch->out( str );
	}
}


void outAllCharExcept( const String & str, Char * ch1, Char * ch2 )
{
	PC *ch;
	LList<PC> tlist = pcs;

	for_each( tlist, ch )
	{
		if( !ch->isPlaying() )
			continue;
		else
		if( ch == ch1 || ch == ch2 )
			continue;
		ch->out( str );
	}
}


// getPCOther returns a PC in the game in any state other than the PC 
// pointed to by 'skip'. This is called by Nanny for reconnect in case a
// char is connected but not playing (logging in or in editor)
PC * getPCOther( const String & name, PC * skip )
{
	PC * other;
	LList<PC> tlist = pcs;
	for_each( tlist, other )
	{
		if( other->isName( name ) )
		{
			if( other == skip )
				continue;
			return other;
		}
	}
	tlist = shellpcs;
	for_each( tlist, other )
	{
		if( other->isName( name ) )
		{
			if( other == skip )
				continue;
			return other;
		}
	}
	return 0;
}


// getPCWorld returns a PC who is playing, if he is online but
// is not playing (editor, etc.) then he is not returned
PC * getPCWorld( const String & name )
{
	PC *ch;
	LList<PC> tlist = pcs;
	for_each( tlist, ch )
	{
		if( !ch->isPlaying() )
			continue;
		if( ch->isName( name ) )
			break;
	}
	return ch;
}


NPC * getNPCWorld( const String & name )
{
	NPC * npc;
	LList<NPC> tlist = npcs;
	for_each( tlist, npc )
		if( npc->isName( name ) )
			break;
	return npc;
}


Object *getObjWorld( const String & name )
{
	Object * obj;
	LList<Object> tlist = objects;
	for_each( tlist, obj )
		if( obj->isName( name ) )
			break;
	return obj;
}


// Direction functions

const char *lookupDirName( int dir )
{
	static const char *dir_name[] =
	{
		"north",
		"east",
		"south",
		"west",
		"up",
		"down"
	};

	if( dir < 0 || dir >= MAX_DIR )
		return "undefined";
	return dir_name[ dir ];
}


int getDir( char ch )
{
	switch( tolower(ch) )
	{
		default : return DIR_UNDEFINED;
		case 'n': return DIR_NORTH;
		case 'e': return DIR_EAST;
		case 's': return DIR_SOUTH;
		case 'w': return DIR_WEST;
		case 'u': return DIR_UP;
		case 'd': return DIR_DOWN;
	}
}


int getRevDir( int dir )
{
	switch( dir )
	{
		default : return DIR_UNDEFINED;
		case DIR_NORTH: return DIR_SOUTH;
		case DIR_EAST: return DIR_WEST;
		case DIR_SOUTH: return DIR_NORTH;
		case DIR_WEST: return DIR_EAST;
		case DIR_UP: return DIR_DOWN;
		case DIR_DOWN: return DIR_UP;
	}
}


int getDir( const char * x )
{
	switch( tolower(*x) )
	{
		default : return DIR_UNDEFINED;
		case 'n': if( !str_abbrev( "north", x ) ) return DIR_NORTH; return DIR_UNDEFINED;
		case 'e': if( !str_abbrev( "east", x ) ) return DIR_EAST; return DIR_UNDEFINED;
		case 's': if( !str_abbrev( "south", x ) ) return DIR_SOUTH; return DIR_UNDEFINED;
		case 'w': if( !str_abbrev( "west", x ) ) return DIR_WEST; return DIR_UNDEFINED;
		case 'u': if( !str_abbrev( "up", x ) ) return DIR_UP; return DIR_UNDEFINED;
		case 'd': if( !str_abbrev( "down", x ) ) return DIR_DOWN; return DIR_UNDEFINED;
	}
}