EmlenMud2005-2006LOC/
EmlenMud2005-2006LOC/world/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"

char *check_mob_name(char *nm, CHAR_DATA *ch) {
char *t;
t=nm;
nm[0]=LOWER(nm[0]); 
if (UPPER(*t)=='A' && *(t+1)==' ') {
	send_to_char("WARNING!  Mob name field should only contain KEYWORDS to access the mob.\n\r",ch);
	send_to_char("For instance: dwarf dwarven king stocky\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!  Mob name field should only contain KEYWORDS to access the mob.\n\r",ch);
		send_to_char("For instance: dwarf dwarven king stocky\n\r",ch);
		return nm;
		}
	}
return nm;
}

char *check_mob_short(char *nm,CHAR_DATA *ch) {
char *t;
bool warn=FALSE;
if (nm[0]=='\0') return nm;
for (t=nm;*t!='\0';t++) {
	if (!warn && *t<='Z' && *t>='A') {
		send_to_char("WARNING: Capitalized letters found in the mob short description.\n\r",ch);
		send_to_char("A mob's short description should be something like: a dwarven adventurer\n\r",ch);
		send_to_char("If you are specifying a name like 'king Ralysuzki', ignore this warning,\n\r",ch);
		send_to_char("otherwise, please redo the short without using capitals.\n\r",ch);
		warn=TRUE;
		}
	}
t--;
if (*t=='.') *t='\0';
if (strlen(nm)>17) {
	send_to_char("You should try to keep mob 'short's down below 18 or so 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 mob's short, if possible).\n\r",ch);
	}
return nm;
}

char *check_mob_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 mob long description.\n\r",ch);
		send_to_char("A mob's long description should be something like:\n\r",ch);
		send_to_char("A massive dwarven gateguard stands here, guarding the gates of the city.\n\r",ch);
		send_to_char("If you are specifying a name like:\n\r",ch);
		send_to_char("King Ralysuzki stands here, talking with Fred the baker. then ignore this\n\r",ch);
		send_to_char("warning.  Otherwise, please redo the long desc without using capitals.\n\r",ch);
		warn=TRUE;
		}
	}
