/
mudd/docs/html/
mudd/world/
/*Offline Player editor */
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mud.h"
char *itoa (int);

/* True is character is fine with payment, false if not. */


char *
augmentss (int augment)
{
   int num;
  static char tttb[256];
  bool prev = FALSE;
  tttb[0] = '\0';
 
  for (num = 0 ; str_cmp (augment_flagss[num].what_you_type, "end_of_list"); num++)
   {
     if (IS_SET(augment, augment_flagss[num].flagname))
       {
	 if (prev)
	   strcat (tttb, ",");
	 strcat (tttb, augment_flagss[num].how_it_appears);
	 prev = TRUE;
       }
     
   }
  if (tttb[0] == '\0')
    strcat (tttb, "None");
  return tttb;
}

char *
itoa (int n)  
{
  static char t[50];
  sprintf (t, "%d", n);
  return t;
}


char *
natural_hurts (int affect)
{
  int num;
  static char tttb[SML_LENGTH];
  bool prev = FALSE;
  tttb[0] = '\0';
  for (num = 0; str_cmp(affect_flags1[num].what_you_type, "end_of_list"); num++)
    {
      if (IS_SET(affect, affect_flags1[num].flagname))
	{
	  if (prev)
	    strcat (tttb, ",");
	  else 
	    sprintf(tttb, "\x1b[1;31m");
	  strcat (tttb, affect_flags1[num].how_it_appears);
	  prev = TRUE;
	}
    }
  return tttb;
}
char *
natural_protects (int affect)
{
  int num;
  static char tttb[SML_LENGTH];
  bool prev = FALSE;
  tttb[0] = '\0';
  for (num = 0; str_cmp(affect_flags1[num].what_you_type, "end_of_list"); num++)
    {
      if (IS_SET(affect, affect_flags1[num].flagname))
	{
	  if (prev)
	    strcat (tttb, ",");
	  else 
	    sprintf(tttb, "\x1b[1;32m");
	  strcat (tttb, affect_flags1[num].how_it_appears);
	  prev = TRUE;
	}
    }
  return tttb;
}
char *
natural_affects (int affect)
{
  int num;
  static char tttb[SML_LENGTH];
  bool prev = FALSE;
  tttb[0] = '\0';
  for (num = 0; str_cmp(affect_flags2[num].what_you_type, "end_of_list"); num++)
    {
      if (IS_SET(affect, affect_flags2[num].flagname))
	{
	  if (prev)
	    strcat (tttb, ",");
	  else 
	    sprintf(tttb, "\x1b[1;33m");
	  strcat (tttb, affect_flags2[num].how_it_appears);
	  prev = TRUE;
	}
    }
  return tttb;
}
		      
char *
natural_detects (int affect)
{
  int num;
  static char tttb[SML_LENGTH];
  bool prev = FALSE;
  tttb[0] = '\0';
  for (num = 0; str_cmp(affect_flags2[num].what_you_type, "end_of_list"); num++)
    {
      if (IS_SET(affect, affect_flags2[num].flagname))
	{
	  if (prev)
	    strcat (tttb, ",");
	  else 
	    sprintf(tttb, "\x1b[1;34m");
	  strcat (tttb, affect_flags2[num].how_it_appears);
	  prev = TRUE;
	}
    }
  return tttb;
}


