distorted/
distorted/area/
distorted/data/CLN/
#include "include.h"

bool check_dispel args ( ( int dis_level, CHAR_DATA *victim, int sn) );
bool check_tumble args ((CHAR_DATA *ch, CHAR_DATA *victim, int dt));
void check_ground_stomp args((CHAR_DATA *ch,CHAR_DATA *victim,int chance,int dam));
DECLARE_DO_FUN( do_yell );
DECLARE_DO_FUN( do_look );
DECLARE_DO_FUN( do_monk_nerve );
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));

void do_chreset(CHAR_DATA *ch, char *argument)
{
 send_to_char("Character Reset.\n\r",ch);
 reset_char(ch);
 return;
}

void do_herb(CHAR_DATA *ch, char *argument)
{
 char arg[100];
 CHAR_DATA *victim;
 AFFECT_DATA af;

 argument = one_argument(argument,arg);

 if (get_skill (ch, gsn_herb) == 0 ||
      (ch->level < skill_table[gsn_herb].skill_level[ch->class]))
 {
  send_to_char("You find some lovely herbs in the bushes.\n\r",ch);
  return;
 }


/*   if ((ch->in_room->sector_type != SECT_FOREST)
   && (ch->in_room->sector_type != SECT_HILLS) 
   && (ch->in_room->sector_type != SECT_MOUNTAIN) ) */

   if (!IS_SET(ch->in_room->affected_by,ROOM_AFF_OVERGROWN))
   {
   if ((ch->in_room->sector_type == SECT_CITY) || (ch->in_room->sector_type == SECT_INSIDE))
   	{ 
     send_to_char("You must be in a wilderness environment to find herbs.\n\r",ch);
     return; 
   	} 
   }

   if (arg[0] == '\0') 
      victim = ch;
   else   if ((victim = get_char_room(ch,arg)) == NULL)
   { 
      send_to_char("They aren't here to be healed.\n\r",ch);
      return; 
   } 

   if (number_percent() > ch->pcdata->learned[gsn_herb]) 
   { 
       act("You search around the area but cannot find any herbs.",ch,NULL,NULL,TO_CHAR);
       act("$n looks in the bushes intently.",ch,NULL,NULL,TO_ROOM);
       check_improve(ch,gsn_herb,FALSE,2); 
       return; 
   }

   if(number_bits(2) == 0)
   {
    act("You search around the area but cannot find any herbs.",ch,NULL,NULL,TO_CHAR);
    act("$n looks in the bushes intently.",ch,NULL,NULL,TO_ROOM);
    check_improve(ch,gsn_herb,FALSE,2); 
    return;
   }

   if(is_affected(victim, gsn_herb))
   {
    if(victim == ch)
     send_to_char("You already have herbs applied to your wounds.\n\r",ch);
    else
     send_to_char("They already have herbs on their wounds.\n\r",ch);
    return;
   }

 
   if (victim != ch) 
   { 
    act("You find some herbs and apply them to $N's wounds.",ch,NULL,victim,TO_CHAR);
    act("$n searches in a few nearby bushes and emerges with some herbs.",ch,NULL,NULL,TO_ROOM);
    act("$n applies the herbs to your wounds.",ch,NULL,victim,TO_VICT);
   } 
 
   if (victim == ch) 
   { 
    act("$n searches in a few nearby bushes and emerges with some herbs.",ch,NULL,NULL,TO_ROOM);
    send_to_char("You find some herbs and apply them to your wounds.\n\r",ch);
   } 

   if (IS_AFFECTED(victim,AFF_PLAGUE) && number_percent() > 30) 
   { 
     affect_strip(victim,gsn_plague); 
     act("The sores on $n's body vanish.\n\r",victim,0,0,TO_ROOM); 
     send_to_char("The sores on your body vanish.\n\r",victim); 
   }

   if (IS_AFFECTED(victim,AFF_POISON) && number_percent() > 30) 
   { 
     affect_strip(victim,gsn_poison); 
     act("$n looks a bit healthier.\n\r",victim,0,0,TO_ROOM); 
     send_to_char("The poison in your body is nullified.\n\r",victim); 
   } 

   check_improve(ch,gsn_herb,TRUE,4);

   if(victim->hit >= victim->max_hit)
   {
    if(ch == victim)
     send_to_char("But you are not wounded!\n\r",ch);
    else
     act("But $N is not wounded!",ch,NULL,victim,TO_CHAR);
    return;
   }

    af.where = TO_AFFECTS; 
    af.type = gsn_herb; 
    af.location = APPLY_REGEN; 
    af.duration = ch->level/10;
    af.modifier = ch->level < 51 ? ch->level/2 : ch->level;
    af.bitvector = 0; 
    af.level = ch->level; 
    affect_to_char(victim,&af); 
        return; 
}

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

    if ( (get_skill(ch,gsn_barkskin) <= 0)
        || (ch->level < skill_table[gsn_barkskin].skill_level[ch->class] ) )
    {
	send_to_char("You do not know how to turn your skin to bark.\n\r",ch);
	return;
    }

    if (is_affected(ch,gsn_barkskin) )
    {
	send_to_char("Your skin is already covered in bark.\n\r",ch);
	return;
    }

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

    if (number_percent() > get_skill(ch,gsn_barkskin))
    {
        send_to_char("Your skin begins to harden but grows soft again.\n\r",ch);
        check_improve(ch,gsn_barkskin,FALSE,1);
        ch->mana -= 30;
        return;
    }

    af.where = TO_AFFECTS;
    af.type = gsn_barkskin;
    af.level = ch->level;
    af.location = APPLY_AC;
    af.modifier = -(ch->level * 2/3);
    af.duration = ch->level/5;
    af.bitvector = 0;
    affect_to_char(ch,&af);

    ch->mana -= 60;

    act("$n's brow furrows and $s skin turns into bark.",ch,NULL,NULL,TO_ROOM);
    send_to_char("Your skin hardens into bark.\n\r",ch);
    check_improve(ch,gsn_barkskin,TRUE,1);
    return;
}

void spell_entangle( int sn, int level, CHAR_DATA *ch, void *vo,int target )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;
 
/*    if(ch->in_room->sector_type != SECT_FOREST &&
       ch->in_room->sector_type != SECT_MOUNTAIN)*/

       if (!IS_SET(ch->in_room->affected_by,ROOM_AFF_OVERGROWN))
       {
       		if ((ch->in_room->sector_type == SECT_CITY) || (ch->in_room->sector_type == SECT_INSIDE))
       		{
        	send_to_char("You must be in the wilderness to entangle someone.\n\r",ch);
        	return;
       		}
   	   }

    if (victim == ch)
    {
      send_to_char("You cannot entangle yourself!\n\r",ch);
      return;
    }

    if ( is_affected( victim, gsn_entangle ))
    {
          act("$N is already entangled in vines.",
              ch,NULL,victim,TO_CHAR);
        return;
    }

    if ( IS_AFFECTED(victim,AFF_SLOW))
    {
          act("$N is moving sluggishly already.",
              ch,NULL,victim,TO_CHAR);
        return;
    }

    if (saves_spell(level,victim,DAM_OTHER) 
    ||  IS_SET(victim->imm_flags,IMM_MAGIC))
    {
        act("Vines from the surrounding forest lunge at $N but miss.",ch,NULL,victim,TO_CHAR);
        return;
    }
 
    if (IS_AFFECTED(victim,AFF_HASTE))
    {
        if (!check_dispel(level,victim,skill_lookup("haste")))
        {
            act("Vines from the surrounding forest grab $N but $E struggles free.",ch,NULL,victim,TO_CHAR);
            return;
        }

        act("$n is slowed by entagling vines.",victim,NULL,NULL,TO_ROOM);

        if(is_affected(victim,skill_lookup("haste")))
         affect_strip(victim,skill_lookup("haste"));
        else
        REMOVE_BIT(victim->affected_by,AFF_HASTE);

        return;
    } 

    af.where     = TO_AFFECTS;
    af.type      = gsn_entangle;
    af.level     = level;
    af.duration  = level/3;
    af.location  = APPLY_DEX;
    af.modifier  = -1 - (level >= 18) - (level >= 25) - (level >= 32) - (level >= 48);
    af.bitvector = 0;
    affect_to_char( victim, &af );

    send_to_char( "Long forest vines reach out and entangle you!\n\r", victim );
    act("$n is entangled by long green vines!",victim,NULL,NULL,TO_ROOM);
    return;
}

