1stMUD4.0/bin/
1stMUD4.0/doc/MPDocs/
1stMUD4.0/player/
1stMUD4.0/win32/
1stMUD4.0/win32/rom/
/**************************************************************************
*  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
*  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
*                                                                         *
*  Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael         *
*  Chastain, Michael Quan, and Mitchell Tse.                              *
*                                                                         *
*  In order to use any part of this Merc Diku Mud, you must comply with   *
*  both the original Diku license in 'license.doc' as well the Merc       *
*  license in 'license.txt'.  In particular, you may not remove either of *
*  these copyright notices.                                               *
*                                                                         *
*  Much time and thought has gone into this software and you are          *
*  benefiting.  We hope that you share your changes too.  What goes       *
*  around, comes around.                                                  *
***************************************************************************
*       ROM 2.4 is copyright 1993-1998 Russ Taylor                        *
*       ROM has been brought to you by the ROM consortium                 *
*           Russ Taylor (rtaylor@hypercube.org)                           *
*           Gabrielle Taylor (gtaylor@hypercube.org)                      *
*           Brian Moore (zump@rom.org)                                    *
*       By using this code, you have agreed to follow the terms of the    *
*       ROM license, in the file Rom24/doc/rom.license                    *
***************************************************************************
*       1stMUD ROM Derivative (c) 2001-2003 by Ryan Jennings              *
*            http://1stmud.dlmud.com/  <r-jenn@shaw.ca>                   *
***************************************************************************/
/***************************************************************************
 *  File: olc.c                                                            *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 *                                                                         *
 *  This code was freely distributed with the The Isles 1.1 source code,   *
 *  and has been used here for OLC - OLC would not be what it is without   *
 *  all the previous coders who released their source code.                *
 *                                                                         *
 ***************************************************************************/

#include "merc.h"
#include "tables.h"
#include "olc.h"
#include "interp.h"
#include "lookup.h"
#include "recycle.h"
#include "music.h"
#include "tablesave.h"

MOB_INDEX_DATA xMob;
OBJ_INDEX_DATA xObj;
ROOM_INDEX_DATA xRoom;
AREA_DATA xArea;
PROG_CODE xMProg;
PROG_CODE xOProg;
PROG_CODE xRProg;
HELP_DATA xHelp;
SOCIAL_DATA xSoc;
CLAN_DATA xClan;
CMD_DATA xCmd;
SKILL_DATA xSkill;
GROUP_DATA xGroup;
RACE_DATA xRace;
CLASS_DATA xClass;
DEITY_DATA xDeity;
CHANNEL_DATA xChan;
MUD xMud;
SONG_DATA xSong;

const struct olc_ed_type olc_ed_table[ED_MAX] = {
	{"AEdit", "area", ED_AREA, aedit_show, do_aedit, area_olc_comm_table},
	{"REdit", "room", ED_ROOM, redit_show, do_redit, room_olc_comm_table},
	{"OEdit", "object", ED_OBJECT, oedit_show, do_oedit, obj_olc_comm_table},
	{"MEdit", "mobile", ED_MOBILE, medit_show, do_medit, mob_olc_comm_table},
	{"HEdit", "help", ED_HELP, hedit_show, do_hedit, help_olc_comm_table},

	{"MPEdit", "mobile program", ED_MPCODE, mpedit_show, do_mpedit,
	 mprog_olc_comm_table},
	{"OPEdit", "object program", ED_OPCODE, opedit_show, do_opedit,
	 oprog_olc_comm_table},
	{"RPEdit", "room program", ED_RPCODE, rpedit_show, do_rpedit,
	 rprog_olc_comm_table},
	{"CEdit", "clan", ED_CLAN, cedit_show, do_cedit, clan_olc_comm_table},
	{"RAEdit", "race", ED_RACE, raedit_show, do_raedit, race_olc_comm_table},
	{"SEdit", "social", ED_SOCIAL, sedit_show, do_sedit, social_olc_comm_table},
	{"SKEdit", "skill", ED_SKILL, skedit_show, do_skedit, skill_olc_comm_table},
	{"MudEdit", "mud", ED_MUD, mudedit_show, do_mudedit, mud_olc_comm_table},
	{"GREdit", "group", ED_GROUP, gredit_show, do_gredit, group_olc_comm_table},
	{"DEdit", "deity", ED_DEITY, dedit_show, do_dedit, deity_olc_comm_table},
	{"CmdEdit", "command", ED_CMD, cmdedit_show, do_cmdedit, cmd_olc_comm_table},
	{"ClEdit", "class", ED_CLASS, cledit_show, do_cledit, class_olc_comm_table},
	{"ChanEdit", "channel", ED_CHAN, chanedit_show, do_chanedit,
	 chan_olc_comm_table},

	{"SongEdit", "song", ED_SONG, songedit_show, do_songedit,
	 song_olc_comm_table}
};

OLCED_DATA *olc_lookup(int ed)
{
	int i;

	if (ed == ED_NONE)
		return NULL;

	for (i = 0; i < ED_MAX; i++)
		if (olc_ed_table[i].ed == ed)
			return &olc_ed_table[i];

	return NULL;
}

AREA_DATA *get_olc_area(DESCRIPTOR_DATA * d)
{
	if (d->editor == ED_NONE || d->pEdit == NULL)
		return NULL;

	switch (d->editor)
	{
	case ED_AREA:
		return (AREA_DATA *) d->pEdit;
	case ED_ROOM:
		return ((ROOM_INDEX_DATA *) d->pEdit)->area;
	case ED_OBJECT:
		return ((OBJ_INDEX_DATA *) d->pEdit)->area;
	case ED_MOBILE:
		return ((MOB_INDEX_DATA *) d->pEdit)->area;
	case ED_MPCODE:
	case ED_OPCODE:
	case ED_RPCODE:
		return ((PROG_CODE *) d->pEdit)->area;
	default:
		return NULL;
	}
}

void olcedit(CHAR_DATA * ch, const char *argument, OLCED_DATA * table)
{
	AREA_DATA *pArea;

	pArea = get_olc_area(ch->desc);

	if (pArea && !IS_BUILDER(ch, pArea))
	{
		chprintlnf(ch, "%s:  Insufficient security to modify %s.", table->name,
				   table->longname);
		edit_done(ch);
		return;
	}

	if (!str_cmp(argument, "done"))
	{
		edit_done(ch);
		return;
	}

	if (emptystring(argument))
	{
		if (table->show != NULL)
			(*table->show) (ch, argument);
		return;
	}

	if (!table->table || !process_olc_command(ch, argument, table->table))
		interpret(ch, argument);
	return;
}

bool run_olc_editor(DESCRIPTOR_DATA * d, char *incomm)
{
	OLCED_DATA *ed;

	if ((ed = olc_lookup(d->editor)) == NULL)
		return FALSE;

	olcedit(CH(d), incomm, ed);
	return TRUE;
}

OLC_FUN *get_olc_show(int editor)
{
	OLCED_DATA *ed;

	if ((ed = olc_lookup(editor)) == NULL)
		return NULL;

	return ed->show;
}

const char *olc_ed_name(DESCRIPTOR_DATA * d)
{
	OLCED_DATA *ed;

	if (!d)
		return &str_empty[0];

	if ((ed = olc_lookup(d->editor)) == NULL)
		return &str_empty[0];

	return ed->name;
}

const char *olc_ed_name_long(CHAR_DATA * ch)
{
	OLCED_DATA *ed;

	if (!ch->desc)
		return "Switched";

	if (IS_NPC(ch))
		return &str_empty[0];

	if ((ed = olc_lookup(ch->desc->editor)) == NULL)
		return &str_empty[0];

	return ed->longname;
}

char *olc_ed_vnum(DESCRIPTOR_DATA * d)
{
	AREA_DATA *pArea;
	ROOM_INDEX_DATA *pRoom;
	OBJ_INDEX_DATA *pObj;
	MOB_INDEX_DATA *pMob;
	PROG_CODE *pMprog;
	PROG_CODE *pOprog;
	PROG_CODE *pRprog;
	HELP_DATA *pHelp;
	CLAN_DATA *pClan;
	SOCIAL_DATA *pSocial;
	CMD_DATA *pCmd;
	SKILL_DATA *pSkill;
	GROUP_DATA *pGroup;
	RACE_DATA *pRace;
	CLASS_DATA *pClass;
	DEITY_DATA *pDeity;
	CHANNEL_DATA *pChan;
	SONG_DATA *pSong;
	static char buf[MIL];

	buf[0] = '\0';
	switch (d->editor)
	{
	case ED_AREA:
		pArea = (AREA_DATA *) d->pEdit;
		sprintf(buf, "%d", pArea ? pArea->vnum : 0);
		break;
	case ED_ROOM:
		pRoom = CH(d)->in_room;
		sprintf(buf, "%ld", pRoom ? pRoom->vnum : 0);
		break;
	case ED_OBJECT:
		pObj = (OBJ_INDEX_DATA *) d->pEdit;
		sprintf(buf, "%ld", pObj ? pObj->vnum : 0);
		break;
	case ED_MOBILE:
		pMob = (MOB_INDEX_DATA *) d->pEdit;
		sprintf(buf, "%ld", pMob ? pMob->vnum : 0);
		break;
	case ED_MPCODE:
		pMprog = (PROG_CODE *) d->pEdit;
		sprintf(buf, "%ld", pMprog ? pMprog->vnum : 0);
		break;
	case ED_OPCODE:
		pOprog = (PROG_CODE *) d->pEdit;
		sprintf(buf, "%ld", pOprog ? pOprog->vnum : 0);
		break;
	case ED_RPCODE:
		pRprog = (PROG_CODE *) d->pEdit;
		sprintf(buf, "%ld", pRprog ? pRprog->vnum : 0);
		break;
	case ED_HELP:
		pHelp = (HELP_DATA *) d->pEdit;
		sprintf(buf, "%s", pHelp ? pHelp->keyword : "");
		break;
	case ED_SOCIAL:
		pSocial = (SOCIAL_DATA *) d->pEdit;
		sprintf(buf, "%s", pSocial ? pSocial->name : "");
		break;
	case ED_CLAN:
		pClan = (CLAN_DATA *) d->pEdit;
		sprintf(buf, "%s", pClan ? pClan->name : "");
		break;
	case ED_CMD:
		pCmd = (CMD_DATA *) d->pEdit;
		sprintf(buf, "%s", pCmd ? pCmd->name : "");
		break;
	case ED_SKILL:
		pSkill = (SKILL_DATA *) d->pEdit;
		sprintf(buf, "%s", pSkill ? pSkill->name : "");
		break;
	case ED_GROUP:
		pGroup = (GROUP_DATA *) d->pEdit;
		sprintf(buf, "%s", pGroup ? pGroup->name : "");
		break;
	case ED_RACE:
		pRace = (RACE_DATA *) d->pEdit;
		sprintf(buf, "%s", pRace ? pRace->name : "");
		break;
	case ED_CLASS:
		pClass = (CLASS_DATA *) d->pEdit;
		sprintf(buf, "%s", pClass ? pClass->name : "");
		break;
	case ED_DEITY:
		pDeity = (DEITY_DATA *) d->pEdit;
		sprintf(buf, "%s", pDeity ? pDeity->name : "");
		break;
	case ED_CHAN:
		pChan = (CHANNEL_DATA *) d->pEdit;
		sprintf(buf, "%s", pChan ? pChan->name : "");
		break;
	case ED_SONG:
		pSong = (SONG_DATA *) d->pEdit;
		sprintf(buf, "%s", pSong ? pSong->name : "");
		break;
	case ED_MUD:
		strcpy(buf, MUD_NAME);
		break;
	default:
		sprintf(buf, " ");
		break;
	}

	return buf;
}

