#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"

char *check_obj_name(char *nm, CHAR_DATA *ch) {
char *t=nm;
nm[0]=LOWER(nm[0]);
if (UPPER(*t)=='A' && *(t+1)==' ') {
	send_to_char("WARNING!  Obj name field should only contain KEYWORDS to access the mob.\n\r",ch);
	send_to_char("For instance: sword long longsword steel\n\r",ch);
	return nm;
	}
for (t=nm; *t!='\0'; t++) {
	if (*t==' ' && *(t+1)!='\0' && *(t+1)=='a' && *(t+2)==' ') {
		send_to_char("WARNING!  Obj name field should only contain KEYWORDS to access the mob.\n\r",ch);
		send_to_char("For instance: sword long longsword steel\n\r",ch);
		return nm;
		}
	}
return nm;
}

char *check_obj_short(char *nm,CHAR_DATA *ch) {
char *t;
bool warn=FALSE;
if (nm[0]=='\0') return nm;
nm[0]=LOWER(nm[0]);
for (t=nm;*t!='\0';t++) {
	if (!warn && *t<='Z' && *t>='A') {
		send_to_char("WARNING: Capitalized letters found in the obj short description.\n\r",ch);
		send_to_char("An object's short description should be something like: a dwarven longsword\n\r",ch);
		warn=TRUE;
		}
	}
t--;
if (*t=='.') *t='\0';
if (strlen(nm)>17) {
	send_to_char("You should try to keep an object's short description below 18 characters.\n\r",ch);
	send_to_char("Longer shorts may cause wordwraps at bad places and unnecessary spam.\n\r",ch);
	send_to_char("(Please keep this in mind and shorten the object's short, if possible).\n\r",ch);
	}
return nm;
}

char *check_obj_long(char *nm, CHAR_DATA *ch) {
char *t;
bool warn=FALSE;
if (nm[0]=='\0') return nm;
nm[0]=UPPER(nm[0]);
for (t=nm+1;*t!='\0';t++) {
	if (!warn && *t<='Z' && *t>='A') {
		send_to_char("WARNING: Capitalized letters found in the object's long description.\n\r",ch);
		send_to_char("An object's long description should be something like:\n\r",ch);
		send_to_char("\x1B[37;1mA dwarven longsword lies on the ground here.\x1B[37;0m\n\r",ch);
		warn=TRUE;
		}
	}
t-=3;
if (*t!='.' && *t!='!') {
	send_to_char("\x1B[33;1mWARNING!!!!!!!!  Your object's long descriptions MUST be a sentence.\n\r",ch);
	send_to_char("This means you should have a noun, verb, etc, and end it with a period.\n\r",ch);
	send_to_char("Here is a proper example:\n\r",ch);
	send_to_char("\x1B[37;1mA blade made of blue steel lies on the ground here.\x1B[33;1m\n\r",ch);
	send_to_char("PLEASE redo the long description so that it adheres to these rules.. thanks :)\x1B[37;0m\n\r",ch);
	}
return nm;
}


void 
do_rcopy (CHAR_DATA * ch, char *argy)
{
  char arg1[500];
  int orig_v;
  int i;
  int dest_v;
  ROOM_DATA *orig;
  ROOM_DATA *dest;
  DEFINE_COMMAND ("roomcopy", do_rcopy, POSITION_DEAD, 110, LOG_ALWAYS, "Copies room vnum <orig> to vnum <dest>.  Use with care!!")
    argy = one_argy (argy, arg1);
  if (!is_number (arg1) || !is_number (argy))
    {
      send_to_char ("Syntax is: <original vnum> <destination vnum>.\n\r", ch);
      return;
    }
  orig_v = atoi (arg1);
  dest_v = atoi (argy);
  if ((orig = get_room_index (orig_v)) == NULL || (dest = get_room_index (dest_v)) == NULL)
    {
      send_to_char ("One of the rooms was not found.\n\r", ch);
      return;
    }
  dest->shade = orig->shade;
  dest->name = str_dup (orig->name);
  dest->description = str_dup (orig->description);
  dest->room_flags = orig->room_flags;
  dest->room_flags_2 = orig->room_flags_2;
  dest->sector_type = orig->sector_type;
  if (dest->area)
    SET_BIT (dest->area->area_flags, AREA_CHANGED);
  send_to_char ("Room copy completed.\n\r", ch);
  return;
}

