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


/*
 *   LOCAL FUNCTIONS
 */


bool  can_wake     ( char_data* );
bool  sit_trigger  ( char_data*, obj_data* );
void  sit          ( char_data*, obj_data* );


/*
 *   CONSTANTS
 */


const char* position_name [] = { "dead", "mortally wounded",
  "incapacitated", "stunned", "sleeping", "meditating", "resting",
  "fighting", "standing", "flying" };


void update_pos( char_data* ch )
{
  if( ch->hit > 0 ) {
    if( ch->position < POS_SLEEPING ) {
      ch->position = POS_RESTING;
      renter_combat( ch );
      }
    return;
    }

       if( ch->hit <= -11 ) ch->position = POS_DEAD;
  else if( ch->hit <= -6 )  ch->position = POS_MORTAL;
  else if( ch->hit <= -3 )  ch->position = POS_INCAP;
  else                      ch->position = POS_STUNNED; 

  ch->fighting = NULL;
  disrupt_spell( ch );
}


/*
 *   CHAIR ROUTINES
 */


void sit( char_data* ch, obj_data* obj )
{
  /*
  ch->next_on_obj = obj->character;
  obj->character  = ch;
  ch->pos_obj     = obj;
  ch->position    = POS_RESTING;

  return;
  */
};


void unseat( char_data* ch )
{
  /*
  char_data*  sch;
  obj_data*   obj;
 
  if( ( obj = ch->pos_obj ) != NULL ) {
    if( obj->character == ch )
      obj->character = ch->next_on_obj;
    else {
      for( sch = obj->character; sch->next_on_obj != ch;
        sch = sch->next_on_obj );        
      sch->next_on_obj = ch->next_on_obj;
      }
    ch->pos_obj     = NULL;
    ch->next_on_obj = NULL;
    }

  return;
  */
}


/*
 *   MEDITATE
 */ 