void stop_editing(void *OLC)
{
	DESCRIPTOR_DATA *d;

	for (d = descriptor_first; d != NULL; d = d->next)
	{
		if (d->pEdit == NULL || d->character == NULL)
			continue;

		if (d->pEdit == (void *) OLC)
			edit_done(d->character);
	}
	return;
}

/*****************************************************************************
 Name:		show_commands
 Purpose:	Display all olc commands.
 Called by:	olc interpreters.
 ****************************************************************************/
bool show_commands(CHAR_DATA * ch, char *argument)
{
	char buf[MSL];
	char buf1[MSL];
	int cmd;
	int col;
	OLCED_DATA *ed;

	buf1[0] = '\0';
	col = 0;

	if ((ed = olc_lookup(ch->desc->editor)) == NULL || ed->table == NULL)
	{
		bugf("table NULL, editor %d", ch->desc->editor);
		return FALSE;
	}

	for (cmd = 0; ed->table[cmd].name != NULL; cmd++)
	{
		sprintf(buf, "%-15.15s", ed->table[cmd].name);
		strcat(buf1, buf);
		if (++col % 5 == 0)
			strcat(buf1, "\n\r");
	}

	if (col % 5 != 0)
		strcat(buf1, "\n\r");

	chprint(ch, buf1);
	return FALSE;
}

/*****************************************************************************
 *                           Interpreter Tables.                             *
 *****************************************************************************/