t-=3;
if (*t!='.' && *t!='!') {
	send_to_char("\x1B[1;33mWARNING!!!!!!!!  Your mob 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("A timid-looking dwarven explorer forages for food here.\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 
medit (CHAR_DATA * ch, char *argy)
{
  AREA_DATA *pArea;
  MOB_PROTOTYPE *pMob;
  char arg[STD_LENGTH];
  char arg1[STD_LENGTH];
  char arg2[STD_LENGTH];
  char buf[STD_LENGTH];
  int value;
  int nextfree;
  int iHash;
  strcpy (arg, argy);
  smash_tilde (argy);
  argy = one_argy (argy, arg1);
  strcpy (arg2, argy);
  value = atoi (arg2);
  pMob = (MOB_PROTOTYPE *) ch->desc->pEdit;
  pArea = pMob->area;
hugebuf_o[0]='\0';
if (!str_cmp (arg1, "show") || arg1[0] == '\0')
  {
    sprintf (buf, "%d", pMob->vnum);
    mindex_window (ch, pMob, -1);
    return;
  }
 if (get_direction_number (arg1) == DIR_MAX)
   {
switch (UPPER(arg1[0]))
  {
  case 'A':
    if (!str_cmp (arg1, "avenger"))
      {
	if (LEVEL(ch) < MAX_LEVEL)
	  return;
	
	if (arg2[0] == '\0')
	  {
	    send_to_char ("Syntax: avenger <vnum of avenger mob>\n\r", ch);
	    return;
	  }
	if (!IS_SET(pMob->act, ACT_AVENGED))
	  {
	    send_to_char ("This mob is not avenged when it dies.\n\r", ch);
	    return;
	  }
	if (!pMob->opt)
	  pMob->opt = new_optional();
	pMob->opt->avenger = atoi (arg2);
	mindex_window (ch, pMob, 6);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Avenger set.\n\r", ch);
	return;
      }
 
    if (!str_cmp (arg1, "armor"))
      {
	if (value != 0)
	  {
	    pMob->armcls = value;
	    mindex_window (ch, pMob, 2);
	    if (value != 101)
	      {
		send_to_char ("Armor Class of Mob Set.\n\r", ch);
		return;
	      }
	    else
	      {
		send_to_char ("Mob's armor class will now be computed automatically.\n\r", ch);
		return;
	      }
	  }
      }
    if (!str_cmp (arg1, "alignment"))
      {
	if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0))
	  {
	    send_to_char ("Syntax: alignment [number]\n\r", ch);
	    return;
	  }
	pMob->alignment = atoi (arg2);
	if (pMob->alignment > NUM_ALIGN) pMob->alignment = 2;
	if (pMob->alignment < 0) pMob->alignment = 1;
	mindex_window (ch, pMob, 2);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Alignment set.\n\r", ch);
	return;
      }
    if (!str_cmp (arg1, "alter"))
      {
	if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) > -1))
	  {
	    send_to_char ("Syntax: alter [vnum]\n\r", ch);
	    return;
	  }
	if (get_mob_index (atoi (arg2)) == NULL && (atoi (arg2) != 0))
	  {
	    send_to_char ("No mob with that vnum.\n\r", ch);
	    return;
	  }
	pMob->alt_vnum = atoi (arg2);
	mindex_window (ch, pMob, 3);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Alter set.\n\r", ch);
	return;
      }
    if (!str_cmp (arg1, "attackname"))
      {
	if (LEVEL (ch) < MAX_LEVEL)
	  {
	    send_to_char ("Please ask a GOD to set this for you. It should be used very rarely.\n\r", ch);
	    return;
	  }
	argy = one_argy (argy, arg1);
	if (arg1[0] == '\0' || arg1[0] == ' ')
	  {
	    if (!str_cmp ("N/A", pMob->attackname) || !pMob->attackname)
	      {
		send_to_char ("Syntax: attackname NAME\n\r", ch);
		return;
	      }
	    if (pMob->attackname)
	      free_string (pMob->attackname);
	    pMob->attackname = str_dup ("N/A");
	    mindex_window (ch, pMob, 6);
	    send_to_char ("Attack name cleared.\n\r", ch);
	    return;
	  }
	if (strlen (arg1) > 15)
	  {
	    send_to_char ("Attacks can't be that LONG. Please ask for help.\n\r", ch);
	    return;
	  }
	if (pMob->attackname)
	  free_string (pMob->attackname);
	pMob->attackname = str_dup (arg1);
	mindex_window (ch, pMob, 6);
	send_to_char ("Attack name set. Please playtest this to see if it is what you like\n\rbefore you continue with building more mobs :)\n\r", ch);
	return;
      }
    /*if ( !str_cmp( arg1, "attack" ) )
      {
      int i;
      int iType;
      if (LEVEL(ch)<MAX_LEVEL) 
      {
      send_to_char("If you REALLY need to set this powerful option, ask a GOD.\n\r",ch); return;
      }
      argy = one_argy( argy, arg1 );
      strcpy( arg2, argy );
      if ( !is_number( arg1 ) )
      {
      send_to_char( "Syntax: attack [num] [weapon type] [min dam] [max dam]\n\r", ch );
      send_to_char( " attack [num] delete\n\r", ch );
      return;
      }
      i = URANGE( 0, atoi( arg1 ), MAX_ATTACK_DATA-1 );
      argy = one_argy( argy, arg1 );
      strcpy( arg2, argy );
      if ( !str_cmp( arg1, "delete" ) )
      {
      if ( pMob->attacks[i] != NULL )
      {
      free_attack( pMob->attacks[i] );
      pMob->attacks[i] = NULL;
      send_to_char( "Attack deleted.\n\r", ch );
      return;
      }
      else
      {
      send_to_char( "Attack does not exist already.\n\r", ch );
      return;
      }
      }
      for ( iType = 0; iType < MAX_ATTACK; iType++ )
      {
      if ( !str_cmp( arg1, attack_table[iType].name ) )
      break;
      }
      if ( iType >= MAX_ATTACK )
      {
      send_to_char( "Invalid weapon type (see IREF WEAPONS).\n\r", ch );
      return;
      }
      if ( pMob->attacks[i] == NULL )
      {
      send_to_char( "Attack added.\n\r", ch );
      pMob->attacks[i] = new_attack( );
      }
      else
      {
      send_to_char( "Attack modified.\n\r", ch );
      }
      pMob->attacks[i]->next = NULL;
      pMob->attacks[i]->idx = iType;
      argy = one_argy( argy, arg1 );
      argy = one_argy( argy, arg2 );
      pMob->attacks[i]->dam1 = atoi( arg1 );
      pMob->attacks[i]->dam2 = atoi( arg2 );
      return;
      } */
    
    break;
  case 'C':
    if (!str_cmp (arg1, "create"))
      {
	value = atoi (argy);
	if (argy[0] == '\0' || value == 0)
	  {
	    send_to_char ("Syntax: medit 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_mob_index (value) != NULL)
	  {
	    send_to_char ("Mob vnum already exists.\n\r", ch);
	    return;
	  }
	pMob = new_mob_index ();
	pMob->vnum = value;
	pMob->area = pArea;
	if (value > top_vnum_mob)
	  top_vnum_mob = value;
	iHash = value % HASH_MAX;
	pMob->next = mob_index_hash[iHash];
	mob_index_hash[iHash] = pMob;
	ch->desc->pEdit = (void *) pMob;
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Mobile Created.\n\r", ch);
	pArea->mob_count++;
	return;
      }
    
    if (!str_cmp (arg1, "casts") && LEVEL (ch) > 109)
      {
	int i = 0;
	int j;
	if (arg2[0] == '\0')
	  return;
	if (!pMob->opt)
	  pMob->opt = new_optional ();
	for (j = 0; j < 10; j++)
	  {
	    if (pMob->opt->cast_spells[j] != NULL && !str_cmp (arg2, pMob->opt->cast_spells[j]))
	      {
		free_string (pMob->opt->cast_spells[j]);
		pMob->opt->cast_spells[j] = NULL;
		send_to_char ("Spell removed.\n\r", ch);
		return;
	      }
	  }
	while (pMob->opt->cast_spells[i] != NULL)
	  i++;
	if (i > 9)
	  {
	    send_to_char ("All full!!\n\r", ch);
	    return;
	  }
	pMob->opt->cast_spells[i] = str_dup (arg2);
	send_to_char ("Spell set.\n\r", ch);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    if (!str_prefix ("cast_p", arg1) && LEVEL (ch) > 109)
      {
	if (!pMob->opt)
	  pMob->opt = new_optional ();
	if (value >= 0)
	  pMob->opt->cast_percent = value;
	send_to_char ("Cast Percentage set.\n\r", ch);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    
    if (!str_cmp (arg1, "clan_guard"))
      {
	if (value > -1)
	  {
	    pMob->clan_guard_1 = value;
	    send_to_char ("Set clanguard.\n\r", ch);
	  }
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    if (!str_cmp (arg1, "sect_guard"))
      {
	if (value > -1)
	  {
	    pMob->clan_guard_2 = value;
	    send_to_char ("Set clan2guard.\n\r", ch);
	  }
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    
    break;
  case 'D':
    if (!str_cmp (arg1, "done"))
      {
	char minibuf[200];
	ch->desc->pEdit = NULL;
	sprintf (minibuf, "\x1B[1;%dr\x1B[2JDone.\n\r", ch->pcdata->pagelen);
	send_to_char (minibuf, ch);
	ch->desc->connected = CON_PLAYING;
	return;
      }
    
    if (!str_cmp (arg1, "damroll"))
      {
	bool neg = FALSE;
	char *a2 = arg2;
	int ii;
	if (arg2[0] == '\0')
	  {
	    send_to_char ("Damroll value cleared.\n\r", ch);
	    pMob->damroll = 0;
	  }
	if (arg2[0] == '-')
	  {
	    neg = TRUE;
	    a2++;
	  }
	ii = atoi (a2);
	if (neg)
	  ii = 0 - ii;
	value = ii;
	if (value != 0)
	  {
	    send_to_char ("Damroll value set.\n\r", ch);
	    pMob->damroll = value;
	  }
	else
	  {
	    send_to_char ("Damroll value cleared.\n\r", ch);
	    pMob->damroll = 0;
	  }
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    if (!str_cmp (arg1, "desc") || !str_cmp (arg1, "description"))
      {
	char *s;
	if (pMob->description != NULL && pMob->description[0] == 1)
	  {
	    s = str_dup (decompress (pMob->description));
	    free_string (pMob->description);
	    pMob->description = s;
	  }
	if (arg2[0] == '\0')
	  {
	    string_append (ch, &pMob->description);
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    return;
	  }
	if (arg2[0] == '+')
	  {
	    string_append (ch, &pMob->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;
      }
  
    if (!str_cmp (arg1, "dodge"))
      {
	if (value > 0)
	  {
	    send_to_char ("Dodge value set.\n\r", ch);
	    pMob->dodge = value;
	  }
	else
	  {
	    send_to_char ("Dodge value cleared.\n\r", ch);
	    pMob->dodge = 0;
	  }
	SET_BIT (pArea->area_flags, AREA_CHANGED);
      return;
      }
    
    break;
  case 'E':
    if (!str_cmp (arg1, "exp")) 
      {				
	if (arg2[0] == '\0' || !is_number (arg2))
	  {
	    send_to_char ("Syntax: exp [multiplier * 10]\n\r", ch);
	    send_to_char ("...so 1.5 times exp would be set by 'exp 15'.\n\r", ch);
	    return;
	  }
	if (atoi (arg2) < 2)
	  {
	    send_to_char ("Multiplier can't be less than two.\n\r", ch);
	    return;
	  }
	pMob->hpmult=pMob->hpmult%1000;
	if (atoi(arg2)!=10) {
	  pMob->hpmult+=(atoi(arg2))*1000;
	}
	mindex_window (ch, pMob, 1);
	send_to_char ("Exp multiplier set.\n\r", ch);
	return;
      }
    
   
    break;
  case 'F':
    if (!str_cmp(arg1, "female"))
      {
	pMob->sex = SEX_FEMALE;
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	mindex_window (ch, pMob, 1);
	send_to_char ("Sex set.\n\r", ch);
	return;
      }
    if (!str_cmp (arg1, "fdesc") || !str_cmp (arg1, "fdescription"))
      {
	char *s;
	if (pMob->description != NULL && pMob->description[0] == 1)
	  {
	    s = str_dup (decompress (pMob->description));
	    free_string (pMob->description);
	    pMob->description = s;
	  }
	fullscreen_editor (ch, &pMob->description);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    
    break;
  case 'G':
    if (!str_cmp (arg1, "guarding"))
      {
	if (arg2[0] == '\0')
	  {
	    send_to_char ("Syntax: guarding [vnum/dir]\n\r", ch);
	    return;
	  }
	if (!IS_SET (pMob->act3, ACT3_GUARD_ITEM)
	    && !IS_SET (pMob->act3, ACT3_GUARD_DOOR)
	    && !IS_SET (pMob->act3, ACT3_GUARD_MOB)
	    && pMob->clan_guard_1 == 0 && pMob->clan_guard_2 == 0
	    && !IS_SET (pMob->act3, ACT3_GUARD_DOOR_ALIGN))
	  {
	    send_to_char ("This mob is not set to guard.\n\r", ch);
	    return;
	  }
	if (!IS_SET (pMob->act3, ACT3_GUARD_ITEM) && !IS_SET (pMob->act3, ACT3_GUARD_MOB))
	  {
	    int door;
	    if (str_cmp (arg2, "none"))
	      door = get_direction_number (arg2);
	    else
	      door = -1;
	    if (door < -1 || door > 5)
	      {
		send_to_char ("Door number out of range.\n\r", ch);
		return;
	      }
	    else
	      pMob->guard = door;
	  }
      else
	pMob->guard = atoi (arg2);
      mindex_window (ch, pMob, 6);
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      send_to_char ("Guard set.\n\r", ch);
      return;
    }
     
    break;
  case 'H':
    if (!str_cmp (arg1, "hp"))
      {
	int tmp=0;
	if (arg2[0] == '\0' || !is_number (arg2))
	  {
	    send_to_char ("Syntax: hp [multiplier * 10]\n\r", ch);
	    send_to_char ("...so 1.5 times hp would be set by 'hp 15'.\n\r", ch);
	    return;
	  }
	if (atoi (arg2) < 0)
	  {
	    send_to_char ("Multiplier can't be less than zero.\n\r", ch);
	    return;
	  }
	if (pMob->hpmult>1000 && (atoi(arg2))<1000) {
	  tmp=pMob->hpmult/1000;
	}
	pMob->hpmult = atoi (arg2);
	if (tmp!=0) {
	  pMob->hpmult+=(tmp*1000);
	}
	mindex_window (ch, pMob, 1);
	send_to_char ("Hp multiplier set.\n\r", ch);
	return;
      }
    
    if (!str_cmp (arg1, "height"))
      {
	if (value == -1 || value == 0)
	  {
	    pMob->height = -1;
	    send_to_char ("Height set to default for mobtype.\n\r", ch);
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    mindex_window (ch, pMob, 4);
	    return;
	  }
	pMob->height = value;
	send_to_char ("Height set.\n\r", ch);
	mindex_window (ch, pMob, 4);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    if (!str_cmp (arg1, "hitroll"))
      {
	if (value > 0)
	  {
	    send_to_char ("Hitroll value set.\n\r", ch);
	    pMob->hitroll = value;
	  }
	else
	  {
	    send_to_char ("Hitroll value cleared.\n\r", ch);
	    pMob->hitroll = 0;
	  }
      SET_BIT (pArea->area_flags, AREA_CHANGED);
      return;
      }
    
    break;

  case 'L':
    if (!str_cmp (arg1, "long"))
      {
	/*
	  int value;
	  */
	if (arg2[0] == '\0')
	  {
	    send_to_char ("Syntax: long [string]\n\r", ch);
	    return;
	  }
	free_string (pMob->long_descr);
	strcat (arg2, "\n\r");
	pMob->long_descr = str_dup (check_mob_long(arg2,ch));
	mindex_window (ch, pMob, 7);
	/*
	  if ( (value=mob_name_type( pMob->long_descr )) >= 0 )
	  pMob->mobtype = value;
	  */
	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;
	  }
	pMob->level = atoi (arg2);
	mindex_window (ch, pMob, 1);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Level set.\n\r", ch);
	return;
      }
 

 
    break;
  case 'M':
    if (!str_cmp (arg1, "money"))
      {
	if (arg2[0] == '\0' || !is_number (arg2))
	  {
	    send_to_char ("Syntax: money [amount in copper]\n\r", ch);
	    return;
	  }
	pMob->money = atoi (arg2);
	mindex_window (ch, pMob, 1);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Monetary amount set.\n\r", ch);
	return;
      }
    
    if ((!str_cmp (arg1, "miw") || !str_cmp (arg1, "max")) && value > 0)
      {
	pMob->max_in_world = value;
	send_to_char ("Max in world set.\n\r", ch);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	mindex_window (ch, pMob, 4);
	return;
      }
    if (!str_cmp(arg1, "male"))
      {
	pMob->sex = SEX_MALE;
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	mindex_window (ch, pMob, 1);
	send_to_char ("Sex set.\n\r", ch);
	return;
      }
    break;
  case 'N':
    if (!str_cmp (arg1, "name"))
      {
	bool ffund;
	/*
	  int k;
	  int value;
	  */
	if (arg2[0] == '\0')
	  {
	    send_to_char ("Syntax: name [string]\n\r", ch);
	    return;
	  }
	ffund = FALSE;
	/*         for (k=0;k<MAX_PLAYERS;k++) 
		   {
		   if (!infix(playerbase.player_name[k],argy)) 
		   {
		   ffund=TRUE;
		   break;
		   }
		   }
		   if (ffund) 
		   {
		   send_to_char("Someone has a name with one of those words in it.\n\r",ch);
		   return;
		   }*/
	free_string (pMob->name);
	pMob->name = str_dup (check_mob_name(arg2,ch));
	mindex_window (ch, pMob, 2);
	/*
	  if ( (value=mob_name_type( pMob->name )) >= 0 )
	  pMob->mobtype = value;
	  */
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Name set.\n\r", ch);
	return;
      }
    if (!str_cmp(arg1, "neutral") || !str_cmp(arg1, "neuter"))
      {
	pMob->sex = SEX_NEUTRAL;
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	mindex_window (ch, pMob, 1);
	send_to_char ("Sex set.\n\r", ch);
	return;
      } 
    if (!str_cmp (arg, "none"))
      {
	pMob->spec_fun = NULL;
	free_string (pMob->spec_name);
	pMob->spec_name = str_dup ("");
	mindex_window (ch, pMob, 3);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Spec removed.\n\r", ch);
	return;
      }

    break;
  case 'P':
    if (!str_cmp (arg1, "parry"))
      {
	if (value > 0)
	  {
	    send_to_char ("Parry value set.\n\r", ch);
	    pMob->parry = value;
	  }
	else
	  {
	    send_to_char ("Parry value cleared.\n\r", ch);
	    pMob->parry = 0;
	  }
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
     
    if (!str_cmp (arg1, "points"))
      {
	if (value > 0)
	  {
	    send_to_char ("Points value set.\n\r", ch);
	    pMob->points = value;
	  }
	else
	  {
	    send_to_char ("Points value cleared.\n\r", ch);
	    pMob->points = 0;
	  }
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    
    break;
  case 'S':
    
    if (!str_cmp (arg1, "short"))
      {
	/*
	  int value;
	  */
	if (arg2[0] == '\0')
	  {
	    send_to_char ("Syntax: short [string]\n\r", ch);
	    return;
	  }
	free_string (pMob->short_descr);
	pMob->short_descr = str_dup (check_mob_short(arg2,ch));
	mindex_window (ch, pMob, 3);
	/*
	  if ( (value=mob_name_type( pMob->short_descr )) >= 0 )
	  pMob->mobtype = value;
	  */
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Short description set.\n\r", ch);
	return;
      }
    if (!str_cmp (arg1, "summons"))
      {
	if (LEVEL(ch) < MAX_LEVEL)
	  return;
	if (arg2[0] == '\0')
	  {
	    send_to_char ("Syntax: summons <mob vnum>", ch);
	    return;
	  }
	if (!IS_SET(pMob->act4, ACT4_SUMMONER))
	  {
	    send_to_char ("This mob is not set as a summoner, try 4summoner first.\n\r", ch);
	    return;
	  }
	if (!pMob->opt)
	  pMob->opt = new_optional();
	pMob->opt->summons = atoi (arg2);
	mindex_window (ch, pMob, 6);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Summons set.\n\r", ch);
	return;
      }
    
    if (!str_cmp (arg1, "shop"))
      {
	argy = one_argy (argy, arg1);
	strcpy (arg2, argy);
	if (arg1[0] == '\0')
	  {
	    send_to_char ("Syntax: shop hours [#opening] [#closing]\n\r", ch);
	    send_to_char (" shop profit [#buying%] [#selling%]\n\r", ch);
	    send_to_char (" shop decrease [Decrease %]\n\r", ch);
	    send_to_char (" shop items [# until decrease %]\n\r", ch);
	    send_to_char (" shop type [#1-5] [item type]\n\r", ch);
	    send_to_char (" shop creates [#vnum#]\n\r", ch);
	    send_to_char (" shop creates_hours [#hours#]\n\r", ch);
	    send_to_char (" shop message <create_message>\n\r", ch);
	    send_to_char (" shop delete\n\r", ch);
	    return;
	  }
	if (!str_cmp (arg1, "hours"))
	  {
	    argy = one_argy (argy, arg1);
	    strcpy (arg2, argy);
	    if (arg1[0] == '\0' || !is_number (arg1)
		|| arg2[0] == '\0' || !is_number (arg2))
	      {
		send_to_char ("Syntax: shop hours [#opening] [#closing]\n\r", ch);
		return;
	      }
	    if (pMob->pShop == NULL)
	      {
		new_shop (pMob);
		/*pMob->pShop->keeper = pMob->vnum;
		  if (shop_last) shop_last->next = pMob->pShop; else
		  {
		  shop_first=pMob->pShop;
		  shop_last=pMob->pShop;
		  }*/
	      }
	    pMob->pShop->open_hour = atoi (arg1);
	    pMob->pShop->close_hour = atoi (arg2);
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop hours set.\n\r", ch);
	    return;
	  }
	if (!str_cmp (arg1, "decrease"))
	  {
	    int joeman;
	    argy = one_argy (argy, arg1);
	    if (arg1[0] == '\0' || !is_number (arg1))
	      {
		send_to_char ("Syntax: shop decrease [#decrease percent#]\n\r", ch);
		return;
	      }
	    joeman = atoi (arg1);
	    if (joeman < 1 || joeman > 100)
	      {
		send_to_char ("Must be between 1 and 100!\n\r", ch);
		return;
	      }
	    if (pMob->pShop == NULL)
	      {
		new_shop (pMob);
	      }
	    pMob->pShop->decrease = joeman;
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop decrease percent set.\n\r", ch);
	  }
	if (!str_cmp (arg1, "creates"))
	  {
	    int joeman;
	    argy = one_argy (argy, arg1);
	    if (arg1[0] == '\0' || !is_number (arg1))
	      {
		send_to_char ("Syntax: shop creates [#vnum#]\n\r", ch);
		return;
	      }
	    joeman = atoi (arg1);
	    if (joeman != 0 && (joeman < 1 || (get_obj_index (joeman) == NULL)))
	      {
		send_to_char ("Invalid object!\n\r", ch);
		return;
	      }
	    if (pMob->pShop == NULL)
	      {
		new_shop (pMob);
	      }
	    pMob->pShop->creates_vnum = joeman;
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop creates vnum set.\n\r", ch);
	    return;
	  }
	if (!str_cmp (arg1, "createhours") ||
	    !str_cmp (arg1, "create_hour") ||
	    !str_cmp (arg1, "create_hours") ||
	    !str_cmp (arg1, "creates_hours"))
	  {
	    int joeman;
	    argy = one_argy (argy, arg1);
	    if (arg1[0] == '\0' || !is_number (arg1))
	      {
		send_to_char ("Syntax: shop creates_hours [#game_ticks#]\n\r", ch);
		return;
	      }
	    joeman = atoi (arg1);
	    if (joeman < 1 || joeman > 30000)
	      {
		send_to_char ("Invalid creates_hours!\n\r", ch);
		return;
	      }
	    if (pMob->pShop == NULL)
	      {
		new_shop (pMob);
	      }
	    pMob->pShop->creates_hours = joeman;
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop creates_hours set.\n\r", ch);
	    return;
	  }
	if (!str_cmp (arg1, "item") || !str_cmp (arg1, "items"))
	  {
	    int joeman;
	    argy = one_argy (argy, arg1);
	    if (arg1[0] == '\0' || !is_number (arg1))
	      {
		send_to_char ("Syntax: shop items [#items before decrease#]\n\r", ch);
		return;
	      }
	    joeman = atoi (arg1);
	    if (joeman < 1 || joeman > 100)
	      {
		send_to_char ("Must be between 1 and 100!\n\r", ch);
		return;
	      }
	    if (pMob->pShop == NULL)
	      {
		new_shop (pMob);
	    }
	    pMob->pShop->items_until_decrease = joeman;
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop items until decrease set.\n\r", ch);
	  }
	if (!str_cmp (arg1, "profit"))
	  {
	    argy = one_argy (argy, arg1);
	    strcpy (arg2, argy);
	    if (arg1[0] == '\0' || !is_number (arg1)
		|| arg2[0] == '\0' || !is_number (arg2))
	      {
		send_to_char ("Syntax: shop profit [#buying%] [#selling%]\n\r", ch);
		return;
	      }
	    if (pMob->pShop == NULL)
	      {
		new_shop (pMob);
	      }
	    pMob->pShop->profit_buy = atoi (arg1);
	    pMob->pShop->profit_sell = atoi (arg2);
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop profit set.\n\r", ch);
	    return;
	  }
	if (!str_cmp (arg1, "message"))
	  {
	    if (arg2[0] == '\0')
	      {
		send_to_char ("Syntax: shop message [string] or shop message clear.\n\r", ch);
		return;
	      }
	    if (pMob->pShop == NULL)
	    {
	      new_shop (pMob);
	    }
	    if (pMob->pShop->creates_message != NULL)
	      free_string (pMob->pShop->creates_message);
	    if (!str_cmp (arg2, "clear"))
	      {
		pMob->pShop->creates_message = NULL;
		send_to_char ("String cleared.\n\r", ch);
		return;
	      }
	    pMob->pShop->creates_message = str_dup (arg2);
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop create message set.\n\r", ch);
	    return;
	  }
	if (!str_cmp (arg1, "type"))
	  {
	    argy = one_argy (argy, arg1);
	    strcpy (arg2, argy);
	    if (arg1[0] == '\0' || !is_number (arg1)
		|| arg2[0] == '\0')
	      {
		send_to_char ("Syntax: shop type [#] [item type]\n\r", ch);
		return;
	      }
	    if (atoi (arg1) > MAX_TRADE)
	      {
		sprintf (buf, "%d", MAX_TRADE);
		send_to_char ("REdit: Shop keepers may only sell ", ch);
		send_to_char (buf, ch);
		send_to_char (" items max.\n\r", ch);
		return;
	      }
	    if ((value = item_name_type (arg2)) == ITEM_NONE)
	      {
		send_to_char ("REdit: That type of item is not known.\n\r", ch);
		return;
	      }
	    if (pMob->pShop == NULL)
	      {
		new_shop (pMob);
	      }
	    pMob->pShop->buy_type[atoi (arg1)] = item_name_type (arg2);
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop type set.\n\r", ch);
	    return;
	  }
	if (!str_cmp (arg1, "delete"))
	  {
	    if (pMob->pShop == NULL)
	      {
		send_to_char ("REdit: Can't delete a shop that is non-existant.\n\r", ch);
		return;
	      }
	    free_shop (pMob->pShop);
	    pMob->pShop = NULL;
	    SET_BIT (pArea->area_flags, AREA_CHANGED);
	    send_to_char ("Shop deleted.\n\r", ch);
	    return;
	  }
	send_to_char ("Syntax: shop hours [#opening] [#closing]\n\r", ch);
	send_to_char (" shop profit [#buying%] [#selling%]\n\r", ch);
	send_to_char (" shop decrease [Decrease %]\n\r", ch);
	send_to_char (" shop items [# until decrease %]\n\r", ch);
	send_to_char (" shop type [#] [item type]\n\r", ch);
	send_to_char (" shop creates_hours [#hours#]\n\r", ch);
	send_to_char (" shop creates [#vnum#]\n\r", ch);
	send_to_char (" shop message <create_message>\n\r", ch);
	send_to_char (" shop delete\n\r", ch);
	return;
      }
    
    break;
  case 'T':
    if (!str_cmp (arg1, "teach"))
      {
	if (LEVEL (ch) < MAX_LEVEL)
	  {
	    send_to_char ("If you need to use a mob that uses this, get a god to set it.\n\r", ch);
	    return;
	  }
	if (value > 0 && value <= SKILL_COUNT)
	  {
	    nextfree = 0;
	    if (!pMob->opt)
	      pMob->opt = new_optional ();
	    while (nextfree <= 28)
	      {
		if (pMob->opt->skltaught[nextfree] == value)
		  {
		    int tmp;
		    tmp = 0;
		    while (tmp <= 27)
		      {
			if (tmp >= nextfree)
			  {
			    pMob->opt->skltaught[tmp] = pMob->opt->skltaught[tmp + 1];
			  }
			tmp++;
		      }
		    pMob->opt->skltaught[28] = 0;
		    send_to_char ("Skill Removed.\n\r", ch);
		    nextfree = 29;
		    return;
		    /*REMOVE SKILL ABOVE */
		  }
		nextfree++;
	      }
	    nextfree = 0;
	    while (nextfree <= 28)
	      {
		if (pMob->opt->skltaught[nextfree] == 0)
		  {
		    pMob->opt->skltaught[nextfree] = value;
		    send_to_char ("Skill Set.\n\r", ch);
		    nextfree = 29;
		    return;
		  }
		nextfree++;
	      }
	    if (nextfree == 30)
	      send_to_char ("Out of slots.\n\r", ch);
	  }
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    if (!str_cmp (arg1, "timer"))
      {
	if (arg2[0] == '\0' || !is_number (arg2))
	  {
	    send_to_char ("Syntax: timer [ticks]\n\r", ch);
	    return;
	  }
	pMob->timer = atoi (arg2);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	send_to_char ("Timer set.\n\r", ch);
	return;
      }

    break;
  case 'W':
    if (!str_cmp (arg1, "willhelp"))
      {
	char bufff[500];
	if (value < 0 || value >= 127)
	  {
	    send_to_char ("Syntax is help <number>, where number is a 1 in <number> chance\n\rthe mob will come assist the yeller.\n\r", ch);
	    return;
	  }
	pMob->will_help = value;
	mindex_window (ch, pMob, 6);
	if (pMob->will_help == 0)
	  {
	    send_to_char ("Mob will no longer hunt out yellers with a similar yeller_num.\n\r", ch);
	    pMob->will_help = 0;
	    return;
	  }
	sprintf (bufff, "Mob will now help out a yeller at 1 in %d chance.\n\r", pMob->will_help);
	send_to_char (bufff, ch);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    if (!str_prefix ("warrior_p", arg1) && LEVEL (ch) > 109)
      {
	if (!pMob->opt)
	  pMob->opt = new_optional ();
	if (value >= 0)
	  pMob->opt->warrior_percent = value;
	send_to_char ("Warrior Percentage set.\n\r", ch);
	SET_BIT (pArea->area_flags, AREA_CHANGED);
	return;
      }
    
    break;
  case 'Y':
    if (!str_cmp (arg1, "yeller"))
      {
	if (value >= 0)
	  {
	    pMob->yeller_number = value;
	    mindex_window (ch, pMob, 6);
	    if (value == 0)
	      send_to_char ("Mob is no longer a yeller.\n\r", ch);
	    else
	      send_to_char ("Yeller number set.\n\r", ch);
	  }
	else
	  send_to_char ("Syntax is yeller <yell_number>.\n\r", ch);
	return;
      }
    break;
  }


if ((value = affect_name_bit (arg1)) != AFFECT_NONE)
  {
    pMob->affected_by ^= value;
    SET_BIT (pArea->area_flags, AREA_CHANGED);
    mindex_window (ch, pMob, 5);
    send_to_char ("Affect flag toggled.\n\r", ch);
    return;
  }
if ((value = affect_name_bit_two (arg1)) != AFFECT_NONE)
  {
    pMob->more_affected_by ^= value;
    mindex_window (ch, pMob, 5);
    SET_BIT (pArea->area_flags, AREA_CHANGED);
    send_to_char ("Affect flag toggled.\n\r", ch);
    return;
  }

if ((value = mob_name_type (arg1)) >= 0)
  {
    pMob->mobtype = value;
    mindex_window (ch, pMob, 6);
    SET_BIT (pArea->area_flags, AREA_CHANGED);
    send_to_char ("Mob type set to \x1B[1;31m", ch);
    send_to_char (mob_type_name (value), ch);
    send_to_char ("\x1B[0m.\n\r", ch);
    return;
  }
if ((value = race_name_bit (arg1)) != 0)
  {
    pMob->race_hate ^= value;
    mindex_window (ch, pMob, 4);
    SET_BIT (pArea->area_flags, AREA_CHANGED);
    send_to_char ("Race_hate flag toggled.\n\r", ch);
    return;
  }
if ((value = act_name_bit (arg1)) != ACT_NONE)
  {
    if (arg1[0] == '3')
      pMob->act3 ^= value;
    else if (arg1[0] == '4')
      pMob->act4 ^= value;
    else
      pMob->act ^= value;
    mindex_window (ch, pMob, 4);
    SET_BIT (pArea->area_flags, AREA_CHANGED);
    send_to_char ("Act flag toggled.\n\r", ch);
    return;
  }

if (get_mob_spec (arg) != NULL)
  {
    pMob->spec_fun = get_mob_spec (arg);
    if (pMob->spec_name)
      free_string (pMob->spec_name);
    sprintf (buf, "spec_%s", arg);
    pMob->spec_name = str_dup (buf);
    mindex_window (ch, pMob, 3);
    SET_BIT (pArea->area_flags, AREA_CHANGED);
    send_to_char ("Spec set.\n\r", ch);
    return;
  }
   }


if (!str_suffix ("edit", arg))
    {
      char minibuf[200];
      sprintf (minibuf, "\x1B[1;%dr\x1B[2JDone.\n\r", ch->pcdata->pagelen);
      send_to_char (minibuf, ch);
    }
if (hugebuf_o[0]!='\0') {
	page_to_char(hugebuf_o,ch);
	return;
	}
  interpret (ch, arg);
  return;
}