distorted/
distorted/area/
distorted/data/CLN/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"
#include "clan.h"
#include "tables.h"
#include <math.h>

double pow( double x, double y );

/* command procedures needed */
DECLARE_DO_FUN (do_backstab);
DECLARE_DO_FUN (do_strangle);
DECLARE_DO_FUN (do_layhands);
DECLARE_DO_FUN (do_smokebomb);
DECLARE_DO_FUN (do_emote);
DECLARE_DO_FUN (do_berserk);
DECLARE_DO_FUN (do_bash);
DECLARE_DO_FUN (do_trip);
DECLARE_DO_FUN (do_dirt);
DECLARE_DO_FUN (do_flee);
DECLARE_DO_FUN (do_fear);
DECLARE_DO_FUN (do_kick);
DECLARE_DO_FUN (do_disarm);
DECLARE_DO_FUN (do_get);
DECLARE_DO_FUN (do_recall);
DECLARE_DO_FUN (do_yell);
DECLARE_DO_FUN (do_sacrifice);
DECLARE_DO_FUN (do_circle);
DECLARE_DO_FUN (do_feed);
DECLARE_DO_FUN (do_gouge);
DECLARE_DO_FUN (do_vdpi);
DECLARE_DO_FUN (do_vdtr);
DECLARE_DO_FUN (do_vdth);
DECLARE_DO_FUN (do_look);
DECLARE_DO_FUN (do_announce);
DECLARE_DO_FUN (do_clantalk);
DECLARE_DO_FUN (do_twirl);
DECLARE_DO_FUN (do_rank);
DECLARE_DO_FUN (do_lead);

/*
 * Local functions.
 */
void check_assist args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool check_dodge args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool check_dodge_real args ((CHAR_DATA * ch, CHAR_DATA * victim, bool silent));
bool check_parry args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool check_phase args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool check_phase_real args ((CHAR_DATA * ch, CHAR_DATA * victim, bool silent));
bool check_shield_block args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool check_shield_wall args ((CHAR_DATA * ch, CHAR_DATA * victim));

void dam_message args ((CHAR_DATA * ch, CHAR_DATA * victim, int dam,
						int dt, bool immune));
void dam_message_new args ((CHAR_DATA * ch, CHAR_DATA * victim, int dam,
                                     int dt, bool immune, int dam_flags));
void death_cry args ((CHAR_DATA * ch));
void group_gain args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool is_safe args ((CHAR_DATA * ch, CHAR_DATA * victim));
int xp_compute args((CHAR_DATA * gch, CHAR_DATA * victim, int total_levels, int members));
int align_compute args((CHAR_DATA * gch, CHAR_DATA * victim, int total_levels, int members));
bool is_safe_mock args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool is_voodood args ((CHAR_DATA * ch, CHAR_DATA * victim));
void make_corpse args ((CHAR_DATA * ch, CHAR_DATA * killer));
void one_hit args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary));
void one_hit_mock args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary));
void mob_hit args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt));
void raw_kill args ((CHAR_DATA * victim, CHAR_DATA * killer));
void set_fighting args ((CHAR_DATA * ch, CHAR_DATA * victim));
void disarm args ((CHAR_DATA * ch, CHAR_DATA * victim));
void check_arena args ((CHAR_DATA * ch, CHAR_DATA * victim));
int dambonus args ((CHAR_DATA * ch, CHAR_DATA * victim,int dam, int stance));
bool can_counter args ((CHAR_DATA * ch));
bool can_bypass args ((CHAR_DATA * ch, CHAR_DATA * victim));
void update_power args((CHAR_DATA *highlander));
void falcon_load args((CHAR_DATA *ch, CHAR_DATA *victim));
void woodsman_twirl args((CHAR_DATA * ch, char *argument));
void part_create args((CHAR_DATA *ch, char *argument));

int add_bonuses args(( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt, int dam_type ));

char debugbuf[MSL];