void 
show_player (CHAR_DATA * ch, CHAR_DATA * victim)
{
  char buf[1024];
  char buff[500];
  int i;
  sprintf (buf, "[\x1B[1;35m%d\x1B[37;0m] Name: \x1B[1;37m%s\x1B[37;0m  (\x1B[1;37m%s #%d\x1B[37;0m)  Gender: %s  Email: %s\n\r",
	   LEVEL (victim), NAME (victim), race_info[victim->pcdata->race].name, victim->pcdata->race,
	   (victim->pcdata->sex == SEX_MALE ? "M" : victim->pcdata->sex == SEX_FEMALE ? "F" : "N"),
	   victim->pcdata->email);
  send_to_char (buf, ch);
  sprintf (buf, "Align: %d  Remorts: %d  NatAC: %d  Deaths: %d  Warpts: %ld  Height: %d\n\r",
	   victim->pcdata->alignment, victim->pcdata->remort_times,
	   victim->pcdata->nat_armor, victim->pcdata->deaths,
	   victim->pcdata->warpoints, victim->height);
  send_to_char (buf, ch);
  sprintf (buf, "Clan: %s  Clan2: %s  Room #%d  BankMoney: %ld  Pracs: %d  Learns: %d\n\r",
	(clan_number (victim) < 0) ? "None" : (itoa (clan_number (victim))),
    (clan_number_2 (victim) < 0) ? "None" : (itoa (clan_number_2 (victim))),
	   (victim->in_room ? victim->in_room->vnum : 0),
     victim->pcdata->bank, victim->pcdata->practice, victim->pcdata->learn);
  send_to_char (buf, ch);
  sprintf (buf, "Total kills: %d  Kill points: %d  HP: \x1B[1;37m%ld/%ld\x1B[37;0m  MV: \x1B[1;37m%d/%d\x1B[37;0m\n\r",
	   victim->pcdata->totalkills, victim->pcdata->killpoints,
	   victim->hit, victim->max_hit, victim->move, victim->max_move);
  send_to_char (buf, ch);
  sprintf (buf, "Hitroll: %d  Damroll: %d  Thirst: %d/50  Full: %d/50  Drunk: %d/0 Exp: %ld\n\r",
	   GET_HITROLL (victim), GET_DAMROLL (victim),
	   victim->pcdata->condition[COND_THIRST], victim->pcdata->condition[COND_FULL],
           victim->pcdata->condition[COND_DRUNK], victim->pcdata->exp);
  send_to_char (buf, ch);
  sprintf (buf, "Saving_throw: %d  Items Car: %d  Weight: %d.%d stone%s  Age: %d  Donation: %d\n\r",
	   victim->pcdata->saving_throw, victim->pcdata->carry_number,
   (victim->pcdata->carry_weight/WGT_MULT),(victim->pcdata->carry_weight % WGT_MULT), ch->pcdata->carry_weight/WGT_MULT < 2 ? "" : "s", get_age (victim), victim->pcdata->donated);
  send_to_char (buf, ch);
  sprintf (buf, "\x1B[1;34m ---------- \x1B[1;30m(\x1B[0;37mStats and Extras\x1B[1;30m)\x1B[1;34m ------------ \x1B[1;30m(\x1B[0;374m%s\x1B[1;30m)\x1B[1;34m ---------\x1B[0;37m\n\r",
         victim->desc ? "Player currently online" : "Player is not logged in");
  send_to_char (buf, ch);
  buf[0] = '\0';
  for (i = 0; i < NUM_STATS; i++)
    {
      sprintf(buff, "%s: %2d/%2d ", capitalize(stat_short_name[i]), get_stat (victim, i), victim->pcdata->stat[i]);
      strcat(buf, buff);
    }
  send_to_char (buf, ch);
  send_to_char ("\n\r\x1B[0;37mNatural Hurts: ", ch);
  send_to_char (natural_hurts (victim->pcdata->nat_aff[HURT]), ch);
  send_to_char (".\n\r", ch);
  send_to_char ("\x1B[0;37mNatural Protects: ", ch);
  send_to_char (natural_protects (victim->pcdata->nat_aff[PROT]), ch);
  send_to_char (".\n\r", ch);
  send_to_char ("\x1B[0;37mNatural Affects: ", ch);
  send_to_char (natural_affects (victim->pcdata->nat_aff[AFF]), ch);
  send_to_char (".\n\r", ch);
  send_to_char ("\x1B[0;37mNatural Detects: ", ch);
  send_to_char (natural_detects (victim->pcdata->nat_aff[DET]), ch);
  send_to_char (".\n\r", ch);
  send_to_char ("\x1B[0;37mAugments: ", ch);
  send_to_char (augmentss (victim->pcdata->augments), ch);
  send_to_char (".\n\r", ch);
  sprintf (buf, "%s", show_guilds(victim));
  send_to_char(buf, ch);

  send_to_char ("Type EXTRA to see more data.  Other bits: ", ch);
  if (IS_SET (victim->pcdata->act2, PLR_SILENCE))
    {
      send_to_char ("Silenced ", ch);
    }
  if (IS_SET (victim->act, PLR_FREEZE))
    {
      send_to_char ("Frozen ", ch);
    }
  if (IS_SET(victim->act, ACT_CRASHER))
    {
       send_to_char ("Crasher ", ch);
    } 
  if (IS_SET (victim->act, ACT_UNVAL))
    {
      send_to_char ("UNVALIDATED ", ch);
    }
  send_to_char ("\n\r", ch);
  return;
}

