/************************************************************************** * 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-2003 by Ryan Jennings * * http://1stmud.dlmud.com/ <r-jenn@shaw.ca> * ***************************************************************************/ #include "merc.h" #include "tables.h" #include "olc.h" #include "recycle.h" #include "interp.h" void unlink_mprog(vnum_t pnum) { PROG_LIST *list, *list_next; MOB_INDEX_DATA *pMob; vnum_t vnum = 0; int nMatch = 0, count; for (vnum = 0; nMatch < top_mob_index; vnum++) { if ((pMob = get_mob_index(vnum)) == NULL) continue; nMatch++; count = -1; for (list = pMob->first_mprog; list != NULL; list = list_next) { list_next = list->next; count++; if (list->vnum != pnum) continue; REMOVE_BIT(pMob->mprog_flags, list->trig_type); UNLINK(list, pMob->first_mprog, pMob->last_mprog, next, prev); free_prog(list); } } } void unlink_oprog(vnum_t pnum) { PROG_LIST *list, *list_next; OBJ_INDEX_DATA *pObj; vnum_t vnum = 0; int nMatch = 0, count; for (vnum = 0; nMatch < top_obj_index; vnum++) { if ((pObj = get_obj_index(vnum)) == NULL) continue; nMatch++; count = -1; for (list = pObj->first_oprog; list != NULL; list = list_next) { list_next = list->next; count++; if (list->vnum != pnum) continue; REMOVE_BIT(pObj->oprog_flags, list->trig_type); UNLINK(list, pObj->first_oprog, pObj->last_oprog, next, prev); free_prog(list); } } } void unlink_rprog(vnum_t pnum) { PROG_LIST *list, *list_next; ROOM_INDEX_DATA *pRoom; vnum_t vnum = 0; int nMatch = 0, count; for (vnum = 0; nMatch < top_room; vnum++) { if ((pRoom = get_room_index(vnum)) == NULL) continue; nMatch++; count = -1; for (list = pRoom->first_rprog; list != NULL; list = list_next) { list_next = list->next; count++; if (list->vnum != pnum) continue; REMOVE_BIT(pRoom->rprog_flags, list->trig_type); UNLINK(list, pRoom->first_rprog, pRoom->last_rprog, next, prev); free_prog(list); } } } CH_CMD(do_mpedit) { PROG_CODE *pMcode; char command[MIL]; argument = one_argument(argument, command); if (is_number(command)) { vnum_t vnum = atol(command); AREA_DATA *ad; if ((pMcode = get_prog_index(vnum, PRG_MPROG)) == NULL) { chprintln(ch, "MPEdit : That vnum does not exist."); return; } ad = pMcode->area; if (ad == NULL) { chprintln(ch, "MPEdit : Vnum is not assigned an area."); return; } if (!IS_BUILDER(ch, ad)) { chprintln(ch, "MPEdit : Insufficient security to modify area."); return; } edit_start(ch, pMcode, ED_MPCODE); return; } if (!str_cmp(command, "create")) { if (IS_NULLSTR(argument)) { chprintln(ch, "Syntax : mpedit create [vnum]"); return; } mpedit_create(ch, argument); return; } if (!str_cmp(command, "delete")) { if (IS_NULLSTR(argument)) { chprintln(ch, "Syntax: mpedit delete [vnum]"); return; } mpedit_delete(ch, argument); return; } chprintln(ch, "Syntax : mpedit [vnum]"); chprintln(ch, " mpedit create [vnum]"); chprintln(ch, " mpedit delete [vnum]"); return; } CH_CMD(do_opedit) { PROG_CODE *pOcode; char command[MIL]; argument = one_argument(argument, command); if (is_number(command)) { vnum_t vnum = atol(command); AREA_DATA *ad; if ((pOcode = get_prog_index(vnum, PRG_OPROG)) == NULL) { chprintln(ch, "OPEdit : That vnum does not exist."); return; } ad = pOcode->area; if (ad == NULL) { chprintln(ch, "OPEdit : Vnum is not assigned an area."); return; } if (!IS_BUILDER(ch, ad)) { chprintln(ch, "OPEdit : Insufficient security to modify area."); return; } edit_start(ch, pOcode, ED_OPCODE); return; } if (!str_cmp(command, "create")) { if (IS_NULLSTR(argument)) { chprintln(ch, "Syntax : opedit create [vnum]"); return; } opedit_create(ch, argument); return; } if (!str_cmp(command, "delete")) { if (IS_NULLSTR(argument)) { chprintln(ch, "Syntax: opedit delete [vnum]"); return; } opedit_delete(ch, argument); return; } chprintln(ch, "Syntax : opedit [vnum]"); chprintln(ch, " opedit create [vnum]"); chprintln(ch, " opedit delete [vnum]"); return; } CH_CMD(do_rpedit) { PROG_CODE *pRcode; char command[MIL]; argument = one_argument(argument, command); if (is_number(command)) { vnum_t vnum = atol(command); AREA_DATA *ad; if ((pRcode = get_prog_index(vnum, PRG_RPROG)) == NULL) { chprintln(ch, "RPEdit : That vnum does not exist."); return; } ad = pRcode->area; if (ad == NULL) { chprintln(ch, "RPEdit : Vnum is not assigned an area."); return; } if (!IS_BUILDER(ch, ad)) { chprintln(ch, "RPEdit : Insufficient security to modify area."); return; } edit_start(ch, pRcode, ED_RPCODE); return; } if (!str_cmp(command, "create")) { if (IS_NULLSTR(argument)) { chprintln(ch, "Syntax : rpedit create [vnum]"); return; } rpedit_create(ch, argument); return; } if (!str_cmp(command, "delete")) { if (IS_NULLSTR(argument)) { chprintln(ch, "Syntax: rpedit delete [vnum]"); return; } rpedit_delete(ch, argument); return; } chprintln(ch, "Syntax : rpedit [vnum]"); chprintln(ch, " rpedit create [vnum]"); chprintln(ch, " rpedit delete [vnum]"); return; } OLCED(mpedit_create) { PROG_CODE *pMcode; vnum_t value = atol(argument); AREA_DATA *ad; if (IS_NULLSTR(argument) || value < 1) { chprintln(ch, "Syntax : mpedit create [vnum]"); return FALSE; } ad = get_vnum_area(value); if (ad == NULL) { chprintln(ch, "MPEdit : Vnum is not assigned an area."); return FALSE; } if (!IS_BUILDER(ch, ad)) { chprintln(ch, "MPEdit : Insufficient security to create MobProgs."); return FALSE; } if (get_prog_index(value, PRG_MPROG)) { chprintln(ch, "MPEdit: Code vnum already exists."); return FALSE; } pMcode = new_pcode(); pMcode->vnum = value; pMcode->area = ad; LINK(pMcode, mprog_first, mprog_last, next, prev); edit_start(ch, pMcode, ED_MPCODE); chprintln(ch, "MobProgram Code Created."); return TRUE; } OLCED(mpedit_delete) { PROG_CODE *curr, *next; vnum_t value = atol(argument); AREA_DATA *ad; if (IS_NULLSTR(argument) || value < 1) { if (ch) chprintln(ch, "Syntax : mpedit create [vnum]"); return FALSE; } if (get_prog_index(value, PRG_MPROG) == NULL) { if (ch) chprintln(ch, "MPEdit : Mob program not found."); return FALSE; } ad = get_vnum_area(value); if (ad == NULL) { if (ch) chprintln(ch, "MPEdit : Mob program not assigned to an area."); return FALSE; } if (ch && !IS_BUILDER(ch, ad)) { chprintln(ch, "MPEdit : 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_first, mprog_last, next, prev); free_pcode(curr); } SET_BIT(ad->area_flags, AREA_CHANGED); if (ch) chprintln(ch, "MobProgram Code Deleted."); return TRUE; } OLCED(opedit_create) { PROG_CODE *pOcode; vnum_t value = atol(argument); AREA_DATA *ad; if (IS_NULLSTR(argument) || value < 1) { chprintln(ch, "Syntax : opedit create [vnum]"); return FALSE; } ad = get_vnum_area(value); if (ad == NULL) { chprintln(ch, "OPEdit : Vnum is not assigned an area."); return FALSE; } if (!IS_BUILDER(ch, ad)) { chprintln(ch, "OPEdit : Insufficient security to create ObjProgs."); return FALSE; } if (get_prog_index(value, PRG_OPROG)) { chprintln(ch, "OPEdit: Code vnum already exists."); return FALSE; } pOcode = new_pcode(); pOcode->vnum = value; pOcode->area = ad; LINK(pOcode, oprog_first, oprog_last, next, prev); edit_start(ch, pOcode, ED_OPCODE); chprintln(ch, "ObjProgram Code Created."); return TRUE; } OLCED(opedit_delete) { PROG_CODE *curr, *next; vnum_t value = atol(argument); AREA_DATA *ad; if (IS_NULLSTR(argument) || value < 1) { if (ch) chprintln(ch, "Syntax : opedit create [vnum]"); return FALSE; } if (get_prog_index(value, PRG_OPROG) == NULL) { if (ch) chprintln(ch, "OPEdit : Obj program not found."); return FALSE; } ad = get_vnum_area(value); if (ad == NULL) { if (ch) chprintln(ch, "OPEdit : Obj program not assigned to an area."); return FALSE; } if (ch && !IS_BUILDER(ch, ad)) { chprintln(ch, "OPEdit : 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_first, oprog_last, next, prev); free_pcode(curr); } SET_BIT(ad->area_flags, AREA_CHANGED); if (ch) chprintln(ch, "Obj Program Code Deleted."); return TRUE; } OLCED(rpedit_create) { PROG_CODE *pRcode; vnum_t value = atol(argument); AREA_DATA *ad; if (IS_NULLSTR(argument) || value < 1) { chprintln(ch, "Syntax : rpedit create [vnum]"); return FALSE; } ad = get_vnum_area(value); if (ad == NULL) { chprintln(ch, "RPEdit : Vnum is not assigned an area."); return FALSE; } if (!IS_BUILDER(ch, ad)) { chprintln(ch, "RPEdit : Insufficient security to create RoomProgs."); return FALSE; } if (get_prog_index(value, PRG_RPROG)) { chprintln(ch, "RPEdit: Code vnum already exists."); return FALSE; } pRcode = new_pcode(); pRcode->vnum = value; pRcode->area = ad; LINK(pRcode, rprog_first, rprog_last, next, prev); edit_start(ch, pRcode, ED_RPCODE); chprintln(ch, "RoomProgram Code Created."); return TRUE; } OLCED(rpedit_delete) { PROG_CODE *curr, *next; vnum_t value = atol(argument); AREA_DATA *ad; if (IS_NULLSTR(argument) || value < 1) { if (ch) chprintln(ch, "Syntax : rpedit create [vnum]"); return FALSE; } if (get_prog_index(value, PRG_RPROG) == NULL) { if (ch) chprintln(ch, "RPEdit : Room program not found."); return FALSE; } ad = get_vnum_area(value); if (ad == NULL) { if (ch) chprintln(ch, "RPEdit : Room program not assigned to an area."); return FALSE; } if (ch && !IS_BUILDER(ch, ad)) { chprintln(ch, "RPEdit : 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_first, rprog_last, next, prev); free_pcode(curr); } SET_BIT(ad->area_flags, AREA_CHANGED); if (ch) chprintln(ch, "Room Program Code Deleted."); return TRUE; } OLCED(mpedit_show) { PROG_CODE *pMcode; BUFFER *buffer; EDIT_MPCODE(ch, pMcode); buffer = new_buf(); bprintln(buffer, draw_line(ch, NULL, 0)); bprintlnf(buffer, "Vnum: [%ld]\n\r" "Code:\n\r%s", pMcode->vnum, pMcode->code); bprintln(buffer, draw_line(ch, NULL, 0)); sendpage(ch, buf_string(buffer)); free_buf(buffer); return FALSE; } OLCED(opedit_show) { PROG_CODE *pOcode; BUFFER *buffer; EDIT_OPCODE(ch, pOcode); buffer = new_buf(); bprintln(buffer, draw_line(ch, NULL, 0)); bprintlnf(buffer, "Vnum: [%ld]\n\r" "Code:\n\r%s", pOcode->vnum, pOcode->code); bprintln(buffer, draw_line(ch, NULL, 0)); sendpage(ch, buf_string(buffer)); free_buf(buffer); return FALSE; } OLCED(rpedit_show) { PROG_CODE *pRcode; BUFFER *buffer; EDIT_RPCODE(ch, pRcode); buffer = new_buf(); bprintln(buffer, draw_line(ch, NULL, 0)); bprintlnf(buffer, "Vnum: [%ld]" "Code:\n\r%s", pRcode->vnum, pRcode->code); bprintlnf(buffer, draw_line(ch, NULL, 0)); sendpage(ch, buf_string(buffer)); free_buf(buffer); return FALSE; } OLCED(mpedit_list) { int count = 1; PROG_CODE *mprg; BUFFER *buffer; bool fAll = !str_cmp(argument, "all"); char blah; AREA_DATA *ad; buffer = new_buf(); for (mprg = mprog_first; mprg != NULL; mprg = mprg->next) if (fAll || ENTRE(ch->in_room->area->min_vnum - 1, mprg->vnum, ch->in_room->area->max_vnum + 1)) { ad = mprg->area; if (ad == NULL) blah = '?'; else if (IS_BUILDER(ch, ad)) blah = '*'; else blah = ' '; bprintlnf(buffer, "[%3d] (%c) %5ld", count, blah, mprg->vnum); count++; } if (count == 1) { if (fAll) bprintln(buffer, "No existing MobPrograms."); else bprintln(buffer, "No existing MobPrograms in this area."); } sendpage(ch, buf_string(buffer)); free_buf(buffer); return FALSE; } OLCED(opedit_list) { int count = 1; PROG_CODE *oprg; BUFFER *buffer; bool fAll = !str_cmp(argument, "all"); char blah; AREA_DATA *ad; buffer = new_buf(); for (oprg = oprog_first; oprg != NULL; oprg = oprg->next) if (fAll || ENTRE(ch->in_room->area->min_vnum - 1, oprg->vnum, ch->in_room->area->max_vnum + 1)) { ad = oprg->area; if (ad == NULL) blah = '?'; else if (IS_BUILDER(ch, ad)) blah = '*'; else blah = ' '; bprintlnf(buffer, "[%3d] (%c) %5ld", count, blah, oprg->vnum); count++; } if (count == 1) { if (fAll) bprintln(buffer, "No existing ObjPrograms."); else bprintln(buffer, "No existing ObjPrograms in this area."); } sendpage(ch, buf_string(buffer)); free_buf(buffer); return FALSE; } OLCED(rpedit_list) { int count = 1; PROG_CODE *rprg; BUFFER *buffer; bool fAll = !str_cmp(argument, "all"); char blah; AREA_DATA *ad; buffer = new_buf(); for (rprg = rprog_first; rprg != NULL; rprg = rprg->next) if (fAll || ENTRE(ch->in_room->area->min_vnum - 1, rprg->vnum, ch->in_room->area->max_vnum + 1)) { ad = rprg->area; if (ad == NULL) blah = '?'; else if (IS_BUILDER(ch, ad)) blah = '*'; else blah = ' '; bprintlnf(buffer, "[%3d] (%c) %5ld", count, blah, rprg->vnum); count++; } if (count == 1) { if (fAll) bprintln(buffer, "No existing RoomPrograms."); else bprintln(buffer, "No existing RoomPrograms in this area."); } sendpage(ch, buf_string(buffer)); free_buf(buffer); return FALSE; }