Mud20/accounts/
Mud20/accounts/c/
Mud20/accounts/f/
Mud20/accounts/k/
Mud20/accounts/s/
Mud20/accounts/t/
Mud20/area_current/
Mud20/area_current/newareas/
Mud20/bin/
Mud20/clans/
Mud20/gods/
Mud20/old-sources/
Mud20/player/
Mud20/player/a/del/
Mud20/player/b/
Mud20/player/b/bak/
Mud20/player/b/del/
Mud20/player/f/
Mud20/player/f/bak/
Mud20/player/f/del/
Mud20/player/k/
Mud20/player/k/bak/
Mud20/player/k/del/
Mud20/player/k/dmp/
Mud20/player/m/
Mud20/player/m/bak/
Mud20/player/o/
Mud20/player/o/bak/
Mud20/player/p/
Mud20/player/s/
Mud20/player/s/bak/
Mud20/player/s/del/
Mud20/player/t/
Mud20/player/t/del/
Mud20/player/v/
Mud20/public_html/
Mud20/races/
Mud20/skilltables/
__MACOSX/Mud20/accounts/
__MACOSX/Mud20/accounts/c/
__MACOSX/Mud20/accounts/f/
__MACOSX/Mud20/accounts/k/
__MACOSX/Mud20/accounts/s/
__MACOSX/Mud20/area_current/
__MACOSX/Mud20/area_current/core_areas/
__MACOSX/Mud20/area_current/helps/
__MACOSX/Mud20/area_current/newareas/
__MACOSX/Mud20/backups/
__MACOSX/Mud20/bin/
__MACOSX/Mud20/clans/
__MACOSX/Mud20/gods/
__MACOSX/Mud20/log/
__MACOSX/Mud20/old-sources/
__MACOSX/Mud20/player/
__MACOSX/Mud20/player/a/del/
__MACOSX/Mud20/player/b/
__MACOSX/Mud20/player/b/bak/
__MACOSX/Mud20/player/f/
__MACOSX/Mud20/player/f/bak/
__MACOSX/Mud20/player/f/del/
__MACOSX/Mud20/player/k/
__MACOSX/Mud20/player/k/bak/
__MACOSX/Mud20/player/k/del/
__MACOSX/Mud20/player/k/dmp/
__MACOSX/Mud20/player/m/
__MACOSX/Mud20/player/m/bak/
__MACOSX/Mud20/player/o/
__MACOSX/Mud20/player/o/bak/
__MACOSX/Mud20/player/p/
__MACOSX/Mud20/player/s/
__MACOSX/Mud20/player/s/bak/
__MACOSX/Mud20/player/t/del/
__MACOSX/Mud20/player/v/
__MACOSX/Mud20/public_html/
__MACOSX/Mud20/races/
__MACOSX/Mud20/skilltables/
/***************************************************************************
 * Mud20 1.0 by Todd H. Johnson (Kregor) a derivative of the Open Gaming   *
 * License by Wizards of the Coast. All comments referring to D20, OGL,    *
 * and SRD refer to the System Reference Document for the Open Gaming      *
 * system. Any inclusion of these derivatives must include credit to the   *
 * Mud20 system, the full and complete Open Gaming LIcense, and credit to  *
 * the respective authors. See ../doc/srd.txt for more information.        *
 *                                                                         *
 * Emud  2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem.   *
 *                                                                         *
 * MrMud 1.4 by David Bills, Dug Michael and Martin Gallwey                *
 *                                                                         *
 * Merc  2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael      *
 * Chastain, Michael Quan, and Mitchell Tse.                               *
 *                                                                         *
 * Original Diku Mud copyright (C) 1990 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik St{rfeld, Tom Madsen, and Katje Nyboe.     *
 ***************************************************************************/

/***************************************************************************
 * mob_handler.c: handler functions for mob progs												   *
 ***************************************************************************/

#include "mud.h"

/*
	even_blinded functions to support mobile commands - Scandum 20/03/02
*/