void do_meditate( char_data* ch, char* )
{
  if( is_confused_pet( ch ) )
    return;

  if( ch->pcdata == NULL || ch->shdata->skill[SKILL_MEDITATE] == UNLEARNT ) {
    send( ch, "You do not have the knowledge required to bring yourself\
 into a state of\n\rmeditation.\n\r" );
    return;
    }

  if( ch->mount != NULL ) {
    send( "You can't meditate while mounted.\n\r", ch );
    return;
    }

  if( water_logged( ch->in_room ) ) {
    send( ch, "You can't meditate underwater.\n\r" );
    return;
    }

  if( ch->position == POS_FIGHTING ) {
    send( "Meditating while fighting requires more concentration than you
 can muster.\n\r", ch );
    return;
    }

  if( ch->position == POS_MEDITATING ) {
    send( "You are already meditating.\n\r", ch );
    return;
    }

  send( "You kneel down and start to meditate.\n\r", ch );
  send_seen( ch, "%s kneels down and starts to meditate.\n\r", ch );

  ch->position = POS_MEDITATING;
  return;
}


/*
 *   LIE DOWN
 */


void do_lie( char_data* ch, char* )
{
  if( ch->mount != NULL ) {
    send( ch, "You need to dismount first.\n\r" );
    return;
    }

  if( deep_water( ch->in_room ) ) {
    send( ch, "You can't lie down while swimming.\n\r" );
    return;
    }

  if( ch->fighting != NULL ) {
    send( ch, "You refuse to lie down while facing adversity.\n\r" );
    return;
    }

  switch( ch->position ) {
    case POS_SLEEPING:
      if( can_wake( ch ) ) 
        send( ch, "You open your eyes.\n\r" );
      return;

    case POS_RESTING:
      send( ch, "You situp.\n\r" );
      break;

    case POS_MEDITATING:
      send( ch, "You stop meditating and lie down.\n\r" );
      send_seen( ch, "%s stops meditating and lies down.\n\r", ch );
      break;

    case POS_STANDING:
      send( ch, "You lie down on the ground.\n\r" );
      send_seen( ch, "%s lies down on the ground.\n\r", ch );
      break;
    }

  return;
}


/*
 *   SIT
 */


void do_sit( char_data* ch, char* argument )
{
//  obj_data*      obj;
//  thing_data*  thing;
//  char_data*     sch;
//  int              i;

  if( *argument == '\0' ) {
    do_rest( ch, "" );
    return;
    }

  send( ch, "Sitting on objects disabled.\n\r" );

  /*
  if( ch->position == POS_FIGHTING ) {
    send( ch, "You can't sit down while fighting!" );
    return;
    }

  if( ch->position != POS_STANDING ) {
    send( ch,
      "You need to be standing before you can sit on an object.\n\r" );
    return;
    }

  if( ch->pos_obj != NULL ) {
    send( "You are sitting and standing at the same time.!?\n\r", ch );
    bug( "Do_sit: Character standing, but pos_obj != NULL. (%s)",
      ch->real_name( ) );
    return;
    }

  if( ( thing = one_thing( ch, argument,
    "sit on", ch->array ) ) == NULL ) 
    return;

  if( ( obj = object( thing ) ) == NULL ) {
    send( ch, "Sit only applies to objects for now.\n\r" );
    return;
    }

  if( !is_set( obj->pIndexData->extra_flags, OFLAG_CHAIR ) ) { 
    send( "That is not made to be sat on.\n\r", ch );
    return;
    }

  for( i = 0, sch = obj->character; sch != NULL;
    i++, sch = sch->next_on_obj ); 

  if( obj->value[0] <= i ) {
    send( "There is not enough room for you to sit on that.\n\r", ch );
    return;
    } 

  sit( ch, obj );

  send( ch, "You rest your weary bones and sit on %s.\n\r",
    obj->pIndexData->Name( ) );
  fsend_seen( ch, "%s sits on %s.", ch, obj );

  sit_trigger( ch, obj );
  */
  return;
}


bool sit_trigger( char_data *ch, obj_data *obj )
{
  oprog_data* oprog;

  for( oprog = obj->pIndexData->oprog; oprog != NULL; oprog = oprog->next )
    if( oprog->trigger == OPROG_TRIGGER_SIT ) {
      var_ch   = ch;
      var_obj  = obj; 
      var_room = ch->in_room;
      execute( oprog );
      return TRUE;
      }
  
  return FALSE;
}


void do_rest( char_data* ch, char*  )
{
  if( ch->mount != NULL ) {
    send( "You need to dismount first.\n\r", ch );
    return;
    }

  if( deep_water( ch->in_room ) ) {
    send( ch, "You can't rest while swimming.\n\r" );
    return;
    }

  if( ch->fighting != NULL ) {
    send( ch, "Rest while fighting??\n\r" );
    return;
    }

  switch( ch->position ) {
    case POS_SLEEPING:
      if( can_wake( ch ) ) {
        send( ch, "You wake and sit up.\n\r" );
        send_seen( ch, "%s wakes and sits up.\n\r", ch );
        ch->position = POS_RESTING;
        }
      break;

    case POS_RESTING:
      send( ch,"You are already resting.\n\r" );
      break;

    case POS_MEDITATING:
      send( ch, "You stop meditating and begin resting.\n\r" );
      fsend_seen( ch, "%s stops meditating and begins resting.", ch );
      ch->position = POS_RESTING;
      break;

    case POS_STANDING:
      if( ch->rider != NULL ) {
        send( ch, "You lie down, dismounting %s.\n\r", ch->rider );
        send( ch->rider, "Your mount lies down, dismounting you.\n\r" );
        send_seen( ch, "%s lies down, dismounting %s.\n\r", ch, ch->rider );
        dismount( ch->rider );
        }
      else {  
        send( ch, "You sit down on the floor.\n\r" );
        send_seen( ch, "%s sits down on the floor.\n\r", ch );
        }
      ch->position = POS_RESTING;
      break;
    }

  return;
}


/*
 *   SLEEP 
 */


bool can_wake( char_data* ch )
{
  if( !is_set( ch->affected_by, AFF_SLEEP ) || is_apprentice( ch ) ) 
    return TRUE;
  
  send( ch, "You are magically slept and unable to wake.\n\r" );

  return FALSE;
} 


void do_sleep( char_data* ch, char* )
{
  char_data* keeper;

  if( ch->mount != NULL ) {
    send( ch, "You can't sleep while riding.\n\r" );
    return;
    }

  if( water_logged( ch->in_room ) ) { 
    send( ch, "You can't sleep underwater.\n\r" );
    return;
    } 

  if( ( keeper = active_shop( ch ) ) != NULL ) {
    send( ch, "%s won't allow vagrants to sleep in %s shop.\n\r", 
      keeper, keeper->His_Her( ) );
    return;
    }

  if( ch->fighting != NULL ) {
    send( ch, "It tends to be difficult to fall asleep while fighting.\n\r" );
    return;
    }

  switch( ch->position ) {
    case POS_SLEEPING:
      send( ch, "You are already asleep.\n\r" );
      break;

    case POS_MEDITATING:
    case POS_RESTING:
    case POS_STANDING: 
      sleep( ch );
      send( ch, "You sleep.\n\r" );
      send_seen( ch, "%s lies down and goes to sleep.\n\r", ch );
      break;
    }

  return;
}


void sleep( char_data *ch )
{
  disrupt_spell( ch );

  ch->position = POS_SLEEPING;

  if( ch->rider != NULL ) {
    send( ch->rider,
      "As %s drops to sleep, you quickly find yourself dismounted.\n\r", ch );
    fsend_seen( ch->rider,
      "As %s falls to sleep, %s quickly finds %sself dismounted.",
      ch->rider, ch->rider->He_She( ), ch->rider->Him_Her( ) );
    ch->rider->mount = NULL;
    ch->rider = NULL;
    }

  return;
}


/*
 *   STAND 
 */


void do_stand( char_data* ch, char* )
{
  if( ch->mount != NULL ) {
    send( ch, "Use dismount to stand on the ground.\n\r" );
    return;
    }

  switch ( ch->position ) {
    case POS_SLEEPING:
      if( can_wake( ch ) ) { 
        send( ch, "You wake and stand up.\n\r" );
        send_seen( ch, "%s wakes and stands up.\n\r", ch );
        ch->position = POS_STANDING;
        }
      break;

    case POS_MEDITATING:
      send( "You stop meditating and stand up.\n\r", ch );
      send_seen( ch, "%s stops meditating and stands up.\n\r", ch );
      ch->position = POS_STANDING;
      break;

    case POS_RESTING:
      if( ch->pos_obj != NULL ) {
        send( ch, "You get off %s and stand up.\n\r", ch->pos_obj );
        send( *ch->array, "%s gets off %s and stands up.\n\r",
          ch, ch->pos_obj );
        unseat( ch );
        }
      else {
        if( opponent( ch ) != NULL ) {
          send( ch, "Sitting in battle was not intentional.\n\r" );
          return;
	  }
        else { 
          send( ch, "You stand up.\n\r" );
          send_seen( ch, "%s stands up.\n\r", ch );
	  }
        }
      ch->position = POS_STANDING;
      break;

    case POS_STANDING:
      send( ch, "You are already standing.\n\r" );
      break;
    }

  return;
}


/*
 *   WAKE
 */


void do_wake( char_data* ch, char* argument )
{
  char_data* victim;

  if( *argument == '\0' ) {
    if( ch->position > POS_SLEEPING ) {
      send( ch, "You aren't sleeping.\n\r" );
      return;
      }
    do_stand( ch, "" );
    return;
    }

  if( ch->position <= POS_SLEEPING ) {
    send( ch, "You are asleep yourself!\n\r" );
    return;
    }

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

  if( victim->position > POS_SLEEPING ) {
    send( ch, "%s is already awake.\n\r", victim );
    return;
    }

  if( victim->position < POS_SLEEPING || IS_AFFECTED( victim, AFF_SLEEP ) ) {
    send( ch, "You try to wake %s, but %s doesn't react.\n\r",
      victim, victim->He_She( ) );
    return;
    }

  victim->position = POS_RESTING;

  send( ch, "You wake %s.\n\r", victim->Him_Her( ) );
  send( victim, "%s wakes you.\n\r", ch );
  send_seen( ch, "%s wakes %s.\n\r", ch, victim );
}