const struct olc_comm_type mob_olc_comm_table[] = {
	{"name", (void *) &xMob.player_name, olced_str, NULL, NULL},
	{"short", (void *) &xMob.short_descr, olced_str, NULL, NULL},
	{"long", (void *) &xMob.long_descr, olced_str, (const void *) 1, NULL},
	{"desc", (void *) &xMob.description, olced_desc, NULL, NULL},

	{"level", (void *) &xMob.level, olced_number,
	 NULL, validate_level},
	{"align", (void *) &xMob.alignment, olced_number,
	 NULL, validate_align},

	{"group", (void *) &xMob.group, olced_olded, (const void *) medit_group,
	 NULL},
	{"imm", (void *) &xMob.imm_flags, olced_flag, (const void *) imm_flags,
	 NULL},
	{"res", (void *) &xMob.res_flags, olced_flag, (const void *) res_flags,
	 NULL},
	{"vuln", (void *) &xMob.vuln_flags, olced_flag, (const void *) vuln_flags,
	 NULL},
	{"act", (void *) &xMob.act, olced_flag, (const void *) act_flags, NULL},

	{"affect", (void *) &xMob.affected_by, olced_flag,
	 (const void *) affect_flags, NULL},
	{"off", (void *) &xMob.off_flags, olced_flag, (const void *) off_flags, NULL},
	{"form", (void *) &xMob.form, olced_flag, (const void *) form_flags, NULL},
	{"parts", (void *) &xMob.parts, olced_flag, (const void *) part_flags, NULL},
	{"shop", (void *) &xMob, olced_shop, NULL, NULL},
	{"create", NULL, olced_olded, (const void *) medit_create, NULL},
	{"delete", NULL, olced_olded, (const void *) medit_delete, NULL},
	{"material", (void *) &xMob.material, olced_str, NULL, NULL},

	{"addprog", (void *) &xMob.first_mprog, olced_addprog,
	 (const void *) &xMob.last_mprog, NULL},
	{"delprog", (void *) &xMob.first_mprog, olced_delprog,
	 (const void *) &xMob.last_mprog, NULL},
	{"spec", (void *) &xMob.spec_fun, olced_spec, NULL, NULL},
	{"sex", (void *) &xMob.sex, olced_flag, (const void *) sex_flags, NULL},
	{"size", (void *) &xMob.size, olced_flag, (const void *) size_flags, NULL},

	{"startpos", (void *) &xMob.start_pos, olced_flag,
	 (const void *) position_flags, NULL},
	{"defaultpos", (void *) &xMob.default_pos, olced_flag,
	 (const void *) position_flags, NULL},
	{"autoeasy", NULL, olced_olded, (const void *) medit_autoeasy, NULL},
	{"autoset", NULL, olced_olded, (const void *) medit_autoset, NULL},
	{"autohard", NULL, olced_olded, (const void *) medit_autohard, NULL},
	{"damtype", (void *) &xMob.dam_type, olced_poslookup,
	 (const void *) attack_lookup, NULL},
	{"race", (void *) &xMob, olced_race, NULL, NULL},
	{"armor", (void *) &xMob, olced_ac, NULL, NULL},
	{"hitdice", (void *) &xMob.hit[0], olced_dice, NULL, NULL},
	{"manadice", (void *) &xMob.mana[0], olced_dice, NULL, NULL},
	{"damdice", (void *) &xMob.damage[0], olced_dice, NULL, NULL},
	{"hitroll", (void *) &xMob.hitroll, olced_number, NULL, NULL},
	{"wealth", (void *) &xMob.wealth, olced_number_long, NULL, NULL},
	{"show", NULL, olced_olded, (const void *) medit_show, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type obj_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) oedit_show, NULL},
	{"create", NULL, olced_olded, (const void *) oedit_create, NULL},
	{"name", (void *) &xObj.name, olced_str, NULL, NULL},
	{"short", (void *) &xObj.short_descr, olced_str, NULL, NULL},
	{"long", (void *) &xObj.description, olced_str, NULL, NULL},
	{"addaffect", NULL, olced_olded, (const void *) oedit_addaffect, NULL},
	{"addapply", NULL, olced_olded, (const void *) oedit_addapply, NULL},
	{"delaffect", NULL, olced_olded, (const void *) oedit_delaffect, NULL},
	{"autoweapon", NULL, olced_olded, (const void *) oedit_autoweapon, NULL},
	{"autoarmor", NULL, olced_olded, (const void *) oedit_autoarmor, NULL},
	{"v0", NULL, olced_value, (const void *) 0, NULL},
	{"v1", NULL, olced_value, (const void *) 1, NULL},
	{"v2", NULL, olced_value, (const void *) 2, NULL},
	{"v3", NULL, olced_value, (const void *) 3, NULL},
	{"v4", NULL, olced_value, (const void *) 4, NULL},
	{"material", (void *) &xObj.material, olced_str, NULL, NULL},
	{"weight", (void *) &xObj.weight, olced_number, NULL, NULL},
	{"cost", (void *) &xObj.cost, olced_number_long, NULL, NULL},

	{"ed", (void *) &xObj.first_extra_descr, olced_ed,
	 (const void *) &xObj.last_extra_descr, NULL},
	{"delete", NULL, olced_olded, (const void *) oedit_delete, NULL},

	{"extra", (void *) &xObj.extra_flags, olced_flag,
	 (const void *) extra_flags, NULL},
	{"wear", (void *) &xObj.wear_flags, olced_flag,
	 (const void *) wear_flags, NULL},

	{"type", (void *) &xObj.item_type, olced_flag,
	 (const void *) type_flags, NULL},

	{"level", (void *) &xObj.level, olced_number, NULL,
	 validate_level},

	{"addprog", (void *) &xObj.first_oprog, olced_addprog,
	 (const void *) &xObj.last_oprog, NULL},
	{"delprog", (void *) &xObj.first_oprog, olced_delprog,
	 (const void *) &xObj.last_oprog, NULL},
	{"condition", (void *) &xObj.condition, olced_number, NULL, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type room_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) redit_show, NULL},
	{"create", NULL, olced_olded, (const void *) redit_create, NULL},
	{"name", (void *) &xRoom.name, olced_str, NULL, NULL},
	{"desc", (void *) &xRoom.description, olced_desc, NULL, NULL},

	{"ed", (void *) &xRoom.first_extra_descr, olced_ed,
	 (const void *) &xRoom.last_extra_descr, NULL},
	{"format", NULL, olced_olded, (const void *) redit_format, NULL},
	{"north", NULL, olced_direction, (const void *) DIR_NORTH, NULL},
	{"south", NULL, olced_direction, (const void *) DIR_SOUTH, NULL},
	{"east", NULL, olced_direction, (const void *) DIR_EAST, NULL},
	{"west", NULL, olced_direction, (const void *) DIR_WEST, NULL},
	{"up", NULL, olced_direction, (const void *) DIR_UP, NULL},
	{"down", NULL, olced_direction, (const void *) DIR_DOWN, NULL},
	{"mreset", NULL, olced_olded, (const void *) redit_mreset, NULL},
	{"oreset", NULL, olced_olded, (const void *) redit_oreset, NULL},
	{"mshow", NULL, olced_olded, (const void *) redit_mshow, NULL},
	{"oshow", NULL, olced_olded, (const void *) redit_oshow, NULL},
	{"clan", NULL, olced_olded, (const void *) redit_clan, NULL},
	{"purge", NULL, olced_docomm, (const void *) do_purge, NULL},
	{"heal", (void *) &xRoom.heal_rate, olced_number, NULL, NULL},
	{"mana", (void *) &xRoom.mana_rate, olced_number, NULL, NULL},
	{"owner", (void *) &xRoom.owner, olced_str, NULL, NULL},

	{"room", (void *) &xRoom.room_flags, olced_flag,
	 (const void *) room_flags, NULL},
	{"olist", NULL, olced_olded, (const void *) redit_olist, NULL},
	{"mlist", NULL, olced_olded, (const void *) redit_mlist, NULL},
	{"rlist", NULL, olced_olded, (const void *) redit_rlist, NULL},
	{"sector", (void *) &xRoom.sector_type, olced_flag,
	 (const void *) sector_flags, NULL},

	{"addprog", (void *) &xRoom.first_rprog, olced_addprog,
	 (const void *) &xRoom.last_rprog, NULL},
	{"delprog", (void *) &xRoom.first_rprog, olced_delprog,
	 (const void *) &xRoom.last_rprog, NULL},
	{"delete", NULL, olced_olded, (const void *) redit_delete, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type area_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) aedit_show, NULL},
	{"create", NULL, olced_olded, (const void *) aedit_create, NULL},
	{"name", (void *) &xArea.name, olced_str, NULL, NULL},
	{"file", NULL, olced_olded, (const void *) aedit_file, NULL},
	{"age", (void *) &xArea.age, olced_number, NULL, NULL},
	{"reset", NULL, olced_olded, (const void *) aedit_reset, NULL},
	{"security", (void *) &xArea.security, olced_number, NULL, NULL},
	{"lvlmsg", (void *) &xArea.lvl_comment, olced_str, NULL, NULL},
	{"minlvl", (void *) &xArea.min_level, olced_number, NULL, NULL},
	{"maxlvl", (void *) &xArea.max_level, olced_number, NULL, NULL},
	{"builder", NULL, olced_olded, (const void *) aedit_builder, NULL},
	{"vnum", NULL, olced_olded, (const void *) aedit_vnum, NULL},
	{"lvnum", NULL, olced_olded, (const void *) aedit_lvnum, NULL},
	{"uvnum", NULL, olced_olded, (const void *) aedit_uvnum, NULL},
	{"credits", (void *) &xArea.credits, olced_str, NULL, NULL},
	{"climate", NULL, olced_olded, (const void *) aedit_climate, NULL},
	{"flag", (void *) &xArea.area_flags, olced_flag,
	 (const void *) area_flags, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type mprog_olc_comm_table[] = {
	{"create", NULL, olced_olded, (const void *) mpedit_create, NULL},
	{"code", (void *) &xMProg.code, olced_desc, NULL, NULL},
	{"show", NULL, olced_olded, (const void *) mpedit_show, NULL},
	{"list", NULL, olced_olded, (const void *) mpedit_list, NULL},
	{"delete", NULL, olced_olded, (const void *) mpedit_delete, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type oprog_olc_comm_table[] = {
	{"create", NULL, olced_olded, (const void *) opedit_create, NULL},
	{"code", (void *) &xOProg.code, olced_desc, NULL, NULL},
	{"show", NULL, olced_olded, (const void *) opedit_show, NULL},
	{"list", NULL, olced_olded, (const void *) opedit_list, NULL},
	{"delete", NULL, olced_olded, (const void *) opedit_delete, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type rprog_olc_comm_table[] = {
	{"create", NULL, olced_olded, (const void *) rpedit_create, NULL},
	{"code", (void *) &xRProg.code, olced_desc, NULL, NULL},
	{"show", NULL, olced_olded, (const void *) rpedit_show, NULL},
	{"list", NULL, olced_olded, (const void *) rpedit_list, NULL},
	{"delete", NULL, olced_olded, (const void *) rpedit_delete, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type help_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) hedit_show, NULL},
	{"make", NULL, olced_olded, (const void *) hedit_new, NULL},
	{"text", (void *) &xHelp.text, olced_desc, NULL, NULL},

	{"level", (void *) &xHelp.level, olced_number, NULL,
	 validate_level},
	{"keywords", (void *) &xHelp.keyword, olced_str, NULL, NULL},
	{"delete", NULL, olced_olded, (const void *) hedit_delete, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type clan_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) cedit_show, NULL},
	{"name", (void *) &xClan.name, olced_str, NULL, NULL},
	{"who", (void *) &xClan.who_name, olced_str, NULL, NULL},
	{"independent", (void *) &xClan.independent, olced_bool, NULL, NULL},
	{"hall", (void *) &xClan.hall, olced_number, NULL, NULL},
	{"delete", NULL, olced_olded, (const void *) cedit_delete, NULL},
	{"create", NULL, olced_olded, (const void *) cedit_create, NULL},
	{"rank", NULL, olced_olded, (const void *) cedit_rank, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type social_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) sedit_show, NULL},
	{"name", NULL, olced_olded, (const void *) sedit_name, NULL},
	{"create", NULL, olced_olded, (const void *) sedit_create, NULL},
	{"delete", NULL, olced_olded, (const void *) sedit_delete, NULL},
	{"cnoarg", (void *) &xSoc.char_no_arg, olced_str, NULL, NULL},
	{"onoarg", (void *) &xSoc.others_no_arg, olced_str, NULL, NULL},
	{"cfound", (void *) &xSoc.char_found, olced_str, NULL, NULL},
	{"ofound", (void *) &xSoc.others_found, olced_str, NULL, NULL},
	{"vfound", (void *) &xSoc.vict_found, olced_str, NULL, NULL},
	{"cself", (void *) &xSoc.char_auto, olced_str, NULL, NULL},
	{"oself", (void *) &xSoc.others_auto, olced_str, NULL, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type cmd_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) cmdedit_show, NULL},
	{"create", NULL, olced_olded, (const void *) cmdedit_create, NULL},
	{"name", NULL, olced_olded, (const void *) cmdedit_name, NULL},
	{"rearrange", NULL, olced_olded, (void *) cmdedit_rearrange, NULL},

	{"level", (void *) &xCmd.level, olced_number, NULL,
	 validate_level},
	{"position", (void *) &xCmd.position, olced_flag,
	 (const void *) position_flags, NULL},
	{"log", (void *) &xCmd.log, olced_flag, (const void *) log_flags, NULL},
	{"fShow", (void *) &xCmd.show, olced_bool, NULL, NULL},
	{"dofun", NULL, olced_olded, (const void *) cmdedit_dofun, NULL},
	{"delete", NULL, olced_olded, (const void *) cmdedit_delete, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type skill_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) skedit_show, NULL},
	{"create", NULL, olced_olded, (const void *) skedit_create, NULL},
	{"name", (void *) &xSkill.name, olced_str, NULL, NULL},
	{"levels", NULL, olced_olded, (const void *) skedit_levels, NULL},
	{"ratings", NULL, olced_olded, (const void *) skedit_ratings, NULL},
	{"spellfun", NULL, olced_olded, (const void *) skedit_spellfun, NULL},

	{"target", (void *) &xSkill.target, olced_flag,
	 (const void *) target_flags, NULL},
	{"minpos", (void *) &xSkill.minimum_position, olced_flag,
	 (const void *) position_flags, NULL},
	{"gsn", NULL, olced_olded, (const void *) skedit_gsn, NULL},
	{"minmana", (void *) &xSkill.min_mana, olced_number, NULL, NULL},
	{"beats", (void *) &xSkill.beats, olced_number, NULL, NULL},
	{"damnoun", (void *) &xSkill.noun_damage, olced_str, NULL, NULL},
	{"msgoff", (void *) &xSkill.msg_off, olced_str, NULL, NULL},
	{"msgobj", (void *) &xSkill.msg_obj, olced_str, NULL, NULL},
	{"delete", NULL, olced_olded, (const void *) skedit_delete, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type group_olc_comm_table[] = {
	{"show", NULL, olced_olded, (const void *) gredit_show, NULL},
	{"create", NULL, olced_olded, (const void *) gredit_create, NULL},

	{"name", (void *) &xGroup.name, olced_str, NULL,
	 validate_groupname},
	{"ratings", NULL, olced_olded, (const void *) gredit_ratings, NULL},
	{"spells", NULL, olced_olded, (const void *) gredit_spells, NULL},
	{"delete", NULL, olced_olded, (const void *) gredit_delete, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type race_olc_comm_table[] = {
	{"create", NULL, olced_olded, (const void *) raedit_create, NULL},
	{"delete", NULL, olced_olded, (const void *) raedit_delete, NULL},
	{"show", NULL, olced_olded, (const void *) raedit_show, NULL},
	{"name", NULL, olced_olded, (const void *) raedit_name, NULL},
	{"act", (void *) &xRace.act, olced_flag, (const void *) act_flags, NULL},
	{"aff", (void *) &xRace.aff, olced_flag, (const void *) affect_flags, NULL},
	{"form", (void *) &xRace.form, olced_flag, (const void *) form_flags, NULL},
	{"off", (void *) &xRace.off, olced_flag, (const void *) off_flags, NULL},
	{"imm", (void *) &xRace.imm, olced_flag, (const void *) imm_flags, NULL},
	{"res", (void *) &xRace.res, olced_flag, (const void *) res_flags, NULL},
	{"vuln", (void *) &xRace.vuln, olced_flag, (const void *) vuln_flags, NULL},
	{"parts", (void *) &xRace.parts, olced_flag, (const void *) part_flags, NULL},
	{"pcrace", (void *) &xRace.pc_race, olced_bool, NULL, NULL},
	{"points", (void *) &xRace.points, olced_number, NULL, NULL},
	{"list", NULL, olced_olded, (const void *) raedit_list, NULL},
	{"stats", NULL, olced_olded, (const void *) raedit_stats, NULL},
	{"mstats", NULL, olced_olded, (const void *) raedit_mstats, NULL},
	{"skills", NULL, olced_olded, (const void *) raedit_skills, NULL},
	{"size", (void *) &xRace.size, olced_flag, (const void *) size_flags, NULL},
	{"classx", NULL, olced_olded, (const void *) raedit_classx, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type class_olc_comm_table[] = {
	{"create", NULL, olced_olded, (const void *) cledit_create, NULL},
	{"delete", NULL, olced_olded, (const void *) cledit_delete, NULL},
	{"show", NULL, olced_olded, (const void *) cledit_show, NULL},

	{"name", (void *) &xClass.name, olced_str, NULL,
	 validate_classname},
	{"prime", NULL, olced_olded, (const void *) cledit_prime, NULL},

	{"weapon", (void *) &xClass.weapon, olced_vnum, NULL,
	 validate_weapon},
	{"adept", (void *) &xClass.skill_adept, olced_number, NULL,
	 validate_adept},
	{"thac0", (void *) &xClass.thac0_00, olced_number, NULL, NULL},
	{"thac32", (void *) &xClass.thac0_32, olced_number, NULL, NULL},

	{"hpmin", (void *) &xClass.hp_min, olced_number, NULL,
	 validate_hmv},
	{"hpmax", (void *) &xClass.hp_max, olced_number, NULL,
	 validate_hmv},
	{"fmana", (void *) &xClass.fMana, olced_bool, NULL, NULL},
	{"guilds", NULL, olced_olded, (const void *) cledit_guilds, NULL},

	{"basegroup", (void *) &xClass.base_group, olced_str, NULL,
	 validate_group},
	{"default", (void *) &xClass.default_group, olced_str, NULL,
	 validate_group},
	{"skill", NULL, olced_olded, (const void *) cledit_skill, NULL},
	{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
	{"?", NULL, olced_olded, (const void *) show_help, NULL},
	{"version", NULL, olced_olded, (const void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type deity_olc_comm_table[] = {
	{"show", NULL, olced_olded, (void *) dedit_show, NULL},
	{"create", NULL, olced_olded, (void *) dedit_create, NULL},
	{"delete", NULL, olced_olded, (void *) dedit_delete, NULL},
	{"list", NULL, olced_olded, (void *) dedit_list, NULL},
	{"name", (void *) &xDeity.name, olced_str, NULL, NULL},
	{"desc", (void *) &xDeity.desc, olced_str, NULL, NULL},
	{"skill", (void *) &xDeity.skillname, olced_str, NULL, NULL},
	{"commands", NULL, olced_olded, (void *) show_commands, NULL},
	{"?", NULL, olced_olded, (void *) show_help, NULL},
	{"version", NULL, olced_olded, (void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type chan_olc_comm_table[] = {
	{"show", NULL, olced_olded, (void *) chanedit_show, NULL},
	{"create", NULL, olced_olded, (void *) chanedit_create, NULL},
	{"gcn", NULL, olced_olded, (void *) chanedit_gcn, NULL},
	{"type", (void *) &xChan.spec_flag, olced_flag, (void *) chan_types, NULL},
	{"bit", (void *) &xChan.bit, olced_flag, (void *) comm_flags, NULL},
	{"format", (void *) &xChan.format, olced_str, NULL, NULL},
	{"name", (void *) &xChan.name, olced_str, NULL, NULL},
	{"description", (void *) &xChan.description, olced_str, NULL, NULL},
	{"colour", NULL, olced_olded, (void *) chanedit_colour, NULL},
	{"length", (void *) &xChan.page_length, olced_number, NULL, NULL},
	{"delete", NULL, olced_olded, (void *) chanedit_delete, NULL},
	{"list", NULL, olced_olded, (void *) chanedit_list, NULL},
	{"commands", NULL, olced_olded, (void *) show_commands, NULL},
	{"?", NULL, olced_olded, (void *) show_help, NULL},
	{"version", NULL, olced_olded, (void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type mud_olc_comm_table[] = {
	{"show", NULL, olced_olded, (void *) mudedit_show, NULL},
	{"flags", (void *) &xMud.mud_flags, olced_flag, (void *) mud_flags, NULL},
	{"pulsepersec", (void *) &xMud.pulsepersec, olced_number, NULL, NULL},
	{"rand_factor", (void *) &xMud.rand_factor, olced_number, NULL, NULL},
	{"weath_unit", (void *) &xMud.weath_unit, olced_number, NULL, NULL},
	{"max_vector", (void *) &xMud.max_vector, olced_number, NULL, NULL},
	{"climate_factor", (void *) &xMud.climate_factor, olced_number, NULL, NULL},
	{"commands", NULL, olced_olded, (void *) show_commands, NULL},
	{"?", NULL, olced_olded, (void *) show_help, NULL},
	{"version", NULL, olced_olded, (void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};

const struct olc_comm_type song_olc_comm_table[] = {
	{"show", NULL, olced_olded, (void *) songedit_show, NULL},
	{"group", (void *) &xSong.group, olced_str, NULL, NULL},
	{"name", (void *) &xSong.name, olced_str, NULL, NULL},
	{"lyrics", NULL, olced_olded, (void *) songedit_lyrics, NULL},
	{"delete", NULL, olced_olded, (void *) songedit_delete, NULL},
	{"create", NULL, olced_olded, (void *) songedit_create, NULL},
	{"commands", NULL, olced_olded, (void *) show_commands, NULL},
	{"?", NULL, olced_olded, (void *) show_help, NULL},
	{"version", NULL, olced_olded, (void *) show_version, NULL},
	{NULL, NULL, NULL, NULL, NULL}
};
/*****************************************************************************
 *                          End Interpreter Tables.                          *
 *****************************************************************************/

/*****************************************************************************
 Name:		get_area_data
 Purpose:	Returns pointer to area with given vnum.
 Called by:	do_aedit(olc.c).
 ****************************************************************************/
AREA_DATA *get_area_data(int vnum)
{
	AREA_DATA *pArea;

	for (pArea = area_first; pArea; pArea = pArea->next)
	{
		if (pArea->vnum == vnum)
			return pArea;
	}

	return 0;
}

/*****************************************************************************
 Name:		edit_done
 Purpose:	Resets builder information on completion.
 Called by:	aedit, redit, oedit, medit(olc.c)
 ****************************************************************************/
bool edit_done(CHAR_DATA * ch)
{
	if (ch->desc->editor != ED_NONE)
	{
		act("$n stop using the $t editor.", ch, olc_ed_name_long(ch), NULL,
			TO_ROOM);
		act("You stop using the $t editor.", ch, olc_ed_name_long(ch), NULL,
			TO_CHAR);
	}

	ch->desc->pEdit = NULL;
	ch->desc->editor = ED_NONE;
	return FALSE;
}

/*****************************************************************************
 *                              Interpreters.                                *
 *****************************************************************************/

bool process_olc_command(CHAR_DATA * ch, const char *argument,
						 const struct olc_comm_type * table)
{
	char arg[MIL];
	AREA_DATA *tArea, *pArea;
	MOB_INDEX_DATA *pMob;
	OBJ_INDEX_DATA *pObj;
	ROOM_INDEX_DATA *pRoom;
	PROG_CODE *pMProg;
	PROG_CODE *pOProg;
	PROG_CODE *pRProg;
	HELP_DATA *pHelp;
	SOCIAL_DATA *pSoc;
	CLAN_DATA *pClan;
	CMD_DATA *pCmd;
	SKILL_DATA *pSkill;
	GROUP_DATA *pGroup;
	RACE_DATA *pRace;
	CLASS_DATA *pClass;
	DEITY_DATA *pDeity;
	CHANNEL_DATA *pChan;
	MUD *nMud;
	SONG_DATA *pSong;
	int temp;
	void *puntero;
	const char *logline = argument;

	argument = one_argument(argument, arg);

	for (temp = 0; table[temp].name; temp++)
	{
		if (LOWER(arg[0]) == LOWER(table[temp].name[0])
			&& !str_prefix(arg, table[temp].name))
		{
			if ((!IS_NPC(ch) && IS_SET(ch->act, PLR_LOG))
				|| IS_SET(mud_info.mud_flags, MUD_LOGALL))
			{
				sprintf(log_buf, "Log %s: %s", ch->name, logline);
				log_string(log_buf);
			}

			if (ch->desc != NULL && ch->desc->snoop_by != NULL)
			{
				d_print(ch->desc->snoop_by, "% ", 2);
				d_println(ch->desc->snoop_by, logline, 0);
			}

			switch (ch->desc->editor)
			{
			case ED_MOBILE:
				EDIT_MOB(ch, pMob);
				tArea = pMob->area;
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xMob + (int) pMob);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate) && tArea)
					SET_BIT(tArea->area_flags, AREA_CHANGED);
				return TRUE;
				break;
			case ED_OBJECT:
				EDIT_OBJ(ch, pObj);
				tArea = pObj->area;
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xObj + (int) pObj);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate)
					&& tArea != NULL)
					SET_BIT(tArea->area_flags, AREA_CHANGED);
				return TRUE;
				break;
			case ED_ROOM:
				EDIT_ROOM(ch, pRoom);
				tArea = pRoom->area;
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xRoom + (int) pRoom);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate)
					&& tArea != NULL)
					SET_BIT(tArea->area_flags, AREA_CHANGED);
				return TRUE;
				break;
			case ED_AREA:
				EDIT_AREA(ch, pArea);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xArea + (int) pArea);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					SET_BIT(pArea->area_flags, AREA_CHANGED);
				return TRUE;
				break;
			case ED_MPCODE:
				EDIT_MPCODE(ch, pMProg);
				tArea = pMProg->area;
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xMProg + (int) pMProg);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					SET_BIT(tArea->area_flags, AREA_CHANGED);
				return TRUE;
				break;
			case ED_OPCODE:
				EDIT_OPCODE(ch, pOProg);
				tArea = pOProg->area;
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xOProg + (int) pOProg);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					SET_BIT(tArea->area_flags, AREA_CHANGED);
				return TRUE;
				break;
			case ED_RPCODE:
				EDIT_RPCODE(ch, pRProg);
				tArea = pRProg->area;
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xRProg + (int) pRProg);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					SET_BIT(tArea->area_flags, AREA_CHANGED);
				return TRUE;
				break;
			case ED_HELP:
				EDIT_HELP(ch, pHelp);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xHelp + (int) pHelp);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					save_helps();
				return TRUE;
				break;
			case ED_SOCIAL:
				EDIT_SOCIAL(ch, pSoc);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xSoc + (int) pSoc);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_socials(action_write);
				return TRUE;
				break;
			case ED_CLAN:
				EDIT_CLAN(ch, pClan);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xClan + (int) pClan);
				else
					puntero = NULL;

				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_clans(action_write);
				return TRUE;
				break;
			case ED_DEITY:
				EDIT_DEITY(ch, pDeity);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument - (int) &xDeity +
								  (int) pDeity);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_deities(action_write);
				return TRUE;
				break;
			case ED_CMD:
				EDIT_CMD(ch, pCmd);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument -
								  (int) &xCmd + (int) pCmd);
				else
					puntero = NULL;

				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_commands(action_write);
				return TRUE;
				break;
			case ED_SKILL:
				EDIT_SKILL(ch, pSkill);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument - (int) &xSkill +
								  (int) pSkill);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_skills(action_write);
				return TRUE;
				break;
			case ED_GROUP:
				EDIT_GROUP(ch, pGroup);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument - (int) &xGroup +
								  (int) pGroup);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_groups(action_write);
				return TRUE;
				break;
			case ED_RACE:
				EDIT_RACE(ch, pRace);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument - (int) &xRace +
								  (int) pRace);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_races(action_write);
				return TRUE;
				break;
			case ED_CLASS:
				EDIT_CLASS(ch, pClass);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument - (int) &xClass +
								  (int) pClass);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_classes(action_write);
				return TRUE;
				break;
			case ED_CHAN:
				EDIT_CHAN(ch, pChan);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument - (int) &xChan +
								  (int) pChan);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_channels(action_write);
				return TRUE;
				break;
			case ED_MUD:
				EDIT_MUD(ch, nMud);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument - (int) &xMud +
								  (int) nMud);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_mud_data(action_write);
				return TRUE;
				break;
			case ED_SONG:
				EDIT_SONG(ch, pSong);
				if (table[temp].argument)
					puntero =
						(void *) ((int) table[temp].argument - (int) &xSong +
								  (int) pSong);
				else
					puntero = NULL;
				if ((*table[temp].function)
					(table[temp].name, ch, argument, puntero,
					 table[temp].parameter, table[temp].validate))
					rw_music(action_write);
				return TRUE;
				break;
			}
		}
	}

	return FALSE;
}