void 
show_extras (CHAR_DATA * ch, CHAR_DATA * victim)
{
  int i = 0;
  int tt;
  SINGLE_OBJECT *prev;
  SINGLE_OBJECT *obj;
  SPELL_DATA *s;
  hugebuf_o[0] = '\0';
  strcpy (hugebuf_o, "\x1B[1;37mSkills...\x1B[37;0m");
  for (tt = 0; tt < SKILL_COUNT; tt++)
    {
      if (victim->pcdata->learned[tt] > 0)
	{
	  if ((s = skill_lookup (NULL, tt)) != NULL)
	    {
	      if (i % 2 == 0)
		strcat (hugebuf_o, "\n\r");
	      i++;
	      sprintf (hugebuf_o + strlen (hugebuf_o), " [%17s #%3d %3d%%]   ", s->spell_name, tt, victim->pcdata->learned[tt]);
	    }
	}
    }
  strcat (hugebuf_o, "\n\r");
  strcat (hugebuf_o, "\x1B[1;37m\n\rInventory...\x1B[37;0m");
  prev = FALSE;
  i = 0;
  for (obj = victim->carrying; obj != NULL; obj = obj->next_content)
    {
      if (i % 11 == 0)
	strcat (hugebuf_o, "\n\r");
      i++;
      if (obj->wear_loc == -1)
	sprintf (hugebuf_o + strlen (hugebuf_o), "%-6d ", obj->pIndexData->vnum);
      else
	sprintf (hugebuf_o + strlen (hugebuf_o), "*%-5d ", obj->pIndexData->vnum);
    }
  strcat (hugebuf_o, "\n\r");
  i = 0;
  strcat (hugebuf_o, "\x1B[1;37m\n\rStorage...\x1B[37;0m");
  prev = FALSE;
  for (tt = 0; tt < MAXST; tt++)
    {
      if (victim->pcdata->storage[tt] == NULL)
	continue;
      if (i % 11 == 0)
	strcat (hugebuf_o, "\n\r");
      i++;
      sprintf (hugebuf_o + strlen (hugebuf_o), "%6d ", victim->pcdata->storage[tt]->pIndexData->vnum);
    }
  strcat (hugebuf_o, "\n\r");
  page_to_char (hugebuf_o, ch);
  return;
}

