/* 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, char*argument) const struct olc_cmd_type mpedit_table[] = { /* { command function }, */ {"commands", show_commands}, {"create", mpedit_create}, {"code", mpedit_code}, {"show", mpedit_show}, {"list", mpedit_list}, {"?", show_help}, {NULL, 0} }; void unlink_mprog ( VNUM pnum ) { MPROG_LIST *list, *list_next; MOB_INDEX_DATA *pMob; VNUM 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; char arg[MAX_INPUT_LENGTH]; char command[MAX_INPUT_LENGTH]; int cmd; AREA_DATA *ad; smash_tilde ( argument ); strcpy ( arg, argument ); argument = one_argument ( argument, command ); EDIT_MPCODE ( ch, pMcode ); if ( pMcode ) { ad = get_vnum_area ( pMcode->vnum ); if ( ad == NULL ) /* ??? */ { edit_done ( ch ); return; } if ( !IS_BUILDER ( ch, ad ) ) { chsend ( "MPEdit: Insufficient security to modify code.\n\r", ch ); edit_done ( ch ); return; } } if ( command[0] == '\0' ) { mpedit_show ( ch, argument ); return; } if ( !str_cmp ( command, "done" ) ) { edit_done ( ch ); return; } for ( cmd = 0; mpedit_table[cmd].name != NULL; cmd++ ) { if ( !str_prefix ( command, mpedit_table[cmd].name ) ) { if ( ( *mpedit_table[cmd].olc_fun ) ( ch, argument ) && pMcode ) if ( ( ad = get_vnum_area ( pMcode->vnum ) ) != NULL ) SET_BIT ( ad->area_flags, AREA_CHANGED ); return; } } interpret ( ch, arg ); return; } CH_CMD ( do_mpedit ) { MPROG_CODE *pMcode; char command[MAX_INPUT_LENGTH]; argument = one_argument ( argument, command ); if ( is_number ( command ) ) { VNUM vnum = atol ( command ); AREA_DATA *ad; if ( ( pMcode = get_mprog_index ( vnum ) ) == NULL ) { chsend ( "MPEdit : That vnum does not exist.\n\r", ch ); return; } ad = get_vnum_area ( vnum ); if ( ad == NULL ) { chsend ( "MPEdit : VNUM no asignado a ningun area.\n\r", ch ); return; } if ( !IS_BUILDER ( ch, ad ) ) { chsend ( "MPEdit : Insuficiente seguridad para editar area.\n\r", ch ); return; } ch->desc->pEdit = ( void * ) pMcode; ch->desc->editor = ED_MPCODE; return; } if ( !str_cmp ( command, "create" ) ) { if ( argument[0] == '\0' ) { chsend ( "Sintaxis : mpedit create [vnum]\n\r", ch ); return; } mpedit_create ( ch, argument ); return; } if ( !str_cmp ( command, "delete" ) ) { if ( argument[0] == '\0' ) { chsend ( "Syntax: mpedit delete [vnum]\n\r", ch ); return; } mpedit_delete ( ch, argument ); return; } chsend ( "Sintaxis : mpedit [vnum]\n\r", ch ); chsend ( " mpedit create [vnum]\n\r", ch ); return; } MPEDIT ( mpedit_create ) { MPROG_CODE *pMcode; VNUM value = atol ( argument ); AREA_DATA *ad; if ( IS_NULLSTR ( argument ) || value < 1 ) { chsend ( "Sintaxis : mpedit create [vnum]\n\r", ch ); return FALSE; } ad = get_vnum_area ( value ); if ( ad == NULL ) { chsend ( "MPEdit : VNUM no asignado a ningun area.\n\r", ch ); return FALSE; } if ( !IS_BUILDER ( ch, ad ) ) { chsend ( "MPEdit : Insuficiente seguridad para crear MobProgs.\n\r", ch ); return FALSE; } if ( get_mprog_index ( value ) ) { chsend ( "MPEdit: Code vnum already exists.\n\r", ch ); return FALSE; } pMcode = new_mpcode ( ); pMcode->vnum = value; pMcode->next = mprog_list; mprog_list = pMcode; ch->desc->pEdit = ( void * ) pMcode; ch->desc->editor = ED_MPCODE; chsend ( "MobProgram Code Created.\n\r", ch ); 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 ); chsend ( buf, ch ); return FALSE; } MPEDIT ( mpedit_code ) { MPROG_CODE *pMcode; EDIT_MPCODE ( ch, pMcode ); if ( argument[0] == '\0' ) { string_append ( ch, &pMcode->code ); return TRUE; } chsend ( "Syntax: code\n\r", ch ); 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 value = atol ( argument ); AREA_DATA *ad; if ( IS_NULLSTR ( argument ) || value < 1 ) { chsend ( "Syntax : mpedit create [vnum]\n\r", ch ); return FALSE; } if ( get_mprog_index ( value ) == NULL ) { chsend ( "MPEdit : Mob program not found.\n\r", ch ); return FALSE; } ad = get_vnum_area ( value ); if ( ad == NULL ) { chsend ( "MPEdit : Mob program not assigned to an area.\n\r", ch ); return FALSE; } if ( !IS_BUILDER ( ch, ad ) ) { chsend ( "MPEdit : Insufficient security to create MobProgs.\n\r", ch ); 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 ); chsend ( "MobProgram Code Deleted.\n\r", ch ); return TRUE; }