tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
#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;
}