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 "ctype.h"
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "define.h"
#include "struct.h"


/*
 *   ACT
 */


void act( char_data* to, const char* text, visible_data* ch,
  visible_data* obj, const char* string1, const char* string2 )
{
  char  tmp  [ 3*MAX_STRING_LENGTH ];
  char  buf  [ 3*MAX_STRING_LENGTH ];

  if( to == NULL || to->link == NULL || *text == '\0' )
    return;

  act_print( buf, text, ch, NULL, obj, NULL, string1, string2, to );   
  convert_to_ansi( to, buf, tmp );
  send( to, tmp );
}


void act( char_data* to, const char* text, visible_data* ch,
  visible_data* victim, visible_data* obj1, visible_data* obj2 )
{
  char  tmp  [ 3*MAX_STRING_LENGTH ];
  char  buf  [ 3*MAX_STRING_LENGTH ];

  if( to == NULL || to->link == NULL || *text == '\0' )
    return;

  act_print( buf, text, ch, victim, obj1, obj2, NULL, NULL, to );   
  convert_to_ansi( to, buf, tmp );
  send( to, tmp );
}


/*
 *   ACT_AREA
 */


void act_area( const char* text, char_data* ch, char_data* victim,
  visible_data* obj )
{
  room_data*  room;
  char_data*   rch;

  if( ( room = Room( ch->array->where ) ) == NULL )
    return;

  for( room = room->area->room_first; room != NULL; room = room->next ) 
    if( room != ch->array->where )
      for( int i = 0; i < room->contents; i++ ) 
        if( ( rch = character( room->contents[i] ) ) != NULL
          && rch->position > POS_SLEEPING )
          act( rch, text, ch, victim, obj );
}


/*
 *   ACT_NOTCHAR
 */


void act_notchar( const char* text, char_data* ch, visible_data* obj1,
  visible_data* obj2 )
{
  char_data* rch;

  for( int i = 0; i < *ch->array; i++ ) 
    if( ( rch = character( ch->array->list[i] ) ) != NULL
      && rch != ch && rch->position > POS_SLEEPING 
      && rch->Accept_Msg( ch ) )
      act( rch, text, ch, obj1, obj2 );
}


void act_notchar( const char* text, char_data* ch, const char* string1,
  const char* string2 )
{
  char_data* rch;

  for( int i = 0; i < *ch->array; i++ ) 
    if( ( rch = character( ch->array->list[i] ) ) != NULL 
      && rch != ch && rch->position > POS_SLEEPING  
      && rch->Accept_Msg( ch ) )
      act( rch, text, ch, NULL, string1, string2 );   
}


void act_notchar( const char* text, char_data* ch, visible_data* obj,
  const char* string1, const char* string2 )
{
  char_data* rch;

  for( int i = 0; i < *ch->array; i++ ) 
    if( ( rch = character( ch->array->list[i] ) ) != NULL
      && rch != ch && rch->position > POS_SLEEPING  
      && rch->Accept_Msg( ch ) )
      act( rch, text, ch, obj, string1, string2 );   
}


/* 
 *   ACT_ROOM
 */


void act_room( room_data* room, const char* text, const char* string1,
  const char* string2 )
{
  char_data* rch;

  for( int i = 0; i < room->contents; i++ ) 
    if( ( rch = character( room->contents[i] ) ) != NULL
      && rch->position > POS_SLEEPING )
      act( rch, text, NULL, NULL, string1, string2 );   
}


void act_room( room_data* room, const char* text, 
  visible_data* obj1, visible_data* obj2 )
{
  char_data* rch;

  for( int i = 0; i < room->contents; i++ ) 
    if( ( rch = character( room->contents[i] ) ) != NULL
      && rch->position > POS_SLEEPING )
      act( rch, text, obj1, obj2 );
}


/*
 *   ACT_NEITHER
 */


void act_neither( const char* text, char_data* ch, char_data* victim,
  visible_data* obj1, visible_data* obj2 )
{
  char_data* rch;
 
  for( int i = 0; i < *ch->array; i++ ) 
    if( ( rch = character( ch->array->list[i] ) ) != NULL
      && rch != ch && rch != victim && rch->position > POS_SLEEPING
      && rch->Accept_Msg( ch ) )
      act( rch, text, ch, victim, obj1, obj2 );
}


/*
 *  MAIN PRINT ROUTINE FOR ACT
 */


void act_print( char* out, const char* in, visible_data* ch,
  visible_data* victim, visible_data* obj1, visible_data* obj2,
  const char* string1, const char* string2, char_data* to )
{
  char_data*  pers;
  visible_data*  obj3;
  const char*     sub;
  char*         start;

  start = out;

  for( ; ; ) {
    if( *in != '$' ) {
      *out++ = *in;
      }
    else {
      pers = character( islower( *(++in) ) ? ch : victim );

      switch( toupper( *in ) ) {
       default:
        sub = "[BUG]";
        break;

       case '$':
        sub = "$";
        break;       

       case '1':
        sub = ( ch == NULL ? "[BUG]" : ch->Name( to, ch->selected ) );
        break;

       case '2':
        sub = ( victim == NULL ? "[BUG]" :
          victim->Name( to, victim->selected ) );
        break;

       case '3':
        sub = ( obj1 == NULL ? "[BUG]" : obj1->Name( to, obj1->selected ) );
        break;

       case 'P':
        obj3 = ( *in == 'p' ? obj1 : obj2 );
        sub = ( obj3 == NULL ? "[BUG]" : obj3->Name( to, obj3->selected ) );
        break;

       case 'D' :
       case 'T' :
        sub = ( *in == 't' ? string1 : string2 );
        if( sub == NULL )
          sub = "[BUG]";
        break;

       case 'N':
        sub = ( pers == NULL ? "[BUG]" : pers->Name( to ) );
        break;

       case 'E':
        sub = ( pers == NULL ? "[BUG]" : pers->He_She( to ) );
        break;

       case 'M':
        sub = ( pers == NULL ? "[BUG]" : pers->Him_Her( to ) );
        break;
 
       case 'S':
        sub = ( pers == NULL ? "[BUG]" : pers->His_Her( to ) );
        break;
        }
      strcpy( out, sub );
      out += strlen( sub );
      }
    if( *in++ == '\0' )
      break;
    }

  *start = toupper( *start );
  out--;

  if( out != start ) {
    if( *(out-1) == '\r' ) 
      return;
    }

  strcpy( out, "\n\r" );
}