void spell_crevice(int sn,int level,CHAR_DATA *ch,void *vo,int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    int dam, save_num = 0;
    int count;

    if (!IS_SET(ch->in_room->affected_by,ROOM_AFF_OVERGROWN))
    {
    if ((ch->in_room->sector_type != SECT_FOREST) && ( ch->in_room->sector_type != SECT_MOUNTAIN) 
    && ( ch->in_room->sector_type != SECT_FIELD))
    {
        send_to_char("You do not control the elements in this environment.\n\r",ch);
        return;
    }
	}

    act("$n opens a crevice in the ground beneath $N.",ch,NULL,victim,TO_NOTVICT);
    act("$n opens a crevice beneath you.",ch,NULL,victim,TO_VICT);
    act("You call upon the magic of the wilderness and create a crevice beneath $N.",ch,NULL,victim,TO_CHAR);

    if(number_bits(2)==0)
     dam = dice(level*3, 18);
    else
     dam = dice(level*2, 14);

    dam += dice(level,12);

    for (count = 0; count < 2; count++)
    {
        if (saves_spell(level, victim, DAM_BASH) )
            save_num++;
    }

    if (save_num == 0)
    {
        act("$n cries out as $s the crevice closes in on $m!",victim,NULL,NULL,TO_ROOM);
        send_to_char("You fall into the crevice and scream in agony as it closes in on you!\n\r",victim);
        damage(ch,victim,dam,gsn_crevice,DAM_BASH,TRUE,0);
        return;
    }

    dam /= save_num * 2;   // Up to divided by 4

    damage(ch,victim,dam,gsn_crevice,DAM_BASH,TRUE,0);

    return;
}

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

    if ( (get_skill(ch,gsn_detect_terrain) <= 0)
        || (ch->level < skill_table[gsn_detect_terrain].skill_level[ch->class] ) )
    {
	send_to_char("You do not know how to detect the environment.\n\r",ch);
	return;
    }


    if ( is_affected(ch, gsn_detect_terrain) )
    {
        send_to_char("You are already identifying the environment. \n\r",ch);
        return;
    }

    af.where     = TO_AFFECTS;
    af.type      = gsn_detect_terrain;
    af.level     = ch->level;
    af.duration  = ch->level/2;
    af.location  = APPLY_NONE;
    af.modifier  = 0;
    af.bitvector = 0;
    affect_to_char( ch, &af );

    send_to_char( "Your awareness of the environment improves.\n\r", ch );
    return;
}

/*-------------- MISCELLANEOUS -------------------*/
void do_throw(CHAR_DATA *ch,char *argument) 
{ 
    CHAR_DATA *victim; 
    int dam, chance, percent; 
    char arg[MAX_INPUT_LENGTH]; 
 
    if ( ( chance = get_skill(ch,gsn_throw) ) == 0 
       || !has_skill(ch,gsn_throw) ) 
    { 
       send_to_char("Throwing? What's that?\n\r",ch); 
       return; 
    } 
 
    one_argument(argument,arg); 

    victim = ( arg[0] == '\0' ? ch->fighting : get_char_room(ch,arg) ); 
 
    if ( victim == NULL ) 
    { 
        send_to_char("They aren't here.\n\r",ch); 
        return; 
    }
 
    if ( victim == ch ) 
    { 
        send_to_char("You can't throw yourself dummy.\n\r",ch); 
        return; 
    }
    
    if (!is_affected(ch,gsn_martial_arts))
    {
	    send_to_char("You must be focused on the martial arts to use this skill.\n\r",ch);
	    return;
    }
    
    if ( ch->stunned > 0 )
    {
	send_to_char ("You're still a little woozy.\n\r", ch);
	return;
    } 

    if ( ( victim->fighting != ch ) && ( ch->fighting != victim ) )
    { 
        send_to_char("But you aren't engaged in combat with them.\n\r",ch); 
        return; 
    } 
 
    if ( get_eq_char(ch,WEAR_WIELD) != NULL || get_eq_char(ch,WEAR_SECONDARY) != NULL )
    { 
        send_to_char("You cannot throw with items in your hands.\n\r",ch); 
        return; 
    }
    
    if ( IS_NPC(victim) )
    {
       chance += (ch->level - (victim->level - 20));
       chance -= get_curr_stat(victim,STAT_DEX)*2/3;
    }
    else
    {
   	   chance += (ch->level - victim->level); 
    	   chance -= get_curr_stat(victim,STAT_DEX);
    }
    
    chance += get_curr_stat(ch,STAT_DEX)*2/3; 
    chance = URANGE(5, chance, 80); 
 
    if (is_affected(ch,AFF_BLIND))
    {
	    chance /=3; //Harder to land while blind.
    }
    
    if (number_percent() > chance) 
    { 
        dam = 0; 
        check_improve(ch,gsn_throw,FALSE,3); 
    } 
    else 
    { 
        if (check_tumble(ch,victim,gsn_throw)) 
        { 
           check_improve(ch,gsn_throw,TRUE,2); 
           act("$N rolls free of $n's throw.",ch,0,victim,TO_NOTVICT); 
           act("You roll out of $n's throw attempt.",ch,0,victim,TO_VICT); 
           act("$N rolls free of your throw attempt.",ch,0,victim,TO_CHAR);
           WAIT_STATE(ch,skill_table[gsn_throw].beats);
           return; 
        } 
 
	dam = (ch->level * number_range(1,5));

        act("$n grabs $N and throws $M to the ground with stunning force!",ch,0,victim,TO_NOTVICT);
        act("You grab $N and throw $M to the ground with stunning force!",ch,0,victim,TO_CHAR); 
        act("$n grabs you and throws you to the ground with stunning force!",ch,0,victim,TO_VICT); 
 
        dam += (get_curr_stat(ch,STAT_DEX)+str_app[get_curr_stat(ch,STAT_STR)].todam)*2; 
        check_improve(ch,gsn_throw,TRUE,3);
        
        if ( !is_affected( victim, gsn_throw ) )
        {
           AFFECT_DATA af;
  
           WAIT_STATE(victim,1*PULSE_VIOLENCE);
            
            af.where      = TO_AFFECTS;
            af.type       = gsn_throw;
            af.level      = ch->level;
            af.duration   = 1;
            af.location   = APPLY_CON;
            af.modifier   = -5;
            af.bitvector  = 0;
        
            affect_to_char( victim, &af );
        }


        /* A little extra kick */
        if ( ( percent = number_percent() ) <= ( get_skill(ch,gsn_throw) / 6 ) )
        {
           dam = 2 * dam + (dam * 2 * percent / 100);
           victim->stunned = 1;
           act ("{)You are stunned, and have trouble getting back up!{x", ch, NULL, victim, TO_VICT);
           act ("{.$N is stunned by the force of your throw!{x", ch, NULL, victim, TO_CHAR);
           act ("{($N is having trouble getting back up.{x", ch, NULL, victim, TO_NOTVICT);
        }
        
        
    } 
 
    damage(ch,victim,dam,gsn_throw,DAM_BASH,TRUE,0); 
    WAIT_STATE(ch,1*PULSE_VIOLENCE); 
    
    if ( ch->fighting == victim ) 
        check_ground_stomp(ch,victim,chance,dam);  
 
    return; 
} 