OBJ_DATA *get_obj_here_even_blinded( CHAR_DATA *ch, char *argument )
{
	OBJ_DATA *obj;

	push_call("get_obj_here_even_blinded(%p,%p)",ch,argument);

	if ((obj = get_obj_wear_even_blinded(ch, argument)) != NULL)
	{
		pop_call();
		return obj;
	}

	if ((obj = get_obj_carry_even_blinded(ch, argument)) != NULL)
	{
		pop_call();
		return obj;
	}

	if ((obj = get_obj_list_even_blinded(ch, argument, ch->in_room->first_content)) != NULL)
	{
		pop_call();
		return obj;
	}
	pop_call();
	return NULL;
}

OBJ_DATA *get_obj_wear_even_blinded( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	OBJ_DATA *obj;
	int number, count;

	push_call("get_obj_wear_even_blinded(%p,%p)",ch,argument);

	number = number_argument(argument, arg);
	count  = 0;

	for (obj = ch->first_carrying ; obj != NULL ; obj = obj->next_content)
	{
		if (obj->wear_loc != WEAR_NONE && is_name(arg, obj->name))
		{
			if (++count == number)
			{
				pop_call();
				return obj;
			}
		}
	}
	pop_call();
	return NULL;
}

OBJ_DATA *get_obj_carry_even_blinded( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	OBJ_DATA *obj;
	int number, count;

	push_call("get_obj_carry_even_blinded(%p,%p)",ch,argument);

	number = number_argument( argument, arg );
	count  = 0;

	for (obj = ch->first_carrying ; obj != NULL ; obj = obj->next_content)
	{
		if (obj->wear_loc == WEAR_NONE && is_name(arg, obj->name))
		{
			if (++count == number)
			{
				pop_call();
				return obj;
			}
		}
	}
	pop_call();
	return NULL;
}

OBJ_DATA *get_obj_list_even_blinded( CHAR_DATA *ch, char *argument, OBJ_DATA *list )
{
	char arg[MAX_INPUT_LENGTH];
	OBJ_DATA *obj;
	int number, count;

	push_call("get_obj_list_even_blinded(%p,%p,%p)",ch,argument,list);

	number = number_argument( argument, arg );
	count  = 0;

	for (obj = list ; obj != NULL ; obj = obj->next_content)
	{
		if (is_name( arg, obj->name ) )
		{
			if ( ++count == number )
			{
				pop_call();
				return obj;
			}
		}
	}
	pop_call();
	return NULL;
}

OBJ_DATA *get_obj_area_even_blinded( CHAR_DATA *ch, char *argument )
{
	OBJ_DATA *obj;
	char arg[MAX_INPUT_LENGTH];
	int number, count, vnum;

	push_call("get_obj_area_even_blinded(%p,%p)",ch,argument);

	number = number_argument(argument, arg);
	count  = 0;

	for (vnum = ch->in_room->area->low_r_vnum ; vnum <= ch->in_room->area->hi_r_vnum ; vnum++)
	{
		if (room_index[vnum] == NULL)
		{
			continue;
		}

		for (obj = room_index[vnum]->first_content ; obj ; obj = obj->next_content)
		{
			if (is_name(arg, obj->name))
			{
				if (++count == number)
				{
					pop_call();
					return obj;
				}
			}
		}
	}
	pop_call();
	return NULL;
}


OBJ_DATA *get_obj_world_even_blinded( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	OBJ_DATA *obj;
	int number, count;

	push_call("get_obj_world_even_blinded(%p,%p)",ch,argument);

	number = number_argument( argument, arg );
	count  = 0;

	if ((obj = get_obj_here_even_blinded(ch, argument)) != NULL)
	{
		pop_call();
		return obj;
	}

	for (obj = mud->f_obj ; obj ; obj = obj->next)
	{
		if (is_name(arg, obj->name))
		{
			if (++count == number)
			{
				pop_call();
				return obj;
			}
		}
	}
	pop_call();
	return NULL;
}