int add_damroll args((CHAR_DATA *ch, int diceside));
void death_message args((CHAR_DATA *killer, CHAR_DATA *victim));
int check_martial_arts args((CHAR_DATA *ch, CHAR_DATA *victim));
bool check_open_palming args((CHAR_DATA *ch));
void clear_stance_affects args((CHAR_DATA *ch));
bool check_block args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool check_roll args ((CHAR_DATA * ch, CHAR_DATA * victim));
bool check_acrobatics args ((CHAR_DATA * ch, CHAR_DATA * victim));
OBJ_DATA * rand_obj args( ( CHAR_DATA *ch, int mob_level )); 
int focus_ac args ((CHAR_DATA *ch));
int focus_hit args ((CHAR_DATA *ch));
int focus_dam args ((CHAR_DATA *ch));
void improve_toughness args((CHAR_DATA * ch));
bool check_tumble args ((CHAR_DATA *ch, CHAR_DATA *victim, int dt));
void special_move args (( CHAR_DATA *ch, CHAR_DATA *victim ));
bool check_deflect args((CHAR_DATA *ch, CHAR_DATA *victim, int dt,int dam));
bool check_counter_defense args((CHAR_DATA *ch,CHAR_DATA *victim,int dt));
char * get_descr_form args((CHAR_DATA *ch,CHAR_DATA *looker, bool get_long));
void do_mutilate args((CHAR_DATA *ch, CHAR_DATA *victim));
int rank_pk args ((CHAR_DATA * ch, CHAR_DATA * victim));
int rank_arena args ((CHAR_DATA * ch, CHAR_DATA * victim));
int chance_pk args ((CHAR_DATA * ch, CHAR_DATA * victim));
int chance_arena args ((CHAR_DATA * ch, CHAR_DATA * victim));

/* Monk Chi */
void do_chi(CHAR_DATA *ch, char *argument)
{
    AFFECT_DATA af;

    if ( (get_skill(ch,gsn_chi) <= 0)
        || (ch->level < skill_table[gsn_chi].skill_level[ch->class] ) )
    {
        send_to_char("You don't have any chi to focus on.\n\r",ch);
	return;
    }

    if (is_affected(ch,gsn_chi) )
    {
        send_to_char("You are already focusing on your chi.\n\r",ch);
	return;
    }

    if (ch->mana < 200 || ch->move < 200)
    {
        send_to_char("You do not have enough mental power to concentrate.\n\r",ch);
	return;
    }

    if (number_percent() > get_skill(ch,gsn_chi))
    {
        send_to_char("You concentrate on becoming one with your spirit but cannot attain the zenith.\n\r",ch);
        check_improve(ch,gsn_chi,FALSE,1);
        ch->mana -= 100;
        ch->move -= 100;
        return;
    }

    af.where = TO_AFFECTS;
    af.type = gsn_chi;
    af.level = ch->level;
    af.location = APPLY_HITROLL;
    af.modifier = ch->level*get_skill(ch,gsn_chi)/100;
    af.duration = ch->level/6;
    af.bitvector = 0;
    affect_to_char(ch,&af);
    af.modifier = ch->level*get_skill(ch,gsn_chi)/300;
    af.location = APPLY_DAMROLL;
    affect_to_char(ch,&af);
    af.modifier = 50;
    af.location = APPLY_AC;
    affect_to_char(ch,&af);

    ch->mana -= 200;
    ch->move -= 200;
    ch->pcdata->power[0] = ch->level*get_skill(ch,gsn_chi)/100;
    ch->pcdata->power[1] = get_skill(ch,gsn_chi)/5;

    act("$n's forehead clouds with concentration.",ch,NULL,NULL,TO_ROOM);
    send_to_char("You focus on the balance of the forces.\n\r",ch);
    check_improve(ch,gsn_chi,TRUE,1);
    return;
}