void do_nerve(CHAR_DATA *ch,char *argument) 
{ 
    char buf[MAX_STRING_LENGTH]; 
    CHAR_DATA *victim; 
    char arg[MAX_INPUT_LENGTH]; 
    AFFECT_DATA af; 
    int chance; 
 
    if(ch->class == CLASS_MONK)
    {
     do_monk_nerve(ch,argument);
     return;
    }
    
    if ( (chance = get_skill(ch,gsn_nerve)) == 0 
    || !has_skill(ch,gsn_nerve)) 
    { 
        send_to_char("You don't know how to stun opponents.\n\r",ch); 
        return; 
    } 
 
    one_argument(argument,arg); 
    if (arg[0] == '\0') 
        victim = ch->fighting; 
    else 
        victim = get_char_room(ch,arg); 
 
    if (victim == NULL) 
    { 
        send_to_char("Attempt to stun who?\n\r",ch); 
        return; 
    } 
    if (victim == ch) 
    { 
        send_to_char("You can't do that.\n\r",ch); 
        return; 
    } 
    
    if (ch->stunned > 0)
    {
	send_to_char ("You're still a little woozy.\n\r", ch);
	return;
    }
    
    if (is_safe(ch,victim)) 
        return; 
 
    if (is_affected(victim,gsn_nerve)) 
    { 
        send_to_char("They have already been weakened.\n\r",ch);  
        return; 
    } 
 
      
    chance += (ch->level - victim->level)*2; 
    chance -= get_curr_stat(victim,STAT_DEX)/3; 
    chance += get_curr_stat(ch,STAT_DEX)/2; 
    chance -= get_curr_stat(victim,STAT_CON)/3;
    chance += get_curr_stat(ch,STAT_CON)/2;
    if(IS_NPC(victim))
          chance+=(victim->level/5);
    if (number_percent() > chance) 
    { 
        act("$n grasps $N's neck but fails to stun them.",ch,0,victim,TO_NOTVICT); 
        act("You grasp $N's neck but fail to stun them.",ch,0,victim,TO_CHAR); 
        act("$n grasps your neck but fails to stun you.",ch,0,victim,TO_VICT); 
        check_improve(ch,gsn_nerve,FALSE,3); 
        WAIT_STATE(ch,PULSE_VIOLENCE); 
        return; 
    } 
    else 
    { 
    act("$n grasps $N's neck and weakens $m with pressure points.",ch,0,victim,TO_NOTVICT); 
    act("You grasp $N's neck and weaken $m with pressure points.",ch,0,victim,TO_CHAR); 
    act("$n grasps your neck and weakens you with pressure point.",ch,0,victim,TO_VICT); 
    check_improve(ch,gsn_nerve,TRUE,3); 
    af.where = TO_AFFECTS; 
    af.type = gsn_nerve; 
    af.location = APPLY_STR; 
    af.duration = 1; 
    af.bitvector = 0; 
    af.modifier = -3; 
    af.level = ch->level; 
    affect_to_char(victim,&af); 
    WAIT_STATE(ch,PULSE_VIOLENCE);
    victim->stunned = 1;
     act ("{)You are stunned, and have trouble getting back up!{x", ch, NULL, victim, TO_VICT);
     act ("{.$N is stunned by your nerve strike!{x", ch, NULL, victim, TO_CHAR);
     act ("{($N is having trouble getting back up.{x", ch, NULL, victim, TO_NOTVICT);
    } 
 
        if (!IS_NPC(ch) && !IS_NPC(victim) 
        && (ch->fighting == NULL 
        || victim->fighting == NULL) ) 
        { 
         sprintf(buf,"Help, %s is attacking me!",PERS(ch,victim)); 
         do_yell(victim,buf); 
        } 
        if (victim->fighting == NULL) 
        { 
         multi_hit(victim,ch,TYPE_UNDEFINED); 
        } 
                 
    return; 
}

bool check_tumble(CHAR_DATA *ch, CHAR_DATA *victim, int dt) 
{ 
        int chance; 
 
        if ( (chance = get_skill(victim,gsn_roll)) == 0 
        || !has_skill(victim,gsn_roll)) 
                return FALSE; 
                 
        chance *= 4; 
        chance /= 5; 
        chance += get_curr_stat(victim,STAT_DEX); 
        chance -= victim->carry_weight/100;
        chance -= get_curr_stat(ch,STAT_DEX);
        if (number_percent() > chance) 
        { 
           check_improve(victim,gsn_roll,FALSE,2); 
           return FALSE; 
        } 
 
        check_improve(victim,gsn_roll,TRUE,2); 
        return TRUE; 
} 

void do_lunge( CHAR_DATA *ch, char *argument) 
{ 
        CHAR_DATA *victim; 
        int chance, dam; 
        char arg[MAX_INPUT_LENGTH]; 
        OBJ_DATA *wield,*second; 
        int multiplier; 
        bool DUAL = FALSE; 
         
        dam = 0; 
        one_argument(argument,arg); 
        if ((chance = get_skill(ch,gsn_lunge) ) == 0 
        || !has_skill(ch,gsn_lunge) ) 
        { 
        send_to_char("Lunging? What's that?\n\r",ch); 
        return; 
        } 
        if (arg[0] == '\0') 
        { 
        victim = ch->fighting; 
         if (victim == NULL) 
         { 
            send_to_char("But you aren't fighting anyone!\n\r",ch); 
            return; 
         } 
        } 
        else if ( (victim = get_char_room(ch,arg)) == NULL ) 
        { 
                send_to_char("They aren't here.\n\r",ch); 
                return; 
        } 
        if (victim == ch) 
        { 
        send_to_char("You can't lunge at yourself!\n\r",ch); 
        return; 
        }

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

        if(ch->stunned)
        {
         send_to_char("You are still a bit woozy.\n\r",ch);
         return;
        }
     
        wield = get_eq_char(ch,WEAR_WIELD); 
        second = get_eq_char(ch,WEAR_SECONDARY); 
 
        if ((wield == NULL) 
        || (( wield->value[0] != WEAPON_SWORD) 
        && ( wield->value[0] != WEAPON_SPEAR) 
        && ( wield->value[0] != WEAPON_POLEARM) )) 
        { 
         if ((second == NULL) 
         || (( second->value[0] != WEAPON_SWORD) 
         && ( second->value[0] != WEAPON_SPEAR) 
         && ( second->value[0] != WEAPON_POLEARM) )) 
         { 
          send_to_char("You must be wielding a sword, spear or polearm to lunge.\n\r",ch); 
          return; 
         } 
         else 
         { 
         DUAL = TRUE; 
         } 
        } 
 
        if (is_safe(ch,victim) ) 
        return; 
 
        chance += ch->carry_weight/25; 
        chance -= victim->carry_weight/20; 
        chance += (ch->size - victim->size)*20; 
        chance -= get_curr_stat(victim,STAT_DEX); 
        chance += get_curr_stat(ch,STAT_STR)/3; 
        chance += get_curr_stat(ch,STAT_DEX)/2; 
        if (IS_AFFECTED(ch,AFF_HASTE) ) 
                chance += 10; 
        if (IS_AFFECTED(victim,AFF_HASTE) ) 
                chance -= 10; 
        chance += (ch->level - victim->level);

        act("$n attempts to impale $N with a quick lunge!",ch,0,victim,TO_NOTVICT); 
        act("You attempt to impale $N with a quick lunge!",ch,0,victim,TO_CHAR); 
        act("$n attempts to impale you with a quick lunge!",ch,0,victim,TO_VICT); 
 
        if (number_percent() < chance) 
        { 
        check_improve(ch,gsn_lunge,TRUE,1); 
        WAIT_STATE(ch,skill_table[gsn_lunge].beats); 
 
        if(DUAL) 
        wield = second; 
 
        if (wield->pIndexData->new_format) 
                dam = dice(wield->value[1],wield->value[2]); 
        else 
                dam = number_range(wield->value[1],wield->value[2]); 
 
        if (get_skill(ch,gsn_enhanced_damage) > 0 ) 
        { 
         if (number_percent() <= get_skill(ch,gsn_enhanced_damage) ) 
         { 
           check_improve(ch,gsn_enhanced_damage,TRUE,1); 
           dam += dam * (number_range(50,100)/100) * ch->pcdata->learned[gsn_enhanced_damage]/100; 
         } 
        } 
 
        dam += GET_DAMROLL(ch); 
        dam *= ch->pcdata->learned[gsn_lunge]; 
        dam /= 100; 
        multiplier = number_range(ch->level/8, ch->level/4); 
        multiplier /= 10; 
        multiplier += 5/4; 
        dam *= multiplier;
        if(!DUAL && IS_WEAPON_STAT(wield,WEAPON_TWO_HANDS))
         dam *= 1.5;
 
        if (dam <= 0) 
                dam = 1; 
        damage(ch,victim,dam,gsn_lunge,DAM_PIERCE,TRUE,0); 
        } 
        else 
        { 
        damage(ch,victim,dam,gsn_lunge,DAM_PIERCE,TRUE,0); 
        check_improve(ch,gsn_lunge,FALSE,1); 
        WAIT_STATE(ch,skill_table[gsn_lunge].beats); 
        } 
        return; 
} 