CHAR_DATA *get_char_room_even_blinded( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	CHAR_DATA *rch;
	int number, count;

	push_call("get_char_room_even_blinded(%p,%p)",ch,argument);

	number = number_argument( argument, arg );
	count  = 0;

	if (!strcasecmp(arg, "self"))
	{
		pop_call();
		return ch;
	}

	for (rch = ch->in_room->first_person ; rch != NULL ; rch = rch->next_in_room)
	{
		if (is_name(arg, rch->name))
		{
			if (!IS_NPC(rch) && IS_SET(rch->act, PLR_WIZINVIS))
			{
				continue;
			}
			if (++count == number)
			{
				pop_call();
				return rch;
			}
		}
	}
	pop_call();
	return NULL;
}


CHAR_DATA *get_char_area_even_blinded( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *ach;
	char arg[MAX_INPUT_LENGTH];
	int number, count, vnum;

	push_call("get_char_area_even_blinded(%p,%p)",ch,argument);

	number = number_argument(argument, arg);
	count  = 0;

	for (vnum = ch->in_room->area->low_r_vnum ; vnum <= ch->in_room->area->hi_r_vnum ; vnum++)
	{
		if (room_index[vnum] == NULL)
		{
			continue;
		}

		for (ach = room_index[vnum]->first_person ; ach ; ach = ach->next_in_room)
		{
			if (is_name(arg, ach->name))
			{
				if (!IS_NPC(ach) && IS_SET(ach->act, PLR_WIZINVIS))
				{
					continue;
				}
				if (++count == number)
				{
					pop_call();
					return ach;
				}
			}
		}
	}
	pop_call();
	return NULL;
}


CHAR_DATA *get_char_world_even_blinded( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	CHAR_DATA *wch;
	int number, count;

	push_call("get_char_world(%p,%p)",ch,argument);

	number = number_argument( argument, arg );
	count  = 0;

	if ((wch = get_char_room_even_blinded(ch, argument)) != NULL)
	{
		pop_call();
		return wch;
	}

	if ((wch = get_player_world_even_blinded(argument)) != NULL)
	{
		pop_call();
		return wch;
	}

	for (wch = mud->f_char ; wch ; wch = wch->next)
	{
		if (is_name(arg,wch->name))
		{
			if (IS_PLR(wch, PLR_WIZINVIS))
			{
				continue;
			}
			if (++count == number)
			{
				pop_call();
				return wch;
			}
		}
	}
	pop_call();
	return NULL;
}

CHAR_DATA *get_player_world_even_blinded( char *argument )
{
	char arg[MAX_INPUT_LENGTH];
	PLAYER_GAME *fpl;

	push_call("get_player_world_even_blinded(%p)",argument);

	argument = one_argument( argument, arg );

	for (fpl = mud->f_player ; fpl ; fpl = fpl->next)
	{
		if (is_name(arg, fpl->ch->name))
		{
			if (IS_PLR(fpl->ch, PLR_WIZINVIS))
			{
				continue;
			}
			pop_call();
			return fpl->ch;
		}
	}
	pop_call();
	return NULL;
}

int find_mp_location( CHAR_DATA *ch, char *arg )
{
	CHAR_DATA *victim;

	push_call("find_mp_location(%p,%p)",ch,arg);

	if (is_number(arg))
	{
		if (get_room_index(atol(arg)))
		{
			pop_call();
			return atol(arg);
		}
		pop_call();
		return -1;
	}

	if ((victim = get_player_world_even_blinded(arg)) != NULL)
	{
		pop_call();
		return victim->in_room->vnum;
	}

	if ((victim = get_char_area_even_blinded(ch, arg)) != NULL)
	{
		pop_call();
		return victim->in_room->vnum;
	}

	pop_call();
	return -1;
}

