/*
* RAM $Id: olc_mpcode.c 67 2009-01-05 00:39:32Z quixadhal $
*/
/* 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 "interp.h"
#include "tables.h"
#include "strings.h"
#include "olc.h"
#include "db.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 mpedit( CHAR_DATA *ch, const char *argument )
{
MPROG_CODE *pMcode = NULL;
char arg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char command[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char local_argument[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
const char *lap = local_argument;
int cmd = 0;
AREA_DATA *ad = NULL;
smash_tilde( local_argument );
strcpy( arg, argument );
lap = one_argument( lap, 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 ) )
{
ch_printf( ch, "MPEdit: Insufficient security to modify code.\r\n" );
edit_done( ch );
return;
}
}
if ( command[0] == '\0' )
{
mpedit_show( ch, lap );
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, lap ) && pMcode )
if ( ( ad = get_vnum_area( pMcode->vnum ) ) != NULL )
SET_BIT( ad->area_flags, AREA_CHANGED );
return;
}
}
interpret( ch, arg );
return;
}
void do_mpedit( CHAR_DATA *ch, const char *argument )
{
MPROG_CODE *pMcode = NULL;
char command[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
argument = one_argument( argument, command );
if ( is_number( command ) )
{
int vnum = atoi( command );
AREA_DATA *ad = NULL;
if ( ( pMcode = get_mprog_index( vnum ) ) == NULL )
{
ch_printf( ch, "MPEdit: That vnum does not exist.\r\n" );
return;
}
ad = get_vnum_area( vnum );
if ( ad == NULL )
{
ch_printf( ch, "MPEdit: VNUM not assigned to any area.\r\n" );
return;
}
if ( !IS_BUILDER( ch, ad ) )
{
ch_printf( ch, "MPEdit: Insufficient security to modify area.\r\n" );
return;
}
ch->desc->pEdit = ( void * ) pMcode;
ch->desc->editor = ED_MPCODE;
return;
}
if ( !str_cmp( command, "create" ) )
{
if ( argument[0] == '\0' )
{
ch_printf( ch, "Syntax: mpedit create [vnum]\r\n" );
return;
}
mpedit_create( ch, argument );
return;
}
ch_printf( ch, "Syntax: mpedit [vnum]\r\n" );
ch_printf( ch, " mpedit create [vnum]\r\n" );
return;
}
bool mpedit_create( CHAR_DATA *ch, const char *argument )
{
MPROG_CODE *pMcode = NULL;
int value = atoi( argument );
AREA_DATA *ad = NULL;
if ( IS_NULLSTR( argument ) || value < 1 )
{
ch_printf( ch, "Syntax: mpedit create [vnum]\r\n" );
return false;
}
ad = get_vnum_area( value );
if ( ad == NULL )
{
ch_printf( ch, "MPEdit: VNUM not assigned to any area.\r\n" );
return false;
}
if ( !IS_BUILDER( ch, ad ) )
{
ch_printf( ch, "MPEdit: Insufficient security to modify area.\r\n" );
return false;
}
if ( get_mprog_index( value ) )
{
ch_printf( ch, "MPEdit: Code vnum already exists.\r\n" );
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;
ch_printf( ch, "MobProgram Code Created.\r\n" );
return true;
}
bool mpedit_show( CHAR_DATA *ch, const char *argument )
{
MPROG_CODE *pMcode = NULL;
EDIT_MPCODE( ch, pMcode );
ch_printf( ch, "Vnum: [%d]\r\n" "Code:\r\n%s\r\n", pMcode->vnum, pMcode->code );
return false;
}
bool mpedit_code( CHAR_DATA *ch, const char *argument )
{
MPROG_CODE *pMcode = NULL;
EDIT_MPCODE( ch, pMcode );
if ( argument[0] == '\0' )
{
string_append( ch, &pMcode->code );
return true;
}
ch_printf( ch, "Syntax: code\r\n" );
return false;
}
bool mpedit_list( CHAR_DATA *ch, const char *argument )
{
int count = 1;
MPROG_CODE *mprg = NULL;
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
BUFFER *buffer = NULL;
bool fAll = !str_cmp( argument, "all" );
char blah = '\0';
AREA_DATA *ad = NULL;
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) %5d\r\n", count, blah, mprg->vnum );
add_buf( buffer, buf );
count++;
}
if ( count == 1 )
{
if ( fAll )
add_buf( buffer, "No existing MobPrograms.\r\n" );
else
add_buf( buffer, "No existing MobPrograms in this area.\r\n" );
}
page_to_char( buf_string( buffer ), ch );
free_buf( buffer );
return false;
}