/************************************************************************** * 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