void 
pedit (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *victim;
  char arg1[512];
  char arg2[512];
  char arg3[512];
  char arg4[512];
  int i;
  static char store_arg[SML_LENGTH];
  int value;
  strcpy (store_arg, argy);
  victim = (CHAR_DATA *) ch->desc->pEdit;
  if (!victim)
    {
      ch->desc->connected = CON_PLAYING;
      ch->desc->pEdit = NULL;
      return;
    }
  arg1[0] = '\0';
  arg2[0] = '\0';
  arg3[0] = '\0';
  arg4[0] = '\0';
  value = -1;
  argy = one_argy (argy, arg1);
  if (arg1[0] == '\0' || !str_cmp (arg1, "show"))
    {
      show_player (ch, victim);
      return;
    }

  if (!str_prefix ("extra", arg1))
    {
      show_extras (ch, victim);
      return;
    }
  if (argy && argy != "")
    argy = one_argy (argy, arg2);
  if (argy && argy != "")
    argy = one_argy (argy, arg3);
  if (argy && argy != "")
    argy = one_argy (argy, arg4);
  if (arg2[0] == '-')
    value = atoi (arg2);
  else
    value = is_number (arg2) ? atoi (arg2) : -1;
  
  if (!str_prefix ("valid", arg1))
    {
      if (IS_SET (victim->act, ACT_UNVAL))
	REMOVE_BIT (victim->act, ACT_UNVAL);
      else
	SET_BIT (victim->act, ACT_UNVAL);
      send_to_char ("Validated flag toggled.\n\r", ch);
      if(victim->pcdata->level == 0)
	victim->pcdata->level = 1;
      return;
    }
  if (!str_prefix ("lamer", arg1))
    {
      if (IS_SET (victim->act, PLR_LAMER))
	REMOVE_BIT (victim->act, PLR_LAMER);
      else
	SET_BIT (victim->act, PLR_LAMER);
      send_to_char ("Lamer flag toggled.\n\r", ch);
      return;
    }
  if (!str_prefix ("frozen", arg1) ||
       !str_prefix ("freeze", arg1))
    {
      if (IS_SET (victim->act, PLR_FREEZE))
	REMOVE_BIT (victim->act, PLR_FREEZE);
      else
	SET_BIT (victim->act, PLR_FREEZE);
      send_to_char ("Frozen flag toggled.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "height") && value >= 0)
    {
      if (value < 1 || value > 32000)
	{
	  send_to_char ("Valid range for height is 1 - 32000.\n\r", ch);
	  return;
	}
      victim->height = value;
      send_to_char ("Victim height set.\n\r", ch);
      return;
    }
/*  if (!str_cmp (arg1, "name") && arg2[0] != '\0')
    {
      sprintf (buf, "%s%s", PLAYER_DIR, NAME (victim));
      unlink (buf);
      victim->pcdata->name[0] = '\0';
      strcpy(victim->pcdata->name, arg2);
      save_char_obj (victim);
      send_to_char ("Name changed.\n\r", ch);
      return;
    }*/
  if (!str_cmp (arg1, "race") && value >= 0 && value < RACE_COUNT)
    {
      raceswitch(victim, value);
      send_to_char ("Race changed.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "sex") && value >= 0 && value < 3)
    {
      victim->pcdata->sex = value;
      send_to_char ("Victim's sex set.\n\r", ch);
      return;
    }
  if (!str_prefix ("remort", arg1) && value >= 0)
    {
      victim->pcdata->remort_times = value;
      send_to_char ("Victim remort times set.\n\r", ch);
      return;
    }
  if (!str_cmp(arg1, "password") && arg2[0] != '\0' && strlen(arg2) > 4)
    {
      char buff[100];
      char *pwdnew;
      char *p;
      pwdnew = crypt(arg2, "blahblah");
      for (p = pwdnew; *p != '\0'; p++)
	{
	  if (*p == '~')
	    {
	      send_to_char("The new password is not acceptable, try again.\n\r", ch);
	      return;
	    }
	}
      if(victim->pcdata->pwd)
	free_string(victim->pcdata->pwd);
      victim->pcdata->pwd = str_dup(pwdnew);
      if (victim->pcdata->rpwd)
        free_string(victim->pcdata->rpwd);
      victim->pcdata->rpwd = str_dup(arg2);
      sprintf(buff, "Ok password reset to crypt of %s \n\r", arg2);
      send_to_char(buff, ch);
      return;
    }
  if (!str_cmp ("email", arg1) && arg2[0] != '\0')
    {
      strcpy (victim->pcdata->email, arg2);
      send_to_char ("Victim email set.\n\r", ch);
      return;
    }
  if (!str_prefix ("nat", arg1) && value != -1)
    {
      victim->pcdata->nat_armor = value;
      send_to_char ("Victim natural armor set.\n\r", ch);
      return;
    }
  if (!str_prefix ("death", arg1) && value >= 0)
    {
      victim->pcdata->deaths = value;
      send_to_char ("Victim deaths set.\n\r", ch);
      return;
    }
  if (!str_prefix ("warpoints", arg1) && value >= 0)
    {
      victim->pcdata->warpoints = value;
      send_to_char ("Victim warpoints set.\n\r", ch);
      return;
    }
  if (!str_cmp ("room", arg1) && value > 1)
    {
      CHAR_DATA *ii;
      ROOM_DATA *rd;
      for (ii = char_list[PLAYER_LIST]; ii != NULL; ii = ii->next)
	{
	  if (ii == victim)
	    {
	      send_to_char ("You can't change a player's room while they are online!\n\r", ch);
	      return;
	    }
	}
      if ((rd = get_room_index (value)) == NULL)
	{
	  send_to_char ("That room doesn't exist.\n\r", ch);
	  return;
	}
      victim->in_room = rd;
      send_to_char ("Victim in_room changed.\n\r", ch);
      return;
    }
  if (!str_cmp ("bank", arg1) && value >= 0)
    {
      victim->pcdata->bank = value;
      send_to_char ("Victim bank amount set.\n\r", ch);
      return;
    }
  if (!str_prefix ("prac", arg1) && value >= 0)
    {
      victim->pcdata->practice = value;
      send_to_char ("Victim practices set.\n\r", ch);
      return;
    }
  if (!str_prefix ("learn", arg1) && value >= 0)
    {
      victim->pcdata->learn = value;
      send_to_char ("Victim learns set.\n\r", ch);
      return;
    }
  if (!str_prefix("resist", arg1) && value >= 0)
    {
      victim->pcdata->resist_points = value;
      send_to_char("Victim resistance points set.\n\r", ch);
      return;
    }
   if (!str_prefix("guild_po", arg1) && value >= 0)
    {
      victim->pcdata->guild_points = value;
      send_to_char("Victim guild points set.\n\r", ch);
      return;
    }
  


  if ((!str_cmp ("tkills", arg1) || !str_cmp ("kills", arg1)) && value >= 0)
    {
      victim->pcdata->totalkills = value;
      send_to_char ("Total kills set.\n\r", ch);
      return;
    }
  if ((!str_cmp ("kpts", arg1) || !str_prefix ("killpo", arg1)) && value >= 0)
    {
      victim->pcdata->killpoints = value;
      send_to_char ("Killpoints set.\n\r", ch);
      return;
    }
  if (!str_cmp ("ac", arg1))
    {
      if (str_cmp ("yes", arg2))
	{
	  send_to_char ("Make sure the chracter is NAKED before you do this, and that\n\r", ch);
	  send_to_char ("NO AFFECTS are present on him/her (use noaffect). Then type ac yes\n\r", ch);
	  return;
	}
      victim->armor = 100;
      send_to_char ("Victim's armor set to 100.\n\r", ch);
      return;
    }
  if (!str_cmp ("hpnow", arg1) && value >= 0)
    {
      victim->hit = value;
      send_to_char ("Hit points now set.\n\r", ch);
      return;
    }
  if (!str_cmp ("hp", arg1) && value >= 0)
    {
      victim->max_hit = value;
      send_to_char ("Hit points max set.\n\r", ch);
      return;
    }
  if (!str_cmp ("mvnow", arg1) && value >= 0)
    {
      victim->move = value;
      send_to_char ("Move points now set.\n\r", ch);
      return;
    }
  if (!str_cmp ("mv", arg1) && value >= 0)
    {
      victim->max_move = value;
      send_to_char ("Move points max set.\n\r", ch);
      return;
    }
  for (i = 0; i < NUM_STATS; i++)
    {
      if (!str_cmp(arg1, stat_short_name[i]) || !str_cmp(arg1, stat_long_name[i]))
	{
	  char bufg[100];
	  if (value < 3 || value > 32)
	    {
	      send_to_char ("Stat range is 3 to 32.\n\r", ch);
	      return;
	    }
	  sprintf(bufg, "%s set.\n\r", capitalize(stat_long_name[i]));
	  send_to_char(bufg, ch);
	  victim->pcdata->stat[i] = value;
	  return;
	}
    }
  if (!str_cmp(arg1, "mod"))
    {
      for (i = 0; i < NUM_STATS; i++)
	{
	  if (!str_cmp(arg2, stat_short_name[i]) || !str_cmp(arg2, stat_long_name[i]))
	    {
	      char bufg[100];
	      value = atoi(arg3);
	      if (value < -40 || value > 40)
		{
		  send_to_char ("Modifier range is -40 to 40.\n\r", ch);
		  return;
		}
	      sprintf(bufg, "%s modifier set.\n\r", capitalize(stat_long_name[i]));
	      send_to_char(bufg, ch);
	      victim->pcdata->stat_mod[i] = value;
	      return;
	    }
	}
    }
  
  if (!str_cmp (arg1, "Sec") && value > 0 && value < 10)
    {
      send_to_char ("Security set.\n\r", ch);
      victim->pcdata->security = value;
      return;
    }
  if (!str_cmp (arg1, "hitrl"))
    {
      send_to_char ("Hitroll set.\n\r", ch);
      victim->hitroll = value;
      return;
    }
  if (!str_cmp (arg1, "damrl"))
    {
      send_to_char ("Damroll set.\n\r", ch);
      victim->damroll = value;
      return;
    }
  if (!str_cmp (arg1, "thirst"))
    {
      send_to_char ("Thirst set.\n\r", ch);
      victim->pcdata->condition[COND_THIRST] = value;
      return;
    }
  if (!str_cmp (arg1, "full"))
    {
      send_to_char ("Full set.\n\r", ch);
      victim->pcdata->condition[COND_FULL] = value;
      return;
    }
  if (!str_cmp (arg1, "drunk"))
    {
      send_to_char ("Drunk set.\n\r", ch);
      victim->pcdata->condition[COND_DRUNK] = value;
      return;
    }
  if (!str_prefix ("sav", arg1))
    {
      send_to_char ("Saving throw set.\n\r", ch);
      victim->pcdata->saving_throw = value;
      return;
    }
  if (!str_cmp (arg1, "cool") && arg2[0] != '\0')
    {
      return;
    }
  if (!str_cmp (arg1, "guild") && arg2[0] != '\0')
    {
      int i;
      
      for (i = 0; i < NUM_GUILDS ; i++)
	{
	  if (!str_cmp(guild_data[i].what_you_type, arg2))
	    {
	      char buf[100];
	      if (!is_number(arg3) || atoi(arg3) < 0 || atoi(arg3) > NUM_TIERS)
		{
		  send_to_char("The tier must be between 0 and 5.\n\r", ch);
		  return;
		}
	      sprintf(buf, "%s set to tier %d.\n\r", guild_data[i].what_you_see, atoi(arg3));
	      send_to_char(buf, ch);
	      victim->pcdata->guilds[i] = atoi(arg3);
	      fix_char(victim);
	      return;
	    }
	}
      send_to_char ("Unknown guild.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "level"))
    {
      if (value < 1 || value > 99)
	return;
      victim->pcdata->exp = (FIND_EXP ((value - 1), 1));
      send_to_char ("Level set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "align") || !str_cmp (arg1, "alignment"))
    {
      if (value < 0 || value >= NUM_ALIGN)
	return;
      alignswitch(victim, value);
      send_to_char ("Alignment set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "hurt") || !str_cmp(arg2, "hurts"))
    {
      char bufff[200];
      int i = 0;
      for (i = 0; str_cmp(affect_flags1[i].what_you_type, "end_of_list"); i++)
	{
	  if (!str_cmp(arg3, affect_flags1[i].what_you_type ))
	    {
	      sprintf(bufff, " %s hurts bit toggled %s\n\r",affect_flags1[i].what_you_type ,(victim->pcdata->nat_aff[HURT] & affect_flags1[i].flagname ? "Off" : "On"));
	      victim->pcdata->nat_aff[HURT] ^= affect_flags1[i].flagname;
	      send_to_char(bufff, ch);
	      victim->aff[HURT] |= victim->pcdata->nat_aff[HURT];
	      return;
	    }
	}
      send_to_char ("Which hurts?????\n\r", ch);
      return;
    }
if (!str_cmp (arg2, "prot") || !str_cmp(arg2, "protect"))
    {
      char bufff[200];
      int i = 0;
      for (i = 0; str_cmp(affect_flags1[i].what_you_type, "end_of_list"); i++)
	{
	  if (!str_cmp(arg3, affect_flags1[i].what_you_type ))
	    {
	      sprintf(bufff, " %s protects bit toggled %s\n\r",affect_flags1[i].what_you_type ,(victim->pcdata->nat_aff[PROT] & affect_flags1[i].flagname ? "Off" : "On"));
	      victim->pcdata->nat_aff[PROT] ^= affect_flags1[i].flagname;
	      send_to_char(bufff, ch);
	      victim->aff[PROT] |= victim->pcdata->nat_aff[PROT];
	      return;
	    }
	}
      send_to_char ("Which protect?????\n\r", ch);
      return;
    }

  if (!str_cmp (arg2, "affect") || !str_cmp(arg2, "aff"))
    {
      char bufff[200];
      int i = 0;
      for (i = 0; str_cmp(affect_flags2[i].what_you_type, "end_of_list"); i++)
	{
	  if (!str_cmp(arg3, affect_flags2[i].what_you_type ))
	    {
	      sprintf(bufff, " %s affect bit toggled %s\n\r",affect_flags2[i].what_you_type ,(victim->pcdata->nat_aff[AFF] & affect_flags2[i].flagname ? "Off" : "On"));
	      victim->pcdata->nat_aff[AFF] ^= affect_flags2[i].flagname;
	      send_to_char(bufff, ch);
	      victim->aff[AFF] |= victim->pcdata->nat_aff[AFF];
	      return;
	    }
	}
      send_to_char ("Which affect?????\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "detect") || !str_cmp(arg2, "det"))
    {
      char bufff[200];
      int i = 0;
      for (i = 0; str_cmp(affect_flags2[i].what_you_type, "end_of_list"); i++)
	{
	  if (!str_cmp(arg3, affect_flags2[i].what_you_type ))
	    {
	      sprintf(bufff, " %s detect bit toggled %s\n\r",affect_flags2[i].what_you_type ,(victim->pcdata->nat_aff[DET] & affect_flags2[i].flagname ? "Off" : "On"));
	      victim->pcdata->nat_aff[DET] ^= affect_flags2[i].flagname;
	      send_to_char(bufff, ch);
	      victim->aff[DET] |= victim->pcdata->nat_aff[DET];
	      return;
	    }
	}
      send_to_char ("Which detect?????\n\r", ch);
      return;
    }
  if (!str_prefix ("skill", arg1) && value > 0 && value < SKILL_COUNT && is_number (arg3))
    {
      int set_to;
      set_to = atoi (arg3);
      if (set_to < 0 || set_to > 100)
	{
	  send_to_char ("Valid ranges are 0 (unlearned) to 100 (perfect).\n\r", ch);
	  return;
	}
      if (set_to == 0)
	set_to = -100;
      victim->pcdata->learned[value] = set_to;
      send_to_char ("Skill/Spell set.\n\r", ch);
      return;
    }
  if (!str_prefix ("obj", arg1) && value != -1)
    {
      SINGLE_OBJECT *otr;
      SINGLE_OBJECT *ofnd;
      OBJ_PROTOTYPE *crobj;
      ofnd = NULL;
      if (value < 0)		/*Take away an object */
	{
	  value = 0 - value;
	  for (otr = victim->carrying; otr != NULL; otr = otr->next_content)
	    if (otr->pIndexData->vnum == value)
	      {
		ofnd = otr;
		break;
	      }
	  if (ofnd == NULL)
	    {
	      send_to_char ("Obj not found.\n\r", ch);
	      return;
	    }
	  if (ofnd->wear_loc != -1)
	    {
	      unequip_char (victim, ofnd);
	    }
	  obj_from (ofnd);
	  free_it (ofnd);
	  send_to_char ("Object removed.\n\r", ch);
	  return;
	}
      if ((crobj = get_obj_index (value)) == NULL)
	{
	  send_to_char ("Invalid object.\n\r", ch);
	  return;
	}
      ofnd = create_object (crobj, 1);
      obj_to (ofnd, victim);
      ofnd->wear_loc = -1;
      send_to_char ("Object added.\n\r", ch);
      return;
    }
  if (!str_prefix ("stor", arg1) && value != -1)
    {
      int otr;
      SINGLE_OBJECT *ofnd;
      ofnd = NULL;
      if (value < 0)		/*Take away an object */
	{
	  value = 0 - value;
	  for (otr = 0; otr < MAXST; otr++)
	    {
	      if (victim->pcdata->storage[otr] == NULL)
		continue;
	      if (victim->pcdata->storage[otr]->pIndexData->vnum == value)
		{
		  ofnd = victim->pcdata->storage[otr];
		  break;
		}
	    }
	  if (ofnd == NULL)
	    {
	      send_to_char ("Obj not found.\n\r", ch);
	      return;
	    }
	  free_it (victim->pcdata->storage[otr]);
	  victim->pcdata->storage[otr] = NULL;
	  send_to_char ("Object removed.\n\r", ch);
	  return;
	}
      send_to_char ("You can only remove personal storage items, not give.\n\r", ch);
      return;
    }
  if (!str_prefix ("silence", arg1))
    {
      victim->pcdata->act2 ^= PLR_SILENCE;
      send_to_char ("Toggled.\n\r", ch);
      return;
    }
  if (!str_prefix ("frozen", arg1))
    {
      victim->act ^= PLR_FREEZE;
      send_to_char ("Toggled.\n\r", ch);
      return;
    }
  if (!str_prefix ("crasher", arg1))
    {
      victim->act ^= ACT_CRASHER;
      send_to_char ("Toggled.\n\r", ch);
      return;
    }
  if (!str_cmp ("done", arg1))
    {
      CHAR_DATA *iii;
      ch->desc->connected = CON_PLAYING;
      ch->desc->pEdit = NULL;
      fix_char(victim);
      save_char_obj (victim);
      for (iii = char_list[PLAYER_LIST]; iii != NULL; iii = iii->next)
	{
	  if (iii == victim)
	    return;
	}
      extract_char (victim, TRUE);
      return;
    }
  if (!str_suffix ("edit", arg1))
    {
      send_to_char ("Please type done before you go to another editor.\n\r", ch);
      return;
    }
  interpret (ch, store_arg);
  return;
}

void 
do_pedit (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *victim;
  CHAR_DATA *cy;
  char edbuf[500];
  DEFINE_COMMAND ("pedit", do_pedit, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Allows you to edit a player online or offline.")

  if (IS_MOB (ch))
    return;

  if (!argy || argy == "" || argy[0] == '\0')
    {
      send_to_char ("Pedit who?", ch);
      return;
    }
  pedit_found = NULL;
  victim = NULL;
  for (cy = char_list[PLAYER_LIST]; cy != NULL; cy = cy->next)
    {
      if (!str_cmp (NAME (cy), argy))
	{
	  victim = cy;
	  break;
	}
    }
  sprintf (edbuf, "%s", argy);
  if (victim == NULL)
    {
      if (!load_char_obj (NULL, edbuf, TRUE))
	{
	  send_to_char ("That character was not found.\n\r", ch);
	  return;
	}
    }
  if (victim == NULL)
    victim = pedit_found;
  ch->desc->pEdit = (void *) victim;
  ch->desc->connected = CON_PEDITOR;
  return;
}


void raceswitch(CHAR_DATA * ch, int newrace)
{

  int i;
  char buf[SML_LENGTH];
  int oldrace = ch->pcdata->race;
  if (IS_MOB(ch)) return;


  /* Check to see if the choice of the new race is valid. */

  if ( newrace < 0 || newrace >= RACE_COUNT || !str_cmp(race_info[newrace].name, "blank"))
    {
      return;
    }
  
  if (ch->pcdata->race >=0 && ch->pcdata->race < RACE_COUNT && str_cmp(race_info[ch->pcdata->race].name, "blank"))
    {
      /* Get rid of the old races natural stuff and modify stats down or up */
      int i;
      for (i = 0; i < 4; i++)
	{
	  REMOVE_BIT(ch->pcdata->nat_aff[i], race_info[ch->pcdata->race].aff[i]);  
	}
      REMOVE_BIT(ch->pcdata->augments, race_info[ch->pcdata->race].nat_augments);    
      for (i = 0; i < NUM_STATS; i++)
	{
	  ch->pcdata->stat[i] -= race_info[ch->pcdata->race].limits[i];
	}
      ch->max_hit -= (LEVEL(ch) * race_info[ch->pcdata->race].hps_bonus);
      if (ch->max_hit < 10) ch->max_hit = 10;
      MAXHIT(ch);
      ch->damroll -= race_info[ch->pcdata->race].combat_damage_bonus;
    }

  /* Wipe skills */
  
  for (i = 0; i < SKILL_COUNT; i++)
    ch->pcdata->learned[i] = -100;
 
  /* Give pracs back. */
  ch->pcdata->learn = LEVEL(ch) +2;
  ch->pcdata->practice =
1+(LEVEL(ch)-1)*(wis_app[get_curr_wis(ch)-1].practice);



  /* Now add in the new stuff from alignment and race */
 

  ch->pcdata->race = newrace;
  {
    int i;
    for (i = 0;  i < NUM_STATS; i++)
      {
	ch->pcdata->stat[i] += race_info[ch->pcdata->race].limits[i];
      }
    for (i = 0; i < 4; i++)
      {
	ch->pcdata->nat_aff[i] |= race_info[ch->pcdata->race].aff[i];
	ch->pcdata->nat_aff[i] |= align_info[ch->pcdata->alignment].aff[i];
	ch->aff[i] |= ch->pcdata->nat_aff[i];
      }
  }
  ch->pcdata->augments |= race_info[ch->pcdata->race].nat_augments;
  ch->pcdata->augments |= align_info[ch->pcdata->alignment].nat_augments;

  ch->max_hit += (LEVEL(ch) * race_info[ch->pcdata->race].hps_bonus);
  if (ch->max_hit < 10) ch->max_hit = 10;
  MAXHIT(ch);
  ch->damroll += race_info[ch->pcdata->race].combat_damage_bonus;


  ch->height = number_range (race_info[ch->pcdata->race].height_min, race_info[ch->pcdata->race].height_max);
  natural_mana(ch);
  fix_char(ch);
  sprintf(buf, "You went from being a %s to being a %s.\n\r", ((oldrace >= 0 && oldrace < RACE_COUNT && str_cmp(race_info[oldrace].name, "blank")) ? race_info[oldrace].name : "Something"), ((ch->pcdata->race >= 0 && ch->pcdata->race < RACE_COUNT 
&& str_cmp(race_info[ch->pcdata->race].name, "blank")) ? race_info[ch->pcdata->race].name : "Something"));
  send_to_char(buf, ch);
  return;
}


void alignswitch(CHAR_DATA * ch, int newalign)
{

  int i;
  char buf[SML_LENGTH];
  int oldalign = ch->pcdata->alignment;
  if (IS_MOB(ch)) return;


  /* Check to see if the choice of the new align is valid. */

  if ( newalign < 0 || newalign >= NUM_ALIGN || !str_cmp(align_info[newalign].name, "blank"))
    {
      return;
    }
  
  if (ch->pcdata->alignment >=0 && ch->pcdata->alignment < NUM_ALIGN && str_cmp(align_info[ch->pcdata->alignment].name, "blank"))
    {
      int i;
      /* Get rid of the old aligns natural stuff and modify stats down or up */
      for (i = 0; i < 4; i++)
	{
	  REMOVE_BIT(ch->pcdata->nat_aff[i], align_info[ch->pcdata->alignment].aff[i]);
	  REMOVE_BIT(ch->aff[i], align_info[ch->pcdata->alignment].aff[i]);
	}
      REMOVE_BIT(ch->pcdata->augments, race_info[ch->pcdata->race].nat_augments);
      
      for (i = 0; i < NUM_STATS; i ++)
	{
	  ch->pcdata->stat[i] -= align_info[ch->pcdata->alignment].limits[i];
	}
      ch->max_hit -= (LEVEL(ch) * align_info[ch->pcdata->alignment].hps_bonus);
      if (ch->max_hit < 10) ch->max_hit = 10;
      MAXHIT(ch);
      ch->damroll -= align_info[ch->pcdata->alignment].combat_damage_bonus;
      
    }

  /* Wipe skills */
  if( LEVEL(ch) != pow.level_to_choose || ch->pcdata->remort_times > 0)
    for (i = 0; i < SKILL_COUNT; i++)
      ch->pcdata->learned[i] = -100;
  
  /* Give pracs back */

  ch->pcdata->learn = LEVEL(ch) +2;
  ch->pcdata->practice =
1+(LEVEL(ch)-1)*(wis_app[get_curr_wis(ch)-1].practice);

 

  /* Now add in the new stuff from alignment and align */
 
  ch->height = number_range (race_info[ch->pcdata->race].height_min, race_info[ch->pcdata->race].height_max);

  ch->pcdata->alignment = newalign;
  for (i = 0; i < NUM_STATS; i ++)
    {
      ch->pcdata->stat[i] += align_info[ch->pcdata->alignment].limits[i];
    }
  for (i = 0; i < 4; i++)
    {
      ch->pcdata->nat_aff[i] |= race_info[ch->pcdata->race].aff[i];
      ch->pcdata->nat_aff[i] |= align_info[ch->pcdata->alignment].aff[i];
      ch->aff[i] |= ch->pcdata->nat_aff[i];
    }
  ch->pcdata->augments |= align_info[ch->pcdata->alignment].nat_augments;
  ch->pcdata->augments |= race_info[ch->pcdata->race].nat_augments;

  ch->max_hit += (LEVEL(ch) * align_info[ch->pcdata->alignment].hps_bonus);
  if (ch->max_hit < 10) ch->max_hit = 10;
  MAXHIT(ch);
  ch->damroll += align_info[ch->pcdata->alignment].combat_damage_bonus;


  natural_mana(ch);
  fix_char(ch);
  sprintf(buf, "You went from being a %s to being a %s.\n\r", ((oldalign >= 0 && oldalign < NUM_ALIGN && str_cmp(align_info[oldalign].name, "blank")) ? align_info[oldalign].name : "Something"), ((newalign >= 0 && newalign < NUM_ALIGN && str_cmp(align_info



[newalign].name, "blank")) ? align_info[newalign].name : "Something"));
  send_to_char(buf, ch);
  return;
}