void special_move( CHAR_DATA *ch, CHAR_DATA *victim )
{
    int dam = number_range(5,10) + GET_DAMROLL(ch);

    if (dam < 10) dam = 10;

    switch (number_range(1,7))
    {
    default:
	return;
    case 1: /* Punch */
	act("You pull your hands into your waist then snap them into $N's stomach.",ch,NULL,victim,TO_CHAR);
	act("$n pulls $s hands into $s waist then snaps them into your stomach.",ch,NULL,victim,TO_VICT);
	act("$n pulls $s hands into $s waist then snaps them into $N's stomach.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_punch,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You double over in agony, and fall to the ground gasping for breath.",victim,NULL,NULL,TO_CHAR);
	act("$n doubles over in agony, and falls to the ground gasping for breath.",victim,NULL,NULL,TO_ROOM);
        victim->stunned = 2;
	break;
    case 2: /* Spinkick */
	act("You spin in a low circle, catching $N behind $S ankle.",ch,NULL,victim,TO_CHAR);
	act("$n spins in a low circle, catching you behind your ankle.",ch,NULL,victim,TO_VICT);
	act("$n spins in a low circle, catching $N behind $S ankle.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_spinkick,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You crash to the ground, stunned.",victim,NULL,NULL,TO_CHAR);
	act("$n crashes to the ground, stunned.",victim,NULL,NULL,TO_ROOM);
        victim->stunned = 2;
	break;
    case 3: /* Elbow */
	act("You roll between $N's legs and flip to your feet.",ch,NULL,victim,TO_CHAR);
	act("$n rolls between your legs and flips to $s feet.",ch,NULL,victim,TO_VICT);
	act("$n rolls between $N's legs and flips to $s feet.",ch,NULL,victim,TO_NOTVICT);
	act("You spin around and smash your elbow into the back of $N's head.",ch,NULL,victim,TO_CHAR);
	act("$n spins around and smashes $s elbow into the back of your head.",ch,NULL,victim,TO_VICT);
	act("$n spins around and smashes $s elbow into the back of $N's head.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_elbow,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You fall to the ground, stunned.",victim,NULL,NULL,TO_CHAR);
	act("$n falls to the ground, stunned.",victim,NULL,NULL,TO_ROOM);
        victim->stunned = 2;
	break;
    case 4: /* Kick */
	act("You somersault over $N's head and land lightly on your toes.",ch,NULL,victim,TO_CHAR);
	act("$n somersaults over your head and lands lightly on $s toes.",ch,NULL,victim,TO_VICT);
	act("$n somersaults over $N's head and lands lightly on $s toes.",ch,NULL,victim,TO_NOTVICT);
	act("You roll back onto your shoulders and kick both feet into $N's back.",ch,NULL,victim,TO_CHAR);
	act("$n rolls back onto $s shoulders and kicks both feet into your back.",ch,NULL,victim,TO_VICT);
	act("$n rolls back onto $s shoulders and kicks both feet into $N's back.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_kick, DAM_BASH, TRUE, 0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You fall to the ground, stunned.",victim,NULL,NULL,TO_CHAR);
	act("$n falls to the ground, stunned.",victim,NULL,NULL,TO_ROOM);
	act("You flip back up to your feet.",ch,NULL,NULL,TO_CHAR);
	act("$n flips back up to $s feet.",ch,NULL,NULL,TO_ROOM);
	stop_fighting(victim, TRUE);
        victim->stunned = 2;
	break;
    case 5: /* Headbutt */
	act("You grab $N by the neck and slam your head into $S face.",ch,NULL,victim,TO_CHAR);
	act("$n grabs $N by the neck and slams $s head into $S face.",ch,NULL,victim,TO_NOTVICT);
	act("$n grabs you by the neck and slams $s head into your face.",ch,NULL,victim,TO_VICT);
        damage(ch,victim,dam,gsn_headbutt,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You crash to the ground, stunned.",victim,NULL,NULL,TO_CHAR);
	act("$n crashes to the ground, stunned.",victim,NULL,NULL,TO_ROOM);
        victim->stunned = 2;
	break;
    case 6: /* Knee */
	act("You slam your fist into $N's stomach, who doubles over in agony.",ch,NULL,victim,TO_CHAR);
	act("$n slams $s fist into your stomach, and you double over in agony.",ch,NULL,victim,TO_VICT);
	act("$n slams $s fist into $N's stomach, who doubles over in agony.",ch,NULL,victim,TO_NOTVICT);
	act("You grab $N by the head and slam $S face into your knee.",ch,NULL,victim,TO_CHAR);
	act("$n grabs you by the head and slams your face into $s knee.",ch,NULL,victim,TO_VICT);
	act("$n grabs $N by the head and slams $S face into $s knee.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_knee,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You roll onto your back and smash your feet into $N's chest.",ch,NULL,victim,TO_CHAR);
	act("$n rolls onto $s back and smashes $s feet into your chest.",ch,NULL,victim,TO_VICT);
	act("$n rolls onto $s back and smashes $s feet into $N's chest.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_kick,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You crash to the ground, stunned.",victim,NULL,NULL,TO_CHAR);
	act("$n crashes to the ground, stunned.",victim,NULL,NULL,TO_ROOM);
	act("You flip back up to your feet.",ch,NULL,NULL,TO_CHAR);
	act("$n flips back up to $s feet.",ch,NULL,NULL,TO_ROOM);
	stop_fighting(victim, TRUE);
        victim->stunned = 2;
	break;
    case 7: /* Punch again */
	act("You duck under $N's attack and pound your fist into $S stomach.",ch,NULL,victim,TO_CHAR);
	act("$n ducks under your attack and pounds $s fist into your stomach.",ch,NULL,victim,TO_VICT);
	act("$n ducks under $N's attack and pounds $s fist into $N's stomach.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_punch,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You double over in agony.",victim,NULL,NULL,TO_CHAR);
	act("$n doubles over in agony.",victim,NULL,NULL,TO_ROOM);

	act("You grab $M by the head and smash your knee into $S face.",ch,NULL,victim,TO_CHAR);
	act("$n grabs you by the head and smashes $s knee into your face.",ch,NULL,victim,TO_VICT);
	act("$n grabs $M by the head and smashes $s knee into $N's face.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_knee,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;

	act("You stamp on the back of $N's leg, forcing $M to drop to one knee.",ch,NULL,victim,TO_CHAR);
	act("$n stamps on the back of your leg, forcing you to drop to one knee.",ch,NULL,victim,TO_VICT);
	act("$n stamps on the back of $N's leg, forcing $M to drop to one knee.",ch,NULL,victim,TO_NOTVICT);

	act("You grab $N by the hair and yank $S head back.",ch,NULL,victim,TO_CHAR);
	act("$n grabs you by the hair and yank your head back.",ch,NULL,victim,TO_VICT);
	act("$n grabs $N by the hair and yank $S head back.",ch,NULL,victim,TO_NOTVICT);

	act("You hammer your elbow down into $N's face.",ch,NULL,victim,TO_CHAR);
	act("$n hammers $s elbow down into your face.",ch,NULL,victim,TO_VICT);
	act("$n hammers $s elbow down into $N's face.",ch,NULL,victim,TO_NOTVICT);
        damage(ch,victim,dam,gsn_elbow,DAM_BASH,TRUE,0);
	if (victim == NULL || victim->position == POS_DEAD) return;
	act("You crash to the ground, stunned.",victim,NULL,NULL,TO_CHAR);
	act("$n crashes to the ground, stunned.",victim,NULL,NULL,TO_ROOM);
        victim->stunned = 2;
	break;
    }
    return;
}

/* Hara Kiri -- Skyntil */
/*
void do_hara_kiri(CHAR_DATA *ch, char *argument)
{
 char arg1[MSL/4];
 AFFECT_DATA af;
 int counter;

 one_argument(argument,arg1);

 if(!is_warrior_class(ch->class) || ch->class == CLASS_MONK)
 {
  send_to_char("Huh?\n\r",ch);
  return;
 }

 if(is_affected(ch,gsn_hara_kiri))
 {
  send_to_char("You must recover from your previous attempt first.\n\r",ch);
  return;
 }

 if(ch->hit < ch->max_hit/2)
 {
  send_to_char("You do not have the health to perform this ritual.\n\r",ch);
  return;
 }
*/
 /* Full Hara */
 /* if(!str_cmp(arg1,"full"))
 {
  act("You tense your body incredibly.",ch,NULL,NULL,TO_CHAR);
  act("$N looks very pale all of a sudden.",NULL,NULL,ch,TO_NOTVICT);
  act("Your veins pop up from beneath your skin.",ch,NULL,NULL,TO_CHAR);
  act("$N slits his wrists!",NULL,NULL,ch,TO_NOTVICT);
  act("You slit your wrists and let the blood drain out.",ch,NULL,NULL,TO_CHAR);
  act("Blood pours onto the floor. $N faints.",NULL,NULL,ch,TO_NOTVICT);
  act("You faint.",ch,NULL,NULL,TO_CHAR);
  ch->hit = 1;
  ch->stunned = 2;

  af.where = TO_AFFECTS;
  af.type = gsn_hara_kiri;
  af.level = ch->level;
  af.duration = ch->level/4;
  af.modifier = (ch->level-1)*2.75;
  af.location = APPLY_REGEN;
  af.bitvector = 0;
  affect_to_char(ch,&af);
  act("You feel slightly disorientated.",ch,NULL,NULL,TO_CHAR);
  for(counter = 0; counter < 4000; counter++)
   improve_toughness(ch);

  return;
 }
*/
//changes here -bree
 /* if(!str_cmp(arg1,""))
 {
  act("You must use 'hara full, hara half, or hara minor.",ch,NULL,NULL,TO_CHAR);
  
  return;
 }
*/


 /* Half Hara */
 /* if(!str_cmp(arg1,"half"))
 {
  act("You tense your body incredibly.",ch,NULL,NULL,TO_CHAR);
  act("$N looks very pale all of a sudden.",NULL,NULL,ch,TO_NOTVICT);
  act("Your veins pop up from beneath your skin.",ch,NULL,NULL,TO_CHAR);
  act("$N slits his wrists!",NULL,NULL,ch,TO_NOTVICT);
  act("You slit your wrists and let the blood drain out.",ch,NULL,NULL,TO_CHAR);
  act("Blood pours onto the floor. $N faints.",NULL,NULL,ch,TO_NOTVICT);
  act("You faint.",ch,NULL,NULL,TO_CHAR);
  ch->hit /= 2;
  ch->stunned = 1;

  af.where = TO_AFFECTS;
  af.type = gsn_hara_kiri;
  af.level = ch->level/2;
  af.duration = ch->level/7;
  af.modifier = (ch->level-1)*2.25;
  af.location = APPLY_REGEN;
  af.bitvector = 0;
  affect_to_char(ch,&af);
  act("You feel invigorated.",ch,NULL,NULL,TO_CHAR);
  for(counter = 0; counter < 2500; counter++)
   improve_toughness(ch);

  return;
 }
*/
 /* Minor Hara */
 /* if(arg1[0] == '\0' || !str_cmp(arg1,"minor"))
 {
  act("You tense your body incredibly.",ch,NULL,NULL,TO_CHAR);
  act("$N looks very pale all of a sudden.",NULL,NULL,ch,TO_NOTVICT);
  act("Your veins pop up from beneath your skin.",ch,NULL,NULL,TO_CHAR);
  act("$N slits his wrists!",NULL,NULL,ch,TO_NOTVICT);
  act("You slit your wrists and let the blood drain out.",ch,NULL,NULL,TO_CHAR);
  act("Blood pours onto the floor. $N faints.",NULL,NULL,ch,TO_NOTVICT);
  act("You faint.",ch,NULL,NULL,TO_CHAR);
  ch->hit -= ch->hit/3;
  WAIT_STATE(ch,6);

  af.where = TO_AFFECTS;
  af.type = gsn_hara_kiri;
  af.level = ch->level;
  af.duration = ch->level/9;
  af.modifier = (ch->level-1)*1.75;
  af.location = APPLY_REGEN;
  af.bitvector = 0;
  affect_to_char(ch,&af);
  act("You feel invigorated.",ch,NULL,NULL,TO_CHAR);
  for(counter = 0; counter < 1500; counter++)
   improve_toughness(ch);

  return;
 }

 return;
}
*/

//hara fix for GCC 4 by Bree

void do_hari(CHAR_DATA *ch, char *argument)
{
    char arg1[MSL/4];
    AFFECT_DATA af;
    
    one_argument(argument,arg1);

    if(!is_warrior_class(ch->class) || ch->class == CLASS_MONK)
    {
     send_to_char("Huh?\n\r",ch);
     return;
    }
   
    if (is_affected(ch,gsn_hari) )
    {
        send_to_char("You are already affected by hara!\n\r",ch);
	return;
    }

 if(!str_cmp(arg1,"full"))
 {
  act("You tense your body incredibly.",ch,NULL,NULL,TO_CHAR);
  act("$N looks very pale all of a sudden.",NULL,NULL,ch,TO_NOTVICT);
  act("Your veins pop up from beneath your skin.",ch,NULL,NULL,TO_CHAR);
  act("$N slits his wrists!",NULL,NULL,ch,TO_NOTVICT);
  act("You slit your wrists and let the blood drain out.",ch,NULL,NULL,TO_CHAR);
  act("Blood pours onto the floor. $N faints.",NULL,NULL,ch,TO_NOTVICT);
  act("You faint.",ch,NULL,NULL,TO_CHAR);
  ch->hit = 1;
  ch->stunned = 2;

    af.where = TO_AFFECTS;
    af.type = gsn_hari;
    af.level = ch->level;
    af.location = APPLY_REGEN;
    af.modifier = (ch->level-1)*2.75;
    af.duration = ch->level/4;
    af.bitvector = 0;
    affect_to_char(ch,&af);
    improve_toughness(ch);
     ch->toughness = (ch->level)*3.5;
   return;
 }

if(!str_cmp(arg1,"half"))
 {
  act("You tense your body incredibly.",ch,NULL,NULL,TO_CHAR);
  act("$N looks very pale all of a sudden.",NULL,NULL,ch,TO_NOTVICT);
  act("Your veins pop up from beneath your skin.",ch,NULL,NULL,TO_CHAR);
  act("$N slits his wrists!",NULL,NULL,ch,TO_NOTVICT);
  act("You slit your wrists and let the blood drain out.",ch,NULL,NULL,TO_CHAR);
  act("Blood pours onto the floor. $N faints.",NULL,NULL,ch,TO_NOTVICT);
  act("You faint.",ch,NULL,NULL,TO_CHAR);
  ch->hit /= 2;
  ch->stunned = 1;

 af.where = TO_AFFECTS;
    af.type = gsn_hari;
    af.level = ch->level;
    af.location = APPLY_REGEN;
    af.modifier = (ch->level-1)*2.25;
    af.duration = ch->level/7;
    af.bitvector = 0;
    affect_to_char(ch,&af);
    improve_toughness(ch);
  act("You feel invigorated.",ch,NULL,NULL,TO_CHAR);

improve_toughness(ch);
 ch->toughness = (ch->level)*3.5;
   return;
 }



return;
}

void do_adamantium_palm( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim = NULL;
    AFFECT_DATA af;
    int chance;
    int dam;
    bool NOHIT = FALSE;

    if( (chance = get_skill(ch,gsn_adamantium_palm)) < 1
     || !has_skill(ch,gsn_adamantium_palm) )
    {
        send_to_char("Huh?\n\r",ch);
    	return;
    }
    if (!is_affected(ch,gsn_martial_arts))
    {
	 	send_to_char("You must be focused on the martial arts to use this skill.\n\r",ch);
	    return;
    }
    
    one_argument( argument, arg );
    
    if( arg[0] == '\0' )
    {
        NOHIT = TRUE;
        send_to_char("Adamantium Palm who?\n\r",ch);
        return;
    }
    
    if( ch->fighting )
    {
      NOHIT = TRUE;
    }
    else if( (victim = get_char_room(ch,arg)) == NULL )
    {
    	send_to_char("They're not here.\n\r",ch);
    	return;
    }
    else if( victim->hit < victim->max_hit/2 )
    {
        send_to_char("They're too aware to be attacked.\n\r",ch);
    	return;
    }
    else if( is_affected(victim,gsn_adamantium_palm) )
    {
        send_to_char("They're already suffering from being struck!\n\r",ch);
    	return;
    }
    else if( ch->mana < 75 )
    {
        send_to_char("You do not have the mental energy.\n\r",ch);
    	return;
    }

    if( number_percent() > UMIN(95, chance) && !NOHIT)
    {
    	act("Your concentration slips as you strike at $N!",ch,0,victim,TO_CHAR);
    	act("$n strikes at you, but loses $s concentration!",ch,0,victim,TO_VICT);
    	act("$n strikes at $N, but loses $s concentration!",ch,0,victim,TO_NOTVICT);
        damage(ch,victim,0,gsn_adamantium_palm,DAM_BASH,TRUE,0);
        ch->mana = UMAX( 0, ch->mana-35 );
        check_improve(ch,gsn_adamantium_palm,FALSE,1);
        WAIT_STATE(ch, skill_table[gsn_adamantium_palm].beats/2);
	return;
    }
    else if(!NOHIT)
    {
    act("You channel your will through your palm as you strike $N!",ch,0,victim,TO_CHAR);
    act("$n viciously strikes you with a hardened palm!",ch,0,victim,TO_VICT);
    act("$n viciously strikes $N with a hardened palm!",ch,0,victim,TO_NOTVICT);

    ch->mana = UMAX( 0, ch->mana - 70 );
    WAIT_STATE(ch, skill_table[gsn_adamantium_palm].beats);

    /* Cut damage down a bit */
    dam = dice((ch->level)/4,13);
    dam += dice(9,chance/2);
    
    if( damage(ch,victim,dam,gsn_adamantium_palm,DAM_BASH,TRUE,0) )
    {
    	af.where = TO_AFFECTS;
        af.level = ch->level;
    	af.location = APPLY_AC;
        /* Changed */
        af.modifier = ch->level;
    	af.bitvector = 0;
        af.type = gsn_adamantium_palm;
        af.duration = ch->level / 12;
    
    	affect_to_char(victim,&af);
    }
        check_improve(ch,gsn_adamantium_palm,TRUE,1);
        return;
   }
  
    return;
}

void do_roundhouse(CHAR_DATA *ch, char *argument)
{
    ROOM_INDEX_DATA *was_in;
    CHAR_DATA *victim,*vch,*vch_next;
    int attempt, chance, dam, level;
    char arg1[MAX_INPUT_LENGTH];
    char buf[MAX_INPUT_LENGTH];

    one_argument(argument,arg1);

    if(IS_NPC(ch))
    return;

    if ( (chance = get_skill(ch,gsn_roundhouse)) == 0
    || !has_skill(ch,gsn_roundhouse))
    {
        send_to_char("Huh?\n\r",ch);
        return;
    }
    
    if (!is_affected(ch,gsn_martial_arts))
    {
	    send_to_char("You must be focused on the martial arts to use this skill.\n\r",ch);
	    return;
    }

    if(ch->fighting != NULL)
    victim = ch->fighting;
    else
    {
     if( (victim = get_char_room(ch,arg1)) == NULL )
     {
    	send_to_char("They're not here.\n\r",ch);
    	return;
     }
    }

    if(victim == ch)
    { 
     send_to_char("Kicking yourself? get real.\n\r",ch);
     return;
    }
    
    if (!IS_NPC(victim) && !can_pkill(ch,victim)) {
     send_to_char("You can't seem to kick them.",ch);
     return;
    }
    
    if (IS_SET(victim->off_flags,OFF_CLAN_GUARD))
    {
	    send_to_char("You can't do that to a clan guard.\n\r",ch);
	    return;
    }

	if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 25)) {
		act("You attempt to roundhouse, but begin crying instead.",ch,NULL,NULL,TO_CHAR);
		act("$n attempts to roundhouse, but begins crying instead.",ch,NULL,NULL,TO_ROOM);
		WAIT_STATE(ch,DEF_FEAR_WAIT);
		return; }
      
    if(ch->stunned)
    {
     send_to_char("You are still a bit woozy.\n\r",ch);
     return;
    }
    
    if(victim->stunned || victim->position < POS_FIGHTING)
    {
	    send_to_char("You'll have to let them get up first.\n\r",ch);
	    return;
    }

    level = ch->level + 5;
    // chance = (ch->level - victim->level) * 2;
    chance += number_range(20,50);
    chance -= get_curr_stat(victim,STAT_DEX)/2;
    chance -= get_curr_stat(victim,STAT_STR)/3;
    chance += get_curr_stat(ch,STAT_STR)/3;
    chance += get_curr_stat(ch,STAT_DEX);

    if (IS_AFFECTED(victim,AFF_HASTE))
        chance -= 30;
    if (IS_AFFECTED(ch,AFF_HASTE))
        chance += 25;
    if (IS_AFFECTED(victim,AFF_SLOW))
        chance += 20;
    if (IS_AFFECTED(ch,AFF_SLOW))
        chance -= 30;
    if (IS_AFFECTED(victim,AFF_FLYING))
        chance -= 5;
    chance += (ch->size - victim->size)*7;

   if (!IS_NPC(victim) && !IS_NPC(ch) && (victim->hit > 1))
   {
      sprintf(buf,"Help! %s just tried to kick me out of the room!",PERS(ch,victim));

      if(ch->fighting == NULL)
      {
      do_yell(victim,buf);
      }
   }


    if (number_percent() > chance)
    {
        act("You spin your leg around but miss $N.",ch,0,victim,TO_CHAR);
        act("$n spins his leg around but misses you.",ch,0,victim,TO_VICT);
        act("$n spins his leg visciously at $N but misses.",ch,0,victim,TO_NOTVICT);
        check_improve(ch,gsn_roundhouse,FALSE,3);
        WAIT_STATE(ch,12);
        if(victim->fighting == NULL)
        multi_hit(victim,ch,TYPE_UNDEFINED);
        return;
    }

    was_in = victim->in_room;
    dam = dice(level,8);
    
    // Stance modifier
    if (!IS_NPC(ch) && ch->stance[0] > 0 && number_percent() < 3)
    {
	int stance = ch->stance[0];
        if (ch->stance[stance] >= 200)
	    dam += dice(ch->stance[stance],2);
	else if(ch->stance[stance] > 0)
 	    dam += dice(ch->stance[stance],1);
    }

   if(number_percent() < 25 && !is_safe(ch,victim))
   {

    for ( attempt = 0; attempt < 6; attempt++ )
    {
	EXIT_DATA *pexit;
	int door;
        char dir[MAX_STRING_LENGTH/4];

	door = number_door( );

        if (door == 0)
        (strcpy(dir,"north"));
        else if (door == 1)
        (strcpy(dir,"east"));
        else if (door == 2)
        (strcpy(dir,"south"));
        else if (door == 3)
        (strcpy(dir,"west"));
        else if (door == 4)
        (strcpy(dir,"up"));
        else if (door == 5)
        (strcpy(dir,"down"));
        else
        strcpy(dir,"none");

	if ( ( pexit = was_in->exit[door] ) == 0
	||   pexit->u1.to_room == NULL
        ||  ( IS_SET(pexit->exit_info, EX_CLOSED) )
	|| ( IS_NPC(victim)
	&&   IS_SET(pexit->u1.to_room->room_flags, ROOM_NO_MOB) ) )
	    continue;

        if ( ( was_in->sector_type == SECT_AIR)
        ||  ( (pexit->u1.to_room->sector_type == SECT_AIR )
        &&  ( !IS_AFFECTED(victim, AFF_FLYING) ) ) )
            continue;

        if (IS_SET(pexit->exit_info,EX_CLOSED))
        {
        act("You spin around and kick $N through the door with incredible force!",ch,0,victim,TO_CHAR);
        act("$n's roundhouse sends $N crashing through the door with incredible force!",ch,0,victim,TO_NOTVICT);
        act("$n spins around and kicks you through the door with incredible force!",ch,0,victim,TO_VICT);
        }
        else
        {
        act("You spin your leg visciously at $N and kick $M from the room!",ch,0,victim,TO_CHAR);
        act("$n spins his leg visciously at $N and kicks $M from the room!",ch,NULL,victim,TO_NOTVICT);
        act("$n spins his leg visciously at you and kicks you from the room!",ch,0,victim,TO_VICT);
        dam = dice(level,5);
        }

        for(vch = victim->in_room->people; vch != NULL; vch = vch_next)
        {
         vch_next = vch->next_in_room;

         if(IS_IMMORTAL(vch))
         {
         sprintf(buf,"\n\r%s is kicked %s.",victim->name,dir);
         send_to_char(buf,vch);
         }
        }

        char_from_room(victim);
        char_to_room(victim, pexit->u1.to_room);
	do_look(victim,"auto");

        if (IS_SET(pexit->exit_info,EX_CLOSED))
        {
        REMOVE_BIT(pexit->exit_info,EX_CLOSED);
        act("With a deafening crash the door explodes open and $n comes flying into the room!",victim,0,0,TO_ROOM);
        }
        else
        {
        act("$n comes flying into the room with incredible force!",victim,0,0,TO_ROOM);
        }

        if (saves_spell(ch->level,victim,DAM_BASH))
                dam /= 2;
        damage(ch,victim,dam,gsn_roundhouse,DAM_BASH,TRUE,0);
        WAIT_STATE(victim,36);
        WAIT_STATE(ch,24);
        stop_fighting( ch, TRUE );
        return;
    }

    if( attempt == 6 )
    {
	dam += dice(level,4);
	act("You spin your leg viscously at $N and kick $M brutally into a wall!",ch,0,victim,TO_CHAR);
    	act("$n spins his leg viscously at $N and kicks $M brutally into a wall!",ch,0,victim,TO_NOTVICT);
    	act("$n spins his leg viscously at you and kicks you brutally into a wall!",ch,0,victim,TO_VICT);

        if (saves_spell(ch->level,victim,DAM_BASH))
                dam /= 2;
        damage(ch,victim,dam,gsn_roundhouse,DAM_BASH,TRUE,0);
        WAIT_STATE(ch,24);
        WAIT_STATE(victim,16);
    }
   }
   else
   {
    act("You spin your leg viscously at $N and kick $M brutally!",ch,0,victim,TO_CHAR);
    act("$n spins his leg viscously at $N and kicks $M brutally!",ch,0,victim,TO_NOTVICT);
    act("$n spins his leg viscously at you and kicks you brutally!",ch,0,victim,TO_VICT);

        if (saves_spell(ch->level-4,victim,DAM_BASH))
                dam /= 2;
        damage(ch,victim,dam,gsn_roundhouse,DAM_BASH,TRUE,0);

        if(number_range(1,2) == 2)
        WAIT_STATE(victim,16);
        else
        WAIT_STATE(victim,12);

        WAIT_STATE(ch,16);

   }
   return; 
}

