1stMud/CVS/
1stMud/area/CVS/
1stMud/backup/CVS/
1stMud/bin/
1stMud/bin/CVS/
1stMud/bin/extras/
1stMud/bin/extras/CVS/
1stMud/data/CVS/
1stMud/data/i3/CVS/
1stMud/doc/1stMud/
1stMud/doc/1stMud/CVS/
1stMud/doc/CVS/
1stMud/doc/Diku/
1stMud/doc/Diku/CVS/
1stMud/doc/MPDocs/CVS/
1stMud/doc/Merc/CVS/
1stMud/doc/Rom/
1stMud/doc/Rom/CVS/
1stMud/log/CVS/
1stMud/notes/
1stMud/notes/CVS/
1stMud/player/CVS/
1stMud/player/backup/CVS/
1stMud/player/deleted/CVS/
1stMud/src/CVS/
1stMud/src/config/CVS/
1stMud/src/h/CVS/
1stMud/src/o/CVS/
1stMud/win/CVS/
/**************************************************************************
*  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
*  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
*                                                                         *
*  Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael         *
*  Chastain, Michael Quan, and Mitchell Tse.                              *
*                                                                         *
*  In order to use any part of this Merc Diku Mud, you must comply with   *
*  both the original Diku license in 'license.doc' as well the Merc       *
*  license in 'license.txt'.  In particular, you may not remove either of *
*  these copyright notices.                                               *
*                                                                         *
*  Much time and thought has gone into this software and you are          *
*  benefiting.  We hope that you share your changes too.  What goes       *
*  around, comes around.                                                  *
***************************************************************************
*       ROM 2.4 is copyright 1993-1998 Russ Taylor                        *
*       ROM has been brought to you by the ROM consortium                 *
*           Russ Taylor (rtaylor@hypercube.org)                           *
*           Gabrielle Taylor (gtaylor@hypercube.org)                      *
*           Brian Moore (zump@rom.org)                                    *
*       By using this code, you have agreed to follow the terms of the    *
*       ROM license, in the file Rom24/doc/rom.license                    *
***************************************************************************
*          1stMud ROM Derivative (c) 2001-2004 by Markanth                *
*            http://www.firstmud.com/  <markanth@firstmud.com>            *
*         By using this code you have agreed to follow the term of        *
*             the 1stMud license in ../doc/1stMud/LICENSE                 *
***************************************************************************/


#ifndef __OLC_DELETE_H_
#define __OLC_DELETE_H_    	1

void
unlink_reset (RoomIndex * pRoom, ResetData * pReset)
{
  ResetData *prev, *wReset;

  for (wReset = pRoom->reset_first; wReset; wReset = prev)
    {
      prev = wReset->next;

      if (wReset == pReset)
	{
	  UnLink (pReset, pRoom->reset, next, prev);
	}
    }
}

void
unlink_obj_index (ObjIndex * pObj)
{
  int iHash;

  iHash = pObj->vnum % MAX_KEY_HASH;

  UnlinkSingle (pObj, ObjIndex, obj_index_hash[iHash], next);
}

void
unlink_room_index (RoomIndex * pRoom)
{
  int iHash;

  iHash = pRoom->vnum % MAX_KEY_HASH;

  UnlinkSingle (pRoom, RoomIndex, room_index_hash[iHash], next);
}

void
unlink_char_index (CharIndex * pMob)
{
  int iHash;

  iHash = pMob->vnum % MAX_KEY_HASH;

  UnlinkSingle (pMob, CharIndex, char_index_hash[iHash], next);
}


void
unlink_mprog (vnum_t pnum)
{
  ProgList *list, *list_next;
  CharIndex *pMob;
  int hash, count;

  for (hash = 0; hash < MAX_KEY_HASH; hash++)
    {
      for (pMob = char_index_hash[hash]; pMob; pMob = pMob->next)
	{
	  count = -1;
	  for (list = pMob->mprog_first; list != NULL; list = list_next)
	    {
	      list_next = list->next;
	      count++;

	      if (list->prog->vnum != pnum)
		continue;

	      RemBit (pMob->mprog_flags, list->trig_type);
	      UnLink (list, pMob->mprog, next, prev);
	      free_prog_list (list);
	    }
	}
    }
}

