/************************************************************************** * 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-2002 by Ryan Jennings * * http://1stmud.dlmud.com/ <r-jenn@shaw.ca> * ***************************************************************************/ /* The following code is based on ILAB OLC by Jason Dinkel */ /* Mobprogram code by Lordrom for Nevermore Mud */ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "tables.h" #include "olc.h" #include "recycle.h" #include "interp.h" #define MPEDIT( fun ) bool fun(CHAR_DATA *ch, const char*argument) void unlink_mprog (vnum_t pnum) { MPROG_LIST *list, *list_next; MOB_INDEX_DATA *pMob; vnum_t vnum = 0; int nMatch = 0, count, pos = 0; for (vnum = 0; nMatch < top_mob_index; vnum++) { if ((pMob = get_mob_index (vnum)) == NULL) continue; nMatch++; count = -1; for (list = pMob->mprogs; list != NULL; list = list_next) { list_next = list->next; count++; if (list->vnum != pnum) continue; if (count == 0) { REMOVE_BIT (pMob->mprog_flags, pMob->mprogs->trig_type); list = pMob->mprogs; pMob->mprogs = list->next; free_mprog (list); } else { while ((list_next = list->next) && (++pos < count)) list = list_next; if (list_next) { REMOVE_BIT (pMob->mprog_flags, list_next->trig_type); list->next = list_next->next; free_mprog (list_next); } } } } } void mpedit (CHAR_DATA * ch, char *argument) { MPROG_CODE *pMcode; AREA_DATA *ad; EDIT_MPCODE (ch, pMcode); if (pMcode) { ad = get_vnum_area (pMcode->vnum); if (ad == NULL) { edit_done (ch); return; } if (!IS_BUILDER (ch, ad)) { chprintln (ch, "MPEdit: Insufficient security to modify code."); edit_done (ch); return; } } if (emptystring (argument)) { mpedit_show (ch, argument); return; } if (!str_cmp (argument, "done")) { edit_done (ch); return; } if (!process_olc_command (ch, argument, mprog_olc_comm_table)) interpret (ch, argument); return; } CH_CMD (do_mpedit) { MPROG_CODE *pMcode; char command[MAX_INPUT_LENGTH]; argument = one_argument (argument, command); if (is_number (command)) { vnum_t vnum = atol (command); AREA_DATA *ad; if ((pMcode = get_mprog_index (vnum)) == NULL) { chprintln (ch, "MPEdit : That vnum does not exist."); return; } ad = get_vnum_area (vnum); if (ad == NULL) { chprint (ch, "MPEdit : vnum_t no asignado a ningun area.\n\r"); return; } if (!IS_BUILDER (ch, ad)) { chprintln (ch, "MPEdit : Insuficiente seguridad para editar area."); return; } edit_start (ch, pMcode, ED_MPCODE); return; } if (!str_cmp (command, "create")) { if (argument[0] == '\0') { chprintln (ch, "Sintaxis : mpedit create [vnum]"); return; } mpedit_create (ch, argument); return; } if (!str_cmp (command, "delete")) { if (argument[0] == '\0') { chprintln (ch, "Syntax: mpedit delete [vnum]"); return; } mpedit_delete (ch, argument); return; } chprintln (ch, "Sintaxis : mpedit [vnum]"); chprintln (ch, " mpedit create [vnum]"); return; } MPEDIT (mpedit_create) { MPROG_CODE *pMcode; vnum_t value = atol (argument); AREA_DATA *ad; if (IS_NULLSTR (argument) || value < 1) { chprintln (ch, "Sintaxis : mpedit create [vnum]"); return FALSE; } ad = get_vnum_area (value); if (ad == NULL) { chprintln (ch, "MPEdit : vnum_t no asignado a ningun area."); return FALSE; } if (!IS_BUILDER (ch, ad)) { chprintln (ch, "MPEdit : Insuficiente seguridad para crear MobProgs."); return FALSE; } if (get_mprog_index (value)) { chprintln (ch, "MPEdit: Code vnum already exists."); return FALSE; } pMcode = new_mpcode (); pMcode->vnum = value; pMcode->next = mprog_list; mprog_list = pMcode; edit_start (ch, pMcode, ED_MPCODE); chprintln (ch, "MobProgram Code Created."); return TRUE; } MPEDIT (mpedit_show) { MPROG_CODE *pMcode; char buf[MAX_STRING_LENGTH]; EDIT_MPCODE (ch, pMcode); sprintf (buf, "Vnum: [%ld]\n\r" "Code:\n\r%s\n\r", pMcode->vnum, pMcode->code); chprint (ch, buf); return FALSE; } MPEDIT (mpedit_list) { int count = 1; MPROG_CODE *mprg; char buf[MAX_STRING_LENGTH]; BUFFER *buffer; bool fAll = !str_cmp (argument, "all"); char blah; AREA_DATA *ad; buffer = new_buf (); for (mprg = mprog_list; mprg != NULL; mprg = mprg->next) if (fAll || ENTRE (ch->in_room->area->min_vnum, mprg->vnum, ch->in_room->area->max_vnum)) { ad = get_vnum_area (mprg->vnum); if (ad == NULL) blah = '?'; else if (IS_BUILDER (ch, ad)) blah = '*'; else blah = ' '; sprintf (buf, "[%3d] (%c) %5ld\n\r", count, blah, mprg->vnum); add_buf (buffer, buf); count++; } if (count == 1) { if (fAll) add_buf (buffer, "No existen MobPrograms.\n\r"); else add_buf (buffer, "No existen MobPrograms en esta area.\n\r"); } page_to_char (buf_string (buffer), ch); free_buf (buffer); return FALSE; } MPEDIT (mpedit_delete) { MPROG_CODE *curr, *prev; vnum_t value = atol (argument); AREA_DATA *ad; if (IS_NULLSTR (argument) || value < 1) { chprintln (ch, "Syntax : mpedit create [vnum]"); return FALSE; } if (get_mprog_index (value) == NULL) { chprintln (ch, "MPEdit : Mob program not found."); return FALSE; } ad = get_vnum_area (value); if (ad == NULL) { chprintln (ch, "MPEdit : Mob program not assigned to an area."); return FALSE; } if (!IS_BUILDER (ch, ad)) { chprintln (ch, "MPEdit : Insufficient security to create MobProgs."); return FALSE; } unlink_mprog (value); prev = NULL; for (curr = mprog_list; curr != NULL; prev = curr, curr = curr->next) { if (curr->vnum != value) continue; if (prev == NULL) mprog_list = mprog_list->next; else prev->next = curr->next; free_mpcode (curr); } save_area (ad); chprintln (ch, "MobProgram Code Deleted."); return TRUE; }