void do_fists(CHAR_DATA *ch, char *argument)
{
  AFFECT_DATA af;
  int sn = -1;
  char arg[MSL/10];
  bool affected = FALSE;

  one_argument(argument,arg);

  if (IS_NPC(ch) || !has_skill(ch,sn))
  {
	send_to_char("Huh?\n\r",ch);
	return;
  }

  if(is_affected(ch,gsn_fists_fury) || is_affected(ch,gsn_fists_flame) ||
  is_affected(ch,gsn_fists_ice) || is_affected(ch,gsn_fists_fang) ||
  is_affected(ch,gsn_fists_acid) || is_affected(ch,gsn_fists_divinity) ||
  is_affected(ch,gsn_fists_claw) || is_affected(ch,gsn_fists_darkness) ||
  is_affected(ch,gsn_fists_liquid) )
   affected = TRUE;

  if(affected && !str_cmp(arg,"none"))
  {
  	if(is_affected(ch,gsn_fists_fury))
  		sn = gsn_fists_fury;	
  	else if(is_affected(ch,gsn_fists_flame))	
  		sn = gsn_fists_flame;
	else if(is_affected(ch,gsn_fists_ice))	  		
  		sn = gsn_fists_ice;
  	else if(is_affected(ch,gsn_fists_acid))	
  		sn = gsn_fists_acid;
  	else if(is_affected(ch,gsn_fists_claw))	
  		sn = gsn_fists_claw;
  	else if(is_affected(ch,gsn_fists_liquid))	
  		sn = gsn_fists_liquid;
  	else if(is_affected(ch,gsn_fists_fang))	
  		sn = gsn_fists_fang;
  	else if(is_affected(ch,gsn_fists_divinity))	
  		sn = gsn_fists_divinity;
  	else if(is_affected(ch,gsn_fists_darkness))	
  		sn = gsn_fists_darkness;
  		
  	if(sn != -1)
  	{	
		send_to_char( skill_table[sn].msg_off, ch );
		send_to_char( "\n\r", ch );  		
		affect_strip(ch,sn);			
	}
  	return;
  }
  else if (affected)
  {
        send_to_char("You are already concentrating on your fighting technique!\n\r",ch);
	return;
  }

  if(!str_cmp(arg,"flame"))
   sn = gsn_fists_flame;
  else if(!str_cmp(arg,"ice"))
   sn = gsn_fists_ice;
  else if(!str_cmp(arg,"acid"))
   sn = gsn_fists_acid;
  else if(!str_cmp(arg,"darkness"))
   sn = gsn_fists_darkness;
  else if(!str_cmp(arg,"fang"))
   sn = gsn_fists_fang;
  else if(!str_cmp(arg,"claw"))
   sn = gsn_fists_claw;
  else if(!str_cmp(arg,"liquid"))
   sn = gsn_fists_liquid;
  else if(!str_cmp(arg,"fury"))
   sn = gsn_fists_fury;
  else if(!str_cmp(arg,"divinity"))
   sn = gsn_fists_divinity;

  if(sn == -1)
  {
	send_to_char("You clench your fists to no avail.\n\r",ch);
	return;
  }

  if (number_percent() > get_skill(ch,sn))
  {
        send_to_char("You fail to focus on your fighting technique.\n\r",ch);
	check_improve(ch,sn,FALSE,1);
	return;
  }
  send_to_char("You focus on your fighting technique!\n\r",ch);

  check_improve(ch,sn,TRUE,1);

  af.where     = TO_AFFECTS;
  af.type      = sn;
  af.level     = ch->level;
  af.duration  = ch->level/10;
  af.location  = APPLY_NONE;
  af.modifier  = 0;
  af.bitvector = 0;
  affect_to_char( ch, &af );

  if (sn == gsn_fists_fury)
  {
        af.duration = ch->level/10;
        af.modifier = ch->level/4 + str_app[get_curr_stat(ch,STAT_STR)].todam;
        af.location = APPLY_DAMROLL;
	affect_to_char(ch,&af);
	//af.modifier = ch->level/4 + str_app[get_curr_stat(ch,STAT_STR)].tohit;
	//af.location = APPLY_HITROLL;
        //affect_to_char( ch, &af );
  }

  return;
}

