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/
/***************************************************************************
 * Emud  2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem.   *
 *                                                                         *
 * MrMud 1.4 by David Bills and Dug Michael.                               *
 *                                                                         *
 * 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.     *
 ***************************************************************************/

/*
	This file was part of eMud - deprecated in Mud20, but left intact - Kregor
*/
#include "emud.h"

bool clanfounder;

bool get_bitvector_value(char *name, int *number, char *allowed)
{
	int cnt;

	push_call("get_bitvector_value(%p,%p,%p)",name,number,allowed);

	if (allowed == NULL && is_number(name))
	{
		*number = atol(name);

		pop_call();
		return TRUE;
	}
	if (is_name_short(allowed, name))
	{
		for (cnt = 0 ; cnt < MAX_BITVECTOR ; cnt++)
		{
			if (is_name(name, bitvector_table[cnt].name))
			{
				*number = bitvector_table[cnt].value;

				pop_call();
				return TRUE;
			}
		}
	}
	*number = -1;

	pop_call();
	return FALSE;
}

void list_bitvectors(CHAR_DATA *ch,char *prefix)
{
	int cnt;
	char buf[81],bigBuf[MAX_STRING_LENGTH];

	push_call("list_bitvectors(%p,%p)",ch,prefix);

	bigBuf[0] = '\0';

	for (cnt = 0 ; cnt < MAX_BITVECTOR ; cnt++)
	{
		if (is_name_short(prefix, bitvector_table[cnt].name))
		{
			sprintf(buf,"   %s\n\r",bitvector_table[cnt].name);
			strcat(bigBuf,buf);
		}
	}

	if (bigBuf[0] == '\0')
	{
		sprintf(buf,"There are no bitvectors starting with '%s'.\n\r",prefix);
		send_to_char(buf,ch);
	}
	else
	{
		send_to_char(bigBuf,ch);
	}

	pop_call();
	return;
}

bool do_castle_mstat( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_INPUT_LENGTH];
 	char tmp[MAX_STRING_LENGTH];
 	char buf1[MAX_STRING_LENGTH];
  	char buf2[MAX_STRING_LENGTH];
 	char buf3[MAX_STRING_LENGTH];
	char bld[10], dim[10];
	CHAR_DATA *victim;
	OBJ_DATA *wield;

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

	one_argument( argument, arg );

	if (arg[0] == '\0')
	{
		send_to_char( "Mstat whom?\n\r", ch );
		pop_call();
		return FALSE;
	}

	if ((victim = get_char_room(ch, arg)) == NULL)
	{
		send_to_char( "They aren't here.\n\r", ch );
		pop_call();
		return FALSE;
	}

	if (!IS_NPC(victim))
	{
		send_to_char( "Don't be silly.\n\r", ch );
		pop_call();
		return FALSE;
	}

	if (victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
	{
		send_to_char( "You can't stat them!\n\r", ch );
		pop_call();
		return FALSE;
	}

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));

	tmp[0] = '\0';

	ch_printf(ch, "%s        Name: %s%s\n\r"  , dim, bld, victim->name);
	ch_printf(ch, "%s       Short: %s%s\n\r"  , dim, bld, victim->short_descr);
	ch_printf(ch, "%s        Long: %s%s\n\r"  , dim, bld, victim->long_descr);

	sprintf(buf1, "%s        Vnum: %s%11u "   , dim, bld, victim->pIndexData->vnum);
	sprintf(buf2, "%s       Level: %s%11d "   , dim, bld, victim->level);
	sprintf(buf3, "%s        Room: %s%11u\n\r", dim, bld, victim->in_room->vnum);

	ch_printf(ch, "%s%s%s", buf1, buf2, buf3);

	sprintf(buf1, "%s   Alignment: %s%11d "   , dim, bld, victim->alignment);
	sprintf(buf2, "%s Armor Class: %s%11d "   , dim, bld, 0 - (mob_armor(victim) + victim->level*4 - 100));
	sprintf(buf3, "%s        Gold: %s%11d\n\r", dim, bld, victim->gold);

	ch_printf(ch, "%s%s%s", buf1, buf2, buf3);

	sprintf(buf1, "%s     Hitroll: %s%11d "   , dim, bld, GET_HITROLL(victim));
	sprintf(tmp,  "%dd%d+%d", victim->npcdata->damnodice, victim->npcdata->damsizedice, GET_DAMROLL(victim) + victim->npcdata->damplus);
	sprintf(buf2, "%s     Damroll: %s%11s "   , dim, bld, tmp);
	if ((wield = get_eq_char(victim, WEAR_WIELD)) != NULL && wield->item_type == ITEM_WEAPON)
	{
		sprintf(tmp, "%dd%d", wield->value[1], wield->value[2]);
	}
	else
	{
		sprintf(tmp, "none");
	}
	sprintf(buf3, "%s      Weapon: %s%11s\n\r", dim, bld, tmp);

	ch_printf(ch, "%s%s%s", buf1, buf2, buf3);

	sprintf(tmp, "%d/%d", victim->hit, victim->max_hit);
	sprintf(buf1, "%s          Hp: %s%11s "   , dim, bld, tmp);
	sprintf(tmp, "%d/%d", victim->mana, victim->max_mana);
	sprintf(buf2, "%s        Mana: %s%11s "   , dim, bld, tmp);
	sprintf(tmp, "%d/%d", victim->move, victim->max_move);
	sprintf(buf3, "%s        Move: %s%11s\n\r", dim, bld, tmp);

	ch_printf(ch, "%s%s%s", buf1, buf2, buf3);

	sprintf(buf1, "%s        Race: %s%11s "   , dim, bld, race_table[victim->race].race_name);
	sprintf(buf2, "%s         Sex: %s%11s "   , dim, bld, victim->sex <= 0 ? "Neutral" : victim->sex == 1 ? "Male" : "Female");
	sprintf(buf3, "%s    Position: %s%11s\n\r", dim, bld, victim->position == 8 ? "Standing" : victim->position == 7 ? "fighting" : victim->position == 6 ? "sitting" : victim->position == 5 ? "resting" : victim->position == 4 ? "sleeping" : "dying");

	ch_printf(ch, "%s%s%s", buf1, buf2, buf3);

	sprintf(buf1, "%sCarry Number: %s%11d "   , dim, bld, victim->carry_number);
	sprintf(buf2, "%sCarry Weight: %s%11d "   , dim, bld, victim->carry_weight);
	sprintf(buf3, "%sSaving Spell: %s%11d\n\r", dim, bld, GET_SAVING_THROW(victim));

	ch_printf(ch, "%s%s%s", buf1, buf2, buf3);

	ch_printf(ch, "%sAction Flags: %s%s\n\r", dim, bld, flag_string(victim->act, act_flags));
	ch_printf(ch, "%sAffect Flags: %s%s\n\r", dim, bld, affect_bit_name(victim->affected_by));

	if (IS_SET(victim->pIndexData->act, ACT_BODY))
	{
		int cnt;
		char buf[MAX_STRING_LENGTH];

		strcpy(buf, "");

		for (cnt = 0 ; cnt < MAX_BODY ; cnt++)
		{
			if (IS_SET(victim->pIndexData->body_parts, 1<<cnt))
			{
				strcat( buf, body_table[cnt].name);
				strcat( buf, " ");
			}
		}
		ch_printf(ch, "%s  Body Parts: %s%s\n\r", dim, bld, buf);

		strcpy(buf, "");

		for (cnt = 0; cnt < MAX_BODY ; cnt++)
		{
			if (IS_SET(victim->pIndexData->attack_parts, 1<<cnt))
			{
				strcat( buf, body_table[cnt].name);
				strcat( buf, " ");
			}
		}
		ch_printf(ch, "%sAttack Parts: %s%s\n\r", dim, bld, buf);
	}

	pop_call();
	return TRUE;
}

bool do_castle_ostat( CHAR_DATA *ch, char *argument )
{
	char arg [MAX_INPUT_LENGTH];
	char bld [10], dim [10];
	OBJ_DATA    *obj;

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

	one_argument(argument, arg);

	if (arg[0] == '\0')
	{
		send_to_char( "Syntax: castle ostat <name>\n\r", ch );
		pop_call();
		return FALSE;
	}

	if ((obj = get_obj_here(ch, arg)) == NULL)
	{
		send_to_char( "You do not see that here.\n\r", ch );
		pop_call();
		return FALSE;
	}

	if (obj->pIndexData->creator_pvnum != ch->pcdata->pvnum)
	{
		send_to_char("You can't ostat that.\n\r", ch );
		pop_call();
		return FALSE;
	}

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));

	ch_printf(ch, "%s    Name:%s %s\n\r", dim, bld, obj->name);
	ch_printf(ch, "%s   Short:%s %s\n\r", dim, bld, obj->short_descr);
	ch_printf(ch, "%s    Long:%s %s\n\r", dim, bld, obj->long_descr);
	ch_printf(ch, "%s    Type:%s %s\n\r", dim, bld, item_type_name(obj));
	ch_printf(ch, "%sItemflag:%s %s\n\r", dim, bld, flag_string(obj->extra_flags, o_flags));

	switch (obj->item_type)
	{
		case ITEM_FOUNTAIN:
			ch_printf(ch, "%s  Liquid:%s %s\n\r", dim, bld, liq_table[(obj->value[2])].liq_name);
			break;
		case ITEM_CONTAINER:
			ch_printf(ch, "%s   Carry:%s %d\n\r", dim, bld, obj->value[0]);
			ch_printf(ch, "%s     Lid:%s %s\n\r", dim, bld, flag_string(obj->value[1], cont_flags));
			ch_printf(ch, "%s     Key:%s %s\n\r", dim, bld, obj->value[2] < 1 ? "none" : get_obj_index(obj->value[2]) ? get_obj_index(obj->value[2])->short_descr : "unknown");
			break;
		case ITEM_FURNITURE:
			ch_printf(ch, "%s    Size:%s %d\n\r", dim, bld, obj->value[0]);
			ch_printf(ch, "%s   Poses:%s %s\n\r", dim, bld, flag_string(obj->value[2], f_flags));
			ch_printf(ch, "%s   Regen:%s %d\n\r", dim, bld, obj->value[3]);
			break;
	}

	pop_call();
	return TRUE;
}

