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"


affect_data* find_leech( char_data* ch, char* argument )
{ 
  int i;

  if( number_arg( argument, i ) ) {
    if( --i < 0 || i >= ch->leech_list ) {
      send( ch, 
        "You are not supporting any affect with that number.\n\r" );
      return NULL;
      }
    return ch->leech_list[i];
    }

  for( i = 0; i < ch->leech_list; i++ ) 
    if( fmatches( argument, aff_char_table[ ch->leech_list[i]->type ].name ) ) 
      return ch->leech_list[i];

  send( ch, "You are not supporting any such leech.\n\r" );
  return NULL;
}   


void do_leech( char_data* ch, char* argument )
{
  char             tmp  [ TWO_LINES ];
  affect_data*  affect;
  cast_data*      cast;
  int             mana;
  int         max_mana;
  int            regen;
  int        max_regen;
  int          prepare;
  int                i;

  if( *argument != '\0' ) {
    if( ( affect = find_leech( ch, argument ) ) == NULL )
      return;
    if( ch != affect->victim ) 
      fsend( ch,
        "You no longer leech %s on %s.",
          aff_char_table[affect->type].name, affect->victim->Name( ) );
    fsend( affect->victim, "The energy leech supplying %s on you is cut.",
      aff_char_table[affect->type].name );
    remove_leech( affect );
    return;
    }
 
  if( is_empty( ch->leech_list ) ) {
    send( ch, "You are not supporting any spells.\n\r" );
    return;
    }

  max_regen = ch->Mana_Regen( );
  max_mana  = ch->max_mana;
 
  mana  = max_mana;
  regen = max_regen;

  prepare = 0;
  for( cast = ch->prepare; cast != NULL; cast = cast->next )
    prepare += cast->mana*cast->times;
  max_mana += prepare;

  for( i = 0; i < ch->leech_list; i++ ) {
    affect = ch->leech_list[i];
    max_regen += affect->leech_regen;
    max_mana  += affect->leech_max;
    }

  if( prepare > 0 )
    sprintf( tmp, " ( %d used by prepare )", prepare );

  page( ch, "   Max Mana: %4d (%d max)%s\n\r", mana, max_mana,
    prepare > 0 ? tmp : "" );
  page( ch, "Regen. Rate: %4.1f (%.1f max)\n\r\n\r",
    float( regen/10. ), float( max_regen/10. ) );

  page_underlined( ch,
    "Num  Spell                Regen     Max     Character\n\r" );
 
  for( i = 0; i < ch->leech_list; i++ ) {
    affect = ch->leech_list[i];
    page( ch, "%3d  %-21s%5.1f%8d     %s\n\r",
      i+1, capitalize_words( aff_char_table[affect->type].name ),
      float( affect->leech_regen/10. ), affect->leech_max, 
      affect->victim == ch ? "[self]" : affect->victim->Name( ) );
    }

  page( ch, "\n\r[ Regen is how much supporting the spell lowers your mana regen rate\n\r  and Max is how much it lowers your maximum mana amount. ]\n\r" );

  return;
}


void sprintf_leech( char* tmp, int value )
{
  dice_data dice;

  dice = value;

  if( dice.side != 0 ) { 
    if( dice.plus == 1 ) {
      if( dice.side == 1 )
        sprintf( tmp, "%d-level", dice.number );
      else
        sprintf( tmp, "%d-%d*level", dice.number, dice.side );
      }
    else {
      if( dice.side == 1 ) 
        sprintf( tmp, "%d-level/%d", dice.number, dice.plus );
      else
        sprintf( tmp, "%d-%d*level/%d", dice.number, dice.side, dice.plus );
      }
    }
  else {
    sprintf( tmp, "%d", dice.number );
    }

  return;
} 


/*
 *   REMOVE
 */


void remove_leech( affect_data* affect )
{
  char_data*    source;
 
  if( ( source = affect->leech ) == NULL )
    return;

  source->leech_list -= affect;
  affect->leech = NULL;
  
  update_max_mana( source );

  return;
}


void remove_leech( char_data* ch )
{
  int i;

  for( i = 0; i < ch->leech_list; i++ ) 
    ch->leech_list[i]->leech = NULL;
 
  clear( ch->leech_list ); 
  update_max_mana( ch );

  return;
}