/* Ninja Michi */
void do_michi(CHAR_DATA *ch, char *argument)
{
    AFFECT_DATA af;

    if ( (get_skill(ch,gsn_michi) <= 0)
        || (ch->level < skill_table[gsn_michi].skill_level[ch->class] ) )
    {
        send_to_char("You don't have any michi to focus on.\n\r",ch);
	return;
    }

    if (is_affected(ch,gsn_michi) )
    {
        send_to_char("You are already focusing on your michi.\n\r",ch);
	return;
    }

    if (ch->mana < 200 || ch->move < 200)
    {
        send_to_char("You do not have enough mental power to concentrate.\n\r",ch);
	return;
    }

    if (number_percent() > get_skill(ch,gsn_michi))
    {
        send_to_char("You concentrate on becoming one with your spirit but cannot attain the zenith.\n\r",ch);
        check_improve(ch,gsn_michi,FALSE,1);
        ch->mana -= 100;
        ch->move -= 100;
        return;
    }

    af.where = TO_AFFECTS;
    af.type = gsn_michi;
    af.level = ch->level;
    af.location = APPLY_HITROLL;
    af.modifier = ch->level*get_skill(ch,gsn_michi)/200;
    af.duration = ch->level/6;
    af.bitvector = 0;
    affect_to_char(ch,&af);
    af.location = APPLY_DAMROLL;
    affect_to_char(ch,&af);

    ch->mana -= 200;
    ch->move -= 200;

    act("$n's forehead clouds with concentration.",ch,NULL,NULL,TO_ROOM);
    send_to_char("You focus on the balance of the forces.\n\r",ch);
    check_improve(ch,gsn_chi,TRUE,1);
    return;
}

/* Highlander */
void do_deathblow(CHAR_DATA * ch, char *argument)
{
	CHAR_DATA *victim;
	OBJ_DATA *obj;
        AFFECT_DATA af;

        if (get_skill (ch, gsn_decapitate) == 0 || (!IS_NPC (ch)
         && ch->level < skill_table[gsn_decapitate].skill_level[ch->class]))
	{
                send_to_char ("Huh?\n\r", ch);
		return;
	}

        if(is_affected(ch,gsn_decapitate))
        {
         send_to_char("You cannot muster enough strength to decapitate again.\n\r",ch);
         return;
        }

	if ((victim = ch->fighting) == NULL)
	{
		send_to_char ("You aren't fighting anyone.\n\r", ch);
		return;
	}

	if ((obj = get_eq_char (ch, WEAR_WIELD)) == NULL)
	{
          send_to_char ("You need to wield a a bladed weapon to decapitate.\n\r", ch);
          return;
	}

        if( obj->value[0] != WEAPON_SWORD && obj->value[0] != WEAPON_AXE )
	{
          send_to_char ("You need to wield a a bladed weapon to decapitate.\n\r", ch);
          return;
	}

        if (victim->hit > victim->max_hit / 4)
	{
                act ("$N is too wary to strike.", ch, NULL, victim, TO_CHAR);
		return;
	}

	if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 30)) {
		act("You attempt to strike them but find yourself crying instead.",ch,NULL,NULL,TO_CHAR);
		act("$n attempts to strike them but begins crying instead.",ch,NULL,NULL,TO_ROOM);
		WAIT_STATE(ch,DEF_FEAR_WAIT);
		return; }

	if (ch->stunned)
	{
		send_to_char ("You're still a little woozy.\n\r", ch);
		return;
	}

	if (!can_see (ch, victim))
	{
		send_to_char ("You stumble blindly into a wall.\n\r", ch);
		return;
	}

        WAIT_STATE (ch, skill_table[gsn_decapitate].beats);
        if (number_percent () < (get_skill (ch, gsn_decapitate)*2)/3
           || (get_skill (ch, gsn_decapitate) >= 2))
	{
                check_improve (ch, gsn_decapitate, TRUE, 2);
                act ("{)$n attempts to decapitate you!{x", ch, NULL, victim, TO_VICT);
                act ("{.You swing your weapon in an arc and bring it down upon $N!{x", ch, NULL, victim, TO_CHAR);
                act ("{($n swings $s weapon in an arc and brings it down upon $N.{x", ch, NULL, victim, TO_NOTVICT);

                one_hit( ch, victim, gsn_decapitate, FALSE );
                one_hit( ch, victim, gsn_decapitate, FALSE );
	}
	else
	{
                check_improve (ch, gsn_decapitate, FALSE, 1);
                act ("{.$N ducks below your swing.{x", ch, NULL, victim, TO_CHAR);
                damage (ch, victim, 0, gsn_decapitate, DAM_NONE, TRUE, 0);
	}

       /* not all good things come cheap */
        af.where = TO_AFFECTS;
        af.type = gsn_decapitate;
        af.level = ch->level;
        af.modifier = -5;
        af.bitvector = 0;
        af.location = APPLY_DEX;
        af.duration = 0;
        affect_to_char(ch, &af);

        ch->mana = UMAX(ch->mana - 100,0);