void do_monk_nerve(CHAR_DATA *ch,char *argument) 
{ 
    char buf[MAX_STRING_LENGTH]; 
    CHAR_DATA *victim; 
    char arg[MAX_INPUT_LENGTH]; 
    AFFECT_DATA af; 
    int chance; 
     
    if ( (chance = get_skill(ch,gsn_nerve)) == 0 
    || !has_skill(ch,gsn_nerve)) 
    { 
        send_to_char("You aren't trained in the use of pressure points.\n\r",ch); 
        return; 
    } 
 
    one_argument(argument,arg); 
    if (arg[0] == '\0') 
        victim = ch->fighting; 
    else 
        victim = get_char_room(ch,arg); 
 
    if (victim == NULL) 
    { 
        send_to_char("Place pressure on who?\n\r",ch); 
        return; 
    } 
    
    if (victim == ch) 
    { 
        send_to_char("You can't do that.\n\r",ch); 
        return; 
    } 
    
    if (ch->stunned > 0)
    {
	send_to_char ("You're still a little woozy.\n\r", ch);
	return;
    }
    
    if (is_safe(ch,victim)) 
        return; 
 
    if (is_affected(victim,gsn_nerve)) 
    { 
        send_to_char("They have already been weakened.\n\r",ch);  
        return; 
    } 
       
    chance += (ch->level - victim->level)*2; 
    chance -= get_curr_stat(victim,STAT_DEX)/3; 
    chance += get_curr_stat(ch,STAT_DEX)/2; 
    chance -= get_curr_stat(victim,STAT_CON)/3;
    chance += get_curr_stat(ch,STAT_CON)/2;
    if(IS_NPC(victim))
          chance+=(victim->level/5);
    if (number_percent() > chance) 
    { 
        act("$n grasps $N's neck but fails to weaken them.",ch,0,victim,TO_NOTVICT); 
        act("You grasp $N's neck but fail to weaken them.",ch,0,victim,TO_CHAR); 
        act("$n grasps your neck but fails to weaken you.",ch,0,victim,TO_VICT); 
        check_improve(ch,gsn_nerve,FALSE,3); 
        WAIT_STATE(ch,PULSE_VIOLENCE); 
        return; 
    } 
    else 
    { 
    act("$n grasps $N's neck and weakens $m with pressure points.",ch,0,victim,TO_NOTVICT); 
    act("You grasp $N's neck and weaken $m with pressure points.",ch,0,victim,TO_CHAR); 
    act("$n grasps your neck and weakens you with pressure point.",ch,0,victim,TO_VICT); 
    check_improve(ch,gsn_nerve,TRUE,3); 
    af.where = TO_AFFECTS; 
    af.type = gsn_nerve; 
    af.location = APPLY_STR; 
    af.duration = 1; 
    af.bitvector = 0; 
    af.modifier = -3; 
    af.level = ch->level; 
    affect_to_char(victim,&af); 
    WAIT_STATE(ch,PULSE_VIOLENCE);
    }
     
        if (!IS_NPC(ch) && !IS_NPC(victim) 
        && (ch->fighting == NULL 
        || victim->fighting == NULL) ) 
        { 
         sprintf(buf,"Help, %s is attacking me!",PERS(ch,victim)); 
         do_yell(victim,buf); 
        } 
        if (victim->fighting == NULL) 
        { 
         multi_hit(victim,ch,TYPE_UNDEFINED); 
        } 
                 
    return; 
}

