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

/* True is character is fine with payment, false if not. */
bool check_hours(CHAR_DATA *ch) {
if (ch->pcdata->monthly_pass>0) {
	if (ch->pcdata->hours_purchased<0) ch->pcdata->hours_purchased=0;
	return TRUE;
	}

  ch->pcdata->played+=(int)(current_time - ch->pcdata->logon);
#ifdef BILLING
  if (ch->pcdata->monthly_pass<=0) ch->pcdata->hours_purchased-=(int)(current_time-ch->pcdata->logon);
#endif
  ch->pcdata->logon=current_time;

if (ch->pcdata->hours_purchased<((-10)*3600)) return FALSE;
return TRUE;
}

#ifdef NEW_WORLD
void display_hours(CHAR_DATA *ch, char *argy) {
char buf[500];
DEFINE_COMMAND("credit",display_hours,POSITION_DEAD,0,LOG_NORMAL,"Checks your current credit situation.")
if (ch->pcdata->monthly_pass>0) {
	sprintf(buf,"You have %d monthly pass%s.\n\r",ch->pcdata->monthly_pass,
		((ch->pcdata->monthly_pass>1)?"es":""));
	send_to_char(buf,ch);
	}
  ch->pcdata->played+=(int)(current_time - ch->pcdata->logon);
#ifdef BILLING
  if (ch->pcdata->monthly_pass<=0) ch->pcdata->hours_purchased-=(int)(current_time-ch->pcdata->logon);
#endif
  ch->pcdata->logon=current_time;
sprintf(buf,"You have %d hours and %d minutes left on hourly credit.\n\r",
	ch->pcdata->hours_purchased/3600, 
	(ch->pcdata->hours_purchased/60)-((ch->pcdata->hours_purchased/3600)*60));
send_to_char(buf,ch);
if (ch->pcdata->hours_purchased<0) {
	send_to_char("(You are allowed a 10 hour grace period).\n\r",ch);
	}
return;
}
#endif

char *
natural_abilities (int flag)
{
  static char tttb[256];
  bool prev = FALSE;
  tttb[0] = '\0';
  if (IS_SET (flag, AFF_INFRARED))
    {
      strcat (tttb, "Infravision");
      prev = TRUE;
    }
  if (IS_SET (flag, AFF_DETECT_HIDDEN))
    {
      if (prev)
	strcat (tttb, ", ");
      strcat (tttb, "Detect Hidden");
      prev = TRUE;
    }
  if (IS_SET (flag, AFF_DETECT_INVIS))
    {
      if (prev)
	strcat (tttb, ", ");
      strcat (tttb, "Detect Invis");
      prev = TRUE;
    }
  if (IS_SET (flag, AFF_FLYING))
    {
      if (prev)
	strcat (tttb, ", ");
      strcat (tttb, "Fly");
      prev = TRUE;
    }
  if (IS_SET (flag, AFF_BREATH_WATER))
    {
      if (prev)
	strcat (tttb, ", ");
      strcat (tttb, "Breath Water");
      prev = TRUE;
    }
  if (tttb[0] == '\0')
    strcat (tttb, "None");
  return tttb;
}