/*        if(ch->pcdata->power[POWER_POINTS] < 65500)
        ch->pcdata->power[POWER_POINTS] += dice(1,10); */
        update_power(ch);

	return;
}

void do_quickening(CHAR_DATA *ch, char *argument)
{
 AFFECT_DATA af;

 if (get_skill (ch, gsn_quickening) == 0 || (!IS_NPC (ch)
 && ch->level < skill_table[gsn_quickening].skill_level[ch->class]))
 {
    send_to_char ("Huh?\n\r", ch);
    return;
 }

 if(ch->class != CLASS_HIGHLANDER)
  return;

 if(is_affected(ch,gsn_quickening))
 {
   send_to_char("You are still affected by the quickening.\n\r",ch);
   return;
 }

 if(ch->hit < 1100 || ch->pcdata->power[POWER_POINTS] < 51)
 {
  send_to_char("You do not have the power to be quickened.\n\r",ch);
  return;
 }

 ch->mana = ch->mana/2;
 damage(ch,ch,1500,gsn_quickening,DAM_OTHER,TRUE,0);
/*  ch->pcdata->power[POWER_POINTS] -= 50; */

 send_to_char("You feel energy surge through your body.\n\r",ch);
 act("$n writhes as lightning strikes his body from the heavens.\n\r",ch,NULL,NULL,TO_ROOM);
 
 af.where = TO_AFFECTS;
 af.level = ch->level;
 af.location = APPLY_AC;
 af.modifier = -(ch->level);
 af.duration = ch->level/2;
 af.bitvector = 0;
 af.type = gsn_quickening;
 affect_to_char(ch,&af);

 return;
}

