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 <syslog.h>
#include "define.h"
#include "struct.h"


/*
 *   APPEARANCE FUNCTIONS
 */


const char* appearance_string = "Your %s has now been set.  When you have\
 completed it, your %s and your description please type request avatar.\
 See help appearance and the identity command for more information.\n\r";

const char* unchangable_msg = "You may not edit your description, keywords,\
 or appearance once approved.\n\rYou may request an avatar to be unapprove\
 you after which you must be\n\rreapproved to gain levels.\n\r";


void do_appearance( char_data* ch, char* argument )
{
  if( is_confused_pet( ch ) || ch->pcdata == NULL )
    return;

  if( !has_permission( ch, PERM_APPROVE ) 
    && is_set( ch->pcdata->pfile->flags, PLR_APPROVED ) ) {
    send( ch, unchangable_msg );
    return;
    }
 
  if( *argument == '\0' ) {
    send( ch, "What do you want your appearance set to?\n\r" );
    return;
    }

  if( !strncasecmp( argument, "a ", 2 )
    || !strncasecmp( argument, "an ", 3 ) ) {
    send( ch, "Your appearance should not start with a or an.\n\r" );
    return;
    }

  if( ispunct( argument[ strlen( argument )-1 ] ) ) {
    send( ch, "Appearances should not end with punctuation.\n\r" );
    return;
    }

  if( strlen( argument ) >= 50 ) {
    send( ch, "Appearances must be less than 50 characters.\n\r" );
    return;
    }

  *argument = tolower( *argument );
  free_string( ch->pcdata->tmp_short, MEM_PLAYER );
  ch->pcdata->tmp_short = alloc_string( argument, MEM_PLAYER );

  fsend( ch, appearance_string, "appearance", "keywords" );
}


void do_keywords( char_data* ch, char* argument )
{
  if( is_confused_pet( ch ) || ch->pcdata == NULL )
    return;

  if( !has_permission( ch, PERM_APPROVE ) 
    && is_set( ch->pcdata->pfile->flags, PLR_APPROVED ) ) {
    send( ch, unchangable_msg );
    return;
    }
 
  if( *argument == '\0' ) {
    send( ch, "What do you want you keywords set to?\n\r" );
    return;
    }

  if( is_name( ch->pcdata->pfile->name, argument ) ) {
    send( ch, "Your keywords should NOT include your name.\n\r" );
    return;
    }

  free_string( ch->pcdata->tmp_keywords, MEM_PLAYER );
  ch->pcdata->tmp_keywords = alloc_string( argument, MEM_PLAYER );

  fsend( ch, appearance_string, "keywords", "appearance" );
}


void do_descript( char_data* ch, char* argument )
{
  char_data*     victim  = ch;
  wizard_data*   imm;

  if( is_confused_pet( ch ) || is_switched( ch )
    || ch->species != NULL ) 
    return;

  if( ( imm = wizard( ch ) ) != NULL && imm->player_edit != NULL )
    victim = imm->player_edit;

  if( !has_permission( ch, PERM_APPROVE ) 
    && is_set( ch->pcdata->pfile->flags, PLR_APPROVED ) ) {
    send( ch, unchangable_msg );
    return;
    }
 
  victim->descr->complete = edit_string( ch, argument,
    victim->descr->complete, MEM_DESCR );
}


/*
 *   REQUEST COMMAND
 */


request_array request_imm;
request_array request_app;


class Request_Data
{
 public: 
  pfile_data*   pfile;
  char*        reason;

  Request_Data( char_data* ch, char* argument  ) {
    record_new( sizeof( request_data ), MEM_REQUEST );
    pfile  = ch->pcdata->pfile;
    reason = alloc_string( argument, MEM_REQUEST );
    }

  ~Request_Data( ) {
    record_delete( sizeof( request_data ), MEM_REQUEST );
    free_string( reason, MEM_REQUEST );
    }
};


void display( char_data* ch, request_array& array, const char* word,
  bool& first )
{
  if( is_empty( array ) ) 
    return;

  if( first ) {
    first = FALSE;
    page_underlined( ch, "%-15s Reason\n\r", "Name" );
    }

  page( ch, "\n\r" );
  page( ch, "-- %s --\n\r", word );
  page( ch, "\n\r" );

  for( int i = 0; i < array; i++ )
    page( ch, "%-15s %s\n\r", array[i]->pfile->name,
      array[i]->reason );
}