void do_chop( CHAR_DATA *ch, char *argument) 
{ 
        CHAR_DATA *victim; 
        int chance, dam; 
        char arg[MAX_INPUT_LENGTH]; 
        OBJ_DATA *wield,*second; 
        int multiplier; 
        bool DUAL = FALSE; 
         
        dam = 0; 
        one_argument(argument,arg); 
        if ((chance = get_skill(ch,gsn_chop) ) == 0 
        || !has_skill(ch,gsn_chop) ) 
        { 
        send_to_char("Chopping? What's that?\n\r",ch); 
        return; 
        } 
        if (arg[0] == '\0') 
        { 
        victim = ch->fighting; 
         if (victim == NULL) 
         { 
            send_to_char("But you aren't fighting anyone!\n\r",ch); 
            return; 
         } 
        } 
        else if ( (victim = get_char_room(ch,arg)) == NULL ) 
        { 
                send_to_char("They aren't here.\n\r",ch); 
                return; 
        } 
        if (victim == ch) 
        { 
        send_to_char("You can't chop at yourself!\n\r",ch); 
        return; 
        }

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

        if(ch->stunned)
        {
         send_to_char("You are still a bit woozy.\n\r",ch);
         return;
        }
     
        wield = get_eq_char(ch,WEAR_WIELD); 
        second = get_eq_char(ch,WEAR_SECONDARY); 
 
        if ((wield == NULL) 
        || (( wield->value[0] != WEAPON_SWORD) 
        && ( wield->value[0] != WEAPON_AXE) 
        && ( wield->value[0] != WEAPON_DAGGER) )) 
        { 
         if ((second == NULL) 
         || (( second->value[0] != WEAPON_SWORD) 
         && ( second->value[0] != WEAPON_AXE) 
         && ( second->value[0] != WEAPON_DAGGER) )) 
         { 
          send_to_char("You must be wielding a sword or axe to chop.\n\r",ch); 
          return; 
         } 
         else 
         { 
         DUAL = TRUE; 
         } 
        } 
 
        if (is_safe(ch,victim) ) 
        return; 
 
        chance += ch->carry_weight/19; 
        chance -= victim->carry_weight/28; 
        chance += (ch->size - victim->size)*20; 
        chance -= get_curr_stat(victim,STAT_DEX); 
        chance += get_curr_stat(ch,STAT_STR)/1.8; 
        chance += get_curr_stat(ch,STAT_DEX)/1.5; 
        if (IS_AFFECTED(ch,AFF_HASTE) ) 
                chance += 14; 
        if (IS_AFFECTED(victim,AFF_HASTE) ) 
                chance -= 9; 
        chance += (ch->level - victim->level);

        act("$n attempts to split open $N with a quick chop!",ch,0,victim,TO_NOTVICT); 
        act("You attempt to split open $N with a quick chop!",ch,0,victim,TO_CHAR); 
        act("$n attempts to split you open with a quick chop!",ch,0,victim,TO_VICT); 
 
        if (number_percent() < chance) 
        { 
        check_improve(ch,gsn_lunge,TRUE,1); 
        WAIT_STATE(ch,skill_table[gsn_chop].beats); 
 
        if(DUAL) 
        wield = second; 
 
        if (wield->pIndexData->new_format) 
                dam = dice(wield->value[1],wield->value[2]); 
        else 
                dam = number_range(wield->value[1],wield->value[2]); 
 
        if (get_skill(ch,gsn_enhanced_damage) > 0 ) 
        { 
         if (number_percent() <= get_skill(ch,gsn_enhanced_damage) ) 
         { 
           check_improve(ch,gsn_enhanced_damage,TRUE,1); 
           dam += dam * (number_range(60,100)/100) * ch->pcdata->learned[gsn_enhanced_damage]/98; 
         } 
        } 
 
        dam += GET_DAMROLL(ch)/2; 
        dam *= ch->pcdata->learned[gsn_chop]; 
        dam /= 100; 
        multiplier = number_range(ch->level/8, ch->level/4.5); 
        multiplier /= 8; 
        multiplier += 5/3; 
        dam *= multiplier;
        if(!DUAL && IS_WEAPON_STAT(wield,WEAPON_TWO_HANDS))
         dam *= 2.5;
 
        if (dam <= 0) 
                dam = 1; 
damage(ch,victim,dam,gsn_chop,DAM_SLASH,TRUE,0);
damage(ch,victim,dam,gsn_chop,DAM_SLASH,TRUE,0);
        } 
        else 
        { 
 damage(ch,victim,dam,gsn_chop,DAM_SLASH,TRUE,0);
 damage(ch,victim,dam,gsn_chop,DAM_SLASH,TRUE,0);
        check_improve(ch,gsn_chop,FALSE,1); 
        WAIT_STATE(ch,skill_table[gsn_chop].beats); 
        } 
        return; 
} 