/* Entry point for all editors. */
CH_CMD(do_olc)
{
	char command[MAX_INPUT_LENGTH];
	int cmd;

	if (IS_NPC(ch))
		return;

	argument = one_argument(argument, command);

	if (IS_NULLSTR(command))
	{
		do_oldhelp(ch, "olc");
		return;
	}

	/* Search Table and Dispatch Command. */
	for (cmd = 0; cmd < ED_MAX; cmd++)
	{
		if (!str_prefix(command, olc_ed_table[cmd].name))
		{
			(*olc_ed_table[cmd].do_fun) (ch, argument);
			return;
		}
	}

	/* Invalid command, send help. */
	do_oldhelp(ch, "olc");
	return;
}

CHANNEL_DATA *get_chan_data(int chan)
{
	if (chan >= 0 && chan < maxChannel)
		return &channel_table[chan];
	else
		return NULL;
}

SONG_DATA *get_song_data(int song)
{
	if (song >= 0 && song < maxSongs)
		return &song_table[song];
	else
		return NULL;
}

SKILL_DATA *get_skill_data(int skill)
{
	if (skill > -1 && skill < maxSkill)
		return &skill_table[skill];

	return &skill_table[0];
}

GROUP_DATA *get_group_data(int group)
{
	if (group > -1 && group < maxGroup)
		return &group_table[group];

	return &group_table[0];
}

CLASS_DATA *get_class_data(int Class)
{
	if (Class > -1 && Class < maxClass)
		return &class_table[Class];

	return &class_table[0];
}