bool 
check_toggle_implant (CHAR_DATA * ch, char *arg)
{
bool ad=FALSE;
bool sb=FALSE;
if (arg[0]=='+') ad=TRUE; else
if (arg[0]=='-') ad=FALSE;
#ifdef NEW_WORLD
  if (!str_cmp (arg, "ArmStrength"))
    {
      if (ad)
      ch->pcdata->implants_1 |= IMPLANT_ARMS;
      else if (sb && IS_SET(ch->pcdata->implants_1,IMPLANT_ARMS)) {
        ch->pcdata->implants_1 ^= IMPLANT_ARMS;
	} else
	if (!sb)
      ch->pcdata->implants_1 ^= IMPLANT_ARMS;
      return TRUE;
    }
  if (!str_cmp (arg, "LegStrength"))
    {
      if (ad)
      ch->pcdata->implants_1 |= IMPLANT_LEGS;
      else if (sb && IS_SET(ch->pcdata->implants_1,IMPLANT_LEGS)) {
      ch->pcdata->implants_1 ^= IMPLANT_LEGS;
	} else
	if (!sb)
      ch->pcdata->implants_1 ^= IMPLANT_LEGS;
      return TRUE;
    }
  if (!str_cmp (arg, "HandStrength"))
    {
      if (ad)
      ch->pcdata->implants_1 |= IMPLANT_HANDS;
      else if (sb && IS_SET(ch->pcdata->implants_1,IMPLANT_HANDS)) {
      ch->pcdata->implants_1 ^= IMPLANT_HANDS;
	} else
	if (!sb)
      ch->pcdata->implants_1 ^= IMPLANT_HANDS;
      return TRUE;
    }
  if (!str_cmp (arg, "BodyStrength"))
    {
      if (ad)
      ch->pcdata->implants_1 |= IMPLANT_BODY;
      else if (sb && IS_SET(ch->pcdata->implants_1,IMPLANT_BODY)) {
      ch->pcdata->implants_1 ^= IMPLANT_BODY;
	} else
	if (!sb)
      ch->pcdata->implants_1 ^= IMPLANT_BODY;
      return TRUE;
    }
  if (!str_cmp (arg, "ArmDexterity"))
    {
	if (ad)
      ch->pcdata->implants_2 |= IMPLANT_ARMS;
      else if (sb && IS_SET(ch->pcdata->implants_2,IMPLANT_ARMS)) {
      ch->pcdata->implants_2 ^= IMPLANT_ARMS;
	} else
	if (!sb)
      ch->pcdata->implants_2 ^= IMPLANT_ARMS;
      return TRUE;
    }
  if (!str_cmp (arg, "LegRunning"))
    {
	if (ad)
      ch->pcdata->implants_2 |= IMPLANT_LEGS;
      else if (sb && IS_SET(ch->pcdata->implants_2,IMPLANT_LEGS)) {
      ch->pcdata->implants_2 ^= IMPLANT_LEGS;
	} else
	if (!sb)
      ch->pcdata->implants_2 ^= IMPLANT_LEGS;
      return TRUE;
    }
  if (!str_cmp (arg, "Brain"))
    {
	if (ad)
      ch->pcdata->implants_2 |= IMPLANT_HEAD;
      else if (sb && IS_SET(ch->pcdata->implants_2,IMPLANT_HEAD)) {
      ch->pcdata->implants_2 ^= IMPLANT_HEAD;
	} else
	if (!sb)
      ch->pcdata->implants_2 ^= IMPLANT_HEAD;
      return TRUE;
    }
  if (!str_cmp (arg, "Feet"))
    {
	if (ad)
      ch->pcdata->implants_2 |= IMPLANT_FEET;
      else if (sb && IS_SET(ch->pcdata->implants_2,IMPLANT_FEET)) {
      ch->pcdata->implants_2 ^= IMPLANT_FEET;
	} else
	if (!sb)
      ch->pcdata->implants_2 ^= IMPLANT_FEET;
      return TRUE;
    }
  if (!str_cmp (arg, "HandArmor"))
    {
	if (ad)
      ch->pcdata->implants_2 |= IMPLANT_HANDS;
      else if (sb && IS_SET(ch->pcdata->implants_2,IMPLANT_HANDS)) {
      ch->pcdata->implants_2 ^= IMPLANT_HANDS;
	} else
	if (!sb)
      ch->pcdata->implants_2 ^= IMPLANT_HANDS;
      return TRUE;
    }
  if (!str_cmp (arg, "BodyArmor"))
    {
	if (ad)
      ch->pcdata->implants_2 |= IMPLANT_BODY;
      else if (sb && IS_SET(ch->pcdata->implants_2,IMPLANT_BODY)) {
      ch->pcdata->implants_2 ^= IMPLANT_BODY;
	} else
	if (!sb)
      ch->pcdata->implants_2 ^= IMPLANT_BODY;
      return TRUE;
    }
#endif
  return FALSE;
}