/*  void do_crit_strike(CHAR_DATA *ch, char *argument)
{
        int chance;

        if (is_affected (ch, gsn_crit_strike))
	{
                send_to_char ("{.Your fury begins to subside.{x\n\r", ch);
		affect_strip(ch, gsn_crit_strike);
                return;
	}

        if( ch->mana < 100 )
        {
         send_to_char("You do not have the willpower to do this. Gather your energy.\n\r",ch);
         return;
        }

        if (is_affected (ch, gsn_crit_strike))
        {
                send_to_char("{.Your fury begins to subside.{x\n\r",ch);
                affect_strip(ch, gsn_crit_strike);
        }

	if (number_percent () < chance)
	{
		AFFECT_DATA af;

		WAIT_STATE (ch, PULSE_VIOLENCE);
                ch->mana -= 100;

                send_to_char ("{.You focus on crital striking!{x\n\r",ch);
                send_to_char ("{.You feel the {!Wrath {xof The {&Storm{x enter your body!{x\n\r", ch);
                act ("{($n concentration increases{x", ch, NULL, NULL, TO_ROOM);
                act ("{($n's eyes turn into shadows.{x", ch, NULL, NULL, TO_ROOM);


		af.where = TO_AFFECTS;
                af.type = gsn_crit_strike;
		af.level = ch->level;
                af.duration = -1;
                af.bitvector = 0;

		af.location = APPLY_DAMROLL;
                af.modifier = UMAX (1, ch->level / 5);
		affect_to_char (ch, &af);
	}

        return;
}
*/