void clean_area_links(AREA_DATA * target)
{
	vnum_t vnum;
	char buf[20];

	for (vnum = target->min_vnum; vnum <= target->max_vnum; vnum++)
	{
		if (get_prog_index(vnum, PRG_MPROG) != NULL)
		{
			sprintf(buf, "%ld", vnum);
			if (!mpedit_delete(NULL, buf))
				bugf("Unable to delete Mprog %ld", vnum);
		}
		if (get_prog_index(vnum, PRG_OPROG) != NULL)
		{
			sprintf(buf, "%ld", vnum);
			if (!opedit_delete(NULL, buf))
				bugf("Unable to delete Oprog %ld", vnum);
		}
		if (get_prog_index(vnum, PRG_RPROG) != NULL)
		{
			sprintf(buf, "%ld", vnum);
			if (!rpedit_delete(NULL, buf))
				bugf("Unable to delete Rprog %ld", vnum);
		}
		if (get_room_index(vnum) != NULL)
		{
			sprintf(buf, "%ld", vnum);
			if (!redit_delete(NULL, buf))
				bugf("Unable to delete Room %ld", vnum);
		}
		if (get_obj_index(vnum) != NULL)
		{
			sprintf(buf, "%ld", vnum);
			if (!oedit_delete(NULL, buf))
				bugf("Unable to delete Object %ld", vnum);
		}
		if (get_mob_index(vnum) != NULL)
		{
			sprintf(buf, "%ld", vnum);
			if (!medit_delete(NULL, buf))
				bugf("Unable to delete Mobile %ld", vnum);
		}
	}
}

bool vnum_OK(vnum_t lnum, vnum_t hnum)
{
	int i;

	for (i = 0; vnum_table[i].vnum != -1; i++)
	{
		if (vnum_table[i].vnum >= lnum && vnum_table[i].vnum <= hnum)
			return FALSE;
	}
	return TRUE;
}

/* Entry point for editing area_data. */
CH_CMD(do_aedit)
{
	AREA_DATA *pArea;
	int value;
	char arg[MAX_STRING_LENGTH];

	if (IS_NPC(ch))
		return;

	pArea = ch->in_room->area;

	argument = one_argument(argument, arg);

	if (is_number(arg))
	{
		value = atoi(arg);
		if (!(pArea = get_area_data(value)))
		{
			chprintln(ch, "That area vnum does not exist.");
			return;
		}
	}
	else if (!str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln(ch, "AEdit : Seguridad insuficiente para crear area.");
			return;
		}

		aedit_create(ch, "");
		ch->desc->editor = ED_AREA;
		act("$n has entered the area editor.", ch, NULL, NULL, TO_ROOM);
		return;
	}
	else if (!str_cmp(arg, "delete"))
	{
		char filename[512];

		if (ch->pcdata->security < 9)
		{
			chprintln(ch, "AEdit : Seguridad insuficiente para delete area.");
			return;
		}
		if (!is_number(argument) || !(pArea = get_area_data(atoi(argument))))
		{
			chprintln(ch, "That area vnum does not exist.");
			return;
		}

		if (vnum_OK(pArea->min_vnum, pArea->max_vnum) == FALSE)
		{
			chprintln(ch,
					  "That area contains hard coded vnums and cannot be deleted.");
			return;
		}

		clean_area_links(pArea);
		sprintf(filename, "%s%s", AREA_DIR, pArea->file_name);
		unlink(filename);
		unlink_area(pArea);
		free_area(pArea);
		do_asave(NULL, "changed");
		chprintln(ch, "Area deleted.");
		return;
	}
	if (!IS_BUILDER(ch, pArea))
	{
		chprintln(ch, "Insuficiente seguridad para editar areas.");
		return;
	}

	edit_start(ch, pArea, ED_AREA);
	return;
}

/* Entry point for editing room_index_data. */
CH_CMD(do_redit)
{
	ROOM_INDEX_DATA *pRoom;
	char arg1[MAX_STRING_LENGTH];

	if (IS_NPC(ch))
		return;

	argument = one_argument(argument, arg1);

	pRoom = ch->in_room;

	if (!str_cmp(arg1, "reset"))	/* redit reset */
	{
		if (!IS_BUILDER(ch, pRoom->area))
		{
			chprintln(ch, "Insufficient security to modify cuartos.");
			return;
		}

		reset_room(pRoom);
		chprintln(ch, "Room reset.");

		return;
	}
	else if (!str_cmp(arg1, "create"))	/* redit create <vnum> */
	{
		if (IS_NULLSTR(argument) || atol(argument) == 0)
		{
			chprintln(ch, "Syntax:  edit room create [vnum]");
			return;
		}

		if (redit_create(ch, argument))	/* pEdit == nuevo cuarto */
		{
			ch->desc->editor = ED_ROOM;
			act("$n has entered the room editor.", ch, NULL, NULL, TO_ROOM);
			char_from_room(ch);
			char_to_room(ch, (ROOM_INDEX_DATA *) ch->desc->pEdit);
			SET_BIT(((ROOM_INDEX_DATA *) ch->desc->pEdit)->area->area_flags,
					AREA_CHANGED);
		}

		return;
	}
	else if (!str_cmp(arg1, "delete"))
	{
		redit_delete(ch, argument);
		return;
	}
	else if (!IS_NULLSTR(arg1))	/* redit <vnum> */
	{
		pRoom = get_room_index(atol(arg1));

		if (!pRoom)
		{
			chprintln(ch, "REdit : cuarto inexistente.");
			return;
		}

		if (!IS_BUILDER(ch, pRoom->area))
		{
			chprintln(ch, "REdit : insuficiente seguridad para editar cuarto.");
			return;
		}

		char_from_room(ch);
		char_to_room(ch, pRoom);
	}

	if (!IS_BUILDER(ch, pRoom->area))
	{
		chprintln(ch, "REdit : Insuficiente seguridad para editar cuartos.");
		return;
	}

	edit_start(ch, pRoom, ED_ROOM);
	return;
}

/* Entry point for editing obj_index_data. */
CH_CMD(do_oedit)
{
	OBJ_INDEX_DATA *pObj;
	AREA_DATA *pArea;
	char arg1[MAX_STRING_LENGTH];
	vnum_t value;

	if (IS_NPC(ch))
		return;

	argument = one_argument(argument, arg1);

	if (is_number(arg1))
	{
		value = atol(arg1);
		if (!(pObj = get_obj_index(value)))
		{
			chprintln(ch, "OEdit:  That vnum does not exist.");
			return;
		}

		if (!IS_BUILDER(ch, pObj->area))
		{
			chprintln(ch, "Insufficient security to modify objetos.");
			return;
		}

		edit_start(ch, pObj, ED_OBJECT);
		return;
	}
	else
	{
		if (!str_cmp(arg1, "create"))
		{
			value = atol(argument);
			if (IS_NULLSTR(argument) || value == 0)
			{
				chprintln(ch, "Syntax:  edit object create [vnum]");
				return;
			}

			pArea = get_vnum_area(value);

			if (!pArea)
			{
				chprintln(ch, "OEdit:  That vnum is not assigned an area.");
				return;
			}

			if (!IS_BUILDER(ch, pArea))
			{
				chprintln(ch, "Insufficient security to modify objetos.");
				return;
			}

			if (oedit_create(ch, argument))
			{
				SET_BIT(pArea->area_flags, AREA_CHANGED);
				ch->desc->editor = ED_OBJECT;
				act("$n has entered the object editor.", ch,
					NULL, NULL, TO_ROOM);
			}
			return;
		}
		else if (!str_cmp(arg1, "delete"))
		{
			oedit_delete(ch, argument);
			return;
		}
	}

	chprintln(ch, "OEdit:  There is no default object to edit.");
	return;
}

/* Entry point for editing mob_index_data. */
CH_CMD(do_medit)
{
	MOB_INDEX_DATA *pMob;
	AREA_DATA *pArea;
	vnum_t value;
	char arg1[MAX_STRING_LENGTH];

	argument = one_argument(argument, arg1);

	if (IS_NPC(ch))
		return;

	if (is_number(arg1))
	{
		value = atol(arg1);
		if (!(pMob = get_mob_index(value)))
		{
			chprintln(ch, "MEdit:  That vnum does not exist.");
			return;
		}

		if (!IS_BUILDER(ch, pMob->area))
		{
			chprintln(ch, "Insufficient security to modify mobs.");
			return;
		}

		edit_start(ch, pMob, ED_MOBILE);
		return;
	}
	else
	{
		if (!str_cmp(arg1, "create"))
		{
			value = atol(argument);
			if (IS_NULLSTR(arg1) || value == 0)
			{
				chprintln(ch, "Syntax:  edit mobile create [vnum]");
				return;
			}

			pArea = get_vnum_area(value);

			if (!pArea)
			{
				chprintln(ch, "MEdit:  That vnum is not assigned an area.");
				return;
			}

			if (!IS_BUILDER(ch, pArea))
			{
				chprintln(ch, "Insufficient security to modify mobs.");
				return;
			}

			if (medit_create(ch, argument))
			{
				SET_BIT(pArea->area_flags, AREA_CHANGED);
				ch->desc->editor = ED_MOBILE;
				act("$n has entered the mobile editor.", ch,
					NULL, NULL, TO_ROOM);
			}
			return;
		}
		else if (!str_cmp(arg1, "delete"))
		{
			medit_delete(ch, argument);
			return;
		}
	}

	chprintln(ch, "MEdit:  There is no default mobile to edit.");
	return;
}

CH_CMD(do_cedit)
{
	CLAN_DATA *pClan;
	char arg[MSL];

	if (IS_NPC(ch))
		return;

	pClan = clan_first;

	argument = one_argument(argument, arg);

	if (IS_NULLSTR(arg))
	{
		chprintln(ch, "Syntax: cedit create\n\r        cedit <clan name>");
		return;
	}

	if (!str_cmp(arg, "save"))
	{
		rw_clans(action_write);
		chprintln(ch, "Clan database saved.");
		return;
	}
	else if (!str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln(ch, "cEdit : Insuffecient security to create new clans.");
			return;
		}
		cedit_create(ch, argument);

		return;
	}
	else if (!(pClan = clan_lookup(arg)) || IS_NULLSTR(pClan->name))
	{
		chprintln(ch, "That clan does not exist.");
		return;
	}

	edit_start(ch, pClan, ED_CLAN);
	return;
}

CH_CMD(do_cmdedit)
{
	CMD_DATA *pCmd;
	char arg[MSL];

	if (IS_NPC(ch))
		return;

	argument = one_argument(argument, arg);

	if (IS_NULLSTR(arg))
	{
		chprintln(ch, "Syntax: cmdedit create\n\r"
				  "        cmdedit <command name>");
		return;
	}

	if (!str_cmp(arg, "save"))
	{
		rw_commands(action_write);
		chprintln(ch, "Command database saved.");
		return;
	}
	else if (!str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln
				(ch, "cmdEdit : Insuffecient security to create new commands.");
			return;
		}

		cmdedit_create(ch, argument);

		return;
	}
	else if (!(pCmd = command_lookup(arg)) || IS_NULLSTR(pCmd->name))
	{
		chprintln(ch, "That command does not exist.");
		return;
	}

	edit_start(ch, pCmd, ED_CMD);

	return;
}