void
unlink_oprog (vnum_t pnum)
{
  ProgList *list, *list_next;
  ObjIndex *pObj;
  int hash, count;

  for (hash = 0; hash < MAX_KEY_HASH; hash++)
    {
      for (pObj = obj_index_hash[hash]; pObj; pObj = pObj->next)
	{
	  count = -1;
	  for (list = pObj->oprog_first; list != NULL; list = list_next)
	    {
	      list_next = list->next;
	      count++;

	      if (list->prog->vnum != pnum)
		continue;

	      RemBit (pObj->oprog_flags, list->trig_type);
	      UnLink (list, pObj->oprog, next, prev);
	      free_prog_list (list);
	    }
	}
    }
}

void
unlink_rprog (vnum_t pnum)
{
  ProgList *list, *list_next;
  RoomIndex *pRoom;
  int hash, count;

  for (hash = 0; hash < MAX_KEY_HASH; hash++)
    {
      for (pRoom = room_index_hash[hash]; pRoom; pRoom = pRoom->next)
	{
	  count = -1;
	  for (list = pRoom->rprog_first; list != NULL; list = list_next)
	    {
	      list_next = list->next;
	      count++;

	      if (list->prog->vnum != pnum)
		continue;

	      RemBit (pRoom->rprog_flags, list->trig_type);
	      UnLink (list, pRoom->rprog, next, prev);
	      free_prog_list (list);
	    }
	}
    }
}


void
clean_area_links (AreaData * target)
{
  vnum_t vnum;
  char buf[20];

  for (vnum = target->min_vnum; vnum <= target->max_vnum; vnum++)
    {
      if (get_prog_index (vnum, PRG_MPROG) != NULL)
	{
	  sprintf (buf, "%ld", vnum);
	  if (!mpedit_delete (NULL, NULL, buf))
	    bugf ("Unable to delete Mprog %ld", vnum);
	}
      if (get_prog_index (vnum, PRG_OPROG) != NULL)
	{
	  sprintf (buf, "%ld", vnum);
	  if (!opedit_delete (NULL, NULL, buf))
	    bugf ("Unable to delete Oprog %ld", vnum);
	}
      if (get_prog_index (vnum, PRG_RPROG) != NULL)
	{
	  sprintf (buf, "%ld", vnum);
	  if (!rpedit_delete (NULL, NULL, buf))
	    bugf ("Unable to delete Rprog %ld", vnum);
	}
      if (get_room_index (vnum) != NULL)
	{
	  sprintf (buf, "%ld", vnum);
	  if (!redit_delete (NULL, NULL, buf))
	    bugf ("Unable to delete Room %ld", vnum);
	}
      if (get_obj_index (vnum) != NULL)
	{
	  sprintf (buf, "%ld", vnum);
	  if (!oedit_delete (NULL, NULL, buf))
	    bugf ("Unable to delete Object %ld", vnum);
	}
      if (get_char_index (vnum) != NULL)
	{
	  sprintf (buf, "%ld", vnum);
	  if (!medit_delete (NULL, NULL, buf))
	    bugf ("Unable to delete Mobile %ld", vnum);
	}
    }
}