bool includes( request_array& array, char_data* ch )
{
  for( int i = 0; i < array; i++ )
    if( array[i]->pfile == ch->pcdata->pfile )
      return TRUE;

  return FALSE;
}


bool remove( request_array& array, char_data* ch )
{
  for( int i = 0; i < array; i++ )
    if( array[i]->pfile == ch->pcdata->pfile ) {
      delete array[i];
      remove( array, i );
      return TRUE;
      }

  return FALSE;
}


void do_request( char_data* ch, char* argument )
{
  char* tmp;

  if( is_mob( ch ) )
    return;

  if( *argument == '\0' ) {
    bool first = TRUE;
    display( ch, request_app, "Avatar", first );
    display( ch, request_imm, "Immortal", first ); 
    if( first )
      send( ch, "Request queues are empty.\n\r" );
    return;
    }

  if( matches( argument, "cancel" ) ) {
    if( remove( request_app, ch )
      | remove( request_imm, ch ) )
      send( ch, "Requests cancelled.\n\r" );
    else
      send( ch, "You have no requests pending.\n\r" ); 
    return;
    } 

  if( matches( argument, "avatar" ) ) {
    if( includes( request_app, ch ) ) {
      send( ch, "You have already requested an avatar.\n\r" );
      return;
      }
    if( *argument == '\0'
      && is_set( ch->pcdata->pfile->flags, PLR_APPROVED ) ) {
      send( ch,
        "Since you are already approved you must specify a reason.\n\r" );
      return;
      }
    request_app += new request_data( ch, argument );
    send( ch, "Request for an avatar registered.\n\r" );
    if( *argument == '\0' ) 
      sprintf( tmp = static_string( ),
        "%s requesting an avatar for approval.",
        ch->Name( ) );
    else
      sprintf( tmp = static_string( ),
        "%s requesting an avatar with reason '%s'.",
        ch->Name( ), argument );
    info( empty_string, LEVEL_AVATAR, tmp,
       IFLAG_REQUESTS, 2, ch );
    return;
    }

  if( matches( argument, "immortal" ) ) {
    if( includes( request_imm, ch ) ) {
      send( ch, "You have already requested immortal attention.\n\r" );
      return;  
      }
    if( *argument == '\0' ) {
      send( ch, "You must include a reason when requesting an\
 immortal.\n\r" );
      return;
      }
    request_imm += new request_data( ch, argument );
    send( ch, "Request for an immortal registered.\n\r" );
    sprintf( tmp = static_string( ),
      "%s requesting an immortal with reason '%s'.",
      ch->Name( ), argument );
    info( empty_string, LEVEL_BUILDER, tmp,
       IFLAG_REQUESTS, 1, ch );
    return;
    }

  send( ch, "Unknown syntax - see help request.\n\r" );
}
 

/*
 *   IMMORTAL COMMANDS
 */