void 
show_implants (CHAR_DATA * ch, CHAR_DATA * looker)
{
  char buf[500];
  int i;
  bool prev = FALSE;
  if (IS_MOB (ch))
    return;
  if (ch->pcdata->implants_1 == 0 && ch->pcdata->implants_2 == 0)
    return;
  sprintf (buf, "Implants: ");
  if (HAS_ARMS_STRENGTH_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "ArmStrength");
      prev = TRUE;
    }
  if (HAS_LEGS_STRENGTH_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "LegStrength");
      prev = TRUE;
    }
  if (HAS_HANDS_STRENGTH_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "HandStrength");
      prev = TRUE;
    }
  if (HAS_BODY_STRENGTH_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "BodyStrength");
      prev = TRUE;
    }
  if (HAS_ARMS_DEXTERITY_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "ArmDexterity");
      prev = TRUE;
    }
  if (HAS_LEGS_RUNNING_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "LegRunning");
      prev = TRUE;
    }
  if (HAS_HEAD_BRAIN_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "Brain");
      prev = TRUE;
    }
  if (HAS_FEET_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "Feet");
      prev = TRUE;
    }
  if (HAS_HANDS_ARMOR_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "HandArmor");
      prev = TRUE;
    }
  if (HAS_BODY_ARMOR_IMPLANT (ch))
    {
      if (prev)
	strcat (buf, ", ");
      strcat (buf, "BodyArmor");
      prev = TRUE;
    }
  strcat (buf, ".");
  i = looker->position;
  looker->position = POSITION_STANDING;
  act (buf, looker, NULL, looker, TO_CHAR);
  looker->position = i;
  return;
}