/* Banshee */
void do_shriek (CHAR_DATA * ch, char *argument)
{
  CHAR_DATA *victim;
  char arg[MAX_STRING_LENGTH];
  int chance;
  int dam;

  one_argument(argument, arg);

  if(get_skill(ch,gsn_shriek)==0)
  {
    send_to_char("Do, re, me, fa, so, laaa *coughcoughcough* te do.\n\r",ch);
    return;
  }

  if(arg[0]=='\0' && ch->fighting == NULL)
  {
    send_to_char("Shriek at who?\n\r",ch);
    return;
  }

  if((victim = get_char_room (ch, arg))==NULL)
  {
    send_to_char("Shriek at who?\n\r",ch);
    return;
  }

 if(arg[0]=='\0')
	victim = ch->fighting;

  if(is_safe (ch, victim))
  {
    send_to_char("Go yell at someone else, loudmouth.\n\r",ch);
    return;
  }

	if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 30)) {
		act("You attempt to shriek but find yourself crying instead.",ch,NULL,NULL,TO_CHAR);
		act("$n attempts to shriek but begins crying instead.",ch,NULL,NULL,TO_ROOM);
		WAIT_STATE(ch,DEF_FEAR_WAIT);
		return; }

  if (ch->stunned)
  {
          send_to_char ("You're still a little woozy.\n\r", ch);
          return;
  }
  
  send_to_char("Shrieeeeeeeeeek....\n\r",ch);

  chance = get_skill(ch,gsn_shriek)-(victim->level/5);
  if(number_percent() < chance)
  {
	dam = (dice(get_age(ch)*5, 5)+ dice(ch->level/2, 7) - dice(victim->level/2, 2));
	
	if(ch->hit > 15000)
		dam += (15000/9);
	else
		dam += (ch->hit)/8.5;
	damage (ch, victim, dam, gsn_shriek, DAM_MENTAL, TRUE, 0);
	check_improve (ch, gsn_shriek, TRUE, 1);
	if (!IS_AFFECTED(victim,AFF_DEAF) || (IS_AFFECTED(victim,AFF_DEAF) && number_percent() < 50)) {

		AFFECT_DATA af;

		af.where = TO_AFFECTS;
		af.type = gsn_shriek;
		af.level = ch->level;

	if (IS_AFFECTED(victim,AFF_DEAF))	{ /* This removes previous shriek and averages modifier */
		AFFECT_DATA *paf;
		for(paf = victim->affected; paf != NULL; paf = paf->next)	{
			if(paf->type == gsn_shriek) {
				af.modifier = ((paf->modifier+(-1*number_range(get_age(ch)/2,get_age(ch))))/2);
				affect_remove (victim, paf); 
		} } }
	else {	af.modifier = -1*number_range(get_age(ch)/3, get_age(ch)); }
		af.duration = number_fuzzy(ch->level/6);
		af.location = APPLY_HITROLL;
		af.bitvector = AFF_DEAF;

		affect_to_char (victim, &af);
	}

        WAIT_STATE (ch, PULSE_VIOLENCE*1.5);
  }
  else
  {
	damage (ch, victim, 0, gsn_shriek, DAM_MENTAL, FALSE, 0);
        act ("{.You let out a sad sounding gurgle.{x",
	 ch, NULL, victim, TO_CHAR);
        act ("{($n lets out a sad sounding gurgle.{x",
	 ch, NULL, victim, TO_NOTVICT);
        act ("{)$n lets out a sad sounding gurgle.{x",
	 ch, NULL, victim, TO_VICT);
	check_improve (ch, gsn_shriek, FALSE, 1);
        WAIT_STATE (ch, skill_table[gsn_bash].beats * 5 / 3);

  }

}

/* Ninja */
void do_strangle(CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim;
    AFFECT_DATA af;
    int chance;
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_INPUT_LENGTH/2];

    one_argument(argument,arg);
    
    
    if(get_skill(ch,gsn_strangle)==0)
    {
      send_to_char("Leave it to the skilled for that.\n\r",ch);
      return;
    }

    if( ch->fighting != NULL )
    {
     send_to_char("Are you nuts? You'd lose your hands before they reach a neck.\n\r",ch);
     return;
    }

    if((victim = get_char_room( ch, arg )) == NULL)
    {
      send_to_char("For being so stealthy, you sure aren't too keen... No one here by that name.\n\r",ch);
      return;
    }

    if(arg[0]=='\0')
    {
      send_to_char("How about a target, ace?\n\r",ch);
      return;
    }

    if(!IS_NPC(victim) && IS_IMMORTAL(victim))
    {
      send_to_char("Think again.\n\r",ch);
      return;
    }

    if (is_safe (ch, victim))
                return;