void do_castle_rstat( CHAR_DATA *ch, char *argument )
{
	OBJ_DATA        *obj;
	CHAR_DATA       *rch;

	char buf1[MAX_STRING_LENGTH];
	char buf2[MAX_STRING_LENGTH];
	char buf3[MAX_STRING_LENGTH];
	char bld [10], dim [10];
	int door;

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

	one_argument(argument, argument);

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));

	ch_printf(ch, "%s       Name:%s %s\n\r", dim, bld, ch->in_room->name);
	ch_printf(ch, "%s       Area:%s %s\n\r", dim, bld, ch->in_room->area->name);
	ch_printf(ch, "%s       Vnum:%s %u\n\r", dim, bld, ch->in_room->vnum);
	ch_printf(ch, "%s     Sector:%s %s\n\r", dim, bld, broken_bits(ch->in_room->sector_type, "SECT_", TRUE));

	ch_printf(ch, "%s Room flags: %s%s\n\r", dim, bld, flag_string(ch->in_room->room_flags, r_flags));

	if (ch->in_room->first_extradesc != NULL )
	{
		EXTRA_DESCR_DATA *ed;

		sprintf(buf1, "%sExtra Descs:%s ",      dim, bld);
		sprintf(buf2, "%s,%s ",                 dim, bld);
		for (ed = ch->in_room->first_extradesc ; ed ; ed = ed->next)
		{
			strcat(buf1, ed->keyword);
			if (ed->next)
			{
				strcat(buf1, buf2);
			}
		}
		ch_printf(ch, "%s\n\r", buf1);
	}

	sprintf( buf1, "%s Characters:%s ",     dim, bld);
	sprintf( buf2, "%s,%s ",                dim, bld);
	for (rch = ch->in_room->first_person ; rch ; rch = rch->next_in_room)
	{
		if (can_see(ch, rch))
		{
			if (str_suffix(" ", buf1))
			{
				strcat(buf1, buf2);
			}
			one_argument_nolower(rch->name, buf3);
			strcat(buf1, buf3);
		}
	}
	ch_printf(ch, "%s\n\r", buf1);

	if (ch->in_room->first_content)
	{
		sprintf(buf1, "%s    Objects:%s ",      dim, bld);
		sprintf(buf2, "%s,%s ",                 dim, bld);
		for (obj = ch->in_room->first_content ; obj ; obj = obj->next_content)
		{
			if (can_see_obj(ch, obj))
			{
				if (strlen(buf1) > 33)
				{
					strcat(buf1, buf2);
				}
				one_argument_nolower(obj->name, buf3);
				strcat(buf1, buf3);
			}
		}
		ch_printf(ch, "%s\n\r", buf1);
	}

	for (door = 0 ; door <= 5 ; door++)
	{
		EXIT_DATA *pexit;

		if ((pexit = ch->in_room->exit[door]) != NULL)
		{
			sprintf(buf1,"%s      %5s:%s %-10s", dim, capitalize(dir_name[door]), bld, room_index[pexit->to_room] ? str_resize(room_index[pexit->to_room]->name, argument, -10) : "null");
			sprintf(buf2,"%s Key:%s %-10s",      dim, bld, pexit->key < 1 ? "none" : get_obj_index(pexit->key) ? str_resize(get_obj_index(pexit->key)->short_descr, argument, -10) : "unknown");
			sprintf(buf3,"%s Flags:%s %s",       dim, bld, flag_string(pexit->exit_info, exit_flags));

			ch_printf(ch, "%s%s%s\n\r", buf1, buf2, buf3);
		}
	}

	pop_call();
	return;
}