void do_approve( char_data* ch, char* argument )
{
  char             tmp  [ THREE_LINES ];
  player_data*  player;
  int            flags;
  bool           found  = FALSE;
  wizard_data*     imm  = wizard( ch );

  in_character = FALSE;

  if( !get_flags( ch, argument, &flags, "slpfr", "Approve" ) )
    return;

  if( is_set( &flags, 1 ) ) {
    for( int i = 0; i < player_list; i++ ) {
      player = player_list[i];
      if( !player->In_Game( )
        || ( player->pcdata->tmp_short == empty_string
        && player->pcdata->tmp_keywords == empty_string )
        || !can_see_who( ch, player ) )
        continue;

      if( !found ) {
        found = TRUE;
        sprintf( tmp, "%-15s   %s\n\r", "Name", "Appearance" );
        page_underlined( ch, tmp );
        }
      page( ch, "%-15s   %s\n\r",
        player->descr->name, player->descr->singular );          
      }
    if( !found ) 
      send( ch, "There are no players with unapproved appearances.\n\r" );
    return;
    }     

  if( *argument == '\0' ) {
    if( ( player = imm->player_edit ) == NULL ) {
      send( ch, "Which player?\n\r" );
      return;
      }
    }
  else {
    if( ( player = one_player( ch, argument, "approve",
      (thing_array*) &player_list ) ) == NULL )
      return;
    }

  if( is_set( &flags, 3 ) ) {
    if( is_set( player->pcdata->pfile->flags, PLR_APPROVED ) ) {
      send( ch, "%s is already marked as approved.\n\r",
        player->descr->name );
      }
    else {
      set_bit( player->pcdata->pfile->flags, PLR_APPROVED );
      send( ch, "You mark %s as approved.\n\r",
        player->descr->name );
      remove( request_app, player );
      }
    return;
    }

  if( is_set( &flags, 4 ) ) {
    if( !is_set( player->pcdata->pfile->flags, PLR_APPROVED ) ) {
      send( ch, "%s isn't approved.\n\r", player->descr->name );
      }
    else {
      remove_bit( player->pcdata->pfile->flags, PLR_APPROVED );
      send( ch, "You unapprove %s.\n\r", player->descr->name );
      sprintf( tmp, "Unapproved by %s.", ch->descr->name );
      player_log( player, tmp );
      }
    return;
    }

  if( is_set( &flags, 2 ) ) {
    if( player == ch ) {
      send( ch, "You are now editting yourself.\n\r" );
      imm->player_edit = NULL;
      return;
      }
    if( player->pcdata->trust >= LEVEL_AVATAR
      || ( player->shdata->level > 10
      && ch->pcdata->trust == LEVEL_AVATAR ) ) {
      send( ch, "You don't have permission to edit their description.\n\r" );
      return;
      }  
    send( ch, "You are now editting %s.\n\r", player->descr->name );
    send( player, "%s is now editting your appearance.\n\r",
      ch->descr->name );
    imm->player_edit = player;
    return;
    }

  if( !is_set( &flags, 0 ) ) {
    page( ch, "   Name: %s\n\r", player->descr->name );
    page( ch, "   Race: %s\n\r", race_table[ player->shdata->race ].name );
    page( ch, "  Class: %s\n\r", clss_table[ player->pcdata->clss ].name );
    page( ch, "    Sex: %s\n\r", sex_name[ player->sex ] );

    page( ch, "\n\r[Current]\n\r" );
    page( ch, "  Appearance: %s\n\r", player->descr->singular );
    page( ch, "    Keywords: %s\n\r", player->descr->keywords );
    page( ch, "\n\r[New]\n\r" );
    page( ch, "  Appearance: %s\n\r", player->pcdata->tmp_short );
    page( ch, "    Keywords: %s\n\r\n\r", player->pcdata->tmp_keywords );
    page( ch, "[Description]\n\r" );
    page( ch, player->descr->complete );
    return;
    }

  if( player->pcdata->tmp_short != empty_string ) {
    free_string( player->descr->singular, MEM_DESCR );
    player->descr->singular    = player->pcdata->tmp_short;
    player->pcdata->tmp_short  = empty_string;
    }
  
  if( player->pcdata->tmp_keywords != empty_string ) {
    free_string( player->descr->keywords, MEM_DESCR );
    player->descr->keywords      = player->pcdata->tmp_keywords;
    player->pcdata->tmp_keywords = empty_string;
    }

  send( ch, "You have approved %s.\n\r", player );
  send( player, "%s has approved you.\n\r", ch );

  sprintf( tmp, "Approved by %s.", ch->real_name( ) );
  player_log( player, tmp );

  set_bit( player->pcdata->pfile->flags, PLR_APPROVED );
}


void do_pbug( char_data* ch, char* argument )
{
  char_data*      victim  = ch;
  wizard_data*       imm;
  account_data*  account;

  if( ( imm = wizard( ch ) ) == NULL ) {
    bug( "Pbug: Non-wizard accessing it!?" );
    return;
    }

  if( imm->player_edit != NULL )
    victim = imm->player_edit;

  if( victim->pcdata == NULL ) {
    send( ch, "This command my only be used on players.\n\r" );
    return;
    }

  if( ( account = victim->pcdata->pfile->account ) == NULL ) {
    send( ch, "%s doesn't have an account.\n\r", victim );
    return;
    }
 
  account->notes = edit_string( ch, argument, account->notes, MEM_DESCR );
}