/*    if (IS_NPC (victim) &&
                victim->fighting != NULL &&
                !is_same_group (ch, victim->fighting))
        {
                send_to_char ("Kill stealing is not permitted.\n\r", ch);
                return;
        } */
        
    if (ch->stunned)
    {
          send_to_char ("You're still a little woozy.\n\r", ch);
          return;
    }

    chance = number_percent()*((2*victim->level)/ch->level);
    
    if(IS_AFFECTED(ch,AFF_SNEAK) || !can_see(victim,ch))
	chance /= 3;
    if(IS_AFFECTED(ch,AFF_HIDE) || !can_see(victim,ch))
	chance /= 3;

    if(chance>get_skill(ch,gsn_strangle))
    {
      send_to_char("You failed to strangle them.\r\n",ch);
      act("$n failed to strangle $N.",ch,NULL,victim,TO_NOTVICT);
      act("$n tried to strangle you!.",ch,NULL,NULL,TO_VICT);
      check_improve (ch, gsn_strangle, TRUE, 2);
      
      	  if (!IS_NPC(ch) && !IS_NPC(victim) && victim->fighting == NULL)
          {
           switch(number_range(0,1))
           {
            case (0):
            sprintf(buf,"Die, %s you strangling fool!",PERS(ch,victim));
            break;
            case (1):
            sprintf(buf,"Help! I'm being strangled by %s!",PERS(ch,victim));
            break;
	   }
           do_yell(victim,buf);
          }
      
      WAIT_STATE (ch, skill_table[gsn_strangle].beats);
      multi_hit (victim, ch, TYPE_UNDEFINED);
      return;
    }
    
    if ( IS_AFFECTED(victim, AFF_SLEEP)
    ||   (IS_NPC(victim) && IS_SET(victim->act,ACT_UNDEAD)))
    {
        send_to_char("Something about that doesn't feel right.\n\r",ch);
        return;
    }

    if ((((get_curr_stat(ch,STAT_STR)*2) + number_range(0,4)) < 
    (get_curr_stat(victim,STAT_STR) + get_curr_stat(victim,STAT_CON) + number_range(2,4))) && can_see(victim,ch))
    {
      send_to_char("You attempt to strangle them, and they overpower you!\n\r",ch);
      act("$n failed to strangle $N.",ch,NULL,victim,TO_NOTVICT);
      act("$n tried to strangle you!.",ch,NULL,NULL,TO_VICT);
      check_improve (ch, gsn_strangle, TRUE, 2);
      WAIT_STATE (ch, skill_table[gsn_strangle].beats);
      multi_hit (victim, ch, TYPE_UNDEFINED);
      return;
    }


    af.where     = TO_AFFECTS;
    af.type      = skill_lookup("sleep");
    af.level     = ch->level;
    af.duration  = 1;
    af.location  = APPLY_NONE;
    af.modifier  = 0;
    af.bitvector = AFF_SLEEP;
    affect_join( victim, &af );
        
    if ( IS_AWAKE(victim) )
    {
        send_to_char( "Someone just strangled you ..... zzzzzz.\n\r", victim );
        act( "$n goes to sleep.", victim, NULL, NULL, TO_ROOM );
        victim->position = POS_SLEEPING;
        check_improve (ch, gsn_strangle, TRUE, 1);
        
        if(!IS_NPC(ch) && !IS_NPC(victim) && !IN_ARENA(ch) && !IN_ARENA(victim))
	{
	     ch->fight_timer = pktimer;
	     victim->fight_timer = pktimer;
	}
    }
    else
    {
      send_to_char("Uh. Already sleeping...\n\r",ch);
    }
    
    WAIT_STATE (ch, skill_table[gsn_strangle].beats);
    return;
}