CH_CMD(do_skedit)
{
	SKILL_DATA *pSkill;
	int value;
	char arg[MSL];

	if (IS_NPC(ch))
		return;

	pSkill = &skill_table[0];

	argument = one_argument(argument, arg);

	if (IS_NULLSTR(arg))
	{
		chprintln(ch, "Syntax: skedit make\n\r" "      : skedit save\n\r"
				  "      : skedit #/skill name");
		return;
	}

	if (is_number(arg))
		value = atoi(arg);
	else
		value = skill_lookup(arg);

	if (value > -1)
	{
		pSkill = get_skill_data(value);

		if (!pSkill || IS_NULLSTR(pSkill->name))
		{
			chprintln(ch, "That skill does not exist.");
			return;
		}

	}
	else if (!str_cmp(arg, "save"))
	{
		rw_skills(action_write);
		chprintln(ch, "Skill database saved.");
		return;
	}
	else if (!str_cmp(arg, "make") || !str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln
				(ch, "skEdit : Insuffecient security to create new skills.");
			return;
		}

		skedit_create(ch, argument);

		return;
	}

	edit_start(ch, pSkill, ED_SKILL);
	return;
}

CH_CMD(do_gredit)
{
	GROUP_DATA *pGroup;
	int value;
	char arg[MSL];

	if (IS_NPC(ch))
		return;

	pGroup = &group_table[0];

	argument = one_argument(argument, arg);

	if (IS_NULLSTR(arg))
	{
		chprintln(ch, "Syntax: gredit create\n\r        gredit #/skill name");
		return;
	}

	if (is_number(arg))
		value = atoi(arg);
	else
		value = group_lookup(arg);

	if (value > -1)
	{
		pGroup = get_group_data(value);

		if (!pGroup || IS_NULLSTR(pGroup->name))
		{
			chprintln(ch, "That skill does not exist.");
			return;
		}

	}
	else if (!str_cmp(arg, "save"))
	{
		rw_groups(action_write);
		chprintln(ch, "Group database saved.");
		return;
	}
	else if (!str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln
				(ch, "grEdit : Insuffecient security to create new groups.");
			return;
		}

		gredit_create(ch, argument);

		return;
	}

	edit_start(ch, pGroup, ED_GROUP);
	return;
}

CH_CMD(do_raedit)
{
	RACE_DATA *pRace;
	char arg[MSL];

	if (IS_NPC(ch))
		return;

	pRace = race_first;

	argument = one_argument(argument, arg);

	if (IS_NULLSTR(arg))
	{
		chprintln(ch, "Syntax: raedit create\n\r        raedit <race name>");
		return;
	}
	else if (!str_cmp(arg, "save"))
	{
		rw_races(action_write);
		chprintln(ch, "Race database saved.");
		return;
	}
	else if (!str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln
				(ch, "raEdit : Insuffecient security to create new races.");
			return;
		}

		raedit_create(ch, argument);

		return;
	}
	else if ((pRace = race_lookup(arg)) == NULL)
	{
		chprintln(ch, "That race does not exist.");
		return;
	}

	edit_start(ch, pRace, ED_RACE);
	return;
}

CH_CMD(do_cledit)
{
	CLASS_DATA *pClass;
	int value;
	char arg[MSL];

	if (IS_NPC(ch))
		return;

	pClass = &class_table[0];

	argument = one_argument(argument, arg);

	if (IS_NULLSTR(arg))
	{
		chprintln(ch, "Syntax: cledit create\n\r        cledit #/class name");
		return;
	}

	if (is_number(arg))
		value = atoi(arg);
	else
		value = class_lookup(arg);

	if (value > -1)
	{
		pClass = get_class_data(value);

		if (!pClass || IS_NULLSTR(pClass->name))
		{
			chprintln(ch, "That class does not exist.");
			return;
		}

	}
	else if (!str_cmp(arg, "save"))
	{
		rw_classes(action_write);
		chprintln(ch, "Class database saved.");
		return;
	}
	else if (!str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln
				(ch, "clEdit : Insuffecient security to create new class.");
			return;
		}

		cledit_create(ch, argument);

		return;
	}
	edit_start(ch, pClass, ED_CLASS);
	return;
}

int channel_lookup(const char *arg)
{
	int i;

	for (i = 0; i < maxChannel; i++)
	{
		if (!str_prefix(arg, channel_table[i].name))
			return i;
	}
	return -1;
}

CH_CMD(do_chanedit)
{
	CHANNEL_DATA *pChan;
	int value;
	char arg[MSL];

	if (IS_NPC(ch))
		return;

	pChan = &channel_table[0];

	argument = one_argument(argument, arg);

	if (IS_NULLSTR(arg))
	{
		chprintln(ch, "Syntax: chanedit create\n\r" "      : chanedit save\n\r"
				  "      : chanedit <#|name>");
		return;
	}

	if (is_number(arg))
		value = atoi(arg);
	else
		value = channel_lookup(arg);

	if (value > -1)
	{
		pChan = get_chan_data(value);

		if (!pChan)
		{
			chprintln(ch, "That channel does not exist.");
			return;
		}

	}
	else if (!str_cmp(arg, "save"))
	{
		rw_channels(action_write);
		chprintln(ch, "Channel database saved.");
		return;
	}
	else if (!str_cmp(arg, "make") || !str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln
				(ch,
				 "chanEdit : Insuffecient security to create new channels.");
			return;
		}

		chanedit_create(ch, argument);

		return;
	}

	edit_start(ch, pChan, ED_CHAN);
	return;
}

CH_CMD(do_songedit)
{
	SONG_DATA *pSong;
	int value;
	char arg[MSL];

	if (IS_NPC(ch))
		return;

	pSong = &song_table[0];

	argument = one_argument(argument, arg);

	if (IS_NULLSTR(arg))
	{
		chprintln(ch, "Syntax: songedit create\n\r" "      : songedit save\n\r"
				  "      : songedit <#|name>");
		return;
	}

	if (is_number(arg))
		value = atoi(arg);
	else
		value = song_lookup(arg);

	if (value > -1)
	{
		pSong = get_song_data(value);

		if (!pSong)
		{
			chprintln(ch, "That song does not exist.");
			return;
		}

	}
	else if (!str_cmp(arg, "save"))
	{
		rw_music(action_write);
		chprintln(ch, "Song database saved.");
		return;
	}
	else if (!str_cmp(arg, "make") || !str_cmp(arg, "create"))
	{
		if (ch->pcdata->security < 9)
		{
			chprintln
				(ch, "SongEdit : Insuffecient security to create new songs.");
			return;
		}

		songedit_create(ch, argument);

		return;
	}

	edit_start(ch, pSong, ED_SONG);
	return;
}

CH_CMD(do_mudedit)
{
	if (IS_NPC(ch))
		return;

	if (get_trust(ch) < MAX_LEVEL - 1)
	{
		chprintln(ch, "Insufficient security to edit mud data.");
		return;
	}

	edit_start(ch, &mud_info, ED_MUD);
	return;
}

void display_resets(CHAR_DATA * ch)
{
	ROOM_INDEX_DATA *pRoom;
	RESET_DATA *pReset;
	MOB_INDEX_DATA *pMob = NULL;
	char buf[MAX_STRING_LENGTH];
	char final[MAX_STRING_LENGTH];
	int iReset = 0;

	EDIT_ROOM(ch, pRoom);
	final[0] = '\0';

	chprintln(ch,
			  " No.  Loads    Description       Location         Vnum   Mx Mn Description"
			  "\n\r"
			  "==== ======== ============= =================== ======== ===== ===========");

	for (pReset = pRoom->reset_first; pReset; pReset = pReset->next)
	{
		OBJ_INDEX_DATA *pObj;
		MOB_INDEX_DATA *pMobIndex;
		OBJ_INDEX_DATA *pObjIndex;
		OBJ_INDEX_DATA *pObjToIndex;
		ROOM_INDEX_DATA *pRoomIndex;

		final[0] = '\0';
		sprintf(final, "[%2d] ", ++iReset);

		switch (pReset->command)
		{
		default:
			sprintf(buf, "Bad reset command: %c.", pReset->command);
			strcat(final, buf);
			break;

		case 'M':
			if (!(pMobIndex = get_mob_index(pReset->arg1)))
			{
				sprintf(buf, "Load Mobile - Bad Mob %ld\n\r", pReset->arg1);
				strcat(final, buf);
				continue;
			}

			if (!(pRoomIndex = get_room_index(pReset->arg3)))
			{
				sprintf(buf, "Load Mobile - Bad Room %ld\n\r", pReset->arg3);
				strcat(final, buf);
				continue;
			}

			pMob = pMobIndex;
			sprintf(buf,
					"M[%5ld] %-13.13s in room             R[%5ld] %2d-%2d %-15.15s\n\r",
					pReset->arg1, pMob->short_descr, pReset->arg3,
					pReset->arg2, pReset->arg4, pRoomIndex->name);
			strcat(final, buf);

			/*
			 * Check for pet shop.
			 * -------------------
			 */
			{
				ROOM_INDEX_DATA *pRoomIndexPrev;

				pRoomIndexPrev = get_room_index(pRoomIndex->vnum - 1);
				if (pRoomIndexPrev
					&& IS_SET(pRoomIndexPrev->room_flags, ROOM_PET_SHOP))
					final[5] = 'P';
			}

			break;

		case 'O':
			if (!(pObjIndex = get_obj_index(pReset->arg1)))
			{
				sprintf(buf, "Load Object - Bad Object %ld\n\r", pReset->arg1);
				strcat(final, buf);
				continue;
			}

			pObj = pObjIndex;

			if (!(pRoomIndex = get_room_index(pReset->arg3)))
			{
				sprintf(buf, "Load Object - Bad Room %ld\n\r", pReset->arg3);
				strcat(final, buf);
				continue;
			}

			sprintf(buf,
					"O[%5ld] %-13.13s in room             "
					"R[%5ld]       %-15.15s\n\r", pReset->arg1,
					pObj->short_descr, pReset->arg3, pRoomIndex->name);
			strcat(final, buf);

			break;

		case 'P':
			if (!(pObjIndex = get_obj_index(pReset->arg1)))
			{
				sprintf(buf, "Put Object - Bad Object %ld\n\r", pReset->arg1);
				strcat(final, buf);
				continue;
			}

			pObj = pObjIndex;

			if (!(pObjToIndex = get_obj_index(pReset->arg3)))
			{
				sprintf(buf,
						"Put Object - Bad To Object %ld\n\r", pReset->arg3);
				strcat(final, buf);
				continue;
			}

			sprintf(buf,
					"O[%5ld] %-13.13s inside              O[%5ld] %2d-%2d %-15.15s\n\r",
					pReset->arg1, pObj->short_descr, pReset->arg3,
					pReset->arg2, pReset->arg4, pObjToIndex->short_descr);
			strcat(final, buf);

			break;

		case 'G':
		case 'E':
			if (!(pObjIndex = get_obj_index(pReset->arg1)))
			{
				sprintf(buf,
						"Give/Equip Object - Bad Object %ld\n\r", pReset->arg1);
				strcat(final, buf);
				continue;
			}

			pObj = pObjIndex;

			if (!pMob)
			{
				sprintf(buf, "Give/Equip Object - No Previous Mobile\n\r");
				strcat(final, buf);
				break;
			}

			if (pMob->pShop)
			{
				sprintf(buf,
						"O[%5ld] %-13.13s in the inventory of S[%5ld]       %-15.15s\n\r",
						pReset->arg1, pObj->short_descr,
						pMob->vnum, pMob->short_descr);
			}
			else
				sprintf(buf,
						"O[%5ld] %-13.13s %-19.19s M[%5ld]       %-15.15s\n\r",
						pReset->arg1, pObj->short_descr,
						(pReset->command ==
						 'G') ? "in the inventory" :
						flag_string(wear_loc_strings, pReset->arg3),
						pMob->vnum, pMob->short_descr);
			strcat(final, buf);

			break;

			/*
			 * Doors are set in rs_flags don't need to be displayed.
			 * If you want to display them then uncomment the new_reset
			 * line in the case 'D' in load_resets in db.c and here.
			 */
		case 'D':
			pRoomIndex = get_room_index(pReset->arg1);
			sprintf(buf,
					"R[%5ld] %s door of %-19.19s reset to %s\n\r",
					pReset->arg1,
					capitalize(dir_name[pReset->arg2]),
					pRoomIndex->name, flag_string(door_resets, pReset->arg3));
			strcat(final, buf);

			break;
			/*
			 * End Doors Comment.
			 */
		case 'R':
			if (!(pRoomIndex = get_room_index(pReset->arg1)))
			{
				sprintf(buf,
						"Randomize Exits - Bad Room %ld\n\r", pReset->arg1);
				strcat(final, buf);
				continue;
			}

			sprintf(buf, "R[%5ld] Set to randomize %s %s.\n\r",
					pReset->arg1,
					pReset->arg3 == 0 ? "exits" : pReset->arg2 ==
					0 ? "any available exit" : dir_name[pReset->arg2 - 1],
					pReset->arg3 == 0 ? "in room" : pReset->arg3 ==
					1 ? "to this area" : "to the world");
			strcat(final, buf);

			break;
		}
		chprint(ch, final);
	}

	return;
}

