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


bool   give_npc       ( char_data*, char_data*, thing_array* );
bool   give_pet       ( char_data*, char_data*, obj_data* );


/*
 *   GIVE FUNCTIONS
 */


thing_data* given( thing_data* obj, char_data* receiver, thing_data* giver )
{
  obj = obj->From( obj->selected );
  set_owner( (obj_data*) obj, receiver, (char_data*) giver );
  obj->To( receiver );

  return obj;
}


void do_give( char_data* ch, char* argument )
{
  char            arg  [ MAX_STRING_LENGTH ];
  char_data*   victim;
  thing_array*  array;

  if( is_confused_pet( ch ) || newbie_abuse( ch ) ) 
     return;

  if( !two_argument( argument, "to", arg ) ) {
    send( ch, "Give what to whom?\r\n" );
    return;
    }

  if( ( victim = one_character( ch, argument, "give to",
    ch->array ) ) == NULL )
    return;

  if( ( array = several_things( ch, arg, "give",
    &ch->contents ) ) == NULL )
    return;

  if( victim->position <= POS_SLEEPING ) {
    send( ch, "%s isn't in a position to be handed items.\r\n", victim );
    return;
    }

  if( give_npc( ch, victim, array ) )
    return;

  thing_array   subset  [ 4 ];
  thing_func*     func  [ 4 ]  = { cursed, heavy, many, given };

  sort_objects( victim, *array, ch, 4, subset, func );

  page_priv( ch, NULL, empty_string );
  page_priv( ch, &subset[0], "can't let go of" );
  page_priv( ch, &subset[1], "can't lift", victim );
  page_priv( ch, &subset[2], "can't handle", victim );
  page_publ( ch, &subset[3], "give", victim, "to" );

  consolidate( subset[3] );

  delete array;
}


bool give_npc( char_data* ch, char_data* victim, thing_array* array )
{
  mprog_data*  mprog  = NULL;
  obj_data*      obj;

  if( victim->pcdata != NULL ) 
    return FALSE;

  if( array->size != 1 || array->list[0]->selected != 1 ) {
    fsend( ch,
      "%s would be much happier if items were offered one at a time.",
      victim );
    return TRUE;
    }
  
  if( ( obj = object( array->list[0] ) ) != NULL ) {
    if( is_set( &victim->status, STAT_PET ) ) 
      return give_pet( ch, victim, obj );

    for( mprog = victim->species->mprog; mprog != NULL; mprog = mprog->next )
      if( mprog->trigger == MPROG_TRIGGER_GIVE
        && ( mprog->value == obj->pIndexData->vnum || mprog->value == 0 ) )
        break;
    }

  if( mprog == NULL ) {
    fsend( ch, "%s doesn't seem interested in %s.",
      victim, array->list[0] );
    return TRUE;
    } 

  send( ch, "You give %s to %s.\r\n", obj, victim );
  send( *ch->array, "%s gives %s to %s.\r\n", ch, obj, victim );

  obj = (obj_data*) obj->From( obj->selected );
  set_owner( obj, ch, NULL );
  obj->To( victim );

  var_ch   = ch;
  var_mob  = victim;  
  var_obj  = obj; 
  var_room = ch->in_room;
  execute( mprog );

  return TRUE;
}


bool give_pet( char_data* ch, char_data* victim, obj_data* obj )
{
  fsend( ch, "You offer %s to %s.", obj, victim );
  fsend( *ch->array, "%s offers %s to %s.", ch, obj, victim );

  if( obj->pIndexData->item_type == ITEM_FOOD 
    && eat( victim, obj ) )
    return TRUE;

  if( obj->pIndexData->item_type == ITEM_DRINK_CON
    && drink( victim, obj ) ) 
    return TRUE;
  
  fsend( ch, "%s inspects it but doesn't seem interested.",
    victim->He_She( ) );

  return TRUE;
}