/* Paladin */
void do_layhands(CHAR_DATA *ch, char *argument)
{
  char arg[MAX_INPUT_LENGTH];
  CHAR_DATA *victim;
  int hp_ammount;
  int chance;
  COOLDOWN_DATA cd;

  one_argument(argument,arg);

  if(!has_skill(ch,gsn_layhands) || get_skill(ch,gsn_layhands) == 0)
  {
    send_to_char("Your god loves you, but not THAT much.\n\r",ch);
    return;
  }

  if((victim = get_char_room( ch, arg )) == NULL)
  {
    send_to_char("Your hands miss their target...\n\r",ch);
    return;
  }
  
  if (ch->stunned)
  {
          send_to_char ("You're still a little woozy.\n\r", ch);
          return;
  }

/*	Cooldown check	
	if (ch->fighting != NULL && on_cooldown(ch, gsn_layhands))
	{
                send_to_char ("Layhands is still on cooldown.\n\r", ch);
                return;
       }


	Apply cooldown	
	cd.type      = skill_lookup("layhands");
	cd.duration	 = skill_table[gsn_layhands].cooldown;
        cooldown_on( ch, &cd );*/

  chance = get_skill(ch,gsn_layhands)*3/2;
  if(chance < (number_percent()+10))
  {
    check_improve (ch, gsn_layhands, TRUE, 2);
    WAIT_STATE (ch, skill_table[gsn_layhands].beats);
    send_to_char("You attempt to call your lay on hands power, but it fails.\n\r", ch);
    return;
  }

  if(arg[0]=='\0' || !str_cmp(ch->name,victim->name))
  {
    if(ch->mana < 500 || ch->move < 300)
    {
	    send_to_char("You call upon the gods for healing and find yourself empty.\n\r",ch);
	    return;
    }
    send_to_char("You sense disappointment as you call upon your gods to heal yourself.\n\r",ch);
    act("$n calls upon the favor of their god to heal themselves...\n\r",ch,NULL,NULL,TO_NOTVICT);
    hp_ammount = (ch->level*10) + (get_skill(ch,gsn_layhands)*10);
    if((ch->max_hit - ch->hit) < hp_ammount)
      hp_ammount = ch->max_hit - ch->hit;
    ch->hit += hp_ammount;
    ch->mana -= 500;
    ch->move -= 300;
    check_improve (ch, gsn_layhands, TRUE, 2);
    WAIT_STATE (ch, skill_table[gsn_layhands].beats);
    return;
  }

  send_to_char("You lay your hands on them, and heal their wounds.",ch);
  act("$n calls upon the favor of their god to heal $N...",ch,NULL,victim,TO_NOTVICT);
  /* act("$n calls upon the favor of their god to heal you...",ch,NULL,NULL,TO_VICT); */
  send_to_char("You feel a wave of healing from the Paladins touch...",victim);
  hp_ammount = (ch->level*5) + (get_skill(ch,gsn_layhands)*5);
  if((victim->max_hit - victim->hit) < hp_ammount)
    hp_ammount = victim->max_hit - victim->hit;
  victim->hit += hp_ammount;
  check_improve (ch, gsn_layhands, TRUE, 2);
  WAIT_STATE (ch, skill_table[gsn_layhands].beats);
  return;
}

void do_lead ( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *gch;
	AFFECT_DATA af;
	int count= 0;
	int members = 0;
	int effect = 0;
	int chance = 0;
	COOLDOWN_DATA cd;

	if (is_affected (ch, gsn_lead) || ch->move < 500 || ch->mana < 300)
	{
		send_to_char("You do not feel the strength within you to lead so soon.\n\r",ch);
		return;
	}

	chance = get_skill(ch,gsn_lead);

	/*if ((gch = ch->fighting) == NULL)
	{
		send_to_char ("You aren't fighting anyone.\n\r", ch);
		return;
	}*/

	for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room)
	{
		if (!is_same_group (gch, ch) || IS_NPC (gch))
			continue;
		if ( (gch->leader != ch) && (gch->master != ch) )
			continue;

		members++;
		count += gch->alignment;
	}

	if (members == 0)
	{
		send_to_char ("And who exactly are you leading to inspire?\n\r", ch);
		return;
	}
	