/*****************************************************************************
 Name:		add_reset
 Purpose:	Inserts a new reset in the given index slot.
 Called by:	do_resets(olc.c).
 ****************************************************************************/
void add_reset(ROOM_INDEX_DATA * room, RESET_DATA * pReset, int pIndex)
{
	RESET_DATA *reset;
	int iReset = 0;

	if (!room->reset_first)
	{
		LINK(pReset, room->reset_first, room->reset_last, next, prev);
		return;
	}

	for (reset = room->reset_first; reset; reset = reset->next)
	{
		if (++iReset == pIndex)
			break;
	}

	if (reset)
		INSERT(pReset, reset, room->reset_first, next, prev);
	else
		LINK(pReset, room->reset_first, room->reset_last, next, prev);
	return;
}

CH_CMD(do_resets)
{
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char arg3[MAX_INPUT_LENGTH];
	char arg4[MAX_INPUT_LENGTH];
	char arg5[MAX_INPUT_LENGTH];
	char arg6[MAX_INPUT_LENGTH];
	char arg7[MAX_INPUT_LENGTH];
	RESET_DATA *pReset = NULL;

	argument = one_argument(argument, arg1);
	argument = one_argument(argument, arg2);
	argument = one_argument(argument, arg3);
	argument = one_argument(argument, arg4);
	argument = one_argument(argument, arg5);
	argument = one_argument(argument, arg6);
	argument = one_argument(argument, arg7);

	if (!IS_BUILDER(ch, ch->in_room->area))
	{
		chprintln(ch, "Resets: Invalid security for editing this area.");
		return;
	}

	/*
	 * Display resets in current room.
	 * -------------------------------
	 */
	if (IS_NULLSTR(arg1))
	{
		if (ch->in_room->reset_first)
		{
			chprintln(ch, "Resets: M = mobile, R = room, O = object, "
					  "P = pet, S = shopkeeper");
			display_resets(ch);
		}
		else
			chprintln(ch, "No resets in this room.");
	}

	/*
	 * Take index number and search for commands.
	 * ------------------------------------------
	 */
	if (is_number(arg1))
	{
		ROOM_INDEX_DATA *pRoom = ch->in_room;

		/*
		 * Delete a reset.
		 * ---------------
		 */
		if (!str_cmp(arg2, "delete"))
		{
			int insert_loc = atoi(arg1);
			int iReset = -1;

			if (!ch->in_room->reset_first)
			{
				chprintln(ch, "No resets in this area.");
				return;
			}
			for (pReset = pRoom->reset_first; pReset; pReset = pReset->next)
			{
				if (++iReset == insert_loc - 1)
					break;
			}

			if (!pReset)
			{
				chprintln(ch, "Reset not found.");
				return;
			}
			UNLINK(pReset, pRoom->reset_first, pRoom->reset_last, next, prev);
			free_reset_data(pReset);
			chprintln(ch, "Reset deleted.");
			SET_BIT(ch->in_room->area->area_flags, AREA_CHANGED);
		}
		else
			/*
			 * Add a reset.
			 * ------------
			 */
			if ((!str_cmp(arg2, "mob") && is_number(arg3)) ||
				(!str_cmp(arg2, "obj") && is_number(arg3)))
		{
			/*
			 * Check for Mobile reset.
			 * -----------------------
			 */
			if (!str_cmp(arg2, "mob"))
			{
				if (get_mob_index(is_number(arg3) ? atol(arg3) : 1) == NULL)
				{
					chprintln(ch, "Mob no existe.");
					return;
				}
				pReset = new_reset_data();
				pReset->command = 'M';
				pReset->arg1 = atol(arg3);
				pReset->arg2 = is_number(arg4) ? atoi(arg4) : 1;	/* Max # */
				pReset->arg3 = ch->in_room->vnum;
				pReset->arg4 = is_number(arg5) ? atoi(arg5) : 1;	/* Min # */
			}
			else
				/*
				 * Check for Object reset.
				 * -----------------------
				 */
			if (!str_cmp(arg2, "obj"))
			{
				pReset = new_reset_data();
				pReset->arg1 = atol(arg3);
				/*
				 * Inside another object.
				 * ----------------------
				 */
				if (!str_prefix(arg4, "inside"))
				{
					OBJ_INDEX_DATA *temp;

					temp = get_obj_index(is_number(arg5) ? atol(arg5) : 1);
					if ((temp->item_type != ITEM_CONTAINER)
						&& (temp->item_type != ITEM_CORPSE_NPC))
					{
						chprintln(ch, "Objeto 2 no es container.");
						return;
					}
					pReset->command = 'P';
					pReset->arg2 = is_number(arg6) ? atoi(arg6) : 1;
					pReset->arg3 = is_number(arg5) ? atol(arg5) : 1;
					pReset->arg4 = is_number(arg7) ? atoi(arg7) : 1;
				}
				else
					/*
					 * Inside the room.
					 * ----------------
					 */
				if (!str_cmp(arg4, "room"))
				{
					if (get_obj_index(atol(arg3)) == NULL)
					{
						chprintln(ch, "Vnum no existe.");
						return;
					}
					pReset->command = 'O';
					pReset->arg2 = 0;
					pReset->arg3 = ch->in_room->vnum;
					pReset->arg4 = 0;
				}
				else
					/*
					 * Into a Mobile's inventory.
					 * --------------------------
					 */
				{
					int wear;

					if ((wear = flag_value(wear_loc_flags, arg4)) == NO_FLAG)
					{
						chprintln(ch, "Resets: '? wear-loc'");
						return;
					}
					if (get_obj_index(atol(arg3)) == NULL)
					{
						chprintln(ch, "Vnum no existe.");
						return;
					}
					pReset->arg1 = atol(arg3);
					pReset->arg3 = wear;
					if (pReset->arg3 == WEAR_NONE)
						pReset->command = 'G';
					else
						pReset->command = 'E';
				}
			}
			add_reset(ch->in_room, pReset, atol(arg1));
			SET_BIT(ch->in_room->area->area_flags, AREA_CHANGED);
			chprintln(ch, "Reset added.");
		}
		else if (!str_cmp(arg2, "random"))
		{
			int door;

			if (is_number(arg3))
			{
				door = atoi(arg3);
			}
			else
			{
				if ((door = get_direction(arg3)) != -1)
					door++;
			}

			if (door < 0 || door > 6)
			{
				chprintln(ch, "Invalid argument.");
				return;
			}

			if (door == 0
				&& (IS_NULLSTR(arg4) || !is_exact_name(arg4, "area world")))
			{
				chprintln(ch, "Invalid or missing argument.");
				return;
			}
			if (is_exact_name(arg4, "area world") && door > 0
				&& ch->in_room->exit[door - 1] != NULL)
			{
				chprintln(ch, "There is already an exit in that direction.");
				return;
			}
			pReset = new_reset_data();
			pReset->command = 'R';
			pReset->arg1 = ch->in_room->vnum;
			pReset->arg2 = door;
			pReset->arg3 =
				!str_cmp(arg4, "area") ? 1 : !str_cmp(arg4, "world") ? 2 : 0;
			add_reset(ch->in_room, pReset, atoi(arg1));
			SET_BIT(ch->in_room->area->area_flags, AREA_CHANGED);
			chprintln(ch, "Random exit reset added.");
		}
		else
		{
			chprintln(ch, "Syntax: RESET <number> OBJ <vnum> <wear_loc>");
			chprintln(ch,
					  "        RESET <number> OBJ <vnum> inside <vnum> [limit] [count]");
			chprintln(ch, "        RESET <number> OBJ <vnum> room");
			chprintln(ch,
					  "        RESET <number> MOB <vnum> [max #x area] [max #x room]");
			chprintln(ch, "        RESET <number> DELETE");
			chprintln(ch, "        RESET <number> RANDOM [#x exits]");
			chprintln(ch, "        RESET <number> RANDOM <exit|0> area|world");
		}
	}

	return;
}

/*****************************************************************************
 Name:		do_alist
 Purpose:	Normal command to list areas and display area information.
 Called by:	interpreter(interp.c)
 ****************************************************************************/
CH_CMD(do_alist)
{
	char buf[MAX_STRING_LENGTH];
	char result[MAX_STRING_LENGTH * 2];	/* May need tweaking. */
	AREA_DATA *pArea;

	if (IS_NPC(ch))
		return;

	sprintf(result, "[%3s] [%-27s] (%-5s-%5s) [%-10s] %3s [%-10s]\n\r",
			"Num", "Area Name", "lvnum", "uvnum", "Filename", "Sec",
			"Builders");

	for (pArea = area_first; pArea; pArea = pArea->next)
	{
		sprintf(buf,
				"[%3d] %-29.29s (%-5ld-%5ld) %-12.12s [%d] [%-10.10s]\n\r",
				pArea->vnum, pArea->name, pArea->min_vnum,
				pArea->max_vnum, pArea->file_name, pArea->security,
				pArea->builders);
		strcat(result, buf);
	}

	chprint(ch, result);
	return;
}

int calc_avedam(int num_dice, int dam_dice)
{
	return ((1 + dam_dice) * num_dice / 2);
}

