/*----------------------------------------------------------------------------*\
|*                     Mana Channel Code!                                     *|
|* Basically, this alows you to channel mana to another player.               *|
|* Syntax: channel <ammount> <player>                                         *|
|* The amount of mana that actually goes through(if any) is based on your wis,*|
|* channel skill, the target's wis, and his/her channel skill, if any.Remember*|
|* to add the gsn, and mods to interp.c, etc.                                 *|
|*                                                                            *|
|* Please send any comments/suggestions/flames to ulyenthanrealms@hotmail.com.*|
|* Thanks,                                                                    *|
|* Archan                                                                     *|
|* Head Coder and Adminstrator                                                *|
|* Ulyenthan Realms                                                           *|
\*----------------------------------------------------------------------------*/


/* too lazy to sort it out; I just use them all */
#if defined( macintosh )
#include <types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <errno.h>		
#include <unistd.h>		
#include <sys/time.h>
#endif
#include <ctype.h>		
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merc.h"

void do_channel( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    int transfer, mana;

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Channel how much to whom?\n\r", ch );
	return;
    }

    if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if(( victim == ch))
     {
       send_to_char("Don't be cheap.\n\r",ch);
       return;
     }

    if (!is_number( arg1 ) && !strcmp(arg1, "all"))
    {
        send_to_char( "Argument must be numerical or all.\n\r", ch);
        return;
    }


   if (!strcmp(arg1, "all"))
    mana = ch->mana;
   else mana = atoi(arg1);

   if (mana == 0)
     {
        send_to_char("You have to channel something!\n\r",ch);
        return;
     }
   if (mana > ch->mana)
     {
        send_to_char("Hah? You don't have that much!\n\r",ch);
        return;
     }

   /* percent of mana to transfer */
   transfer =  (number_range(0, get_skill(ch,gsn_channel)) * mana / 100);
   /* skill failure */
   if( transfer == 0 )
    {
       act("{gA beam of {MENERGY{g shoots from your forehead and {RFIZZLES{g!!{x", ch, 0, victim, TO_CHAR);
       act("{g$n places $s fingers on $s temples and a beam of {MENERGY{R FIZZLES{g!!{x", ch, 0, victim, TO_ROOM);
       check_improve(ch,gsn_channel,FALSE,5);
       return;
    }


   /* boni etc. (based on practice gain.) */

  transfer += wis_app[get_curr_stat(ch,STAT_WIS)].practice * 10;
  transfer += wis_app[get_curr_stat(victim,STAT_WIS)].practice * 10;
  transfer += number_range(0,get_skill(victim,gsn_channel))/2;
  /* can't let them get to much in battle (concentration loss */
  if (ch->position == POS_FIGHTING)
    transfer *= 2/3;


  /* They can't gain more than they sent! */
  if( (mana < transfer) )
    transfer = mana;
  /* finally, the transfer! */
  victim->mana += transfer;
  ch->mana -= mana;
  check_improve(ch,gsn_channel,TRUE,5);
  act("{g$n places $s fingers on $s temples and a beam of {MENERGY{g shoots to $N!!{x", ch, 0, victim, TO_NOTVICT);
  act("{gA beam of {MENERGY{g shoots from your forehead to $N!!{x", ch, 0, victim, TO_CHAR);
  act("{gA beam of {MENERGY{g shoots from $n's forehead to yours!!{x", ch, 0, victim, TO_VICT);
  send_to_char("{YYou feel energized!!!!{x\n\r",victim);
  send_to_char("{bYou feel your energy drop.{x\n\r",ch);
  return;
 }