void 
show_player (CHAR_DATA * god, CHAR_DATA * victim)
{
  char buf[1024];
  SINGLE_OBJECT *obj;
  int tt;
  bool prev;
  sprintf (buf, "[\x1B[35;1m%d\x1B[37;0m] Name: \x1B[37;1m%s\x1B[37;0m  (\x1B[37;1m%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, god);
  sprintf (buf, "Align: %d  Remorts: %d  NatAC: %d  Deaths: %d  Warpts: %d  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, god);
  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, god);
  sprintf (buf, "Total kills: %d  Kill points: %d  HP: \x1B[37;1m%d/%d\x1B[37;0m  MV: \x1B[37;1m%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, god);
  sprintf (buf, "Hitroll: %d  Damroll: %d  Thirst: %d/50  Full: %d/50  Drunk: %d/0\n\r",
	   GET_HITROLL (victim), GET_DAMROLL (victim),
	   victim->pcdata->condition[COND_THIRST], victim->pcdata->condition[COND_FULL],
	   victim->pcdata->condition[COND_DRUNK]);
  send_to_char (buf, god);
  sprintf (buf, "Saving_throw: %d  Items Car: %d  Weight Car: %d  Age: %d  Dntn: %d  Tps: %d\n\r",
	   victim->pcdata->saving_throw, victim->pcdata->carry_number,
   victim->pcdata->carry_weight, get_age (victim), victim->pcdata->donated, victim->pcdata->tps);
  send_to_char (buf, god);
if (!str_cmp(NAME(god),"Orin")) {
	sprintf(buf,"Hours left: %d hours, %d mins.  Monthly Passes: %d.\n\r",
		victim->pcdata->hours_purchased/3600, 
	(victim->pcdata->hours_purchased/60) - (((victim->pcdata->hours_purchased/3600)*60)),
 		victim->pcdata->monthly_pass);
	send_to_char(buf,god);
	}
  print_profs (god, victim->pcdata->profession_flag);
  sprintf (buf, "\x1B[34;1m----- Stats and Extras ------------ (%s) ----------\x1B[37;0m\n\r",
	 victim->desc ? "Player currently online" : "Player not logged in");
  send_to_char (buf, god);
  sprintf (buf, "Str: %2d/%2d  Con: %2d/%2d  Dex: %2d/%2d  Int: %2d/%2d  Wis: %2d/%2d\n\r",
	   get_curr_str (victim), victim->pcdata->perm_str,
	   get_curr_con (victim), victim->pcdata->perm_con,
	   get_curr_dex (victim), victim->pcdata->perm_dex,
	   get_curr_int (victim), victim->pcdata->perm_int,
	   get_curr_wis (victim), victim->pcdata->perm_wis);
  send_to_char (buf, god);
  sprintf (buf, "Use Smd, Cmd, Dmd, Imd, and Wmd to set stat modifiers.   Exp: %ld\n\r",
	   victim->exp);
  send_to_char (buf, god);
  if (victim->pcdata->cool_skills != 0)
    {
      bool prev;
      prev = FALSE;
      send_to_char ("Cool Skills: ", god);
      if (NO_HUNGER (victim))
	{
	  if (prev)
	    send_to_char (", ", god);
	  send_to_char ("No_hunger", god);
	  prev = TRUE;
	}
      if (NO_THIRST (victim))
	{
	  if (prev)
	    send_to_char (", ", god);
	  send_to_char ("No_thirst", god);
	  prev = TRUE;
	}
      if (VIEW_MOBS (victim))
	{
	  if (prev)
	    send_to_char (", ", god);
	  send_to_char ("view_mobs", god);
	  prev = TRUE;
	}
      if (NO_PKILL (victim))
	{
	  if (prev)
	    send_to_char (", ", god);
	  send_to_char ("no_pkill", god);
	  prev = TRUE;
	}
      if (CHEAP_RECALL (victim))
	{
	  if (prev)
	    send_to_char (", ", god);
	  send_to_char ("Cheap_recall", god);
	  prev = TRUE;
	}

      if (MARTIAL_ARTIST (victim))
	{
	  if (prev)
	    send_to_char (", ", god);
	  send_to_char ("Martial_artist", god);
	  prev = TRUE;
	}
      if (ARCHMAGE (victim))
	{
	  if (prev)
	    send_to_char (", ", god);
	  send_to_char ("Archmage", god);
	  prev = TRUE;
	}
      send_to_char (".\n\r", god);
    }
  if (victim->pcdata->nat_abilities != 0)
    {
      bool prev;
      prev = FALSE;
      send_to_char ("Natural Abilities: ", god);
      send_to_char (natural_abilities (victim->pcdata->nat_abilities), god);
      send_to_char (".\n\r", god);

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

void 
show_extras (CHAR_DATA * god, 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[37;1mSkills...\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[37;1m\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[37;1m\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, god);
  return;
}

void 
pedit (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *victim;
  char buf[1024];
  char arg1[512];
  char arg2[512];
  char arg3[512];
  char arg4[512];
  int bit = 0;
  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;
    }
#ifdef NEW_WORLD
  S_HEALER (arg1, bit)
    S_WIZARD (arg1, bit)
    S_KNIGHT (arg1, bit)
    S_BARBARIAN (arg1, bit)
    S_RANGER (arg1, bit)
    S_PALADIN (arg1, bit)
    S_DRUID (arg1, bit)
    S_ARCHMAGE (arg1, bit)
    S_ASSASSIN (arg1, bit)
    S_MONK (arg1, bit)
    S_BARD (arg1, bit)
    S_HUNTER (arg1, bit)
    S_ENGINEER (arg1, bit)
    S_PHILOSOPHER (arg1, bit)
    if (bit != 0)
    {
      victim->pcdata->profession_flag ^= bit;
      send_to_char ("Profession toggled.\n\r", ch);
      return;
    }
#endif
  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 (check_toggle_implant (victim, arg1))
    {
      send_to_char ("Implant flag toggled.\n\r", ch);
      return;
    }
  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);
      victim->pcdata->level = 1;
      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')
    {
      if (!str_cmp(arg2,"Orin")) return;
      sprintf (buf, "%s%s", PLAYER_DIR, NAME (victim));
      unlink (buf);
      free_string (victim->pcdata->name);
      victim->pcdata->name = str_dup (capitalize (arg2));
      save_char_obj (victim);
      send_to_char ("Name changed.\n\r", ch);
      return;
    }
#ifdef NEW_WORLD
  if (!str_cmp (arg1, "addtps") && value >= 0)
    {
      victim->pcdata->tps += value;
      send_to_char ("Tps added.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "donated") && value >= 0)
    {
      victim->pcdata->donated = value;
      send_to_char ("Donation value set.\n\r", ch);
      return;
    }
#endif
  if (!str_cmp (arg1, "race") && value >= 0 && value < RACE_COUNT)
    {
      victim->pcdata->race = 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 ("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 ("war", 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; 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_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;
    }
  if (!str_cmp (arg1, "wis") && value >= 0)
    {
      if (value < 3 || value > 30)
	{
	  send_to_char ("Wisdom range is 3 to 30.\n\r", ch);
	  return;
	}
      send_to_char ("Wisdom set.\n\r", ch);
      victim->pcdata->perm_wis = value;
      return;
    }
  if (!str_cmp (arg1, "dex") && value >= 0)
    {
      if (value < 3 || value > 30)
	{
	  send_to_char ("Dexterity range is 3 to 30.\n\r", ch);
	  return;
	}
      send_to_char ("Dexterity set.\n\r", ch);
      victim->pcdata->perm_dex = value;
      return;
    }
  if (!str_cmp (arg1, "con") && value >= 0)
    {
      if (value < 3 || value > 30)
	{
	  send_to_char ("Constitution range is 3 to 30.\n\r", ch);
	  return;
	}
      send_to_char ("Constitution set.\n\r", ch);
      victim->pcdata->perm_con = value;
      return;
    }
  if (!str_cmp (arg1, "int") && value >= 0)
    {
      if (value < 3 || value > 30)
	{
	  send_to_char ("Intelligence range is 3 to 30.\n\r", ch);
	  return;
	}
      send_to_char ("Intelligence set.\n\r", ch);
      victim->pcdata->perm_int = value;
      return;
    }
  if (!str_cmp (arg1, "str") && value >= 0)
    {
      if (value < 3 || value > 30)
	{
	  send_to_char ("Strength range is 3 to 30.\n\r", ch);
	  return;
	}
      send_to_char ("Strength set.\n\r", ch);
      victim->pcdata->perm_str = value;
      return;
    }
  if (!str_cmp (arg1, "wmd"))
    {
      send_to_char ("Wisdom mod set.\n\r", ch);
      victim->pcdata->mod_wis = value;
      return;
    }
  if (!str_cmp (arg1, "dmd"))
    {
      send_to_char ("Dexterity mod set.\n\r", ch);
      victim->pcdata->mod_dex = value;
      return;
    }
  if (!str_cmp (arg1, "imd"))
    {
      send_to_char ("Intelligence mod set.\n\r", ch);
      victim->pcdata->mod_int = value;
      return;
    }
  if (!str_cmp (arg1, "cmd"))
    {
      send_to_char ("Constitution mod set.\n\r", ch);
      victim->pcdata->mod_con = value;
      return;
    }
  if (!str_cmp (arg1, "smd"))
    {
      send_to_char ("Strength mod set.\n\r", ch);
      victim->pcdata->mod_str = 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')
    {
      if (!str_cmp (arg2, "no_hunger") || !str_cmp (arg2, "hunger"))
	{
	  if (NO_HUNGER (victim))
	    {
	      send_to_char ("No_hunger Removed.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_NO_HUNGER;
	    }
	  else
	    {
	      send_to_char ("No_hunger Added.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_NO_HUNGER;
	    }
	  return;
	}
      if (!str_cmp (arg2, "no_thirst") || !str_cmp (arg2, "thirst"))
	{
	  if (NO_THIRST (victim))
	    {
	      send_to_char ("No_thirst Removed.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_NO_THIRST;
	    }
	  else
	    {
	      send_to_char ("No_thirst Added.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_NO_THIRST;
	    }
	  return;
	}
      if (!str_cmp (arg2, "cheap_recall") || !str_cmp (arg2, "recall"))
	{
	  if (CHEAP_RECALL (victim))
	    {
	      send_to_char ("Cheap_recall Removed.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_CHEAP_RECALL;
	    }
	  else
	    {
	      send_to_char ("Cheap_recall added.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_CHEAP_RECALL;
	    }
	  return;
	}
      if (!str_cmp (arg2, "view_mobs") || !str_cmp (arg2, "view_mobs"))
	{
	  if (VIEW_MOBS (victim))
	    {
	      send_to_char ("View_mobs Removed.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_VIEW_MOBS;
	    }
	  else
	    {
	      send_to_char ("View_mobs added.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_VIEW_MOBS;
	    }
	  return;
	}
      if (!str_cmp (arg2, "no_pkill"))
	{
	  if (NO_PKILL (victim))
	    {
	      send_to_char ("No_pkill Removed.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_NO_PKILL;
	    }
	  else
	    {
	      send_to_char ("No_pkill added.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_NO_PKILL;
	    }
	  return;
	}

      if (!str_cmp (arg2, "archmage") || !str_cmp (arg2, "archmage"))
	{
	  if (ARCHMAGE (victim))
	    {
	      send_to_char ("Archmage Removed.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_ARCHMAGE;
	    }
	  else
	    {
	      send_to_char ("Archmage Added.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_ARCHMAGE;
	    }
	  return;
	}
      if (!str_cmp (arg2, "martial_artist") || !str_cmp (arg2, "martial"))
	{
	  if (MARTIAL_ARTIST (victim))
	    {
	      send_to_char ("Martial Artist Removed.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_MARTIAL_ARTIST;
	    }
	  else
	    {
	      send_to_char ("Martial Artist Added.\n\r", ch);
	      victim->pcdata->cool_skills ^= COOL_SKILL_MARTIAL_ARTIST;
	    }
	  return;
	}
    }
  if (!str_cmp (arg1, "guild") && arg2[0] != '\0')
    {
      if (!str_cmp (arg2, "tinker"))
	{
	  if (IS_SET (victim->pcdata->guilds, ACT3_TINKER))
	    {
	      send_to_char ("Tinker's Guild Removed.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_TINKER;
	    }
	  else
	    {
	      send_to_char ("Tinker's Guild Added.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_TINKER;
	    }
	  return;
	}
      if (!str_cmp (arg2, "warrior"))
	{
	  if (IS_SET (victim->pcdata->guilds, ACT3_WARRIOR))
	    {
	      send_to_char ("Warrior's Guild Removed.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_WARRIOR;
	    }
	  else
	    {
	      send_to_char ("Warrior's Guild Added.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_WARRIOR;
	    }
	  return;
	}
      if (!str_cmp (arg2, "healer"))
	{
	  if (IS_SET (victim->pcdata->guilds, ACT3_HEALER))
	    {
	      send_to_char ("Healer's Guild Removed.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_HEALER;
	    }
	  else
	    {
	      send_to_char ("Healer's Guild Added.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_HEALER;
	    }
	  return;
	}
      if (!str_cmp (arg2, "wizard"))
	{
	  if (IS_SET (victim->pcdata->guilds, ACT3_WIZARD))
	    {
	      send_to_char ("Wizard's Guild Removed.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_WIZARD;
	    }
	  else
	    {
	      send_to_char ("Wizard's Guild Added.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_WIZARD;
	    }
	  return;
	}
      if (!str_cmp (arg2, "thief") || !str_cmp (arg2, "thiefg"))
	{
	  if (IS_SET (victim->pcdata->guilds, ACT3_THIEFG))
	    {
	      send_to_char ("Thief's Guild Removed.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_THIEFG;
	    }
	  else
	    {
	      send_to_char ("Thief's Guild Added.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_THIEFG;
	    }
	  return;
	}
      if (!str_cmp (arg2, "ranger"))
	{
	  if (IS_SET (victim->pcdata->guilds, ACT3_RANGER))
	    {
	      send_to_char ("Ranger's Guild Removed.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_RANGER;
	    }
	  else
	    {
	      send_to_char ("Ranger's Guild Added.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_RANGER;
	    }
	  return;
	}
      if (!str_cmp (arg2, "assassin"))
	{
	  if (IS_SET (victim->pcdata->guilds, ACT3_ASSASSIN))
	    {
	      send_to_char ("Assassin's Guild Removed.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_ASSASSIN;
	    }
	  else
	    {
	      send_to_char ("Assassin's Guild Added.\n\r", ch);
	      victim->pcdata->guilds ^= ACT3_ASSASSIN;
	    }
	  return;
	}
      send_to_char ("Unknown guild.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "level"))
    {
      if (value < 1 || value > 99)
	return;
      victim->exp = (FIND_EXP ((value - 1), 1));
      send_to_char ("Level set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "align"))
    {
      if (value < -5000 || value > 5000)
	return;
      victim->pcdata->alignment = value;
      send_to_char ("Alignment set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "fly"))
    {
      if (IS_SET (victim->pcdata->nat_abilities, AFF_FLYING))
	{
	  act ("$N no longer has natural flying abilities.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities -= AFF_FLYING;
	}
      else
	{
	  act ("$N now has natural flying abilities.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities += AFF_FLYING;
	}
      return;
    }
  if (!str_prefix ("infra", arg1))
    {
      if (IS_SET (victim->pcdata->nat_abilities, AFF_INFRARED))
	{
	  act ("$N can no longer see in the dark naturally.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities -= AFF_INFRARED;
	}
      else
	{
	  act ("$N can now see in the dark naturally.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities += AFF_INFRARED;
	}
      return;
    }
  if (!str_prefix ("d_hid", arg1))
    {
      if (IS_SET (victim->pcdata->nat_abilities, AFF_DETECT_HIDDEN))
	{
	  act ("$N can no longer sense hidden objs/lifeforms naturally.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities -= AFF_DETECT_HIDDEN;
	}
      else
	{
	  act ("$N can now sense hidden lifeforms/objs naturally.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities += AFF_DETECT_HIDDEN;
	}
      return;
    }
  if (!str_prefix ("d_invis", arg1))
    {
      if (IS_SET (victim->pcdata->nat_abilities, AFF_DETECT_INVIS))
	{
	  act ("$N no longer has natural detect invis.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities -= AFF_DETECT_INVIS;
	}
      else
	{
	  act ("$N now has natural detect invis.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities += AFF_DETECT_INVIS;
	}
      return;
    }
  if (!str_prefix ("breath", arg1))
    {
      if (IS_SET (victim->pcdata->nat_abilities, AFF_BREATH_WATER))
	{
	  act ("$N can no longer breath water naturally.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities -= AFF_BREATH_WATER;
	}
      else
	{
	  act ("$N now can breath water naturally.", ch, NULL, victim, TO_CHAR);
	  victim->pcdata->nat_abilities += AFF_BREATH_WATER;
	}
      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_cmp ("frozen", arg1))
    {
      victim->act ^= PLR_FREEZE;
      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;
      save_char_obj (victim);
      for (iii = char_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, 110, LOG_ALWAYS, "Allows you to edit a player online or offline.")

    if (!IS_REAL_GOD (ch))
    {
      send_to_char ("Huh?\n\r", ch);
      return;
    }
  if (!argy || argy == "" || argy[0] == '\0')
    {
      send_to_char ("Pedit who?", ch);
      return;
    }
  pedit_found = NULL;
  victim = NULL;
  for (cy = char_list; cy != NULL; cy = cy->next)
    {
      if (IS_MOB (cy))
	continue;
      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;
}