/
mudd/docs/html/
mudd/world/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mud.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("\x1b[1;31mWARNING!!!!\x1b[0;37m Name field should only contain keywords.\n\r", ch);
      
      return nm;
    }
  for (t=nm; *t!='\0'; t++) 
    {
      if (*t==' ' && *(t+1)!='\0' && *(t+1)=='a' && *(t+2)==' ') 
	{
	  send_to_char("\x1b[1;31mWARNING!!!!\x1b[0;37m Name field should only contain keywords.\n\r", ch);
	  return nm;
	}
    }
  return nm;
}

char *check_obj_short(char *nm,CHAR_DATA *ch) 
{
  if (nm[0]=='\0') return nm;
  if (strlen(nm) > 38)
    {
      send_to_char("\x1b[1;31mWARNING!!!!\x1b[0;37m You should keep the short description below 38 characters (with color codes).\n\r", ch);
      return nm;
    }
  return nm;
}


char *check_obj_long(char *nm, CHAR_DATA *ch) 
{
  char *t;
  if (nm[0]=='\0') return nm;
  nm[0]=UPPER(nm[0]);
  for (t = nm; *(t+3) != '\0'; t++) {};

  if (*t != '.' && *t != '!')
    {
      send_to_char("\x1b[1;31mWARNING!!!!\x1b[0;37m The Long description must be a sentence ending with punctuation.\n\r", ch);
      return nm;
    }
  return nm;
}

void 
do_rcopy (CHAR_DATA * ch, char *argy)
{
  char arg1[500];
  int orig_v;
  int dest_v;
  ROOM_DATA *orig;
  ROOM_DATA *dest;
  DEFINE_COMMAND ("roomcopy", do_rcopy, POSITION_DEAD, MAX_LEVEL, 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->name = str_dup (orig->name);
  dest->description = str_dup (orig->description);
  dest->room_flags = orig->room_flags;
  dest->room_flags2 = orig->room_flags2;
  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 dest_v;
  MOB_PROTOTYPE *orig;
  MOB_PROTOTYPE *dest;
  DEFINE_COMMAND ("mobcopy", do_mcopy, POSITION_DEAD, MAX_LEVEL, 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;
    }
  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->act = orig->act;
  dest->act2 = orig->act2;
  dest->act3 = orig->act3;
  dest->act4 = orig->act4;
  dest->aff[0] = orig->aff[0];
  dest->aff[1] = orig->aff[1];
  dest->aff[2] = orig->aff[2];
  dest->aff[3] = orig->aff[3];
  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->guard = orig->guard;
  dest->hitroll = orig->hitroll;
  dest->damroll = orig->damroll;
  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, MAX_LEVEL, 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->long_descr = str_dup (orig->long_descr);
  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->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;
  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, "?"))
  {
    do_help (ch, "oedit");
    return;
  }

if (get_direction_number (arg1) == DIR_MAX)
  {
    switch (UPPER(arg1[0]))
      {
      case 'A':
	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->next = pObj->affected;
	    pObj->affected = pAf;
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Affect added.\n\r", ch);
	    return;
	  }
	
	break;
      case 'C':
	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;
	  }
	
	break;
      case 'D':
	if (!str_cmp (arg1, "done"))
	  {
	    ch->desc->pEdit = NULL;
	    ch->desc->connected = CON_PLAYING;
	    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, "desc") || !str_cmp (arg1, "description"))
	  {
	    char *s;
	    if (pObj->description != NULL && pObj->description[0] == 1)
	      {
		s = str_dup (pObj->description);
		free_string (pObj->description);
		pObj->description = s;
	      }
	    if (arg2[0] == '\0')
	      {
		string_append (ch, &pObj->description);
		SET_BIT (pArea->area_flags, AREA_CHANGED);
		return;
	      }
	    if (arg2[0] == '+')
	      {
		string_append (ch, &pObj->description);
		SET_BIT (pArea->area_flags, AREA_CHANGED);
		return;
	      }
	    send_to_char ("Syntax: desc - line edit\n\r", ch);
	    send_to_char (" desc + - line append\n\r", ch);
	    return;
	  }
	break;
      case 'L':
	
	if (!str_cmp (arg1, "long"))
	  {
	    if (arg2[0] == '\0')
	      {
		send_to_char ("Syntax: long [string]\n\r", ch);
		return;
	      }
	    strcat(str, "\n\r");
	    free_string (pObj->long_descr);
            sprintf(str ,"%s", anseval(str_dup(arg2), ch));

	    pObj->long_descr = str_dup (str);
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Long description set.\n\r", ch);
	    return;
	  }
	break;
      case 'M':
	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;
	  }
      case 'N':
	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 (arg2);
/*	    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;
	  }
	
	break;
	case 'R':
	  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;
	    }
	  
	  break;
      case 'S':
	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 (str);
/*	    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;
	  }
	
	break;
      case 'T':
	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;
	  }
	
	break;
      case 'V':
	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;
	  }
	
	break;
	case 'W':
	  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;
	    }
	  break;
      }
 
  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 = 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 (hugebuf_o[0]!='\0') {
	page_to_char(hugebuf_o,ch);
	return;
	}
  interpret (ch, arg);
  return;
}