/*	Cooldown check	
	if (ch->fighting != NULL && on_cooldown(ch, gsn_lead))
	{
                send_to_char ("Lead is still on cooldown.\n\r", ch);
                return;
       }


*	Apply cooldown	
	cd.type      = skill_lookup("lead");
	cd.duration	 = skill_table[gsn_lead].cooldown;
        cooldown_on( ch, &cd );*/

	// effect is average align, 1000 being the best
	effect = count / members;

	// reset count to 0 for next step
	count = 0;
	members++;

	// add chance of failure/winning
	effect -= 8*number_percent();
	effect += 8*number_percent();

	effect = effect * chance / 100;

	if (effect < 0)
	{
		send_to_char("You step forward to take charge only to find yourself being laughed at.\n\r",ch);
		act("$n begins a battle cry and accidentally breaks into a humorous falsetto...",ch,NULL,gch,TO_NOTVICT);
		count = 0;
	}
	else if(effect < 250)
	{
		send_to_char("You step forward ushering a half-hearted cry of war.\n\r",ch);
		act("$n begins a half-hearted cry of war wobbling slightly at the climax.",ch,NULL,gch,TO_NOTVICT);
		count = 1;
	}
	else if(effect < 500)
	{
		send_to_char("With the grace of an ox you cry out, calling on comrads to follow you into battle.\n\r",ch);
		act("$n moves with the grace of an ox crying out for men to follow his lead.",ch,NULL,gch,TO_NOTVICT);
		count = 2;
	}
	else if(effect < 750)
	{
		send_to_char("Moving with confidence you lift your voice in a roaring warcry.\n\r",ch);
		act("$n stands with confidence and roars out a powerful warcry.",ch,NULL,gch,TO_NOTVICT);
		count = 3;
	}
	else if(effect < 1000)
	{
		send_to_char("With practiced ease you call for men to follow you knowing that they indeed will.\n\r",ch);
		act("With practiced ease, $n calls in passionate and powerful words for victory!",ch,NULL,gch,TO_NOTVICT);
		count = 4;
	}
	else
	{
		send_to_char("A fierce rage surrounds you inspiring men to follow til death.\n\r",ch);
		act("Infused with power and conviction $n calls on men to follow him to battle.",ch,NULL,gch,TO_NOTVICT);
		count = 5;
	}

	af.where = TO_AFFECTS;
	af.type = gsn_lead;
	af.level = ch->level;
	af.bitvector = 0;
	af.duration = 15;

	for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room)
	{
		if (!is_same_group (gch, ch) || IS_NPC (gch))
			continue;
		// messages for the individual need to be moved into the loop
		//
		switch(count)
		{
			case (0):
			send_to_char("You feel completely discouraged and uninspired.\n\r",gch);
			break;
			case (1):
			send_to_char("You wonder what just happened and continue on uninspired.\n\r",gch);
			break;
			case (2):
			send_to_char("You feel a slight thrill and your pulse begins to quicken.\n\r",gch);
			break;
			case (3):
			send_to_char("Your muscles tense in anticipation of the fight to come.\n\r",gch);
			break;
			case (4):
			send_to_char("A thrill races down your spine as you prepare to battle.\n\r",gch);
			break;
			case (5):
			send_to_char("Waves of euphoria and adrenaline wash over you pumping life into your limbs.\n\r",gch);
			break;
			default:
			send_to_char("Do_lead: count. - Inform an immortal.\n\r",gch);
		}
		af.modifier = number_range(1,10) * effect / 1000;
		af.location = APPLY_CON;
		affect_to_char(gch,&af);
		af.location = APPLY_STR;
		affect_to_char(gch,&af);
		af.location = APPLY_WIS;
		affect_to_char(gch,&af);
		af.location = APPLY_DEX;
		affect_to_char(gch,&af);
		af.modifier = count * 5;
		af.location = APPLY_HITROLL;
		affect_to_char(gch,&af);
		af.location = APPLY_DAMROLL;
		affect_to_char(gch,&af);
		af.location = APPLY_AC;
		af.modifier = count * -8;
		affect_to_char(gch,&af);
	}

	ch->move -= 500;
	ch->mana -= 300;
	check_improve(ch, gsn_lead, TRUE, 2);
	WAIT_STATE (ch, skill_table[gsn_lead].beats);

	return;
}