CH_CMD(do_avedam)
{
	int i, j;
	int k = 0;
	int lookingfor;

	if (IS_NULLSTR(argument))
	{
		chprintln(ch, "What average dam are you looking for?");
		return;
	}

	lookingfor = atoi(argument);
	chprintf(ch, "Possible dice combinations for ave dam: %d\n\r", lookingfor);
	chprintln(ch, "T_Dice D_Dice   T_Dice D_Dice");
	chprintln(ch, "------ ------   ------ ------");
	for (i = 1; i <= lookingfor; i++)
	{
		for (j = 1; j <= lookingfor; j++)
		{
			if (lookingfor == calc_avedam(i, j))
			{
				k++;
				chprintf(ch, "%6d %6d   ", i, j);
				if (k % 2 == 0)
					chprintln(ch, "");
			}
		}
	}
	chprintln(ch, "");
}

void edit_start(CHAR_DATA * ch, void *OLC, int Ed)
{
	int old_ed;
	OLC_FUN *olc_fun;

	if (!ch || !ch->desc)
		return;

	old_ed = ch->desc->editor;

	ch->desc->pEdit = OLC;
	ch->desc->editor = Ed;
	if (old_ed != Ed)
	{
		act("$n has entered the $t editor.", ch, olc_ed_name_long(ch), NULL,
			TO_ROOM);
		act("You are now entering the $t editor, type 'done' to finish.", ch,
			olc_ed_name_long(ch), NULL, TO_CHAR);
	}
	if ((olc_fun = get_olc_show(ch->desc->editor)) != NULL)
		(*olc_fun) (ch, "");
}

void autoset(MOB_INDEX_DATA * pMob)
{
	double roll, size, bonus, avg;
	double ac_n, ac_x;
	int level;

	if (!pMob || pMob->level < 1)
		return;

	level = pMob->level;

	bonus = UMAX(1, (number_fuzzier(level) - 5));
	ac_n =
		80 - (level * (7.77 + (level / 90))) - ((level / 9) ^ 2) - (bonus * 2);
	ac_x =
		80 - (level * (6.67 + (level / 90))) - ((level / 9) ^ 2) - (bonus * 2);
	pMob->ac[AC_PIERCE] = (int) ac_n;
	pMob->ac[AC_BASH] = (int) ac_n;
	pMob->ac[AC_SLASH] = (int) ac_n;
	pMob->ac[AC_EXOTIC] = (int) ac_x;

	pMob->mana[DICE_NUMBER] = number_fuzzier(level);
	pMob->mana[DICE_TYPE] = number_fuzzier(10);
	pMob->mana[DICE_BONUS] = number_fuzzier(85);

	avg = (number_fuzzier(level) * .84);
	roll = (number_fuzzier(level) / 9 + 1);
	size = (number_fuzzier((int) roll) / 3);

	for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);

	pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
	pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
	pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .89);

	bonus =
		UMAX(1,
			 (level / 53 + 1) * ((level * 10) + (level / 10)) - UMIN(20,
																	 (2 *
																	  level))
			 + 1);

	size = number_fuzzier(level) * 1.2 - number_fuzzier(1);

	roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);

	pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
	pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
	pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);

	pMob->hitroll = number_range(level * 6 / 10, level);
}

void autohard(MOB_INDEX_DATA * pMob)
{
	double roll, size, bonus, avg;
	double ac_n, ac_x;
	int level;

	if (!pMob || pMob->level < 1)
		return;

	level = pMob->level;

	bonus = UMAX(1, (number_fuzzier(level) - 5));
	ac_n =
		70 - (level * (8.15 + (level / 90))) - ((level / 8) ^ 2) - (bonus * 2);
	ac_x =
		70 - (level * (7.12 + (level / 90))) - ((level / 8) ^ 2) - (bonus * 2);
	pMob->ac[AC_PIERCE] = (int) ac_n;
	pMob->ac[AC_BASH] = (int) ac_n;
	pMob->ac[AC_SLASH] = (int) ac_n;
	pMob->ac[AC_EXOTIC] = (int) ac_x;

	pMob->mana[DICE_NUMBER] = number_fuzzier(level);
	pMob->mana[DICE_TYPE] = number_fuzzier(12);
	pMob->mana[DICE_BONUS] = number_fuzzier(95);

	avg = (number_fuzzier(level) * .9);
	roll = (number_fuzzier(level) / 9 + 1);
	size = (number_fuzzier((int) roll) / 3);

	for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);

	pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
	pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
	pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .99);

	bonus = (level / 53 + 1) * ((level * 10) + (level / 10)) + 1;

	size = number_fuzzier(level) * 1.2 - number_fuzzier(1);

	size++;

	roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);

	pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
	pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
	pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);

	pMob->hitroll = number_range(level * 65 / 100, level);
}

void autoeasy(MOB_INDEX_DATA * pMob)
{
	double roll, size, bonus, avg;
	double ac_n, ac_x;
	int level;

	if (!pMob || pMob->level < 1)
		return;

	level = pMob->level;

	bonus = UMAX(1, (number_fuzzier(level) - 5));
	ac_n =
		90 - (level * (7.47 + (level / 90))) - ((level / 10) ^ 2) - (bonus * 2);
	ac_x =
		90 - (level * (6.37 + (level / 90))) - ((level / 10) ^ 2) - (bonus * 2);
	pMob->ac[AC_PIERCE] = (int) ac_n;
	pMob->ac[AC_BASH] = (int) ac_n;
	pMob->ac[AC_SLASH] = (int) ac_n;
	pMob->ac[AC_EXOTIC] = (int) ac_x;

	pMob->mana[DICE_NUMBER] = number_fuzzier(level);
	pMob->mana[DICE_TYPE] = number_fuzzier(10);
	pMob->mana[DICE_BONUS] = number_fuzzier(60);

	avg = (number_fuzzier(level) * .76);
	roll = (number_fuzzier(level) / 9 + 1);
	size = (number_fuzzier((int) roll) / 3);

	for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);

	pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
	pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
	pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .82);

	bonus =
		UMAX(1,
			 (level / 55 + 1) * ((level * 9) + (level / 10)) - UMIN(20,
																	(1.5 *
																	 level))
			 + 1);

	size = number_fuzzier(level) * 1.2 - number_fuzzier(1);

	roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);

	pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
	pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
	pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);

	pMob->hitroll = number_range(level * 59 / 100, level);
}

void autoweapon(OBJ_INDEX_DATA * pObj)
{
	AFFECT_DATA *pAf, *pObjAf;
	bool bDamroll, bHitroll;
	double pDice, size, bonus;
	int level, mod;

	if (!pObj || pObj->item_type != ITEM_WEAPON)
		return;

	if (pObj->level < 1 || IS_OBJ_STAT(pObj, ITEM_QUEST))
		return;

	level = pObj->level;

	bonus = UMAX(1, number_fuzzier(level) / 9 - 1);
	pDice = (number_fuzzier(level) * .22 + 2);
	size = (number_fuzzier((int) pDice) / 2);

	for (size = pDice / 2; pDice * (size + 2) / 2 < level; size++);

	pDice = UMAX(2, pDice);
	size = UMAX(3, size);

	switch (pObj->value[0])
	{
	default:
	case WEAPON_EXOTIC:
	case WEAPON_SWORD:
		break;
	case WEAPON_DAGGER:
		pDice = UMAX(2, pDice - 1);
		size = UMAX(3, size - 1);
		break;
	case WEAPON_SPEAR:
	case WEAPON_POLEARM:
		size++;
		break;
	case WEAPON_MACE:
	case WEAPON_AXE:
		size = UMAX(3, size - 1);
		break;
	case WEAPON_FLAIL:
	case WEAPON_WHIP:
		pDice = UMAX(2, pDice - 1);
		break;
	}

	pDice += 1;
	size -= 1;

	pDice = UMAX(2, number_fuzzier((int) pDice));
	size = UMAX(3, number_fuzzier((int) size));

	pObj->value[1] = (long) pDice;
	pObj->value[2] = (long) size;

	mod = UMAX(1, number_range(number_fuzzier((int) bonus) * 6 / 10,
							   number_fuzzier((int) bonus)));

	if (mod > 0)
	{
		bDamroll = FALSE;
		bHitroll = FALSE;

		for (pObjAf = pObj->first_affect; pObjAf; pObjAf = pObjAf->next)
		{
			if (pObjAf->location == APPLY_DAMROLL)
			{
				pObjAf->level = level;
				pObjAf->modifier = mod;
				bDamroll = TRUE;
			}
			else if (pObjAf->location == APPLY_HITROLL)
			{
				pObjAf->level = level;
				pObjAf->modifier = mod;
				bHitroll = TRUE;
			}
		}

		if (!bDamroll)
		{
			pAf = new_affect();
			pAf->location = APPLY_DAMROLL;
			pAf->modifier = mod;
			pAf->where = TO_OBJECT;
			pAf->type = -1;
			pAf->duration = -1;
			pAf->bitvector = 0;
			pAf->level = level;
			LINK(pAf, pObj->first_affect, pObj->last_affect, next, prev);
		}

		if (!bHitroll)
		{
			pAf = new_affect();
			pAf->location = APPLY_HITROLL;
			pAf->modifier = mod;
			pAf->where = TO_OBJECT;
			pAf->type = -1;
			pAf->duration = -1;
			pAf->bitvector = 0;
			pAf->level = level;
			LINK(pAf, pObj->first_affect, pObj->last_affect, next, prev);
		}
	}
}

void autoarmor(OBJ_INDEX_DATA * pObj)
{
	int size;
	int level;

	if (!pObj || pObj->item_type != ITEM_ARMOR)
		return;

	if (pObj->level < 1 || IS_OBJ_STAT(pObj, ITEM_QUEST))
		return;

	level = pObj->level;

	size = UMAX(1, number_fuzzier(level) / 2 + 1);

	pObj->value[0] = size;
	pObj->value[1] = size;
	pObj->value[2] = size;
	pObj->value[3] = (size - 1);
}

void area_set_auto(AREA_DATA * pArea)
{
	OBJ_INDEX_DATA *pObjIndex;
	MOB_INDEX_DATA *pMobIndex;
	vnum_t vnum;

	if (!pArea)
		return;

	for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++)
	{
		if ((pMobIndex = get_mob_index(vnum)) != NULL && pMobIndex->level >= 1)
		{
			if (pMobIndex->level < 9)
				autoeasy(pMobIndex);
			else if (pMobIndex->level < 30)
				autoset(pMobIndex);
			else
				autohard(pMobIndex);
		}

		if ((pObjIndex = get_obj_index(vnum)) != NULL
			&& !IS_OBJ_STAT(pObjIndex, ITEM_QUEST) && pObjIndex->level >= 1)
		{

			if (pObjIndex->item_type == ITEM_WEAPON)
				autoweapon(pObjIndex);
			else if (pObjIndex->item_type == ITEM_ARMOR)
				autoarmor(pObjIndex);
		}
	}
}

CH_CMD(do_areaset)
{
	AREA_DATA *pArea;

	if (!str_cmp(argument, "world"))
	{
		for (pArea = area_first; pArea; pArea = pArea->next)
			area_set_auto(pArea);
		chprintln(ch, "World set to default values.");
	}
	else if (ch->in_room != NULL && (pArea = ch->in_room->area) != NULL)
	{
		area_set_auto(pArea);
		chprintlnf(ch, "%s set to default values.", pArea->name);
	}
	else
		chprintln(ch, "Syntax: afun set world       - set the whole world.\n\r"
				  "      : afun set             - set your current area.");

	return;
}