void do_castle_entrance( CHAR_DATA *ch, char *argument )
{
	CASTLE_DATA     *castle;
	EXIT_DATA       *pexit;
	RESET_DATA	 *reset;
	ROOM_INDEX_DATA *pRoomIndex;
	char buf[81], dim[10], bld[10];
	int vnum, door, argn, cost;

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

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));
	castle = ch->pcdata->castle;

	if (!IS_SET(ch->in_room->room_flags, ROOM_IS_CASTLE))
	{
		switch(ch->in_room->sector_type)
		{
			case SECT_FIELD:
			case SECT_FOREST:
			case SECT_HILLS:
			case SECT_MOUNTAIN:
			case SECT_DESERT:
				if (IS_SET(ch->in_room->room_flags, ROOM_NO_CASTLE)
				||  IS_SET(ch->in_room->area->flags, AFLAG_NOCASTLE))
				{
					send_to_char("You cannot build a castle here.\n\r",ch);
					pop_call();
					return;
				}
				break;
			default:
				send_to_char("Alas, you cannot build a castle here.\n\r",ch);
				pop_call();
				return;
				break;
		}
	}
	else if (castle == NULL)
	{
		send_to_char("You cannot build a castle in a castle.\n\r",ch);
		pop_call();
		return;
	}

	if (castle != NULL)
	{
		/*
			Debug info for lost entrance.
		*/

		pRoomIndex = room_index[castle->entrance];

		if (pRoomIndex == NULL
		||  ch->pcdata->pvnum != pRoomIndex->creator_pvnum
		|| !IS_SET(pRoomIndex->room_flags, ROOM_IS_ENTRANCE)
		|| !IS_SET(pRoomIndex->room_flags, ROOM_IS_CASTLE))
		{
			for (vnum = ROOM_VNUM_CASTLE ; vnum < MAX_VNUM ; vnum++)
			{
				if ((pRoomIndex = room_index[vnum]) == NULL)
				{
					continue;
				}
				if (ch->pcdata->pvnum == pRoomIndex->creator_pvnum
				&& IS_SET(pRoomIndex->room_flags, ROOM_IS_ENTRANCE)
				&& IS_SET(pRoomIndex->room_flags, ROOM_IS_CASTLE))
				{
					break;
				}
			}
			if (vnum >= MAX_VNUM || room_index[vnum] == NULL)
			{
				send_to_char("You no longer have a castle entrance. Contact the immortals.\n\r", ch);
				pop_call();
				return;
			}
			ch_printf(ch, "Your entrance is located at vnum %d. Contact the immortals.\n\r", vnum);
			pop_call();
			return;
		}
		send_to_char("You already have a castle entrance!\n\r",ch);
		pop_call();
		return;
	}

	if (!get_bitvector_value(argument, &argn, "DIR_"))
	{
		char exit_buf[MAX_STRING_LENGTH];

		for (door = 0, exit_buf[0] = '\0' ; door <= 5 ; door++)
		{
			if (ch->in_room->exit[door] == NULL)
			{
				sprintf(buf, "%s%s%s|", bld, broken_bits(door, "DIR_", TRUE), dim);
				strcat(exit_buf, buf);
			}
		}

		if (exit_buf[0] == '\0')
		{
			send_to_char( "There are no available exits here to create a castle entrance.\n\r", ch);
		}
		else
		{
			exit_buf[strlen(exit_buf)-1] = '\0';
			ch_printf(ch, "%sSyntax:%s castle entrance %s<%s>\n\r", dim, bld, dim, exit_buf);
		}
		pop_call();
		return;
	}

	if (ch->in_room->exit[argn] != NULL)
	{
		send_to_char("You cannot create a castle entrance in that direction.\n\r",ch);
		pop_call();
		return;
	}

	/*
		Check for random exit reset - Scandum 02-03-2002
	*/

	for (reset = ch->in_room->area->first_reset ; reset ; reset = reset->next)
	{
		if (!is_room_reset(reset, ch->in_room))
		{
			continue;
		}
		if (reset->command == 'R')
		{
			break;
		}
	}
	if (reset)
	{
		send_to_char("Alas, you cannot build a castle here.\n\r",ch);
		pop_call();
		return;
	}

	cost = haggle(ch, COST_OF_ENTRANCE) * 1000;

	if (ch->gold < cost)
	{
		ch_printf(ch, "It will cost you %s gold coins to build a room.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	for (vnum = ROOM_VNUM_CASTLE ; room_index[vnum] != NULL && vnum < MAX_VNUM ; vnum++);
	{
		if (vnum >= MAX_VNUM)
		{
			send_to_char("You cannot create an entrance. Contact the immortals.\n\r",ch);
			pop_call();
			return;
		}
	}

	/*
		create player's castle data
	*/

	ALLOCMEM(ch->pcdata->castle, CASTLE_DATA, 1);
	ch->pcdata->castle->entrance		= 0;
	ch->pcdata->castle->door_room		= -1;
	ch->pcdata->castle->door_dir		= -1;
	ch->pcdata->castle->has_backdoor	= FALSE;
	ch->pcdata->castle->cost			= 0;
	ch->pcdata->castle->num_rooms		= 0;
	ch->pcdata->castle->num_mobiles	= 0;
	ch->pcdata->castle->num_objects	= 0;
	castle						= ch->pcdata->castle;

	ch_printf(ch, "A contractor comes and takes %s gold.\n\r", tomoney(cost));

	/*
		create room
	*/

	sprintf(buf, "The Castle of %s", ch->name);

	create_room(vnum);
	pRoomIndex = room_index[vnum];

	pRoomIndex->name			= STRALLOC( buf );
	pRoomIndex->area			= room_index[ROOM_VNUM_CASTLE]->area;
	pRoomIndex->vnum			= vnum;
	pRoomIndex->creator_pvnum	= ch->pcdata->pvnum;
	pRoomIndex->description		= STRALLOC( "This room is bare of all ornamentation and appears to be relatively new." );
	pRoomIndex->room_flags		= ROOM_IS_CASTLE|ROOM_SAFE|ROOM_IS_ENTRANCE;
	pRoomIndex->sector_type		= SECT_INSIDE;

	for (door = 0 ; door < MAX_LAST_LEFT ; door++)
	{
		pRoomIndex->last_left[door] = STRDUPE(str_empty);
	}

	create_exit(pRoomIndex, rev_dir[argn]);
	pexit = pRoomIndex->exit[rev_dir[argn]];

	RESTRING(pexit->description, buf);
	pexit->vnum				= ch->in_room->vnum;
	pexit->to_room				= ch->in_room->vnum;

	create_exit(ch->in_room, argn);
	pexit = ch->in_room->exit[argn];

	RESTRING(pexit->description, buf);
	pexit->pvnum				= ch->pcdata->pvnum;
	pexit->to_room				= pRoomIndex->vnum;

	if (vnum > pRoomIndex->area->hi_r_vnum)
	{
		pRoomIndex->area->hi_r_vnum = vnum;
	}
	if (vnum < pRoomIndex->area->low_r_vnum)
	{
		pRoomIndex->area->low_r_vnum = vnum;
	}

	act( "Builders come, work, take a break, and leave.", ch, NULL, NULL, TO_ROOM );
	ch_printf(ch, "Builders come and build a room %swards.\n\r", dir_name[argn]);

	ch->gold			-= cost;
	castle->cost		+= cost/1000;
	castle->num_rooms	+= 1;
	castle->entrance	=  vnum;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_connect( CHAR_DATA *ch, char *argument )
{
	CASTLE_DATA *castle;
	EXIT_DATA *pexit, *castleexit;
	char buf[81], dim[10], bld[10];
	int cost, argn; 

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

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));
	castle = ch->pcdata->castle;

	if (!strcasecmp(argument, "clear"))
	{
		castle->door_room = -1;
		castle->door_dir  = -1;
		send_to_char("Clearing first connection.\n\r", ch);
		pop_call();
		return;
	}

	/*
		Check for backdoors
		Only allow if they already defined first connect - Scandum
	*/

	if (ch->in_room->creator_pvnum != ch->pcdata->pvnum)
	{
		if (castle->door_room == -1)
		{
			send_to_char("You must have defined the first connect to create a backdoor.\n\r", ch);
			pop_call();
			return;
		}

		if (castle->has_backdoor && !clanfounder)
		{
			send_to_char("You can only have one back door.\n\r",ch);
			pop_call();
			return;
		}

		if (clanfounder)
		{
			cost = COST_OF_CLANDOOR * 1000;
			if (ch->pcdata->clan->coffers < cost)
			{
				ch_printf(ch, "It will cost you %s gold coins to build a clan-wide back door.\n\r", tomoney(cost));
				pop_call();
				return;
			}
		}
		else
		{
			cost = haggle(ch, COST_OF_BACKDOOR) * 1000;

			if (ch->gold < cost)
			{
				ch_printf(ch, "It will cost you %s gold coins to build a back door.\n\r", tomoney(cost));
				pop_call();
				return;
			}
		}
	}
	else
	{
		cost = haggle(ch, COST_OF_DOOR) * 1000;
		if (ch->gold < cost)
		{
			ch_printf(ch, "It will cost you %s gold coins to build a connection.\n\r", tomoney(cost));
			pop_call();
			return;
		}
	}

	if (!get_bitvector_value(argument, &argn, "DIR_") && castle->door_room == -1)
	{
		int door;
		char exit_buf[MAX_STRING_LENGTH];

		for (door = 0, exit_buf[0] = '\0' ; door <= 5 ; door++)
		{
			if (ch->in_room->exit[door] == NULL)
			{
				sprintf(buf, "%s%s%s|", bld, broken_bits(door, "DIR_", TRUE), dim);
				strcat(exit_buf, buf);
			}
		}

		if (exit_buf[0] == '\0')
		{
			send_to_char( "There are no available exits here to create a castle connection.\n\r", ch);
		}
		else
		{
			exit_buf[strlen(exit_buf)-1] = '\0';
			ch_printf(ch, "%sSyntax:%s castle connect %s<%s>\n\r", dim, bld, dim, exit_buf);
		}
		pop_call();
		return;
	}

	/*
		default direction is opposite of first one
	*/

	if (castle->door_room != -1 && argn == -1)
	{
		argn = rev_dir[castle->door_dir];
	}

	if (ch->in_room->exit[argn] != NULL)
	{
		send_to_char("You cannot create a connection in that direction.\n\r",ch);
		pop_call();
		return;
	}

	if (!IS_SET(ch->in_room->room_flags, ROOM_IS_CASTLE))
	{
		switch(ch->in_room->sector_type)
		{
			case SECT_FIELD:
			case SECT_FOREST:
			case SECT_HILLS:
			case SECT_MOUNTAIN:
			case SECT_DESERT:
				if (IS_SET(ch->in_room->room_flags, ROOM_NO_CASTLE)
				||  IS_SET(ch->in_room->area->flags, AFLAG_NOCASTLE))
				{
					send_to_char("You cannot build a back door in this room.\n\r",ch);
					pop_call();
					return;
				}
				break;
			default:
				send_to_char("You cannot build a back door in this room.\n\r",ch);
				pop_call();
				return;
				break;
		}
	}

	if (castle->door_room == -1)
	{
		castle->door_room = ch->in_room->vnum;
		castle->door_dir  = argn;
		send_to_char("Now you have to go define the other side of the connection.\n\r",ch);
		pop_call();
		return;
	}

	if (room_index[castle->door_room] == NULL
	||  room_index[castle->door_room]->exit[castle->door_dir] != NULL
	||  room_index[castle->door_room]->creator_pvnum != ch->pcdata->pvnum)
	{
		send_to_char("Your first connection became corrupted.  Clearing first connection.\n\r",ch);
		castle->door_room = -1;
		castle->door_dir  = -1;
		pop_call();
		return;
	}

	if (ch->in_room->creator_pvnum != ch->pcdata->pvnum)
	{
		if (IS_SET(room_index[castle->door_room]->room_flags, ROOM_IS_ENTRANCE))
		{
			send_to_char("You cannot build a back door from your castle entrance.\n\r", ch);
			pop_call();
			return;
		}
		if (IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
		{
			send_to_char("You cannot build a back door from an entrance.\n\r", ch);
			pop_call();
			return;
		}
	}

	/*
		other rooms exit points to room
	*/

	create_exit(room_index[castle->door_room], castle->door_dir);
	pexit = room_index[castle->door_room]->exit[castle->door_dir];

	pexit->pvnum		= ch->pcdata->pvnum;
	pexit->vnum		= ch->in_room->vnum;
	pexit->to_room		= ch->in_room->vnum;

	castleexit = pexit;

	/*
		room exit points to other room
	*/

	if (room_index[ch->in_room->vnum]->creator_pvnum == ch->pcdata->pvnum)
	{
		create_exit(ch->in_room, argn);
		pexit = ch->in_room->exit[argn];
	
		pexit->pvnum			= ch->pcdata->pvnum;
		pexit->vnum			= castle->door_room;
		pexit->to_room			= castle->door_room;
		castleexit			= pexit;
	}

	act("Builders come, take a break, and leave.",ch,NULL,NULL,TO_ROOM);

	/*
		modify the appropriate character and castle data
	*/

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
	castle->door_room	 = -1;
	castle->door_dir	 = -1;

	if (ch->in_room->creator_pvnum != ch->pcdata->pvnum)
	{
		if (!clanfounder)
		{
			SET_BIT(castleexit->exit_info, EX_BACKDOOR);
			castle->has_backdoor = TRUE;
			ch->gold			-= cost;
			castle->cost		+= cost/1000;
			send_to_char("The back door has been made.\n\r",ch);
		}
		else
		{
			SET_BIT(castleexit->exit_info, EX_CLAN_BACKDOOR);
			ch->pcdata->clan->num_backdoors++;
			ch->pcdata->clan->coffers -= cost;
			ch_printf(ch, "You just made a clan-wide backdoor for %s.\n\r", ch->pcdata->clan->name);
		}
	}
	else
	{
		ch->gold			-= cost;
		castle->cost		+= cost/1000;
		send_to_char("The door has been made.\n\r",ch);
	}
	pop_call();
	return;
}

void do_castle_rcreate( CHAR_DATA *ch, char *argument )
{
	CASTLE_DATA *castle;
	EXIT_DATA *pexit;
	ROOM_INDEX_DATA *pRoomIndex;
	char buf[81], dim[10], bld[10];
	int vnum, door, cost, argn;

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

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));
	castle = ch->pcdata->castle;

	if (!get_bitvector_value(argument, &argn, "DIR_"))
	{
		char exit_buf[MAX_STRING_LENGTH];

		for (door = 0, exit_buf[0] = '\0' ; door <= 5 ; door++)
		{
			if (ch->in_room->exit[door] == NULL)
			{
				sprintf(buf, "%s%s%s|", bld, broken_bits(door, "DIR_", TRUE), dim);
				strcat(exit_buf, buf);
			}
		}
		if (exit_buf[0] == '\0')
		{
			send_to_char( "There are no available exits here to create a room.\n\r", ch);
		}
		else
		{
			exit_buf[strlen(exit_buf)-1] = '\0';
			ch_printf(ch, "%sSyntax:%s castle rcreate %s<%s>\n\r", dim, bld, dim, exit_buf);
		}
		pop_call();
		return;
	}

	if (ch->in_room->exit[argn] != NULL)
	{
		send_to_char("You cannot create a room in that direction.\n\r",ch);
		pop_call();
		return;
	}

	cost = (haggle(ch, COST_OF_CREATE)) * 1000;

	if (ch->gold < cost)
	{
		ch_printf(ch, "It will cost you %s gold coins to build a room.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	if (castle != NULL && castle->num_rooms >= 20)
	{
		send_to_char("You cannot make any more rooms.\n\r",ch);
		pop_call();
		return;
	}

	/* find an empty vnum */

	for (vnum = ROOM_VNUM_CASTLE ; room_index[vnum] != NULL && vnum < MAX_VNUM ; vnum++);
	{
		if (vnum >= MAX_VNUM)
		{
			send_to_char("I'm sorry, you can't create a room, tell the Implementors.\n\r",ch);
			pop_call();
			return;
		}
	}
	ch_printf(ch, "A contractor comes and takes %s gold coins.\n\r", tomoney(cost));

	sprintf(buf, "The Castle of %s", ch->name);

	create_room(vnum);

	pRoomIndex = room_index[vnum];

	pRoomIndex->name			= STRALLOC(buf);
	pRoomIndex->area			= room_index[ROOM_VNUM_CASTLE]->area;
	pRoomIndex->vnum			= vnum;
	pRoomIndex->creator_pvnum	= ch->pcdata->pvnum;
	pRoomIndex->description		= STRALLOC( "This room is bare of all ornamentation and appears to be relatively new." );
	pRoomIndex->room_flags		= ROOM_IS_CASTLE;
	pRoomIndex->sector_type		= SECT_INSIDE;

	for (door = 0 ; door < MAX_LAST_LEFT ; door++)
	{
		pRoomIndex->last_left[door] = STRDUPE(str_empty);
	}

	create_exit(pRoomIndex, rev_dir[argn]);
	pexit = pRoomIndex->exit[rev_dir[argn]];

	RESTRING(pexit->description, buf);
	pexit->vnum				= ch->in_room->vnum;
	pexit->to_room				= ch->in_room->vnum;

	create_exit(ch->in_room, argn);
	pexit = ch->in_room->exit[argn];
	RESTRING(pexit->description, buf);
	pexit->pvnum				= ch->pcdata->pvnum;
	pexit->vnum				= pRoomIndex->vnum;
	pexit->to_room				= pRoomIndex->vnum;

	if (vnum > pRoomIndex->area->hi_r_vnum)
	{
		pRoomIndex->area->hi_r_vnum = vnum;
	}

	if (vnum < pRoomIndex->area->low_r_vnum)
	{
		pRoomIndex->area->low_r_vnum = vnum;
	}

	act("Builders come, work, take a break, and leave.",ch,NULL,NULL,TO_ROOM);
	ch_printf(ch, "Builders come and build a room %swards.\n\r", dir_name[argn]);

	ch->gold			-= cost;
	castle->cost		+= cost / 1000;
	castle->num_rooms	+= 1;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_mcreate( CHAR_DATA *ch )
{
	AREA_DATA		*pArea;
	MOB_INDEX_DATA	*pMobIndex;
	CHAR_DATA		*mob;
	RESET_DATA	*pReset;
	int vnum, cost;

	push_call("do_castle_mcreate(%p)",ch);

	cost   = haggle(ch, COST_OF_CREATE) * 1000;

	if (ch->gold < cost)
	{
		ch_printf(ch, "It will cost you %s gold coins to create a mobile.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	if (ch->pcdata->castle->num_mobiles >= 20)
	{
		send_to_char("You cannot create more than 20 mobiles.\n\r", ch);
		pop_call();
		return;
	}

	for (vnum = ROOM_VNUM_CASTLE ; get_mob_index(vnum) != NULL && vnum < MAX_VNUM ; vnum++);
	{
		if (vnum >= MAX_VNUM)
		{
			send_to_char("You can't create a mobile, tell the Immortals.\n\r",ch);
			pop_call();
			return;
		}
	}

	ALLOCMEM( pMobIndex, MOB_INDEX_DATA, 1);
	pMobIndex->creator_pvnum        = ch->pcdata->pvnum;
	pMobIndex->vnum                 = vnum;
	pMobIndex->area                 = ch->in_room->area;
	pMobIndex->player_name          = STRALLOC("golem wafer");
	pMobIndex->short_descr          = STRALLOC("a wafer golem");
	pMobIndex->long_descr           = STRALLOC("A wafer golem stands here, looking useless.");
	pMobIndex->description          = STRALLOC("The wafer golem looks *very* dumb.");
	pMobIndex->act                  = ACT_SENTINEL;
	pMobIndex->affected_by          = 0;
	pMobIndex->pShop                = NULL;
	pMobIndex->alignment            = ch->alignment;
	pMobIndex->level                = 0;
	pMobIndex->body_parts           = 0;
	pMobIndex->attack_parts         = 0;
	pMobIndex->hitnodice            = 1;
	pMobIndex->hitsizedice          = 1;
	pMobIndex->hitplus              = 0;
	pMobIndex->damnodice            = 1;
	pMobIndex->damsizedice          = 1;
	pMobIndex->damplus              = 0;
	pMobIndex->gold                 = 0;
	pMobIndex->race                 = ch->race;
	pMobIndex->position             = POS_STANDING;
	pMobIndex->sex                  = SEX_NEUTRAL;
	pMobIndex->first_prog           = NULL;
	pMobIndex->last_prog            = NULL;

	mob_index[vnum]                 = pMobIndex;

	if (vnum > pMobIndex->area->hi_m_vnum)
	{
		pMobIndex->area->hi_m_vnum = vnum;
	}
	if (vnum < pMobIndex->area->low_m_vnum)
	{
		pMobIndex->area->low_m_vnum = vnum;
	}
	mud->top_mob_index++;

	/* make the mobile reset in this room */

	pReset = make_reset('M', vnum, 100, ch->in_room->vnum);
	pArea			= room_index[ROOM_VNUM_CASTLE]->area;
	LINK(pReset, pArea->first_reset, pArea->last_reset, next, prev);

	mob			= create_mobile( pMobIndex );
	mob->reset	= pReset;
	pReset->mob	= mob;
	char_to_room( mob, ch->in_room->vnum );

	act("A being takes form in the center of the room.",ch,NULL,NULL,TO_ROOM);
	act("A being takes form in the center of the room.",ch,NULL,NULL,TO_CHAR);

	ch->gold						-= cost;
	ch->pcdata->castle->cost			+= cost/1000;
	ch->pcdata->castle->num_mobiles	+= 1;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_screate( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA		*victim;
	int cost;

	push_call("do_castle_screate(%p)",ch);

	cost   = haggle(ch, COST_OF_CREATE) * 1000;

	if (argument[0] == '\0')
	{
		send_to_char("Syntax: castle screate <mob>\n\r", ch);
		pop_call();
		return;
	}

	if (ch->gold < cost)
	{
		ch_printf(ch, "It will cost you %s gold coins to create a shop.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	if ((victim = get_char_room(ch, argument)) == NULL)
	{
		send_to_char( "They aren't here.\n\r", ch );
		pop_call();
		return;
	}

	if (!IS_NPC(victim) || victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
	{
		ch_printf(ch, "You cannot turn %s into a shopkeeper.\n\r", get_name(victim));
		pop_call();
		return;
	}

	if (victim->pIndexData->pShop != NULL)
	{
		ch_printf(ch, "%s is already a shopkeeper.\n\r", capitalize(get_name(victim)));
		pop_call();
		return;
	}

	create_shop(victim->pIndexData);

	act("Builders come and build a shop for $N.", ch, NULL, victim, TO_ROOM);
	act("Builders come and build a shop for $N.", ch, NULL, victim, TO_CHAR);

	ch->gold						-= cost;
	ch->pcdata->castle->cost			+= cost/1000;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_ocreate( CHAR_DATA *ch )
{
	AREA_DATA		*pArea;
	OBJ_INDEX_DATA	*pObjIndex;
	OBJ_DATA		*obj;
	RESET_DATA	*pReset;
	int vnum, cost;

	push_call("do_castle_ocreate(%p)",ch);

	cost   = haggle(ch, COST_OF_CREATE) * 1000;

	if (ch->gold < cost)
	{
		ch_printf(ch, "It will cost you %s gold coins to create an object.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	if (ch->pcdata->castle->num_objects >= 20)
	{
		send_to_char("You cannot create more than 20 objects.\n\r", ch);
		pop_call();
		return;
	}

	for (vnum = ROOM_VNUM_CASTLE ; get_obj_index(vnum) != NULL && vnum < MAX_VNUM ; vnum++);
	{
		if (vnum >= MAX_VNUM)
		{
			send_to_char("You can't create an object, tell the Immortals.\n\r",ch);
			pop_call();
			return;
		}
	}

	ALLOCMEM( pObjIndex, OBJ_INDEX_DATA, 1);

	pObjIndex->creator_pvnum		= ch->pcdata->pvnum;
	pObjIndex->vnum			= vnum;
	pObjIndex->area			= ch->in_room->area;

	pObjIndex->name			= STRALLOC("pile dust");
	pObjIndex->short_descr		= STRALLOC("a pile of dust");
	pObjIndex->long_descr		= STRALLOC("A pile of dust lies here.");
	pObjIndex->description		= STRALLOC("The pile of dust looks very dusty.");
	pObjIndex->attack_string		= STRALLOC("");

	pObjIndex->item_type		= ITEM_TRASH;
	pObjIndex->extra_flags		= 0;
	pObjIndex->wear_flags		= 0;
	pObjIndex->value[0]			= 0;
	pObjIndex->value[1]			= 0;
	pObjIndex->value[2]			= 0;
	pObjIndex->value[3]			= 0;
	pObjIndex->weight			= 100;
	pObjIndex->cost			= 100;
	pObjIndex->level			= 100;

	obj_index[vnum]			= pObjIndex;
	mud->top_obj_index++;

	if (vnum > pObjIndex->area->hi_o_vnum)
	{
		pObjIndex->area->hi_o_vnum = vnum;
	}
	if (vnum < pObjIndex->area->low_o_vnum)
	{
		pObjIndex->area->low_o_vnum = vnum;
	}

	/* make the object reset in this room */

	pReset = make_reset('O', vnum, 100, ch->in_room->vnum);
	pArea			= room_index[ROOM_VNUM_CASTLE]->area;
	LINK(pReset, pArea->first_reset, pArea->last_reset, next, prev);

	obj			= create_object(pObjIndex, 0);
	obj->reset	= pReset;
	pReset->obj	= obj;
	obj_to_room( obj, ch->in_room->vnum);

	act("A pile of dust heaps up in the center of the room.", ch, NULL, NULL, TO_ROOM);
	act("A pile of dust heaps up in the center of the room.", ch, NULL, NULL, TO_CHAR);

	ch->gold						-= cost;
	ch->pcdata->castle->cost			+= cost/1000;
	ch->pcdata->castle->num_objects	+= 1;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_mdelete( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;

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

	if (argument[0] == '\0')
	{
		send_to_char("Syntax: castle mdelete <mob>\n\r", ch);
		pop_call();
		return;
	}

	if ((victim = get_char_room(ch, argument)) == NULL)
	{
		send_to_char( "They aren't here.\n\r", ch );
		pop_call();
		return;
	}

	if (victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
	{
		act("You cannot delete $N.", ch, NULL, victim, TO_CHAR);
		pop_call();
		return;
	}

	if (clanfounder)
	{
		if (IS_SET(victim->act, ACT_CLAN_GUARD))
		{
			ch->pcdata->clan->num_guards--;
		}
		if (IS_SET(victim->act, ACT_CLAN_HEALER))
		{
			ch->pcdata->clan->num_healers--;
		}
		if (IS_SET(victim->act, ACT_TRAIN))
		{
			ch->pcdata->clan->num_trainers--;
		}
		if (IS_SET(victim->act, ACT_PRACTICE))
		{
			ch->pcdata->clan->num_trainers--;
		}
	}

	act("Demolishers come and butcher $N.", ch, NULL, victim, TO_ROOM);
	act("Demolishers come and butcher $N.", ch, NULL, victim, TO_CHAR);

	delete_mob(victim->pIndexData);

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	ch->pcdata->castle->num_mobiles	-= 1;
	pop_call();
	return;
}

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

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

	if (argument[0] == '\0')
	{
		send_to_char("Syntax: castle odelete <obj>\n\r", ch);
		pop_call();
		return;
	}

	if ((obj = get_obj_list(ch, argument, ch->in_room->first_content)) == NULL)
	{
		send_to_char( "You can't find it.\n\r", ch );
		pop_call();
		return;
	}

	if (obj->pIndexData->creator_pvnum != ch->pcdata->pvnum)
	{
		act("You can't delete $p.", ch, obj, NULL, TO_CHAR);
		pop_call();
		return;
	}

	act("Demolishers come and pulverize $p.", ch, obj, NULL, TO_ROOM);
	act("Demolishers come and pulverize $p.", ch, obj, NULL, TO_CHAR);

	delete_obj(obj->pIndexData);

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	ch->pcdata->castle->num_objects	-= 1;

	pop_call();
	return;
}

void do_castle_sdelete( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;

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

	if (argument[0] == '\0')
	{
		send_to_char("Syntax: castle sdelete <mob>\n\r", ch);
		pop_call();
		return;
	}

	if ((victim = get_char_room(ch, argument)) == NULL)
	{
		send_to_char( "They aren't here.\n\r", ch );
		pop_call();
		return;
	}

	if (!IS_NPC(victim) || victim->pIndexData->pShop == NULL)
	{
		ch_printf(ch, "%s is not a shopkeeper.\n\r", capitalize(get_name(victim)));
		pop_call();
		return;
	}

	if (victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
	{
		ch_printf(ch, "You cannot delete %s's shop.\n\r", get_name(victim));
		pop_call();
		return;
	}

	act("Demolishers come and dismantle $N's shop.", ch, NULL, victim, TO_ROOM);
	act("Demolishers come and dismantle $N's shop.", ch, NULL, victim, TO_CHAR);

	delete_shop(victim->pIndexData);

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_rset( CHAR_DATA *ch, char *argument )
{
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char bld[10], dim[10], grn[10];
	int argn, cost;

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

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));
	strcpy(grn, ansi_translate_text(ch, "{128}"));

	if (strlen(argument) > 160)
	{
		argument[160] = '\0';
	}
	smash_tilde( argument );

	argument = one_argument( argument, arg1 );

	if (arg1[0] == '\0')
	{
		send_to_char( "Syntax: castle rset <name|desc|flag|sector|door|extra> <argument>\n\r", ch );
		pop_call();
		return;
	}

	cost = haggle(ch, COST_OF_SET) * 1000;

	if (ch->gold < cost)
	{
		ch_printf(ch, "It will cost you %s gold coins to do a rset.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	if (!strcasecmp(arg1, "name"))
	{
		STRFREE (ch->in_room->name );
		ch->in_room->name = STRALLOC( argument );
	}
	else if (!strcasecmp(arg1, "desc"))
	{
		if (ch->pcdata->editmode == MODE_NONE)
		{
			ch->gold     -= cost;
			ch->pcdata->editmode  = MODE_ROOM_DESC;
			ch->pcdata->edit_ptr  = ch->in_room;
			start_editing( ch, ch->in_room->description );
		}
		else
		{
			bug("do_castle_rset: bad mode");
		}
		pop_call();
		return;
	}
	else if (!strcasecmp(arg1, "flag"))
	{
		get_bitvector_value(argument, &argn, "ROOM_");

		if (argn == -1	|| (!IS_SET(CASTLE_R_FLAG_LIST, argn) && (!clanfounder || !IS_SET(CLAN_R_FLAG_LIST, argn))))
		{
			int bit;
			char flag_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle rset flag %s<%sroom_flag%s>\n\r\n\r", dim, bld, dim, bld, dim);

			for (bit = 0, flag_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_R_FLAG_LIST, 1 << bit))
				{
					cat_sprintf(flag_buf, "%s%-20s", bld, broken_bits(1 << bit, "ROOM_", TRUE));
				}
				if (IS_SET(CLAN_R_FLAG_LIST, 1 << bit) && clanfounder)
				{
					cat_sprintf(flag_buf, "%s%-20s", grn, broken_bits(1 << bit, "ROOM_", TRUE));
				}
				if (strlen(flag_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", flag_buf);
					flag_buf[0] = '\0';
				}
			}
			if (strlen(flag_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", flag_buf);
			}
			pop_call();
			return;
		}
		if (clanfounder && IS_SET(CLAN_R_FLAG_LIST, argn))
		{
			if (ch->pcdata->clan->coffers < CLANHALL_FLAG)
			{
				ch_printf(ch, "It will cost you %s gold coins to set a clan flag.\n\r", tomoney(CLANHALL_FLAG));
				pop_call();
				return;
			}
			ch->pcdata->clan->coffers -= CLANHALL_FLAG;
			switch (argn)
			{
				case ROOM_ALTAR:   ch->pcdata->clan->num_altars  += IS_SET(ch->in_room->room_flags, ROOM_ALTAR)   ? -1 : 1; break;
				case ROOM_BANK:    ch->pcdata->clan->num_banks   += IS_SET(ch->in_room->room_flags, ROOM_BANK)    ? -1 : 1; break;
				case ROOM_MORGUE:  ch->pcdata->clan->num_morgues += IS_SET(ch->in_room->room_flags, ROOM_MORGUE)  ? -1 : 1; break;
			}
		}
		TOGGLE_BIT(ch->in_room->room_flags, argn);
	}
	else if (!strcasecmp(arg1, "sector"))
	{
		if (!get_bitvector_value(argument, &argn, "SECT_"))
		{
			int cnt;
			char sect_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle rset sector %s<%ssector_type%s>\n\r\n\r", dim, bld, dim, bld, dim);

			for (cnt = 0, sect_buf[0] = '\0' ; cnt < SECT_MAX ; cnt++)
			{
				cat_sprintf(sect_buf, "%s%-20s", bld, broken_bits(cnt, "SECT_", TRUE));

				if (strlen(sect_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", sect_buf);
					sect_buf[0] = '\0';
				}
			}
			if (strlen(sect_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", sect_buf);
			}
			pop_call();
			return;
		}
		ch->in_room->sector_type = argn;
	}

	else if (!strcasecmp(arg1, "extra"))
	{
		EXTRA_DESCR_DATA *ed;
		int cnt;

		argument = one_argument( argument, arg1 );

		if (!strcasecmp(arg1, "desc"))
		{
			argument = one_argument( argument, arg1 );
			strcpy(arg2, arg1);
		}
		else if (!strcasecmp(arg1, "del"))
		{
			argument = one_argument( argument, arg1 );

			for (ed = ch->in_room->first_extradesc ; ed ; ed = ed->next)
			{
				if (is_name(arg1, ed->keyword))
				{
					ch_printf(ch, "Deleted the following extras: '%s'\n\r", ed->keyword);
					UNLINK( ed, ch->in_room->first_extradesc, ch->in_room->last_extradesc, next, prev);
					STRFREE (ed->description);
					STRFREE (ed->keyword);
					FREEMEM(ed);

					CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

					pop_call();
					return;
				}
			}
			ch_printf(ch, "Couldn't find an extra named '%s' to delete.\n\r", arg1);
			pop_call();
			return;
		}
		else
		{
			send_to_char("Syntax: castle rset extra <del|desc> 'keywords'\n\r",ch);
			pop_call();
			return;
		}

		for (cnt = 1, ed = ch->in_room->first_extradesc ; ed ; ed = ed->next, cnt++)
		{
			if (is_name(arg1, ed->keyword))
			{
				break;
			}
			if (cnt >= 10)
			{
				ch_printf(ch, "You cannot create more than ten extra descriptions per room.\n\r");
				pop_call();
				return;
			}
		}

		if (ed == NULL)
		{
			ALLOCMEM(ed, EXTRA_DESCR_DATA, 1);
			ed->description = STRALLOC("");
			ed->keyword     = STRALLOC(arg2);
			LINK( ed, ch->in_room->first_extradesc, ch->in_room->last_extradesc, next, prev);
		}
		if (ch->pcdata->editmode == MODE_NONE)
		{
			ch->gold     -= cost;
			ch->pcdata->editmode  = MODE_ROOM_EXTRA;
			ch->pcdata->edit_ptr  = ed;
			start_editing( ch, ed->description);
		}
		else
		{
			bug( "do_castle_rset: bad mode");
		}
		pop_call();
		return;
	}
	else
	{
		do_castle_rset( ch, "" );
		pop_call();
		return;
	}

	act("The room appears to flicker for an instant.",ch,NULL,NULL,TO_ROOM);
	act("The contractor comes, takes your money, looks around, hammers on a post, then\n\rheads back the way he came.",ch,NULL,NULL,TO_CHAR);

	ch->gold				-= cost;
	ch->pcdata->castle->cost	+= cost/1000;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_mset( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA   *victim;
	char arg1 [MAX_INPUT_LENGTH];
	char arg2 [MAX_INPUT_LENGTH];
	char arg3 [MAX_INPUT_LENGTH];
	char buf2 [MAX_INPUT_LENGTH];
	char *buf1 = '\0';

	char bld[10], dim[10], grn[10];
	int argn, cost;

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

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));
	strcpy(grn, ansi_translate_text(ch, "{128}"));

	if (strlen(argument) > 160)
	{
		argument[160] = '\0';
	}

	smash_tilde( argument );

	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	strcpy( arg3, argument );

	if (arg1[0] == '\0' || arg2[0] == '\0')
	{
		send_to_char("Syntax: castle mset <mob> <sex|race|act|affect|body|attack> <bitvector>\n\r", ch);
		send_to_char("Syntax: castle mset <mob> <level|alignment> <value>\n\r", ch);
		send_to_char("Syntax: castle mset <mob> <name|short|long|desc> <string>\n\r", ch);
		pop_call();
		return;
	}

	cost = haggle(ch, COST_OF_SET) * 1000;

	if (ch->gold < cost)
	{
		ch_printf(ch,"It will cost you %s gold coins to do an mset.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	if ((victim = get_char_room(ch, arg1)) == NULL)
	{
		send_to_char( "They aren't here.\n\r", ch );
		pop_call();
		return;
	}

	if (!IS_NPC(victim) || victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
	{
		ch_printf(ch, "You cannot mset them.\n\r");
		pop_call();
		return;
	}

	if (!strcasecmp(arg2, "sex"))
	{
		if (!get_bitvector_value(argument, &argn, "SEX_"))
		{
			int sex;
			char sex_buf[MAX_STRING_LENGTH];

			for (sex = 0, sex_buf[0] = '\0' ; sex <= 2 ; sex++)
			{
				cat_sprintf(sex_buf, "%s%s%s|", bld, broken_bits(sex, "SEX_", TRUE), dim);
			}
			sex_buf[strlen(sex_buf)-1] = '\0';
			ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s sex %s<%s>\n\r", dim, bld, dim, bld, dim, bld, dim, sex_buf);
			pop_call();
			return;
		}
		victim->sex = argn;
	}
	else if (!strcasecmp(arg2, "level"))
	{
		int value = is_number(arg3) ? atol(arg3) : -1;

		if (value < 1 || value > ch->level)
		{
			ch_printf(ch, "Level range is between 1 and %d\n\r", ch->level);
			pop_call();
			return;
		}
		victim->pIndexData->level	= victim->level				= value;
		victim->pIndexData->damplus	= victim->npcdata->damplus		= value;
		victim->pIndexData->hitplus	= victim->hit = victim->max_hit	= value * value;
	}
	else if (!strcasecmp(arg2, "alignment"))
	{
		int value = atol(arg3);

		if (value < -1000 || value > 1000)
		{
			ch_printf(ch, "Alignment range is between -1000 and 1000.\n\r");
			pop_call();
			return;
		}
		victim->pIndexData->alignment = victim->alignment = value;
	}
	else if (!strcasecmp(arg2, "race"))
	{
		if (!get_bitvector_value(argument, &argn, "RACE_"))
		{
			int cnt;
			char race_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s race %s<%ssector_type%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (cnt = 0, race_buf[0] = '\0' ; cnt < MAX_RACE ; cnt++)
			{
				cat_sprintf(race_buf, "%s%-20s", bld, broken_bits(cnt, "RACE_", TRUE));

				if (strlen(race_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", race_buf);
					race_buf[0] = '\0';
				}
			}
			if (strlen(race_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", race_buf);
			}
			pop_call();
			return;
		}
		SET_BIT(victim->act, ACT_RACE);
		victim->race			= argn;
		victim->pIndexData->race	= victim->race;
		victim->pIndexData->act	= victim->act;
	}
	else if (!strcasecmp(arg2, "act"))
	{
		get_bitvector_value(argument, &argn, "ACT_");

		if (argn == -1	|| (!IS_SET(CASTLE_M_ACT_LIST, argn) && (!clanfounder || !IS_SET(CLAN_M_ACT_LIST, argn))))
		{
			int bit;
			char act_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s act %s<%sact_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (bit = 0, act_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_M_ACT_LIST, 1 << bit))
				{
					cat_sprintf(act_buf, "%s%-20s", bld, broken_bits(1 << bit, "ACT_", TRUE));
				}
				if (IS_SET(CLAN_M_ACT_LIST, 1 << bit) && clanfounder)
				{
					cat_sprintf(act_buf, "%s%-20s", grn, broken_bits(1 << bit, "ACT_", TRUE));
				}
				if (strlen(act_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", act_buf);
					act_buf[0] = '\0';
				}
			}
			if (strlen(act_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", act_buf);
			}
			pop_call();
			return;
		}
		if (clanfounder && IS_SET(CLAN_M_ACT_LIST, argn))
		{
			if (ch->pcdata->clan->coffers < CLANHALL_FLAG)
			{
				ch_printf(ch, "It will cost you %s gold coins to set a clan act.\n\r", tomoney(CLANHALL_FLAG));
				pop_call();
				return;
			}
			ch->pcdata->clan->coffers -= CLANHALL_FLAG;
			switch (argn)
			{
				case ACT_CLAN_GUARD:
					ch->pcdata->clan->num_guards   += IS_SET(victim->act, ACT_CLAN_GUARD)  ? -1 : 1;
					break;
				case ACT_CLAN_HEALER:
					ch->pcdata->clan->num_healers  += IS_SET(victim->act, ACT_CLAN_HEALER) ? -1 : 1;
					break;
				case ACT_TRAIN:
					ch->pcdata->clan->num_trainers += IS_SET(victim->act, ACT_TRAIN)       ? -1 : 1;
					break;
				case ACT_PRACTICE:
					ch->pcdata->clan->num_trainers += IS_SET(victim->act, ACT_PRACTICE)    ? -1 : 1;
					break;
			}
		}
		TOGGLE_BIT(victim->act, argn);
		victim->pIndexData->act = victim->act;
	}
	else if (!strcasecmp(arg2, "affect"))
	{
		get_bitvector_value(argument, &argn, "AFF_");

		if (argn == -1	|| !IS_SET(CASTLE_M_AFF_LIST, argn))
		{
			int bit;
			char aff_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s affect %s<%saffect_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (bit = 0, aff_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_M_AFF_LIST, 1 << bit))
				{
					cat_sprintf(aff_buf, "%s%-20s", bld, broken_bits(1 << bit, "AFF_", TRUE));
				}
				if (strlen(aff_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", aff_buf);
					aff_buf[0] = '\0';
				}
			}
			if (strlen(aff_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", aff_buf);
			}
			pop_call();
			return;
		}
		TOGGLE_BIT(victim->affected_by, argn);
		victim->pIndexData->affected_by = victim->affected_by;
	}
	else if (!strcasecmp(arg2, "body"))
	{
		get_bitvector_value(argument, &argn, "BODY_");

		if (argn == -1	|| !IS_SET(CASTLE_M_BODY_LIST, argn))
		{
			int bit;
			char body_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s body %s<%sbody_part%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (bit = 0, body_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_M_BODY_LIST, 1 << bit))
				{
					cat_sprintf(body_buf, "%s%-20s", bld, broken_bits(1 << bit, "BODY_", TRUE));
				}
				if (strlen(body_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", body_buf);
					body_buf[0] = '\0';
				}
			}
			if (strlen(body_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", body_buf);
			}
			pop_call();
			return;
		}
		TOGGLE_BIT(victim->pIndexData->body_parts, argn);
	}
	else if (!strcasecmp(arg2, "attack"))
	{
		get_bitvector_value(argument, &argn, "BODY_");

		if (argn == -1	|| !IS_SET(CASTLE_M_BODY_LIST, argn))
		{
			int bit;
			char body_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s attack %s<%sattack_part%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (bit = 0, body_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_M_BODY_LIST, 1 << bit))
				{
					cat_sprintf(body_buf, "%s%-20s", bld, broken_bits(1 << bit, "BODY_", TRUE));
				}
				if (strlen(body_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", body_buf);
					body_buf[0] = '\0';
				}
			}
			if (strlen(body_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", body_buf);
			}
			pop_call();
			return;
		}
		TOGGLE_BIT(victim->pIndexData->attack_parts, argn);
	}
	else if (!strcasecmp(arg2, "name"))
	{
		int cnt;

		for (cnt = 0 ; cnt < strlen(arg3) ; cnt++)
		{
			if (!isalpha(arg3[cnt]) && !isspace(arg3[cnt]))
			{
				ch_printf(ch, "You may only use alpha characters.\n\r");
				pop_call();
				return;
			}
		}
		for (buf1 = one_argument(arg3, buf2) ; buf2[0] != '\0' ; buf1 = one_argument(buf1, buf2))
		{
			if (char_exists(buf2))
			{
				ch_printf(ch, "There is already a player with that name.\n\r");
				pop_call();
				return;
			}
		}
		STRFREE (victim->name);
		STRFREE (victim->pIndexData->player_name);
		victim->pIndexData->player_name	= STRALLOC(arg3);
		victim->name					= STRALLOC(arg3);
	}
	else if (!strcasecmp(arg2, "short"))
	{
		STRFREE (victim->short_descr );
		STRFREE (victim->pIndexData->short_descr);
		victim->pIndexData->short_descr	= STRALLOC(arg3);
		victim->short_descr				= STRALLOC(arg3);
	}
	else if (!strcasecmp(arg2, "long"))
	{
		STRFREE (victim->long_descr );
		STRFREE (victim->pIndexData->long_descr );
		victim->pIndexData->long_descr	= STRALLOC(arg3);
		victim->long_descr				= STRALLOC(arg3);
	}
	else if (!strcasecmp(arg2, "desc"))
	{
		if (ch->pcdata->editmode == MODE_NONE)
		{
			ch->gold		-= cost;
			ch->pcdata->editmode	= MODE_MOB_DESC;
			ch->pcdata->edit_ptr	= victim;
			start_editing( ch, victim->pIndexData->description);
		}
		else
		{
			bug( "do_castle_mset: bad mode");
		}
		pop_call();
		return;
	}
	else
	{
		do_castle_mset(ch, "");
		pop_call();
		return;
	}

	act("Your eyes go fuzzy for a moment.",ch,NULL,NULL,TO_ROOM);
	act("The contractor comes, takes your money, looks around, pinches the mobile, then\n\rheads back the way he came.",ch,NULL,NULL,TO_CHAR);

	ch->gold				-= cost;
	ch->pcdata->castle->cost	+= cost/1000;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_oset( CHAR_DATA *ch, char *argument )
{
	OBJ_DATA    *obj;
	OBJ_DATA    *key;
	char arg1 [MAX_INPUT_LENGTH];
	char arg2 [MAX_INPUT_LENGTH];
	char arg3 [MAX_INPUT_LENGTH];

	char bld[10], dim[10], grn[10];
	int argn, cost;

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

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));
	strcpy(grn, ansi_translate_text(ch, "{128}"));

	if (strlen(argument) > 160)
	{
		argument[160] = '\0';
	}

	smash_tilde( argument );

	argument = one_argument( argument, arg1 );
	argument = one_argument( argument, arg2 );
	strcpy( arg3, argument );

	if (arg1[0] == '\0' || arg2[0] == '\0')
	{
		send_to_char("Syntax: castle oset <obj> <flag|type> <bitvector>\n\r", ch);
		send_to_char("Syntax: castle oset <obj> <name|short|long|desc> <string>\n\r\n\r", ch);
		send_to_char("Syntax: castle oset <fountain>  <liquid> <argument>\n\r", ch);
		send_to_char("Syntax: castle oset <container> <carry|lid|key|max> <argument>\n\r", ch);
		send_to_char("Syntax: castle oset <furniture> <size|pose|regen> <argument>\n\r", ch);
		pop_call();
		return;
	}

	cost = haggle(ch, COST_OF_SET) * 1000;

	if (ch->gold < cost)
	{
		ch_printf(ch,"It will cost you %s gold coins to do an oset.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	if ((obj = get_obj_list(ch, arg1, ch->in_room->first_content)) == NULL)
	{
		send_to_char( "You can't find it.\n\r", ch );
		pop_call();
		return;
	}

	if (obj->pIndexData->creator_pvnum != ch->pcdata->pvnum)
	{
		ch_printf(ch, "You cannot oset that.\n\r");
		pop_call();
		return;
	}

	if (!strcasecmp(arg2, "flag"))
	{
		get_bitvector_value(argument, &argn, "ITEM_FLAG_");

		if (argn == -1	|| !IS_SET(CASTLE_O_FLAG_LIST, argn))
		{
			int bit;
			char flag_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s flag %s<%sobj_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (bit = 0, flag_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_O_FLAG_LIST, 1 << bit))
				{
					cat_sprintf(flag_buf, "%s%-20s", bld, broken_bits(1 << bit, "ITEM_FLAG_", TRUE));
				}
				if (strlen(flag_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", flag_buf);
					flag_buf[0] = '\0';
				}
			}
			if (strlen(flag_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", flag_buf);
			}
			pop_call();
			return;
		}
		TOGGLE_BIT(obj->extra_flags, argn);
		obj->pIndexData->extra_flags = obj->extra_flags;
	}
	else if (!strcasecmp(arg2, "type"))
	{
		get_bitvector_value(argument, &argn, "ITEM_TYPE_");

		if (argn == -1	|| (argn != ITEM_FURNITURE && argn != ITEM_CONTAINER && argn != ITEM_FOUNTAIN))
		{
			int bit;
			char flag_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s type %s<%sobj_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (bit = 0, flag_buf[0] = '\0' ; bit <= ITEM_FOUNTAIN ; bit++)
			{
				if (bit == ITEM_FURNITURE || bit == ITEM_CONTAINER || bit == ITEM_FOUNTAIN)
				{
					cat_sprintf(flag_buf, "%s%-20s", bld, broken_bits(bit, "ITEM_TYPE_", TRUE));
				}
				if (strlen(flag_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", flag_buf);
					flag_buf[0] = '\0';
				}
			}
			if (strlen(flag_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", flag_buf);
			}
			pop_call();
			return;
		}
		obj->item_type = argn;
		obj->pIndexData->item_type = obj->item_type;
		obj->value[0] = 0;
		obj->value[1] = 0;
		obj->value[2] = 0;
		obj->value[3] = 0;
	}
	else if (!strcasecmp(arg2, "liquid"))
	{
		if (obj->item_type != ITEM_FOUNTAIN)
		{
			act("$p is not a fountain.", ch, obj, NULL, TO_CHAR);
			pop_call();
			return;
		}
		if (!get_bitvector_value(argument, &argn, "LIQ_"))
		{
			int cnt;
			char liq_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s liquid %s<%ssector_type%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (cnt = 0, liq_buf[0] = '\0' ; cnt < LIQ_MAX ; cnt++)
			{
				cat_sprintf(liq_buf, "%s%-20s", bld, broken_bits(cnt, "LIQ_", TRUE));

				if (strlen(liq_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", liq_buf);
					liq_buf[0] = '\0';
				}
			}
			if (strlen(liq_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", liq_buf);
			}
			pop_call();
			return;
		}
		obj->value[2] = argn;
		obj->pIndexData->value[2] = obj->value[2];
	}
	else if (!strcasecmp(arg2, "lid"))
	{
		if (obj->item_type != ITEM_CONTAINER)
		{
			act("$p is not a container.", ch, obj, NULL, TO_CHAR);
			pop_call();
			return;
		}
		get_bitvector_value(argument, &argn, "CONT_");

		if (argn == -1	|| !IS_SET(CASTLE_O_LID_LIST, argn))
		{
			int bit;
			char lid_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s lid %s<%slid_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (bit = 0, lid_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_O_LID_LIST, 1 << bit))
				{
					cat_sprintf(lid_buf, "%s%-20s", bld, broken_bits(1 << bit, "CONT_", TRUE));
				}
				if (strlen(lid_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", lid_buf);
					lid_buf[0] = '\0';
				}
			}
			if (strlen(lid_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", lid_buf);
			}
			pop_call();
			return;
		}
		TOGGLE_BIT(obj->value[1], argn);
		obj->pIndexData->value[1] = obj->value[1];
	}
	else if (!strcasecmp(arg2, "carry"))
	{
		int value = is_number(arg3) ? atol(arg3) : -1;

		if (obj->item_type != ITEM_CONTAINER)
		{
			act("$p is not a container.", ch, obj, NULL, TO_CHAR);
			pop_call();
			return;
		}

		if (value < 1 || value > 1500)
		{
			ch_printf(ch, "A container's carry weight range is between 1 and 1500.\n\r");
			pop_call();
			return;
		}
		obj->value[0] = value;
		obj->pIndexData->value[0] = value;
	}
	else if (!strcasecmp(arg2, "max"))
	{
		int value = is_number(arg3) ? atol(arg3) : -1;

		if (obj->item_type != ITEM_CONTAINER)
		{
			act("$p is not a container.", ch, obj, NULL, TO_CHAR);
			pop_call();
			return;
		}

		if (value < 1 || value > 150)
		{
			ch_printf(ch, "A container's max item range is between 1 and 150.\n\r");
			pop_call();
			return;
		}
		obj->value[3] = obj->pIndexData->value[3] = value;
	}
	else if (!strcasecmp(arg2, "key"))
	{
		if (obj->item_type != ITEM_CONTAINER)
		{
			act("$p is not a container.", ch, obj, NULL, TO_CHAR);
			pop_call();
			return;
		}

		if ((key = get_obj_carry(ch, argument)) == NULL)
		{
			send_to_char("You are not carrying that.\n\r", ch);
			pop_call();
			return;
		}
		else
		{
			obj->pIndexData->value[2] = obj->value[2] = key->pIndexData->vnum;
		}
	}
	else if (!strcasecmp(arg2, "pose"))
	{
		if (obj->item_type != ITEM_FURNITURE)
		{
			act("$p is not a piece of furniture.", ch, obj, NULL, TO_CHAR);
			pop_call();
			return;
		}
		get_bitvector_value(argument, &argn, "FURNITURE_");

		if (argn == -1	|| !IS_SET(CASTLE_O_FURNIT_LIST, argn))
		{
			int bit;
			char pos_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s position %s<%slid_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);

			for (bit = 0, pos_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_O_FURNIT_LIST, 1 << bit))
				{
					cat_sprintf(pos_buf, "%s%-20s", bld, broken_bits(1 << bit, "FURNITURE_", TRUE));
				}
				if (strlen(pos_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", pos_buf);
					pos_buf[0] = '\0';
				}
			}
			if (strlen(pos_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", pos_buf);
			}
			pop_call();
			return;
		}
		TOGGLE_BIT(obj->value[2], argn);
		obj->pIndexData->value[2] = obj->value[2];
	}
	else if (!strcasecmp(arg2, "size"))
	{
		int value = is_number(arg3) ? atol(arg3) : -1;

		if (obj->item_type != ITEM_FURNITURE)
		{
			act("$p is not a piece of furniture.", ch, obj, NULL, TO_CHAR);
			pop_call();
			return;
		}

		if (value < 1 || value > 100)
		{
			ch_printf(ch, "A piece of furniture's size range is between 1 and 100.\n\r");
			pop_call();
			return;
		}
		obj->value[0] = value;
		obj->pIndexData->value[0] = value;
	}
	else if (!strcasecmp(arg2, "regen"))
	{
		int value = is_number(arg3) ? atol(arg3) : -1;

		if (obj->item_type != ITEM_FURNITURE)
		{
			act("$p is not a piece of furniture.", ch, obj, NULL, TO_CHAR);
			pop_call();
			return;
		}

		if (value < 1 || value > 200)
		{
			ch_printf(ch, "A piece of furniture's regen range is between 1 and 200.\n\r");
			pop_call();
			return;
		}
		obj->value[3] = value;
		obj->pIndexData->value[3] = value;
	}
	else if (!strcasecmp(arg2, "name"))
	{
		int cnt;

		for (cnt = 0 ; cnt < strlen(arg3) ; cnt++)
		{
			if (!isalpha(arg3[cnt]) && !isspace(arg3[cnt]))
			{
				ch_printf(ch, "You may only use alpha characters.\n\r");
				pop_call();
				return;
			}
		}
		STRFREE (obj->name);
		STRFREE (obj->pIndexData->name);
		obj->pIndexData->name	= STRALLOC(arg3);
		obj->name				= STRALLOC(arg3);
	}
	else if (!strcasecmp(arg2, "short"))
	{
		STRFREE (obj->short_descr );
		STRFREE (obj->pIndexData->short_descr);
		obj->pIndexData->short_descr	= STRALLOC(arg3);
		obj->short_descr			= STRALLOC(arg3);
	}
	else if (!strcasecmp(arg2, "long"))
	{
		STRFREE (obj->long_descr);
		STRFREE (obj->pIndexData->long_descr);
		obj->pIndexData->long_descr	= STRALLOC(arg3);
		obj->long_descr			= STRALLOC(arg3);
	}
	else if (!strcasecmp(arg2, "desc"))
	{
		if (ch->pcdata->editmode == MODE_NONE)
		{
			ch->gold		-= cost;
			ch->pcdata->editmode	= MODE_OBJ_DESC;
			ch->pcdata->edit_ptr	= obj;
			start_editing(ch, obj->pIndexData->description);
		}
		else
		{
			bug( "do_castle_oset: bad mode");
		}
		pop_call();
		return;
	}
	else
	{
		do_castle_oset(ch, "");
		pop_call();
		return;
	}

	act("Your eyes go fuzzy for a moment.",ch,NULL,NULL,TO_ROOM);
	act("The contractor comes, takes your money, looks around, pinches the mobile, then\n\rheads back the way he came.",ch,NULL,NULL,TO_CHAR);

	ch->gold				-= cost;
	ch->pcdata->castle->cost	+= cost/1000;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle_dset( CHAR_DATA *ch, char *argument )
{
	OBJ_DATA    *key;
	EXIT_DATA   *pexit;
	char arg1[MAX_INPUT_LENGTH];
	char buf [MAX_INPUT_LENGTH];
	char bld[10], dim[10];
	int argn, cost, door_dir;

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

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));

	if (strlen(argument) > 200)
	{
		argument[200] = '\0';
	}
	smash_tilde( argument );

	argument = one_argument( argument, arg1 );

	if (arg1[0] == '\0')
	{
		send_to_char( "Syntax: castle dset <dir> <name|desc|flag|key|del> <argument>\n\r", ch );
		pop_call();
		return;
	}

	cost = haggle(ch, COST_OF_SET) * 1000;

	if (ch->gold < cost)
	{
		ch_printf(ch, "It will cost you %s gold coins to do a rset.\n\r", tomoney(cost));
		pop_call();
		return;
	}

	if (!get_bitvector_value(arg1, &argn, "DIR_"))
	{
		int door;
		char exit_buf[MAX_STRING_LENGTH];

		for (door = 0, exit_buf[0] = '\0' ; door <= 5 ; door++)
		{
			sprintf(buf, "%s%s%s|", bld, broken_bits(door, "DIR_", TRUE), dim);
			strcat(exit_buf, buf);
		}
		exit_buf[strlen(exit_buf)-1] = '\0';
		ch_printf(ch, "%sSyntax:%s castle dset %s<%s>\n\r", dim, bld, dim, exit_buf);

		pop_call();
		return;
	}
	door_dir = argn;

	if ((pexit = ch->in_room->exit[door_dir]) == NULL)
	{
		create_exit(ch->in_room, door_dir);
		pexit = ch->in_room->exit[door_dir];
		pexit->pvnum                = ch->pcdata->pvnum;
		pexit->vnum                 = ch->in_room->vnum;
	}

	argument = one_argument( argument, arg1 );

	if (!strcasecmp(arg1, "name"))
	{
		STRFREE (pexit->keyword );
		if (argument[0] == '\'' || argument[0]=='"')
		{
			argument = one_argument_nolower(argument, arg1);
		}
		pexit->keyword = STRALLOC( argument );

		if (room_index[pexit->to_room] != NULL && room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum && IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
		{
			EXIT_DATA *pexit2 = room_index[pexit->to_room]->exit[rev_dir[door_dir]];

			if (pexit2 != NULL)
			{
				if (pexit2->keyword != NULL)
				{
					STRFREE (pexit2->keyword);
				}
				pexit2->keyword = STRALLOC( pexit->keyword );
			}
		}
	}
	else if (!strcasecmp(arg1, "del"))
	{
		if (room_index[pexit->to_room] != NULL
		&& room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum
		&& IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE)
		&& !IS_SET(pexit->exit_info, EX_BACKDOOR)
		&& !IS_SET(pexit->exit_info, EX_CLAN_BACKDOOR))
		{
			send_to_char("You wouldn't want to delete your entrance.\n\r",ch);
			pop_call();
			return;
		}

		if (IS_SET(pexit->exit_info, EX_BACKDOOR))
		{
			ch->pcdata->castle->has_backdoor = FALSE;
		}
		if (IS_SET(pexit->exit_info, EX_CLAN_BACKDOOR) && clanfounder)
		{
			ch->pcdata->clan->num_backdoors--;
		}
		delete_exit(ch->in_room, door_dir);
		cost = 0;
	}
	else if (!strcasecmp(arg1, "desc"))
	{
		STRFREE (pexit->description);
		pexit->description = STRALLOC( justify(argument, 80) );

		if (room_index[pexit->to_room] && room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum && IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
		{
			EXIT_DATA *pexit2;
			pexit2 = room_index[pexit->to_room]->exit[rev_dir[door_dir]];
			if (pexit2 != NULL)
			{
				if (pexit2->description != NULL)
				{
					STRFREE (pexit2->description);
				}
				pexit2->description = STRALLOC( pexit->description );
			}
		}
	}
	else if (!strcasecmp(arg1, "flag"))
	{
		get_bitvector_value(argument, &argn, "EX_");

		if (argn == -1	|| !IS_SET(CASTLE_D_FLAG_LIST, argn))
		{
			int bit;
			char flag_buf[MAX_STRING_LENGTH];

			ch_printf(ch, "%sSyntax:%s castle dset %s flag %s<%sdoor_flag%s>\n\r\n\r", dim, bld, broken_bits(door_dir, "DIR_", TRUE), dim, bld, dim);

			for (bit = 0, flag_buf[0] = '\0' ; bit < 32 ; bit++)
			{
				if (IS_SET(CASTLE_D_FLAG_LIST, 1 << bit))
				{
					cat_sprintf(flag_buf, "%s%-20s", bld, broken_bits(1 << bit, "EX_", TRUE));
				}
				if (strlen(flag_buf) == 120)
				{
					ch_printf(ch, "%s\n\r", flag_buf);
					flag_buf[0] = '\0';
				}
			}
			if (strlen(flag_buf) > 0)
			{
				ch_printf(ch, "%s\n\r", flag_buf);
			}
			pop_call();
			return;
		}
		TOGGLE_BIT(pexit->exit_info, argn);

		if (room_index[pexit->to_room] && room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum && IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
		{
			EXIT_DATA *pexit2 = room_index[pexit->to_room]->exit[rev_dir[door_dir]];

			if (pexit2)
			{
				pexit2->exit_info = pexit->exit_info;
			}
		}
	}
	else if (!strcasecmp(arg1, "key"))
	{
		if ((key = get_obj_carry(ch, argument)) == NULL)
		{
			send_to_char("You are not carrying that.\n\r", ch);
			pop_call();
			return;
		}
		else
		{
			pexit->key = key->pIndexData->vnum;
		}

		if (room_index[pexit->to_room] && room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum && IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
		{
			EXIT_DATA *pexit2 = room_index[pexit->to_room]->exit[rev_dir[door_dir]];

			if (pexit2)
			{
				pexit2->key = pexit->key;
			}
		}
	}
	else
	{
		do_castle_dset(ch, "");
		pop_call();
		return;
	}
	act("The surrounding exits appear to shimmer for an instant.", ch,NULL,NULL,TO_ROOM);
	act("The contractor comes, takes your money, looks around, hammers on a post, then\n\rheads back the way he came.",ch,NULL,NULL,TO_CHAR);

	ch->gold				-= cost;
	ch->pcdata->castle->cost	+= cost/1000;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}

void do_castle( CHAR_DATA *ch, char *argument )
{
	CASTLE_DATA      *castle;
	ROOM_INDEX_DATA  *location;
	EXTRA_DESCR_DATA *ed;
	CHAR_DATA        *victim;
	OBJ_DATA         *obj;

	char arg[MAX_INPUT_LENGTH];
	char dim[10], bld[10];

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

	if (IS_NPC(ch))
	{
		pop_call();
		return;
	}

	strcpy(dim, get_color_string(ch, COLOR_PROMPT,  VT102_DIM ));
	strcpy(bld, get_color_string(ch, COLOR_PROMPT,  VT102_BOLD));

	switch (ch->pcdata->editmode)
	{
		default: break;

		case MODE_RESTRICTED:
			send_to_char( "You cannot use this command from while editing something else.\n\r",ch);
			pop_call();
			return;

		case MODE_ROOM_DESC:
			if (!ch->pcdata->edit_ptr)
			{
				send_to_char("Editor Error: Report to the Immortals.\n\r", ch);
				bug( "do_castle_rset: sub_room_desc: NULL ch->pcdata->edit_ptr", 0);
				ch->pcdata->editmode = MODE_NONE;
			}
			else
			{
				location = ch->pcdata->edit_ptr;
				STRFREE(location->description);
				location->description = copy_buffer(ch);
				stop_editing( ch );
			}

			CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

			pop_call();
			return;

		case MODE_ROOM_EXTRA:
			if (!ch->pcdata->edit_ptr)
			{
				send_to_char("Editor Error: Report to the Immortals.\n\r", ch);
				bug( "do_castle_rset: sub_room_extra: NULL ch->pcdata->edit_ptr", 0 );
				ch->pcdata->editmode = MODE_NONE;
			}
			else
			{
				ed = ch->pcdata->edit_ptr;
				STRFREE( ed->description );
				ed->description = copy_buffer( ch );
				stop_editing( ch );
			}

			CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

			pop_call();
			return;

		case MODE_MOB_DESC:
			if (!ch->pcdata->edit_ptr)
			{
				send_to_char("Fatal error: report to Chaste.\n\r", ch);
				bug( "do_castle: sub_mob_desc: NULL ch->pcdata->edit_ptr", 0);
				ch->pcdata->editmode = MODE_NONE;
			}
			else
			{
				victim = ch->pcdata->edit_ptr;
				STRFREE (victim->description );
				STRFREE (victim->pIndexData->description );
				victim->description             = copy_buffer(ch);
				victim->pIndexData->description = copy_buffer(ch);
				stop_editing( ch );
			}

			CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

			pop_call();
			return;

		case MODE_OBJ_DESC:
			if (!ch->pcdata->edit_ptr)
			{
				send_to_char("Fatal error: report to Demise.\n\r", ch);
				bug( "do_castle: sub_obj_desc: NULL ch->pcdata->edit_ptr", 0);
				ch->pcdata->editmode = MODE_NONE;
			}
			else
			{
				obj = ch->pcdata->edit_ptr;
				STRFREE (obj->description);
				STRFREE (obj->pIndexData->description);
				obj->description             = copy_buffer(ch);
				obj->pIndexData->description = copy_buffer(ch);
				stop_editing( ch );
			}

			CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

			pop_call();
			return;
	}

	if (ch->pcdata->clan && !strcasecmp(ch->name, ch->pcdata->clan->leader[0]))
	{
		clanfounder = TRUE;
	}
	else
	{
		clanfounder = FALSE;
	}

	if (argument[0] == '\0')
	{
		if ((castle = ch->pcdata->castle) != NULL)
		{
			if (room_index[castle->entrance] == NULL)
			{
				ch_printf(ch, "Your castle entrance no longer exists. Contact the immortals.\n\r");
			}
			else
			{
				ch_printf(ch, "%s  Castle Cost:%s %s,000\n\r",	dim, bld, tomoney(castle->cost));
				ch_printf(ch, "%s        Rooms:%s %d\n\r",	dim, bld, castle->num_rooms);
				ch_printf(ch, "%s    Creatures:%s %d\n\r",	dim, bld, castle->num_mobiles);
				ch_printf(ch, "%s      Objects:%s %d\n\r",	dim, bld, castle->num_objects);
				ch_printf(ch, "%s   Back Doors:%s %d\n\r",   dim, bld, castle->has_backdoor);
				if (room_index[castle->door_room])
				{
					ch_printf(ch, "%s Connect Room:%s %s\n\r",	dim, bld, room_index[castle->door_room]->name);
					ch_printf(ch, "%s  Connect Dir:%s %s\n\r",	dim, bld, broken_bits(castle->door_dir, "DIR_", TRUE));
				}
			}
		}
		else
		{
			switch(ch->in_room->sector_type)
			{
				case SECT_FIELD:
				case SECT_FOREST:
				case SECT_HILLS:
				case SECT_MOUNTAIN:
				case SECT_DESERT:
					if (!IS_SET(ch->in_room->room_flags, ROOM_NO_CASTLE)
					&&  !IS_SET(ch->in_room->area->flags, AFLAG_NOCASTLE))
					{
						send_to_char("CASTLE: You could start a castle here.\n\r",ch);
					}
					else
					{
						send_to_char("CASTLE: You can't start a castle here.\n\r",ch);
					}
					break;
				default:
					send_to_char("CASTLE: You can't start a castle here.\n\r",ch);
					break;
			}
		}
		pop_call();
		return;
	}

	argument = one_argument( argument, arg );

	smash_tilde( argument );

	castle = ch->pcdata->castle;

	clanfounder = (ch->pcdata->clan && !strcasecmp(ch->name, ch->pcdata->clan->leader[0]));

	if (!strcasecmp(arg, "entrance"))
	{
		do_castle_entrance(ch, argument);
		pop_call();
		return;
	}

	if ((castle = ch->pcdata->castle) == NULL)
	{
		send_to_char("You have no castle established yet.\n\r",ch);
		pop_call();
		return;
	}

	if (!strcasecmp(arg, "connect"))
	{
		do_castle_connect(ch, argument);
		pop_call();
		return;
	}

	if (ch->in_room->creator_pvnum != ch->pcdata->pvnum)
	{
		send_to_char("You are NOT in your castle!\n\r",ch);
		pop_call();
		return;
	}

	if (!strcasecmp(arg, "rcreate"))
	{
		do_castle_rcreate(ch, argument);
	}
	else if (!strcasecmp(arg, "rstat"))
	{
		do_castle_rstat(ch, argument);
	}
	else if (!strcasecmp(arg, "mstat"))
	{
		do_castle_mstat(ch, argument);
	}
	else if (!strcasecmp(arg, "ostat"))
	{
		do_castle_ostat(ch, argument);
	}
	else if (!strcasecmp(arg, "mcreate"))
	{
		do_castle_mcreate(ch);
	}
	else if (!strcasecmp(arg, "ocreate"))
	{
		do_castle_ocreate(ch);
	}
	else if (!strcasecmp(arg, "screate"))
	{
		do_castle_screate(ch, argument);
	}
	else if (!strcasecmp(arg, "mdelete"))
	{
		do_castle_mdelete(ch, argument);
	}
	else if (!strcasecmp(arg, "rdelete"))
	{
		ch_printf(ch, "Deletion of rooms has not been implemented yet.\n\r");
	}
	else if (!strcasecmp(arg, "odelete"))
	{
		do_castle_odelete(ch, argument);
	}
	else if (!strcasecmp(arg, "sdelete"))
	{
		do_castle_sdelete(ch, argument);
	}
	else if (!strcasecmp(arg, "rset"))
	{
		do_castle_rset(ch, argument);
	}
	else if (!strcasecmp(arg, "mset"))
	{
		do_castle_mset(ch, argument);
	}
	else if (!strcasecmp(arg, "oset"))
	{
		do_castle_oset(ch, argument);
	}
	else if (!strcasecmp(arg, "dset"))
	{
		do_castle_dset(ch, argument);
	}
	else
	{
		send_to_char("Use what castle option? (see 'help castles')\n\r", ch);
		/*
			<connect|rcreate|mcreate|screate|rset|mset|dset|mstat|rstat>
		*/
	}
	pop_call();
	return;
}

void del_castle( CHAR_DATA *victim)
{
	ROOM_INDEX_DATA *pRoomIndex;
	MOB_INDEX_DATA  *pMobIndex;
	OBJ_INDEX_DATA  *pObjIndex;
	int vnum;

	push_call("del_castle(%p)",victim);

	if (victim->pcdata->castle == NULL)
	{
		pop_call();
		return;
	}

	if (victim->pcdata->pvnum == 0)
	{
		log_printf("del_castle: corrupted pvnum found");
		pop_call();
		return;
	}

	log_printf("del_castle: %s", victim->name);

	for (vnum = ROOM_VNUM_CASTLE ; vnum < MAX_VNUM ; vnum++)
	{
		if ((pMobIndex = mob_index[vnum]) != NULL
		&& pMobIndex->area->low_r_vnum == ROOM_VNUM_CASTLE
		&& victim->pcdata->pvnum == pMobIndex->creator_pvnum)
		{
			delete_mob(pMobIndex);
		}

		if ((pObjIndex = obj_index[vnum]) != NULL
		&& pObjIndex->area->low_r_vnum == ROOM_VNUM_CASTLE
		&& victim->pcdata->pvnum == pObjIndex->creator_pvnum)
		{
			delete_obj(pObjIndex);
		}

		if ((pRoomIndex = room_index[vnum]) != NULL
		&& pRoomIndex->area->low_r_vnum == ROOM_VNUM_CASTLE
		&& victim->pcdata->pvnum == pRoomIndex->creator_pvnum)
		{
			delete_room(pRoomIndex);
		}
	}

	FREEMEM(victim->pcdata->castle);
	victim->pcdata->castle				= NULL;

	CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);

	pop_call();
	return;
}