#include <sys/types.h>
#include <stdio.h>
#include "stdlib.h"
#include "define.h"
#include "struct.h"
const char* mprog_trigger[ MAX_MPROG_TRIGGER ] = { "entering",
"leaving", "asking", "none", "death", "kill", "give", "reset", "tell",
"skin", "timer", "attack", "order" };
const char* mprog_value[ MAX_MPROG_TRIGGER ] = { "direction",
"direction", "unused", "direction" };
/*
* MPROG_DATA CLASS
*/
void extract( mprog_data* mprog, wizard_data* wizard )
{
for( int i = 0; i < mprog->data; i++ ) {
wizard->mpdata_edit = mprog->data[i];
extract( wizard, offset( &wizard->mpdata_edit, wizard ), "mpdata" );
}
wizard->mprog_edit = mprog;
extract( wizard, offset( &wizard->mprog_edit, wizard ), "mprog" );
}
/*
* DISPLAY ROUTINE
*/
void mprog_data :: display( char_data* ch )
{
mprog_data* mprog;
int i = 0;
if( species == NULL ) {
send( ch, "%-10s %-10s %s\n\r", "??", "Mprog", "Null Species??" );
return;
}
for( mprog = species->mprog; mprog != this && mprog != NULL;
mprog = mprog->next, i++ );
if( mprog == NULL ) {
send( ch, "Mob %-11d %-20s %s\n\r", species->vnum, "Fight Code",
species->descr->name );
}
else {
send( ch, "Mob %-11d Mprog %-8d %s\n\r", species->vnum, i,
species->descr->name );
}
return;
}
/*
* EDITING FUNCTIONS
*/
void do_mpedit( char_data* ch, char* argument )
{
char arg [ MAX_STRING_LENGTH ];
char buf [ MAX_STRING_LENGTH ];
mprog_data* mprog;
species_data* species;
wizard_data* wizard;
int i;
wizard = (wizard_data*) ch;
if( ( species = wizard->mob_edit ) == NULL ) {
send( "You aren't editing any mob.\n\r", ch );
return;
}
if( *argument == '\0' ) {
if( ( mprog = species->mprog ) == NULL ) {
send( "This mob has no programs.\n\r", ch );
return;
}
for( i = 0, mprog = species->mprog; mprog != NULL;
mprog = mprog->next ) {
sprintf( buf, "[%2d] %20s %s\n\r", ++i,
mprog_trigger[mprog->trigger], mprog->string );
send( buf, ch );
}
return;
}
argument = one_argument( argument, arg );
if( is_number( arg ) ) {
i = atoi( arg );
for( mprog = species->mprog; mprog != NULL && i != 1;
mprog = mprog->next, i-- );
if( mprog == NULL ) {
send( ch, "No mprog by that number.\n\r" );
return;
}
wizard->mprog_edit = mprog;
wizard->mpdata_edit = NULL;
send( "You now edit that mprog.\n\r", ch );
return;
}
if( !ch->can_edit( species ) )
return;
if( !strcasecmp( arg, "new" ) ) {
mprog = new mprog_data;
mprog->next = NULL;
mprog->trigger = 0;
mprog->value = -1;
mprog->string = empty_string;
mprog->code = empty_string;
wizard->mprog_edit = mprog;
append( species->mprog, mprog );
send( ch, "Mprog added.\n\r" );
return;
}
if( !strcasecmp( arg, "delete" ) ) {
if( ( mprog = wizard->mprog_edit ) == NULL ) {
send( "You aren't editing any mprog.\n\r", ch );
return;
}
remove( species->mprog, mprog );
extract( mprog, wizard );
delete mprog;
send( ch, "Mprog deleted.\n\r" );
return;
}
send( ch, "Illegal syntax.\n\r" );
}
void do_mpcode( char_data* ch, char *argument )
{
char tmp [ MAX_STRING_LENGTH ];
program_data* mprog;
species_data* species;
wizard_data* wizard;
wizard = (wizard_data*) ch;
if( ( species = wizard->mob_edit ) == NULL ) {
send( "You aren't editing any mob - use medit <mob>.\n\r", ch );
return;
}
if( *argument != '\0' ) {
if( !ch->can_edit( species ) )
return;
sprintf( tmp, "mpc: %s", argument );
mob_log( ch, species->vnum, tmp );
zero_exp( species );
}
if( ( mprog = wizard->mprog_edit ) == NULL )
mprog = species->attack;
var_ch = ch;
mprog->code = edit_string( ch, argument, mprog->code, MEM_MPROG );
compile( mprog );
if( mprog == species->attack )
mprog->active = 1;
return;
}
void do_mpdata( char_data* ch, char* argument )
{
program_data* mprog;
species_data* species;
wizard_data* wizard;
wizard = (wizard_data*) ch;
mprog = wizard->mprog_edit;
if( ( species = wizard->mob_edit ) == NULL ) {
send( ch, "You aren't editing any mob.\n\r" );
return;
}
if( mprog == NULL )
mprog = species->attack;
if( wizard->mpdata_edit != NULL ) {
if( !strcasecmp( argument, "exit" ) ) {
wizard->mpdata_edit = NULL;
send( ch, "Mpdata now operates on the data list.\n\r" );
return;
}
wizard->mpdata_edit->text = edit_string( ch,
argument, wizard->mpdata_edit->text, MEM_EXTRA );
}
else {
edit_extra( mprog->data, wizard,
offset( &wizard->mpdata_edit, wizard ), argument, "mprog" );
}
var_ch = ch;
compile( mprog );
if( mprog == species->attack )
mprog->active = 1;
return;
}
void do_mpstat( char_data* ch, char* )
{
char buf [ 3*MAX_STRING_LENGTH ];
mprog_data* mprog;
wizard_data* wizard;
wizard = (wizard_data*) ch;
if( ( mprog = wizard->mprog_edit ) == NULL ) {
send( "You aren't editing any mprog.\n\r", ch );
return;
}
page( ch, "%10s : %s\n\r", "Trigger", mprog_trigger[ mprog->trigger ] );
page( ch, "%10s : %d\n\r", "Value", mprog->value );
page( ch, "%10s : %s\n\r\n\r", "String", mprog->string );
sprintf( buf, "[Code]\n\r%s\n\r", mprog->code );
page( ch, buf );
show_extras( ch, mprog->data );
return;
}
void do_mpset( char_data* ch, char *argument )
{
char buf [ MAX_STRING_LENGTH ];
mprog_data* mprog;
wizard_data* wizard;
wizard = (wizard_data*) ch;
if( ( mprog = wizard->mprog_edit ) == NULL ) {
send( ch, "You aren't editing any mprog.\n\r" );
return;
}
if( *argument == '\0' ) {
do_mpstat( ch, argument );
return;
}
if( !ch->can_edit( wizard->mob_edit ) )
return;
if( matches( argument, "trigger" ) ) {
set_type( ch, argument, mprog->trigger, "Trigger",
"mprog", MAX_MPROG_TRIGGER, mprog_trigger );
return;
}
if( matches( argument, "value" ) ) {
mprog->value = atoi( argument );
sprintf( buf, "Value on mprog set to %d.\n\r", mprog->value );
send( buf, ch );
return;
}
if( matches( argument, "string" ) ) {
set_string( ch, argument, mprog->string,
"string", MEM_MPROG );
return;
}
send( ch, "Syntax: mpset <field> <value>\n\r" );
return;
}
void do_mpflag( char_data* ch, char* )
{
send( ch, "Under construction.\n\r" );
return;
}
/*
* ASK ROUTINE
*/
void do_ask( char_data* ch, char* argument )
{
char arg [ MAX_INPUT_LENGTH ];
char_data* victim;
mprog_data* mprog;
if( *argument == '\0' ) {
send( ch, "Ask whom?\n\r" );
return;
}
argument = one_argument( argument, arg );
if( ( victim = one_character( ch, arg, "ask",
ch->array ) ) == NULL )
return;
if( victim->pcdata != NULL ) {
send( ch, "They seem to ignore your request.\n\r" );
return;
}
if( !strcasecmp( "about ", argument ) )
argument += 6;
else if( !strcasecmp( "for ", argument ) )
argument += 4;
skip_spaces( argument );
if( *argument == '\0' ) {
send( ch, "Ask about what?\n\r" );
return;
}
for( mprog = victim->species->mprog; mprog != NULL; mprog = mprog->next )
if( mprog->trigger == MPROG_TRIGGER_ASKING
&& is_name( argument, mprog->string ) ) {
var_ch = ch;
var_mob = victim;
var_room = ch->in_room;
execute( mprog );
return;
}
for( mprog = victim->species->mprog; mprog != NULL; mprog = mprog->next )
if( mprog->trigger == MPROG_TRIGGER_ASKING
&& is_name( "default", mprog->string ) ) {
var_ch = ch;
var_mob = victim;
var_room = ch->in_room;
execute( mprog );
return;
}
process_tell( victim, ch, "I know nothing about that." );
return;
}