bool is_room_good_for_teleport( CHAR_DATA *victim, int rvnum )
{
	ROOM_INDEX_DATA *pRoomIndex;

	push_call_format("is_room_good_for_teleport(%p,%d)",victim,rvnum);

	pRoomIndex = get_room_index( rvnum );

	if (pRoomIndex == NULL)
	{
		pop_call();
		return( FALSE );
	}

	if (IS_SET(pRoomIndex->area->flags, AFLAG_NOTELEPORT))
	{
		pop_call();
		return( FALSE );
	}
	if (IS_SET(pRoomIndex->area->flags, AFLAG_NORECALL))
	{
		pop_call();
		return( FALSE );
	}
	if (IS_SET(pRoomIndex->area->flags, AFLAG_NORIP))
	{
		pop_call();
		return( FALSE );
	}

	if (IS_SET(pRoomIndex->room_flags, ROOM_NO_RECALL))
	{
		pop_call();
		return( FALSE );
	}
	if (IS_SET(pRoomIndex->room_flags, ROOM_PRIVATE))
	{
		pop_call();
		return( FALSE );
	}
	if (IS_SET(pRoomIndex->room_flags, ROOM_NO_ASTRAL))
	{
		pop_call();
		return( FALSE );
	}
	if (IS_SET(pRoomIndex->room_flags, ROOM_SOLITARY))
	{
		pop_call();
		return( FALSE );
	}
	if (IS_SET(pRoomIndex->room_flags, ROOM_CLANHALL))
	{
		pop_call();
		return( FALSE );
	}
	if (IS_SET(pRoomIndex->room_flags, ROOM_RIP))
	{
		pop_call();
		return( FALSE );
	}

	if (pRoomIndex->sector_type == SECT_ETHEREAL)
	{
		pop_call();
		return( FALSE );
	}
	if (pRoomIndex->sector_type == SECT_ASTRAL)
	{
		pop_call();
		return( FALSE );
	}
	if (pRoomIndex->area->low_hard_range != 0 || pRoomIndex->area->hi_hard_range != 0)
	{
		if (victim->level < LEVEL_IMMORTAL)
		{
			if (victim->level < pRoomIndex->area->low_hard_range)
			{
				pop_call();
				return( FALSE );
			}
			if (victim->level > pRoomIndex->area->hi_hard_range)
			{
				pop_call();
				return( FALSE );
			}
		}
	}	
	if (is_affected(victim, gsn_dimensional_anchor))
	{
		pop_call();
		return( FALSE );
	}
	pop_call();
	return( TRUE );
}


void set_exit( int room, int door, int dest)
{
	EXIT_DATA *pExit;

	push_call("set_exit(%p,%p,%p)",room,door,dest);

	if (room <= 0 || dest < -1
	||  room_index[room] == NULL
	||  door < 0 || door > 5
	|| (dest != -1 && room_index[dest] == NULL))
	{
		log_printf("Bad room connect at %d door %d to %d", room, door, dest);
		pop_call();
		return;
	}

	if (room_index[room]->exit[door] == NULL && dest > 0)
	{
		create_exit(room_index[room], door);
	}

	pExit = room_index[room]->exit[door];

	if (dest > 0)
	{
		pExit->to_room	= dest;
	}
	else
	{
		if (pExit)
		{
			pExit->to_room = 0;
		}
	}
	pop_call();
	return;
}

lg_int translate_bits( char *string )
{
	int cnt, num;
	lg_int number;
	char c;
	char buf[100];

	push_call("translate_bits(%p)",string);

	cnt    = 0;
	number = 0;

	for (c = string[cnt] ; isdigit(c) || isupper(c) || c == '_' ; c = string[++cnt])
	{
		buf[cnt] = c;
	}

	buf[cnt] = '\0';

	if (isupper(buf[0]))
	{
		for (num = mud->bitvector_ref[*buf - 'A'] ; *bitvector_table[cnt].name != '\0' ; num++)
		{
			if (!strcmp(bitvector_table[num].name, buf))
			{
				number = bitvector_table[num].value;
				break;
			}
		}
		if (*bitvector_table[cnt].name == '\0')
		{
			log_printf("translate_bits: bad vector '%s'", buf);
		}
	}
	else
	{
		number = atoll(buf);
	}

	if (c == '|')
	{
		number += translate_bits(&string[cnt + 1]);
	}
	pop_call();
	return number;
}