void 
do_mcopy (CHAR_DATA * ch, char *argy)
{
  char arg1[500];
  int orig_v;
  int i;
  int dest_v;
  MOB_PROTOTYPE *orig;
  MOB_PROTOTYPE *dest;
  DEFINE_COMMAND ("mobcopy", do_mcopy, POSITION_DEAD, 110, LOG_ALWAYS, "Copies mob vnum <orig> to vnum <dest>.  Use with care!!")
    argy = one_argy (argy, arg1);
  if (!is_number (arg1) || !is_number (argy))
    {
      send_to_char ("Syntax is: <original vnum> <destination vnum>.\n\r", ch);
      return;
    }
  orig_v = atoi (arg1);
  dest_v = atoi (argy);
  if ((orig = get_mob_index (orig_v)) == NULL || (dest = get_mob_index (dest_v)) == NULL)
    {
      send_to_char ("One of the mob prototypes was not found.\n\r", ch);
      return;
    }
  if (dest->max_in_world != 5)
    {
      send_to_char ("It looks as if the destination vnum isn't unused!\n\r", ch);
      return;
    }
  if (orig->spec_name)
    dest->spec_name = str_dup (orig->spec_name);
  dest->name = str_dup (orig->name);
  dest->short_descr = str_dup (orig->short_descr);
  dest->long_descr = str_dup (orig->long_descr);
  dest->sex = orig->sex;
  dest->level = orig->level;
  dest->clan_guard_1 = orig->clan_guard_1;
  dest->clan_guard_2 = orig->clan_guard_2;
  dest->act = orig->act;
  dest->act3 = orig->act3;
  dest->act4 = orig->act4;
  dest->affected_by = orig->affected_by;
  dest->more_affected_by = orig->more_affected_by;
  dest->alignment = orig->alignment;
  dest->money = orig->money;
  dest->height = orig->height;
  dest->mobtype = orig->mobtype;
  dest->hpmult = orig->hpmult;
  dest->armcls = orig->armcls;
  dest->race_hate = orig->race_hate;
  dest->guard = orig->guard;
  dest->hitroll = orig->hitroll;
  dest->damroll = orig->damroll;
  dest->dodge = orig->dodge;
  dest->parry = orig->parry;
  if (dest->area)
    SET_BIT (dest->area->area_flags, AREA_CHANGED);
  send_to_char ("Mob copy completed.  Don't forget to type in a NEW description for this mob.\n\r", ch);
  return;
}

void 
do_ocopy (CHAR_DATA * ch, char *argy)
{
  char arg1[500];
  int orig_v;
  int i;
  int dest_v;
  OBJ_PROTOTYPE *orig;
  OBJ_PROTOTYPE *dest;
  DEFINE_COMMAND ("objcopy", do_ocopy, POSITION_DEAD, 110, LOG_ALWAYS, "Copies object vnum <orig> to vnum <dest>.  Use with care!!")
    argy = one_argy (argy, arg1);
  if (!is_number (arg1) || !is_number (argy))
    {
      send_to_char ("Syntax is: <original vnum> <destination vnum>.\n\r", ch);
      return;
    }
  orig_v = atoi (arg1);
  dest_v = atoi (argy);
  if ((orig = get_obj_index (orig_v)) == NULL || (dest = get_obj_index (dest_v)) == NULL)
    {
      send_to_char ("One of the object prototypes was not found.\n\r", ch);
      return;
    }
  if (dest->item_type != ITEM_TRASH || dest->value[3] != 0)
    {
      send_to_char ("There appears to be an object in the destination already!!\n\r", ch);
      return;
    }
  dest->name = str_dup (orig->name);
  dest->short_descr = str_dup (orig->short_descr);
  dest->description = str_dup (orig->description);
  if (orig->action_descr[0])
    dest->action_descr[0] = str_dup (orig->action_descr[0]);
  if (orig->action_descr[1])
    dest->action_descr[1] = str_dup (orig->action_descr[1]);
  if (orig->action_descr[2])
    dest->action_descr[2] = str_dup (orig->action_descr[2]);
  dest->item_type = orig->item_type;
  dest->timer = orig->timer;
  dest->extra_flags = orig->extra_flags;
  dest->wear_flags = orig->wear_flags;
  dest->weight = orig->weight;
  for (i = 0; i < 10; i++)
    {
      dest->value[i] = orig->value[i];
      dest->values_2[i] = orig->values_2[i];
    }
  dest->cost = orig->cost;
  if (dest->area)
    SET_BIT (dest->area->area_flags, AREA_CHANGED);
  send_to_char ("Object copy completed.\n\r", ch);
  return;
}