Olc_Fun (redit_delete)
{
  RoomIndex *pRoom, *pRoom2;
  ResetData *pReset;
  ExitData *ex;
  ObjData *Obj, *obj_next;
  CharData *wch, *wnext;
  ExDescrData *pExtra;
  char arg[MIL];
  vnum_t pIndex, v;
  int i, iHash, rcount, ecount, mcount, ocount, edcount;

  if (NullStr (argument))
    {
      if (ch)
	cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  one_argument (argument, arg);

  if (is_number (arg))
    {
      pIndex = atov (arg);
      pRoom = get_room_index (pIndex);
    }
  else
    {
      if (ch)
	chprintln (ch, "That is not a number.");
      return false;
    }

  if (!check_vnum (pIndex, ROOM_VNUM))
    {
      if (ch)
	chprintln (ch, "That vnum is reserved.");
      return false;
    }

  if (!pRoom)
    {
      if (ch)
	chprintln (ch, "No such room.");
      return false;
    }

  stop_editing (pRoom);

  SetBit (pRoom->area->area_flags, AREA_CHANGED);

  rcount = 0;

  for (pReset = pRoom->reset_first; pReset; pReset = pReset->next)
    {
      rcount++;
    }

  ocount = 0;
  for (Obj = pRoom->content_first; Obj; Obj = obj_next)
    {
      obj_next = Obj->next_content;

      extract_obj (Obj);
      ocount++;
    }

  mcount = 0;
  for (wch = pRoom->person_first; wch; wch = wnext)
    {
      wnext = wch->next_in_room;
      if (IsNPC (wch))
	{
	  extract_char (wch, true);
	  mcount++;
	}
      else
	{
	  chprintln (wch,
		     "This room is being deleted. Moving you somewhere safe.");
	  if (wch->fighting != NULL)
	    stop_fighting (wch, true);

	  char_from_room (wch);

	  char_to_room (wch, get_room_index (ROOM_VNUM_TEMPLE));
	  wch->was_in_room = wch->in_room;
	}
    }

  ecount = 0;
  for (iHash = 0; iHash < MAX_KEY_HASH; iHash++)
    {
      for (pRoom2 = room_index_hash[iHash]; pRoom2; pRoom2 = pRoom2->next)
	{
	  for (i = 0; i < MAX_DIR; i++)
	    {
	      if (!(ex = pRoom2->exit[i]))
		continue;

	      if (pRoom2 == pRoom)
		{

		  ecount++;
		  continue;
		}

	      if (ex->u1.to_room == pRoom)
		{
		  free_exit (pRoom2->exit[i]);
		  pRoom2->exit[i] = NULL;
		  SetBit (pRoom2->area->area_flags, AREA_CHANGED);
		  ecount++;
		}
	    }
	}
    }

  edcount = 0;
  for (pExtra = pRoom->ed_first; pExtra; pExtra = pExtra->next)
    {
      edcount++;
    }

  if (top_vnum_room == pIndex)
    for (v = 1; v < pIndex; v++)
      if (get_room_index (v))
	top_vnum_room = v;

  if (!IsSet (pRoom->room_flags, ROOM_NOEXPLORE))
    top_explored--;

  unlink_room_index (pRoom);

  pRoom->area = NULL;
  pRoom->vnum = 0;

  free_room_index (pRoom);

  if (ch)
    {
      chprintlnf (ch,
		  "Removed room vnum {C%ld{x, %d resets, %d extra "
		  "descriptions and %d exits.", pIndex, rcount,
		  edcount, ecount);
      chprintlnf (ch,
		  "{C%d{x objects and {C%d{x mobiles were extracted "
		  "from the room.", ocount, mcount);
    }
  return true;
}


Olc_Fun (aedit_delete)
{
  AreaData *pArea;
  char filename[512];

  GetEdit (ch, AreaData, pArea);

  if (ch->pcdata->security < 9)
    {
      chprintln (ch, "Insufficient security to delete area.");
      return false;
    }

  if (NullStr (argument))
    {
      cmd_syntax (ch, NULL, n_fun, "<vnum>", "all (carefull!)", NULL);
      return false;
    }
  if (!str_cmp (argument, "all") && get_trust (ch) == MAX_LEVEL)
    {
      AreaData *pArea_next;

#ifdef HAVE_WORKING_FORK

      pid_t pid = fork ();

      if (pid == 0)
	{
#endif
	  crash_info.status = CRASH_LOOPING;
	  for (pArea = area_first; pArea != NULL; pArea = pArea_next)
	    {
	      pArea_next = pArea->next;
	      if (vnum_OK (pArea->min_vnum, pArea->max_vnum) == false)
		continue;
	      stop_editing (pArea);
	      clean_area_links (pArea);
	      sprintf (filename, "%s%s", AREA_DIR, pArea->file_name);
	      unlink (filename);
	      unlink_area (pArea);
	      logf ("Done unlinking area %s.", pArea->name);
	      free_area (pArea);
	    }
	  crash_info.status = CRASH_LIKELY;
#ifdef HAVE_WORKING_FORK

	  _exit (1);
	}
      else if (pid > 0)
	{
#endif
	  do_function (NULL, &do_asave, "changed");
	  chprintln (ch, "All deleteable areas deleted.");
#ifdef HAVE_WORKING_FORK

	}
      else
	{
	  chprintln (ch, "Error deleting world.");
	  log_error ("save world: fork()");
	}
#endif

    }
  else
    {
      if (!is_number (argument) || !(pArea = get_area_data (atoi (argument))))
	{
	  chprintln (ch, "That area vnum does not exist.");
	  return false;
	}

      if (vnum_OK (pArea->min_vnum, pArea->max_vnum) == false)
	{
	  chprintln (ch,
		     "That area contains hard coded vnums and cannot be deleted.");
	  return false;
	}

      clean_area_links (pArea);
      sprintf (filename, "%s%s", AREA_DIR, pArea->file_name);
      unlink (filename);
      unlink_area (pArea);
      free_area (pArea);
      do_function (NULL, &do_asave, "changed");
      chprintln (ch, "Area deleted.");
    }
  return true;
}


Olc_Fun (oedit_delete)
{
  ObjData *obj, *obj_next;
  ObjIndex *pObj;
  ResetData *pReset, *wReset;
  RoomIndex *pRoom;
  char arg[MIL];
  vnum_t pIndex, i;
  int rcount, ocount, iHash;

  if (NullStr (argument))
    {
      if (ch)
	cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  one_argument (argument, arg);

  if (is_number (arg))
    {
      pIndex = atov (arg);
      pObj = get_obj_index (pIndex);
    }
  else
    {
      if (ch)
	chprintln (ch, "That is not a number.");
      return false;
    }

  if (!check_vnum (pIndex, OBJ_VNUM))
    {
      if (ch)
	chprintln (ch, "That vnum is reserved.");
      return false;
    }

  if (!pObj)
    {
      if (ch)
	chprintln (ch, "No such object.");
      return false;
    }

  stop_editing (pObj);

  SetBit (pObj->area->area_flags, AREA_CHANGED);

  if (top_vnum_obj == pIndex)
    for (i = 1; i < pIndex; i++)
      if (get_obj_index (i))
	top_vnum_obj = i;

  ocount = 0;
  for (obj = obj_first; obj; obj = obj_next)
    {
      obj_next = obj->next;

      if (obj->pIndexData == pObj)
	{
	  extract_obj (obj);
	  ocount++;
	}
    }

  rcount = 0;
  for (iHash = 0; iHash < MAX_KEY_HASH; iHash++)
    {
      for (pRoom = room_index_hash[iHash]; pRoom; pRoom = pRoom->next)
	{
	  for (pReset = pRoom->reset_first; pReset; pReset = wReset)
	    {
	      wReset = pReset->next;
	      switch (pReset->command)
		{
		case 'O':
		case 'E':
		case 'P':
		case 'G':
		  if ((pReset->arg1 == pIndex) ||
		      ((pReset->command == 'P') && (pReset->arg3 == pIndex)))
		    {
		      unlink_reset (pRoom, pReset);
		      free_reset (pReset);

		      rcount++;
		      SetBit (pRoom->area->area_flags, AREA_CHANGED);

		    }
		}
	    }
	}
    }

  unlink_obj_index (pObj);

  pObj->area = NULL;
  pObj->vnum = 0;

  free_obj_index (pObj);

  if (ch)
    {
      chprintlnf (ch,
		  "Removed object vnum {C%ld{x and {C%d{x resets.",
		  pIndex, rcount);

      chprintlnf (ch,
		  "{C%d{x occurences of the object"
		  " were extracted from the mud.", ocount);

    }
  return true;
}


Olc_Fun (medit_delete)
{
  CharData *wch, *wnext;
  CharIndex *pMob;
  ResetData *pReset, *wReset;
  RoomIndex *pRoom;
  char arg[MIL];
  vnum_t pIndex, i;
  int mcount, rcount, iHash;
  bool foundmob = false;
  bool foundobj = false;

  if (NullStr (argument))
    {
      if (ch)
	cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  one_argument (argument, arg);

  if (is_number (arg))
    {
      pIndex = atov (arg);
      pMob = get_char_index (pIndex);
    }
  else
    {
      if (ch)
	chprintln (ch, "That is not a number.");
      return false;
    }

  if (!check_vnum (pIndex, MOB_VNUM))
    {
      if (ch)
	chprintln (ch, "That vnum is reserved.");
      return false;
    }

  if (!pMob)
    {
      if (ch)
	chprintln (ch, "No such mobile.");
      return false;
    }

  stop_editing (pMob);

  SetBit (pMob->area->area_flags, AREA_CHANGED);

  if (top_vnum_mob == pIndex)
    for (i = 1; i < pIndex; i++)
      if (get_char_index (i))
	top_vnum_mob = i;

  rcount = 0;
  mcount = 0;

  for (iHash = 0; iHash < MAX_KEY_HASH; iHash++)
    {
      for (pRoom = room_index_hash[iHash]; pRoom; pRoom = pRoom->next)
	{

	  for (wch = pRoom->person_first; wch; wch = wnext)
	    {
	      wnext = wch->next_in_room;
	      if (wch->pIndexData == pMob)
		{
		  extract_char (wch, true);
		  mcount++;
		}
	    }

	  for (pReset = pRoom->reset_first; pReset; pReset = wReset)
	    {
	      wReset = pReset->next;
	      switch (pReset->command)
		{
		case 'M':
		  if (pReset->arg1 == pIndex)
		    {
		      foundmob = true;

		      unlink_reset (pRoom, pReset);
		      free_reset (pReset);

		      rcount++;
		      SetBit (pRoom->area->area_flags, AREA_CHANGED);

		    }
		  else
		    foundmob = false;

		  break;
		case 'E':
		case 'G':
		  if (foundmob)
		    {
		      foundobj = true;

		      unlink_reset (pRoom, pReset);
		      free_reset (pReset);

		      rcount++;
		      SetBit (pRoom->area->area_flags, AREA_CHANGED);

		    }
		  else
		    foundobj = false;

		  break;
		case '0':
		  foundobj = false;
		  break;
		case 'P':
		  if (foundobj && foundmob)
		    {
		      unlink_reset (pRoom, pReset);
		      free_reset (pReset);

		      rcount++;
		      SetBit (pRoom->area->area_flags, AREA_CHANGED);
		    }
		}
	    }
	}
    }

  unlink_char_index (pMob);

  pMob->area = NULL;
  pMob->vnum = 0;

  free_char_index (pMob);

  if (ch)
    {
      chprintlnf (ch,
		  "Removed mobile vnum {C%ld{x and {C%d{x resets.",
		  pIndex, rcount);
      chprintlnf (ch,
		  "{C%d{x mobiles were extracted" " from the mud.", mcount);
    }
  return true;
}


Olc_Fun (cedit_delete)
{
  ClanData *pClan;

  GetEdit (ch, ClanData, pClan);

  if (str_cmp (argument, "confirm"))
    {
      chprintln (ch,
		 "Typing 'delete confirm' again will permanetely remove this clan!");
      return false;
    }
  else
    {
      CharData *pch;
      AreaData *area;
      ClanMember *pmbr, *next = NULL;

      for (pmbr = mbr_first; pmbr != NULL; pmbr = next)
	{
	  next = pmbr->next;

	  if (pmbr->clan == pClan)
	    {
	      UnLink (pmbr, mbr, next, prev);
	      free_mbr (pmbr);
	    }
	}

      for (pch = player_first; pch != NULL; pch = pch->next_player)
	{
	  if (CharClan (pch) == pClan)
	    {
	      pch->pcdata->clan = NULL;
	      pch->rank = 0;
	    }
	}

      for (area = area_first; area; area = area->next)
	{
	  if (area->clan == pClan)
	    {
	      area->clan = NULL;
	      SetBit (area->area_flags, AREA_CHANGED);
	    }
	}

      UnLink (pClan, clan, next, prev);
      free_clan (pClan);
      pClan = clan_first;
      edit_start (ch, pClan, ED_CLAN);
      chprintln (ch, "Clan deleted.");
    }

  return true;
}


Olc_Fun (songedit_delete)
{
  SongData *pSong;

  GetEdit (ch, SongData, pSong);

  if (str_cmp (argument, "confirm"))
    {
      chprintln (ch,
		 "Typing 'delete confirm' will permanetely remove this song!");
      return false;
    }
  else
    {
      int i, j = 0, c;
      struct song_data *new_table;

      alloc_mem (new_table, struct song_data, top_song);

      if (!new_table)
	{
	  chprintln (ch, "Memory Allocation error!!! Unable to delete song.");
	  return false;
	}

      c = song_lookup (pSong->name);

      for (i = 0; i < top_song; i++)
	if (i != c)
	  new_table[j++] = song_table[i];

      free_string (pSong->name);
      free_string (pSong->group);
      for (j = 0; j < pSong->lines; j++)
	free_string (pSong->lyrics[j]);
      free_mem (song_table);
      song_table = new_table;
      top_song--;

      pSong = &song_table[0];
      ch->desc->pEdit = (void *) pSong;

      chprintln (ch, "Song deleted.");
    }

  return true;
}

Olc_Fun (sedit_delete)
{
  SocialData *pSocial;

  if (NullStr (argument))
    GetEdit (ch, SocialData, pSocial);
  else
    pSocial = social_lookup (argument);

  if (pSocial == NULL)
    {
      chprintln (ch, "No such social exists.");
      return false;
    }

  unlink_social (pSocial);
  free_social (pSocial);
  edit_done (ch);
  chprintln (ch, "Social deleted.");
  return true;
}


Olc_Fun (skedit_delete)
{
  SkillData *pSkill;

  GetEdit (ch, SkillData, pSkill);

  if (str_cmp (argument, "confirm"))
    {
      chprintln
	(ch, "Typing 'delete confirm' will permanetely remove this skill!");
      return false;
    }
  else
    {
      int i, j = 0, c;
      struct skill_type *new_table;

      alloc_mem (new_table, struct skill_type, top_skill);

      if (!new_table)
	{
	  chprintln (ch,
		     "Memory Allocation error!!! Unable to delete skill.");
	  return false;
	}

      c = skill_lookup (pSkill->name);

      for (i = 0; i < top_skill; i++)
	if (i != c)
	  new_table[j++] = skill_table[i];

      free_string (pSkill->name);
      free_mem (pSkill->skill_level);
      free_mem (pSkill->rating);
      free_string (pSkill->noun_damage);
      free_string (pSkill->msg_off);
      free_string (pSkill->msg_obj);
      free_mem (skill_table);
      skill_table = new_table;
      top_skill--;

      pSkill = &skill_table[0];
      edit_start (ch, pSkill, ED_SKILL);
      chprintln (ch, "Skill deleted.");
    }

  return true;
}


Olc_Fun (raedit_delete)
{
  RaceData *pRace;
  CharData *rch;
  CharIndex *mch;
  int ihash;

  GetEdit (ch, RaceData, pRace);

  if (str_cmp (argument, "confirm"))
    {
      chprintln
	(ch, "Typing 'delete confirm' will permanetely remove this race!");
      return false;
    }
  else
    {
      for (ihash = 0; ihash < MAX_KEY_HASH; ihash++)
	{
	  for (mch = char_index_hash[ihash]; mch; mch = mch->next)
	    {
	      if (mch->race == pRace)
		{
		  mch->race = default_race;
		  SetBit (mch->area->area_flags, AREA_CHANGED);
		}
	    }
	}

      for (rch = char_first; rch != NULL; rch = rch->next)
	{
	  if (rch->race == pRace)
	    {
	      if (IsNPC (rch))
		rch->race = default_race;
	      else
		rch->race = default_race;
	    }
	}

      UnLink (pRace, race, next, prev);
      free_race (pRace);
      pRace = race_first;
      edit_start (ch, pRace, ED_RACE);
      chprintln (ch, "Race deleted.");
    }

  return true;
}


Olc_Fun (mpedit_delete)
{
  ProgCode *curr, *next;
  vnum_t value = atov (argument);
  AreaData *ad;

  if (NullStr (argument) || value < 1)
    {
      if (ch)
	cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  if (get_prog_index (value, PRG_MPROG) == NULL)
    {
      if (ch)
	chprintln (ch, "Mob program not found.");
      return false;
    }

  ad = get_vnum_area (value);
  if (ad == NULL)
    {
      if (ch)
	chprintln (ch, "Mob program not assigned to an area.");
      return false;
    }

  if (ch && !IsBuilder (ch, ad))
    {
      chprintln (ch, "Insufficient security to create MobProgs.");
      return false;
    }

  unlink_mprog (value);
  for (curr = mprog_first; curr != NULL; curr = next)
    {
      next = curr->next;

      if (curr->vnum != value)
	continue;

      UnLink (curr, mprog, next, prev);

      free_mprog (curr);
    }
  SetBit (ad->area_flags, AREA_CHANGED);
  if (ch)
    chprintln (ch, "MobProgram Code Deleted.");

  return true;
}


Olc_Fun (opedit_delete)
{
  ProgCode *curr, *next;
  vnum_t value = atov (argument);
  AreaData *ad;

  if (NullStr (argument) || value < 1)
    {
      if (ch)
	cmd_syntax (ch, NULL, n_fun, "<vnum", NULL);
      return false;
    }

  if (get_prog_index (value, PRG_OPROG) == NULL)
    {
      if (ch)
	chprintln (ch, "Obj program not found.");
      return false;
    }

  ad = get_vnum_area (value);
  if (ad == NULL)
    {
      if (ch)
	chprintln (ch, "Obj program not assigned to an area.");
      return false;
    }

  if (ch && !IsBuilder (ch, ad))
    {
      chprintln (ch, "Insufficient security to create ObjProgs.");
      return false;
    }

  unlink_oprog (value);
  for (curr = oprog_first; curr != NULL; curr = next)
    {
      next = curr->next;

      if (curr->vnum != value)
	continue;

      UnLink (curr, oprog, next, prev);

      free_oprog (curr);
    }
  SetBit (ad->area_flags, AREA_CHANGED);
  if (ch)
    chprintln (ch, "Obj Program Code Deleted.");

  return true;
}


Olc_Fun (rpedit_delete)
{
  ProgCode *curr, *next;
  vnum_t value = atov (argument);
  AreaData *ad;

  if (NullStr (argument) || value < 1)
    {
      if (ch)
	cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  if (get_prog_index (value, PRG_RPROG) == NULL)
    {
      if (ch)
	chprintln (ch, "Room program not found.");
      return false;
    }

  ad = get_vnum_area (value);
  if (ad == NULL)
    {
      if (ch)
	chprintln (ch, "Room program not assigned to an area.");
      return false;
    }

  if (ch && !IsBuilder (ch, ad))
    {
      chprintln (ch, "Insufficient security to create RoomProgs.");
      return false;
    }

  unlink_rprog (value);
  for (curr = rprog_first; curr != NULL; curr = next)
    {
      next = curr->next;

      if (curr->vnum != value)
	continue;
      UnLink (curr, rprog, next, prev);

      free_rprog (curr);
    }
  SetBit (ad->area_flags, AREA_CHANGED);
  if (ch)
    chprintln (ch, "Room Program Code Deleted.");

  return true;
}


Olc_Fun (gredit_delete)
{
  GroupData *pGroup;

  GetEdit (ch, GroupData, pGroup);

  if (str_cmp (argument, "confirm"))
    {
      chprintln
	(ch, "Typing 'delete confirm' will permanetely remove this group!");
      return false;
    }
  else
    {
      int i, j = 0, c;
      struct group_type *new_table;

      alloc_mem (new_table, struct group_type, top_group);

      if (!new_table)
	{
	  chprintln (ch,
		     "Memory Allocation error!!! Unable to delete group.");
	  return false;
	}

      c = group_lookup (pGroup->name);

      for (i = 0; i < top_group; i++)
	if (i != c)
	  new_table[j++] = group_table[i];

      free_string (pGroup->name);
      for (j = 0; j < MAX_IN_GROUP; j++)
	free_string (pGroup->spells[j]);
      free_mem (pGroup->rating);
      free_mem (group_table);
      group_table = new_table;
      top_group--;

      pGroup = &group_table[0];
      edit_start (ch, pGroup, ED_GROUP);
      chprintln (ch, "Group deleted.");
    }

  return true;
}


Olc_Fun (dedit_delete)
{
  DeityData *pDeity;

  GetEdit (ch, DeityData, pDeity);

  if (str_cmp (argument, "confirm"))
    {
      chprintln
	(ch, "Typing 'delete confirm' will permanetely remove this deity!");
      return false;
    }
  else
    {
      UnLink (pDeity, deity, next, prev);
      free_deity (pDeity);
      pDeity = deity_first;
      ch->desc->pEdit = (void *) pDeity;

      chprintln (ch, "Deity deleted.");
    }

  return true;
}


Olc_Fun (cmdedit_delete)
{
  CmdData *pCmd;

  GetEdit (ch, CmdData, pCmd);

  if (!NullStr (argument))
    {
      if (IsSet (pCmd->flags, CMD_DELETED))
	{
	  chprintln (ch, "Delete cancelled.");
	  return true;
	}
      else
	chprintln (ch, "No deletion was in progress.");

      return false;
    }

  if (!IsSet (pCmd->flags, CMD_DELETED))
    {
      chprintln
	(ch,
	 "Typing 'delete' again will permanetely remove this command!"
	 NEWLINE "-or- 'delete' with any argument will cancel the deletion.");
      SetBit (pCmd->flags, CMD_DELETED);
      return false;
    }
  else
    {
      unlink_command (pCmd);
      free_cmd (pCmd);
      pCmd = cmd_first;
      edit_start (ch, pCmd, ED_CMD);
      chprintln (ch, "Command deleted.");
    }

  return true;
}


Olc_Fun (cledit_delete)
{
  ClassData *pClass;

  GetEdit (ch, ClassData, pClass);

  if (str_cmp (argument, "confirm"))
    {
      chprintln
	(ch, "Typing 'delete confirm' will permanetely remove this class!");
      return false;
    }
  else
    {
      int i, j = 0, c;
      struct class_type *new_table;
      RaceData *race;
      CharData *pch;

      alloc_mem (new_table, struct class_type, top_class);

      if (!new_table)
	{
	  chprintln (ch,
		     "Memory Allocation error!!! Unable to delete class.");
	  return false;
	}

      c = class_lookup (pClass->name[0]);

      for (pch = player_first; pch != NULL; pch = pch->next_player)
	{
	  for (i = 0, j = 0; i < MAX_MCLASS; i++)
	    {
	      if (pch->Class[i] == c)
		{
		  pch->Class[i] = -1;
		  j++;
		  continue;
		}
	      pch->Class[i - j] = pch->Class[i];
	      pch->Class[i - j + 1] = -1;
	    }
	}
      for (i = 0; i < top_class; i++)
	if (i != c)
	  new_table[j++] = class_table[i];

      for (i = 0; i < MAX_REMORT; i++)
	free_string (pClass->name[i]);
      free_string (pClass->description);
      free_mem (class_table);
      class_table = new_table;
      top_class--;

      for (i = 0; i < top_skill; i++)
	{
	  realloc_mem (skill_table[i].rating, int, top_class);
	  realloc_mem (skill_table[i].skill_level, int, top_class);
	}

      for (i = 0; i < top_group; i++)
	realloc_mem (group_table[i].rating, int, top_class);

      for (race = race_first; race; race = race->next)
	realloc_mem (race->class_mult, int, top_class);

      pClass = &class_table[0];
      edit_start (ch, pClass, ED_CLASS);
      chprintln (ch, "Class deleted.");
    }

  return true;
}


Olc_Fun (hedit_delete)
{
  HelpData *pHelp;

  GetEdit (ch, HelpData, pHelp);

  if (str_cmp (argument, "confirm"))
    {
      chprintln
	(ch,
	 "Typing 'delete confirm' will permanetely remove this help file!");
      return false;
    }
  else
    {
      stop_editing (pHelp);

      UnLink (pHelp, help, next, prev);

      free_help (pHelp);

      chprintln (ch, "Ok.");
    }
  return true;
}

#endif