void 
oedit (CHAR_DATA * ch, char *argy)
{
  AREA_DATA *pArea;
  OBJ_PROTOTYPE *pObj;
  DESCRIPTION_DATA *ed;
  AFFECT_DATA *pAf;
  char arg[STD_LENGTH];
  char arg1[STD_LENGTH];
  char arg2[STD_LENGTH];
  char buf[STD_LENGTH];
  int value;
  int iHash;
  char str[STD_LENGTH + 5];
  strcpy (arg, argy);
  smash_tilde (argy);
  argy = one_argy (argy, arg1);
  strcpy (arg2, argy);
  pObj = (OBJ_PROTOTYPE *) ch->desc->pEdit;
  pArea = pObj->area;
hugebuf_o[0]='\0';
  if (!str_cmp (arg1, "show") || arg1[0] == '\0')
    {
      sprintf (buf, "%d", pObj->vnum);
      do_oindex (ch, buf);
      return;
    }
  if (!str_cmp (arg1, "done"))
    {
      ch->desc->pEdit = NULL;
      ch->desc->connected = CON_PLAYING;
      return;
    }
  if (!str_cmp (arg1, "?"))
    {
      do_help (ch, "oedit");
      return;
    }


  if (!str_prefix ("java", arg1))
    {
      char arg3[200];
	int n1,n2;
      char *t=arg2;
      t=one_argy(t,arg3);
	if ( (n1=atoi(arg3)) < 0 ) return;
	if ( (n2=atoi(t)) < 0 ) return;
      pObj->java[0] = (char) n1;
      pObj->java[1] = (char) n2;
      send_to_char ("Java appearance set.\n\r", ch);
      if (IS_JAVA(ch)) send_pic_to_oedit(ch,pObj);
	SET_BIT(pArea->area_flags, AREA_CHANGED);
      return;
    }


  if (!str_cmp (arg1, "max"))
    {
      argy = one_argy (argy, arg1);
      if (!is_number (arg1))
	{
	  send_to_char ("Usage: max <number>\n\r", ch);
	  return;
	}
      if (atoi (arg1) < 1 || atoi (arg1) > 50)
	{
	  send_to_char ("Must be a range between 1 and 50.\n\r", ch);
	  return;
	}
      pObj->max_in_room = atoi (arg1);
      send_to_char ("Max items concurrently in 1 room value Set :)\n\r", ch);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      return;
    }

  if (!str_cmp (arg1, "material"))
    {
	int ii=0;
	char bf[500];
      argy = one_argy (argy, arg1);
      if (!is_number (arg1))
	{
	  send_to_char ("Usage: material <number>\n\r", ch);
	  while (str_cmp(materials[ii].name,"END")) {
		sprintf(bf,"%d) %s.\n\r",ii+1,materials[ii].name);
		send_to_char(bf,ch);
		}
	  return;
	}
      if (atoi (arg1) < 0 )
	{
	  pObj->made_of=0;
          SET_BIT (pArea->area_flags, AREA_CHANGED);
	  return;
	}
      pObj->made_of = atoi (arg1);
	ii=0;
	while (str_cmp(materials[ii].name,"END")) ii++;
	if (pObj->made_of > ii) {
		pObj->made_of=0;
		send_to_char("Material number too high.  Not set.\n\r",ch);
		return;
		}
      send_to_char ("Material set.\n\r", ch);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      return;
    }
 
  if (!str_cmp (arg1, "addaffect"))
    {
      char arg3[STD_LENGTH];
      argy = one_argy (argy, arg1);
      argy = one_argy (argy, arg2);
      strcpy (arg3, argy);
      if (arg1[0] == '\0' || arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) * -1 == 0)
	  || arg3[0] == '\0' || !is_number (arg3))
	{
	  send_to_char ("Syntax: addaffect|remaffect [what-affect-added] [modifier #] [1]\n\r", ch);
	  return;
	}
      pAf = new_affect ();
      pAf->location = affect_name_loc (arg1);
      pAf->modifier = atoi (arg2);
      pAf->type = atoi (arg3);
      pAf->duration = 0;
      pAf->bitvector = 0;
      pAf->next = pObj->affected;
      pObj->affected = pAf;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Affect added.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "delaffect") || !str_cmp (arg1, "remaffect"))
    {
      pAf = pObj->affected;
      if (pAf == NULL)
	{
	  send_to_char ("No affects on this object!\n\r", ch);
	  return;
	}
      pObj->affected = pObj->affected->next;
      free_affect (pAf);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Affect removed.\n\r", ch);
      return;
    }

  if (!str_cmp (arg1, "timer"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: timer [number]\n\r", ch);
	  return;
	}
      pObj->timer = atoi (arg2);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Timer set.\n\r", ch);
      return;
    }
  if ((value = item_name_type (arg1)) != ITEM_NONE)
    {
      pObj->item_type = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Type set.\n\r", ch);
      return;
    }
  if ((value = affect_name_bit (arg1)) != AFFECT_NONE)
    {
      if (LEVEL (ch) < 110)
	{
	  send_to_char ("Due to overuse of this flag, gods only may now set it.\n\r", ch);
	  return;
	}
      pObj->effects ^= value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Item affect flag toggled.\n\r", ch);
      return;
    }
  if ((value = extra_name_bit (arg1)) != EXTRA_NONE)
    {
      pObj->extra_flags ^= value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Extra flag toggled.\n\r", ch);
      return;
    }
  if ((value = wear_name_bit (arg1)) != ITEM_WEAR_NONE)
    {
      pObj->wear_flags ^= value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Wear flag toggled.\n\r", ch);
      return;
    }

  if (!str_cmp (arg1, "limit"))
    {
      int ir;
      if (!is_number (arg2))
	{
	  send_to_char ("Use: Limit [number or 0]\n\r", ch);
	  return;
	}
      if (pObj->vnum > 9999)
	{
	  send_to_char ("Too high of an object vnum.\n\r", ch);
	  return;
	}
      ir = atoi (arg2);
      pObj->how_many = ir;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      return;
    }
  if (!str_cmp (arg1, "name"))
    {
      if (arg2[0] == '\0')
	{
	  send_to_char ("Syntax: name [string]\n\r", ch);
	  return;
	}
      free_string (pObj->name);
      pObj->name = str_dup (check_obj_name(arg2,ch));
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Name set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "short"))
    {
      if (arg2[0] == '\0')
	{
	  send_to_char ("Syntax: short [string]\n\r", ch);
	  return;
	}
      free_string (pObj->short_descr);
      strcpy (str, anseval (str_dup (arg2), ch));
      pObj->short_descr = str_dup (check_obj_short(str,ch));
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Short description set.\n\r", ch);
      return;
    }
#ifdef NEW_WORLD
  if (!str_cmp (arg1, "action1"))
    {
      if (arg2[0] == '\0')
	{
	  if (pObj->action_descr[0])
	    {
	      free (pObj->action_descr[0]);
	      pObj->action_descr[0] = NULL;
	    }
	  return;
	}
      if (pObj->action_descr[0])
	free_string (pObj->action_descr[0]);
      sprintf (str, "%s", arg2);
      pObj->action_descr[0] = str_dup (str);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("ACTION description seen to character.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "action2"))
    {
      if (arg2[0] == '\0')
	{
	  if (pObj->action_descr[1])
	    {
	      free (pObj->action_descr[1]);
	      pObj->action_descr[1] = NULL;
	    }
	  return;
	}
      if (pObj->action_descr[1])
	free_string (pObj->action_descr[1]);
      sprintf (str, "%s", arg2);
      pObj->action_descr[1] = str_dup (str);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("ACTION description seen by victim set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "action3"))
    {
      if (arg2[0] == '\0')
	{
	  if (pObj->action_descr[2])
	    {
	      free (pObj->action_descr[2]);
	      pObj->action_descr[2] = NULL;
	    }
	  return;
	}
      if (pObj->action_descr[2])
	free_string (pObj->action_descr[2]);
      sprintf (str, "%s", arg2);
      pObj->action_descr[2] = str_dup (str);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("ACTION description seen by room set.\n\r", ch);
      return;
    }
#endif

  if (!str_cmp (arg1, "long"))
    {
      if (arg2[0] == '\0')
	{
	  send_to_char ("Syntax: long [string]\n\r", ch);
	  return;
	}
      strcat (arg2, "\n\r");
      free_string (pObj->description);
      sprintf (str, "%s\x1B[0;36m", anseval (str_dup (check_obj_long(arg2,ch)), ch));
      pObj->description = str_dup (str);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Long description set.\n\r", ch);
      return;
    }
/*
  if (!str_cmp (arg1, "level"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: level [number]\n\r", ch);
	  return;
	}
      pObj->level = atoi (arg2);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Level set.\n\r", ch);
      return;
    }
*/
  if (!str_cmp (arg1, "value0") || !str_cmp (arg1, "v0"))
    {
      if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0))
	{
	  send_to_char ("Syntax: value0 [number]\n\r", ch);
	  send_to_char ("or v0 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[0] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 0 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value1") || !str_cmp (arg1, "v1"))
    {
      if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0))
	{
	  send_to_char ("Syntax: value1 [number]\n\r", ch);
	  send_to_char ("or v1 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[1] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 1 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value2") || !str_cmp (arg1, "v2"))
    {
      if (arg2[0] != '\0' && !str_cmp (arg2, "-1"))
	{
	  pObj->value[2] = -1;
	  SET_BIT (pArea->area_flags, AREA_CHANGED);
	  send_to_char ("Value 2 set (lampoil).\n\r", ch);
	  return;
	}
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: value2 [number]\n\r", ch);
	  send_to_char ("or v2 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[2] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 2 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value3") || !str_cmp (arg1, "v3"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: value3 [number]\n\r", ch);
	  send_to_char ("or v3 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[3] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 3 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value4") || !str_cmp (arg1, "v4"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: value4 [number]\n\r", ch);
	  send_to_char ("or v4 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[4] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 4 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value5") || !str_cmp (arg1, "v5"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: value5 [number]\n\r", ch);
	  send_to_char ("or v5 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[5] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 5 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value6") || !str_cmp (arg1, "v6"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: value6 [number]\n\r", ch);
	  send_to_char ("or v6 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[6] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 6 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value7") || !str_cmp (arg1, "v7"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: value7 [number]\n\r", ch);
	  send_to_char ("or v7 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[7] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 7 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value8") || !str_cmp (arg1, "v8"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: value8 [number]\n\r", ch);
	  send_to_char ("or v8 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[8] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 8 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "value9") || !str_cmp (arg1, "v9"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: value9 [number]\n\r", ch);
	  send_to_char ("or v9 [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->value[9] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 9 set.\n\r", ch);
      return;
    }

  if (!str_cmp (arg1, "2value0") || !str_cmp (arg1, "2v0"))
    {
      if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[0] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 0 set.\n\r", ch);
      return;
    }

  if (!str_cmp (arg1, "2value1") || !str_cmp (arg1, "2v1"))
    {
      if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[1] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 1 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "2value2") || !str_cmp (arg1, "2v2"))
    {
      if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[2] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 2 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "2value3") || !str_cmp (arg1, "2v3"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[3] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 3 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "2value4") || !str_cmp (arg1, "2v4"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[4] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 4 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "2value5") || !str_cmp (arg1, "2v5"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[5] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 5 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "2value6") || !str_cmp (arg1, "2v6"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[6] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 6 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "2value7") || !str_cmp (arg1, "2v7"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[7] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 7 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "2value8") || !str_cmp (arg1, "2v8"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[8] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 8 set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "2value9") || !str_cmp (arg1, "2v9"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  return;
	}
      value = atoi (arg2);
      pObj->values_2[9] = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Value 9 set.\n\r", ch);
      return;
    }


  if (!str_cmp (arg1, "weight"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: weight [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->weight = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Weight set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "cost"))
    {
      if (arg2[0] == '\0' || !is_number (arg2))
	{
	  send_to_char ("Syntax: cost [number]\n\r", ch);
	  return;
	}
      value = atoi (arg2);
      pObj->cost = value;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Cost set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "create"))
    {
      value = atoi (arg2);
      if (arg2[0] == '\0' || value == 0)
	{
	  send_to_char ("Syntax: oedit create [vnum]\n\r", ch);
	  return;
	}
      pArea = get_vnum_area (value);
      if (pArea == NULL)
	{
	  send_to_char ("That vnum is not assigned an area.\n\r", ch);
	  return;
	}
      if (!IS_BUILDER (ch, pArea))
	{
	  send_to_char ("Vnum in an area you can't build in.\n\r", ch);
	  return;
	}
      if (get_obj_index (value) != NULL)
	{
	  send_to_char ("Object vnum already exists.\n\r", ch);
	  return;
	}
      pObj = new_obj_index ();
      pObj->vnum = value;
      pObj->area = pArea;
      if (value > top_vnum_obj)
	top_vnum_obj = value;
      iHash = value % HASH_MAX;
      pObj->next = obj_index_hash[iHash];
      obj_index_hash[iHash] = pObj;
      ch->desc->pEdit = (void *) pObj;
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Object Created.\n\r", ch);
      pArea->obj_count++;
      return;
    }
  if (!str_cmp (arg1, "ed"))
    {
      if (arg2[0] == '\0')
	{
	  send_to_char ("Syntax: ed add [keyword]\n\r", ch);
	  send_to_char (" ed delete [keyword]\n\r", ch);
	  send_to_char (" ed edit [keyword]\n\r", ch);
	  send_to_char (" ed format [keyword]\n\r", ch);
	  return;
	}
      argy = one_argy (argy, arg1);
      strcpy (arg2, argy);
      if (!str_cmp (arg1, "add"))
	{
	  if (arg2[0] == '\0')
	    {
	      send_to_char ("Syntax: ed add [keyword]\n\r", ch);
	      return;
	    }
	  ed = new_extra_descr ();
	  ed->keyword = str_dup (arg2);
	  ed->next = pObj->extra_descr;
	  pObj->extra_descr = ed;
	  string_append (ch, &ed->description);
	  SET_BIT (pArea->area_flags, AREA_CHANGED);
	  return;
	}
      if (!str_cmp (arg1, "edit"))
	{
	  if (arg2[0] == '\0')
	    {
	      send_to_char ("Syntax: ed edit [keyword]\n\r", ch);
	      return;
	    }
	  for (ed = pObj->extra_descr; ed != NULL; ed = ed->next)
	    {
	      if (is_name (arg2, ed->keyword))
		break;
	    }
	  if (ed == NULL)
	    {
	      send_to_char ("Extra description keyword not found.\n\r", ch);
	      return;
	    }
	  string_append (ch, &ed->description);
	  SET_BIT (pArea->area_flags, AREA_CHANGED);
	  return;
	}
      if (!str_cmp (arg1, "append"))
	{
	  if (arg2[0] == '\0')
	    {
	      send_to_char ("Syntax: ed edit [keyword]\n\r", ch);
	      return;
	    }
	  for (ed = pObj->extra_descr; ed != NULL; ed = ed->next)
	    {
	      if (is_name (arg2, ed->keyword))
		break;
	    }
	  if (ed == NULL)
	    {
	      send_to_char ("Extra description keyword not found.\n\r", ch);
	      return;
	    }
	  string_append (ch, &ed->description);
	  SET_BIT (pArea->area_flags, AREA_CHANGED);
	  return;
	}
      if (!str_cmp (arg1, "delete"))
	{
	  DESCRIPTION_DATA *ped;
	  if (arg2[0] == '\0')
	    {
	      send_to_char ("Syntax: ed delete [keyword]\n\r", ch);
	      return;
	    }
	  ped = NULL;
	  for (ed = pObj->extra_descr; ed != NULL; ed = ed->next)
	    {
	      if (is_name (arg2, ed->keyword))
		break;
	      ped = ed;
	    }
	  if (ed == NULL)
	    {
	      send_to_char ("Extra description keyword not found.\n\r", ch);
	      return;
	    }
	  if (ped == NULL)
	    {
	      pObj->extra_descr = ed->next;
	    }
	  else
	    {
	      ped->next = ed->next;
	    }
	  free_extra_descr (ed);
	  send_to_char ("Extra description deleted.\n\r", ch);
	  SET_BIT (pArea->area_flags, AREA_CHANGED);
	  return;
	}
      if (!str_cmp (arg1, "format"))
	{
	  DESCRIPTION_DATA *ped;
	  if (arg2[0] == '\0')
	    {
	      send_to_char ("Syntax: ed format [keyword]\n\r", ch);
	      return;
	    }
	  ped = NULL;
	  for (ed = pObj->extra_descr; ed != NULL; ed = ed->next)
	    {
	      if (is_name (arg2, ed->keyword))
		break;
	      ped = ed;
	    }
	  if (ed == NULL)
	    {
	      send_to_char ("Extra description keyword not found.\n\r", ch);
	      return;
	    }
	  ed->description = format_string (ed->description);
	  send_to_char ("Extra description formatted.\n\r", ch);
	  SET_BIT (pArea->area_flags, AREA_CHANGED);
	  return;
	}
    }
if (hugebuf_o[0]!='\0') {
	page_to_char(hugebuf_o,ch);
	return;
	}
  interpret (ch, arg);
  return;
}