eotc-rot/data/helps/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
#include <unistd.h>
#include "disease.h"



void do_objectgate (CHAR_DATA *ch, char *argument)
{
  OBJ_DATA *obj;
  char arg1[MAX_INPUT_LENGTH];

  argument = one_argument(argument, arg1);

  if (IS_NPC(ch)) return;

  if ( number_percent( ) > ch->pcdata->learned[gsn_objgate] )
  {
    send_to_char("You fail to summon the object\n\r",ch);
    return;
  }

  if (arg1[0] == '\0')
  {
    send_to_char("What object do you want to attempt to gate?\n\r",ch);
    return;
  }
  if ((obj = get_obj_world(ch, arg1)) == NULL)
  {
    send_to_char("No such object.\n\r",ch);
    return;
  }
  if (IS_SET(obj->extra_flags, ITEM_NOLOCATE))
  {
    stc("You can't get a grip on its location.\n\r", ch);
    return;
  }
  if (obj->carried_by != NULL)
  {
    send_to_char("Someone is holding the item.\n\r",ch);
    return;
  }
  if (obj->in_room == NULL)
  {
    send_to_char("It seems to be inside something.\n\r",ch);
    return;
  }
  if (!IS_SET(obj->wear_flags, ITEM_TAKE))
  {
    send_to_char("This item is too big.\n\r",ch);
    return;
  }

  obj_from_room( obj );
  obj_to_char( obj, ch );
  send_to_char("The item appears in your hand.\n\r",ch);
  return;
}


void do_scry( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    ROOM_INDEX_DATA *chroom;
    ROOM_INDEX_DATA *victimroom;
    char      arg [MAX_INPUT_LENGTH];
    int rand_room;

    argument = one_argument( argument, arg );

    if (IS_NPC(ch)) return;

      if (ch->level < 201)
      {
        send_to_char("{gThis is {RVeteran {gOnly.{x\n\r", ch);
        return;
      }

    if ( arg[0] == '\0' )
    {
	send_to_char( "Scry on whom?\n\r", ch );
	return;
    }

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


    chroom = ch->in_room;
    victimroom = victim->in_room;
      for ( ; ; )
      {
        rand_room = number_range( 0, 65535 );
        victimroom = get_room_index( rand_room );
        if (victimroom != NULL) break;   
      }

    char_from_room(ch);
    char_to_room(ch,victimroom);

    do_look(ch,"scry");
    char_from_room(ch);
    char_to_room(ch,chroom);
    
    return;
}

void do_superberserk(CHAR_DATA *ch, char *argument)
{
  char arg [MAX_INPUT_LENGTH];
  CHAR_DATA *vch;
  CHAR_DATA *vch_next;

  argument = one_argument( argument, arg );
  if (IS_NPC(ch)) return;

  WAIT_STATE( ch, 6);
  if ( number_percent( ) > ch->pcdata->learned[gsn_berserk] )
  {
    act("You rant and rave, but nothing much happens.",ch,NULL,NULL,TO_CHAR);
    act("$n gets a wild look in $s eyes, but nothing much happens.",ch,NULL,NULL,TO_ROOM);
    return;
  }
        if (ch->disease != DISEASE_WEREWOLF)
        {
                stc("Huh?\n\r",ch);
                return;
        }


  act("You Roar with Rage and {RB{WE{RR{WS{RE{WR{RK{x into a Barbarian style Frenzy.",ch,NULL,NULL,TO_CHAR);
  act("$n Roars with Rage and {RB{WE{RR{WS{RE{WR{RK{x into a Barbarian style Frenzy!",ch,NULL,NULL,TO_ROOM);
        for (vch = char_list; vch != NULL; vch = vch_next)
        {
                vch_next = vch->next;
                if (vch->in_room == NULL)
                        continue;
                if (!IS_NPC(vch)) continue;
                if (ch == vch)
                {
                        act("You throw back your head and howl with rage!",
                            ch, NULL, NULL, TO_CHAR);
                        continue;
                }
                if (!IS_NPC(vch))
                {
                        if (vch->in_room->area == ch->in_room->area)
                                send_to_char
                                        ("You hear a Warcry close by!\n\r",
                                         vch);
                }
                if (vch->in_room == ch->in_room && can_see(ch, vch))
                {
                        multi_hit(ch, vch, TYPE_UNDEFINED);
                        if (vch == NULL || vch->position <= POS_STUNNED)
                                continue;
                        multi_hit(ch, vch, TYPE_UNDEFINED);
                }
        }
return;
}


// CH_CMD ( do_knee )
void do_knee (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
int dam;

if ( !IS_NPC(ch)
&& ch->level < skill_table[gsn_knee].skill_level[ch->class]
&& ch->level2 < skill_table[gsn_knee].skill_level[ch->class2]
&& ch->level3 < skill_table[gsn_knee].skill_level[ch->class3]
&& ch->level4 < skill_table[gsn_knee].skill_level[ch->class4] )
{
send_to_char(
"You better leave the martial arts to fighters.\n\r", ch );
return;
}

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


if ( !can_see ( ch, victim ) )
{
send_to_char ( "You can't seem to find their head.\n\r", ch );
return;
}

WAIT_STATE( ch, skill_table[gsn_knee].beats );
if ( get_skill(ch,gsn_knee) > number_percent())
{
check_improve(ch,gsn_knee,TRUE,1);
act( "{i$n grabs your head and slams their {Rk{rn{Re{re{i into your face.{x", ch, NULL, victim, TO_VICT);
act( "{hYou grab $N {hand slam your {Rk{rn{Re{re{h into their face.{x", ch, NULL, victim, TO_CHAR);
act( "{k$n grabs $N {kand slams $s {Rk{rn{Re{re{k into their face.{x", ch, NULL, victim, TO_NOTVICT);

dam = number_range ( (ch->level * 90 ), ( 5 ));
damage( ch, victim, dam, gsn_knee,DAM_BASH,TRUE);
WAIT_STATE ( ch, skill_table[gsn_knee].beats );
}
else
{
check_improve(ch,gsn_knee,FALSE,1);
act( "{i$n tries to {Rk{rn{Re{re{i you but misses.{x", ch, NULL, victim, TO_VICT);
act( "{hYou try to {Rk{rn{Re{re{h $N but miss.{x", ch, NULL, victim, TO_CHAR);
act( "{k$n tries to {Rk{rn{Re{re{k $N but misses.{x", ch, NULL, victim, TO_NOTVICT);
damage( ch, victim, 0, gsn_knee,DAM_BASH,TRUE);
}
return;
}

void do_shand (CHAR_DATA * ch, char *argument)
{
//    OBJ_DATA *obj;
    CHAR_DATA *victim;
    int dam;
    int chance;


    chance = number_percent();

if ( !IS_NPC(ch)
&& ch->level < skill_table[gsn_shand].skill_level[ch->class]
&& ch->level2 < skill_table[gsn_shand].skill_level[ch->class2]
&& ch->level3 < skill_table[gsn_shand].skill_level[ch->class3]
&& ch->level4 < skill_table[gsn_shand].skill_level[ch->class4] )

    {
        send_to_char
            ( "You better leave that skill to Liches.\n\r", ch );
        return;
    }

    if ( ( victim = ch->fighting ) == NULL )
    {
        send_to_char
            ( "You must be fighting to do this.\n\r",
              ch );
        return;
    }
    if ( !can_see ( ch, victim ) )
    {
        send_to_char ( "You cant find them.\n\r", ch );
        return;
    }


    WAIT_STATE ( ch, skill_table[gsn_shand].beats / 2 );

    if ( get_skill ( ch, gsn_shand ) < number_percent (  ) )
    {
        printf_to_char ( ch, "You miss them.\n\r" );
        check_improve ( ch, gsn_shand, FALSE, 1 );
        return;
    }

    dam = ch->level * 40;

    damage ( ch, victim, number_range ( dam, ch->level * 45 ), gsn_shand, DAM_NEGATIVE, TRUE);
    check_improve ( ch, gsn_shand, TRUE, 3 );

    dam = ch->level * 40;

    damage ( ch, victim, number_range ( dam, ch->level * 45 ), gsn_shand, DAM_NEGATIVE, TRUE);

    dam = ch->level * 40;

    damage ( ch, victim, number_range ( dam, ch->level * 35 ), gsn_shand, DAM_NEGATIVE, TRUE);

    if (chance < 50 )
        return;

    dam = ch->level * 45;

    damage ( ch, victim, number_range ( dam, ch->level * 28 ), gsn_shand, DAM_NEGATIVE, TRUE);
    check_improve ( ch, gsn_shand, TRUE, 2 );

    if (chance < 30)
        return;

    dam = ch->level * 35;

    damage ( ch, victim, number_range ( dam, ch->level * 22 ), gsn_shand, DAM_NEGATIVE, TRUE);

    if (chance < 25)
        return;

    dam = ch->level * 30;

    damage ( ch, victim, number_range ( dam, ch->level * 16 ), gsn_shand, DAM_NEGATIVE, TRUE);

    if (chance < 20)
        return;

    dam = ch->level * 25;

    damage ( ch, victim, number_range ( dam, ch->level * 16 ), gsn_shand, DAM_NEGATIVE, TRUE);

    return;
}


// CH_CMD ( do_rampage )
void do_rampage (CHAR_DATA * ch, char *argument)
{
    OBJ_DATA *obj;
    CHAR_DATA *victim;
    int dam;
    int chance;


    chance = number_percent();

if ( !IS_NPC(ch)
&& ch->level < skill_table[gsn_rampage].skill_level[ch->class]
&& ch->level2 < skill_table[gsn_rampage].skill_level[ch->class2]
&& ch->level3 < skill_table[gsn_rampage].skill_level[ch->class3]
&& ch->level4 < skill_table[gsn_rampage].skill_level[ch->class4] )

    {
        send_to_char
            ( "You better leave that skill to fighters.\n\r", ch );
        return;
    }

    if ( ( obj = get_eq_char ( ch, WEAR_WIELD ) ) == NULL )
    {
        send_to_char
            ( "You need to wield a primary weapon to go on a rampage.\n\r",
              ch );
        return;
    }
    if ( ( victim = ch->fighting ) == NULL )
    {
        send_to_char
            ( "How do you expect to lose your temper when your not in battle.\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_rampage].beats / 2 );

    if ( get_skill ( ch, gsn_rampage ) < number_percent (  ) )
    {
        printf_to_char ( ch,
                         "You prepare for a rampage but your opponent is too quick!\n\r" );
        check_improve ( ch, gsn_rampage, FALSE, 1 );
        return;
    }

    dam = ch->level * 30;

    damage ( ch, victim, number_range ( dam, ch->level * 45 ), gsn_rampage, DAM_BASH, TRUE);
    check_improve ( ch, gsn_rampage, TRUE, 3 );

    dam = ch->level * 30;

    damage ( ch, victim, number_range ( dam, ch->level * 45 ), gsn_rampage,
             DAM_BASH, TRUE);

    dam = ch->level * 30;

    damage ( ch, victim, number_range ( dam, ch->level * 35 ), gsn_rampage,
             DAM_BASH, TRUE);

    if (chance < 50 )
        return;

    dam = ch->level * 35;

    damage ( ch, victim, number_range ( dam, ch->level * 28 ), gsn_rampage,
             DAM_BASH, TRUE);
    check_improve ( ch, gsn_rampage, TRUE, 2 );

    if (chance < 30)
        return;

    dam = ch->level * 25;

    damage ( ch, victim, number_range ( dam, ch->level * 22 ), gsn_rampage,
             DAM_BASH, TRUE);
/*
    if ( chance ( 35 ) )
    {
        printf_to_char ( ch,
                         "{YYour opponent is stunned by your {Rf{ru{Rr{ri{Ro{ru{Rs{Y{x rampage!{x\n\r" ); */
/*    if ( chance ( 35 ) )
    {
     if ( ch->level > skill_table[gsn_stun].skill_level[ch->class] )
     {
        act("You {Ystun{x $N with your rampage.",
            ch,NULL,victim,TO_CHAR);
        act("You are {Ystunned{x by $n's rampage.",
            ch,NULL,victim,TO_VICT);
        act("$N is {Ystunned{x.",
            ch,NULL,victim,TO_NOTVICT);
        victim->stunned = 2;
        check_improve ( ch, gsn_stun, TRUE, 1 ); 
     }
    }
*/
    if (chance < 25)
        return;

    dam = ch->level * 20;

    damage ( ch, victim, number_range ( dam, ch->level * 16 ), gsn_rampage,
             DAM_BASH, TRUE);

    if (chance < 20)
        return;

    dam = ch->level * 15;

    damage ( ch, victim, number_range ( dam, ch->level * 16 ), gsn_rampage,
             DAM_BASH, TRUE);

    return;
}


void do_relinquish (CHAR_DATA * ch, char *argument)
{

  char arg[MSL];
  CHAR_DATA *victim;
  one_argument (argument, arg);

  if (IS_NPC (ch))
    return;

    if ( !IS_NPC(ch)
    && ch->level < skill_table[gsn_relinquish].skill_level[ch->class]
    && ch->level2 < skill_table[gsn_relinquish].skill_level[ch->class2]
    && ch->level3 < skill_table[gsn_relinquish].skill_level[ch->class3]
    && ch->level4 < skill_table[gsn_relinquish].skill_level[ch->class4] )


    {
        send_to_char("You don't know how to relinquish.\n\r", ch );
        return;
    }



  if (arg[0] == '\0')
    {
      stc ("Desanc whom?\n\r", ch);
      return;
    }
  if (ch->fighting != NULL)
    {
      stc ("You can only use this power to start combat.\n\r", ch);
      return;
    }
  if ((victim = get_char_room (ch, arg)) == NULL)
    {
      stc ("They are not here.\n\r", ch);
      return;
    }
  if(victim == ch) 
    {
     stc("not on yourself",ch);
     return;
    }

  if (is_safe (ch, victim))
    return;

  if (number_range (1,3) == 1)
    {
      stc ("You failed to Desanct!\n\r", ch);
      WAIT_STATE (ch, 6);
      return;
    }

  act
    ("$n cackles with glee as he destroys the hold of god from your body.\n\r",
     ch, NULL, victim, TO_VICT);
  act
    ("$n cackles with glee as he destroys the hold of god from $N's body.\n\r",
     ch, NULL, victim, TO_ROOM);
  act
    ("You cackles with glee as you destroy the hold of god from $N's body.\n\r",
     ch, NULL, victim, TO_CHAR);
//  sn = skill_lookup ("desanct");
//  level = 25;
//  (*skill_table[sn].spell_fun) (sn, level, ch, victim);

	REMOVE_BIT (victim->affected_by, AFF_SANCTUARY);

  set_fighting (ch, victim);
  set_fighting (victim, ch);
  if (!IS_NPC (victim))

  WAIT_STATE (ch, 6);

}


/*  
 * critical strike
*/
int critical_strike( CHAR_DATA *ch, CHAR_DATA *victim,   int dam )
{
  int diceroll;
  AFFECT_DATA baf;

	
  if ( get_eq_char(ch,WEAR_WIELD) != NULL 
	&& get_eq_char(ch,WEAR_SECONDARY ) != NULL
	&& number_percent() > ( (ch->hit * 100) / ch->max_hit ) ) 
      return 0;

  if ( !IS_NPC(ch) && /* IS_SET( ch->off_flags, OFF_CRIT ) ) ||*/ 
	 get_skill( ch, gsn_critical ) > 0 ) 
  {  
    diceroll = number_range( 0, 100 );
    if( victim -> level > ch -> level )
      diceroll += ( victim->level - ch->level ) * 2;
    if( victim -> level < ch -> level )
      diceroll -= ( ch->level - victim->level );
 
    if ( (!IS_NPC(ch)) && (diceroll <= (get_skill( ch, gsn_critical )/2)) )  
    {  
      check_improve( ch, gsn_critical, TRUE, 2 );
      dam += dam * diceroll/200;
    }  

    if ( (IS_NPC(ch) && (diceroll <= (ch->level / 13))) || 
         (!IS_NPC(ch) && (diceroll <= (get_skill(ch, gsn_critical)/13)) ) )
    {  
      diceroll = number_percent( );
      if( diceroll < 75 )
      {  
        act( "$n takes you down with a weird judo move!", 
	     ch, NULL, victim, TO_VICT);
	act( "You take $N down with a weird judo move!", 
	     ch, NULL, victim, TO_CHAR);
        if (!IS_NPC(ch))
          check_improve( ch, gsn_critical, TRUE, 3 );
	WAIT_STATE( victim, 2 * PULSE_VIOLENCE );
	dam += (dam * number_range( 2, 5 )) / 5;			
	return(dam);
      }   
      else if( diceroll > 75 && diceroll < 95 )
      {   
        act( "You are blinded by $n's attack!", ch, NULL, victim, 
			TO_VICT);
        act( "You blind $N with your attack!", ch, NULL, victim, 
			TO_CHAR);
	if (!IS_NPC(ch)) 
	  check_improve( ch, gsn_critical, TRUE, 4 );
	if (!IS_AFFECTED(victim,AFF_BLIND)) 
	{
          baf.type = gsn_dirt;
	  baf.level = ch->level; 
	  baf.location = APPLY_HITROLL; 
	  baf.modifier = -4;
	  baf.duration = number_range(1,5); 
	  baf.bitvector = AFF_BLIND;
	  affect_to_char( victim, &baf );
        }  
	dam += dam * number_range( 1, 2 );			
	return(dam);
      }  
      else if( diceroll > 95 ) 
      {   
        act( "$n cuts out your heart! OUCH!!",  
             ch, NULL, victim, TO_VICT); 
        act( "You cut out $N's heart!  I bet that hurt!",  
             ch, NULL, victim, TO_CHAR);
	if (!IS_NPC(ch)) 
	  check_improve( ch, gsn_critical, TRUE, 5 );
	dam += dam * number_range( 2, 5 );			
	return(dam);
      }  
    }   
  }   

  return dam;
}  

void do_jugular_slice( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    OBJ_DATA *obj;

    one_argument( argument, arg );



    if ( !IS_NPC(ch)
    && ch->level < skill_table[gsn_jugular_slice].skill_level[ch->class]
    && ch->level2 < skill_table[gsn_jugular_slice].skill_level[ch->class2]
    && ch->level3 < skill_table[gsn_jugular_slice].skill_level[ch->class3]
    && ch->level4 < skill_table[gsn_jugular_slice].skill_level[ch->class4] )
      {
        send_to_char("You don't know how to jugular slice.\n\r",ch);
        return;
      }




    if ( arg[0] == '\0' )
    {
	send_to_char( "Jugular Slice who?\n\r", ch );
	return;
    }

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

    if ( victim == ch )
    {
	send_to_char( "How can you sneak up on yourself?\n\r", ch );
	return;
    }

    if ( is_safe( ch, victim ) )
      return;

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


    if ( victim->fighting != NULL )
    {
	send_to_char( "You can't jugular slice a fighting person.\n\r", ch );
	return;
    }


    WAIT_STATE( ch, skill_table[gsn_jugular_slice].beats );

    if ( victim->hit < (0.7 * victim->max_hit) &&
	 (IS_AWAKE(victim) ) )
    {
	act( "$N is hurt and suspicious ... you couldn't sneak up.",
	    ch, NULL, victim, TO_CHAR );
	return;
    }


    if ( !IS_AWAKE(victim)
    ||   IS_NPC(ch)
    ||   number_percent( ) < get_skill(ch,gsn_jugular_slice) )
    {
	check_improve(ch,gsn_jugular_slice,TRUE,1);
        multi_hit( ch, victim, gsn_jugular_slice );
    }
    else
    {
	check_improve(ch,gsn_jugular_slice,FALSE,1);
	damage( ch, victim, 0, gsn_jugular_slice,DAM_NONE, TRUE );
    }
    return;
}

void do_assassinate( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    one_argument( argument, arg );

	if (ch->master != NULL && IS_NPC(ch))
	return;


    if ( !IS_NPC ( ch ) &&
         ch->level < skill_table[gsn_assassinate].skill_level[ch->class]
         && ch->level2 < skill_table[gsn_assassinate].skill_level[ch->class2]
         && ch->level3 < skill_table[gsn_assassinate].skill_level[ch->class3] 
         && ch->level4 < skill_table[gsn_assassinate].skill_level[ch->class4])
      {
	send_to_char("You don't know how to assassinate.\n\r",ch);
	return;
      }
    
    if ( IS_AFFECTED( ch, AFF_CHARM ) )  
    {
	send_to_char( "You don't want to kill your beloved master.\n\r",ch);
	return;
    } 

    if ( arg[0] == '\0' )
    {
	send_to_char( "Assassinate whom?\n\r", ch );
	return;
    }

    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( "Suicide is against your way.\n\r", ch );
	return;
    }

    if ( is_safe( ch, victim ) )
      return;

    if ( IS_IMMORTAL( victim ) && !IS_NPC(victim) )
    {
	send_to_char( "Your hands pass through.\n\r", ch );
	return;
    }

    if ( victim->fighting != NULL )
    {
	send_to_char( "You can't assassinate a fighting person.\n\r", ch );
	return;
    }
 
    if ( (get_eq_char( ch, WEAR_WIELD ) != NULL) ||
	 (get_eq_char( ch, WEAR_HOLD  ) != NULL) )  {
	send_to_char( 
	"You need both hands free to assassinate somebody.\n\r", ch );
	return;
    }
 
    if ( (victim->hit < victim->max_hit) && 
	 (can_see(victim, ch)) &&
	 (IS_AWAKE(victim) ) )
    {
	act( "$N is hurt and suspicious ... you can't sneak up.",
	    ch, NULL, victim, TO_CHAR );
	return;
    }
    
/*
    if (IS_SET(victim->imm_flags, IMM_WEAPON))
      {
	act("$N seems immune to your assassination attempt.", ch, NULL,
		 victim, TO_CHAR);
	act("$N seems immune to $n's assassination attempt.", ch, NULL,
		victim, TO_ROOM);
	return;
      }
*/
    WAIT_STATE( ch, skill_table[gsn_assassinate].beats );
    if ( IS_NPC(ch) ||
	!IS_AWAKE(victim) 
	||   number_percent( ) < get_skill(ch,gsn_assassinate))
      multi_hit(ch,victim,gsn_assassinate);
    else
      {
	check_improve(ch,gsn_assassinate,FALSE,1);
	damage( ch, victim, 0, gsn_assassinate,DAM_NONE, TRUE );
      }

    return;
  }


void do_unnerve(CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim;

    if ( !IS_NPC ( ch ) &&
         ch->level < skill_table[gsn_unnerve].skill_level[ch->class]
         && ch->level2 < skill_table[gsn_unnerve].skill_level[ch->class2]
         && ch->level3 < skill_table[gsn_unnerve].skill_level[ch->class3]
        && ch->level4 < skill_table[gsn_unnerve].skill_level[ch->class4]
 )
    {
      send_to_char("Unnerve is unavailable to you.\n\r",ch);
      return;
    }

    if (argument[0] == '\0')
    {
	stc("Who do you wish to unnerve?\n\r", ch);
	return;
    }

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

    WAIT_STATE(ch, 7);
    do_say(ch,"{RXeus Dominus Mortai!{x");
    do_stance(victim, "");
}


/* RT spells and skills show the players spells (or skills) */
void do_garrote( CHAR_DATA *ch, char *argument ) 
{ 
char arg[MAX_INPUT_LENGTH]; 
CHAR_DATA *victim; 
int chance; 

one_argument( argument, arg ); 

if ( (chance = get_skill(ch,gsn_garrote)) == 0) 
if ( !IS_NPC(ch)
&& ch->level < skill_table[gsn_garrote].skill_level[ch->class]
&& ch->level2 < skill_table[gsn_garrote].skill_level[ch->class2]
&& ch->level3 < skill_table[gsn_garrote].skill_level[ch->class3]
&& ch->level4 < skill_table[gsn_garrote].skill_level[ch->class4] )
{ 
send_to_char("Garrote? What's that?{x\n\r",ch); 
return; 
} 

if (arg[0] == '\0') 
{ 
send_to_char("Garrote whom?\n\r",ch); 
return; 
} 

if (ch->fighting != NULL) 
{ 
send_to_char("{hYou're facing the wrong end.{x\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( "How can you sneak up on yourself?\n\r", ch ); 
return; 
} 

if ( is_safe( ch, victim ) ) 
return; 

if (IS_NPC(victim) && victim->fighting != NULL && !is_same_group(ch,victim->fighting))

if ( victim->hit < victim->max_hit / 4) 
{
	act( "$N is hurt and suspicious ... you can't sneak up.", 
ch, NULL, victim, TO_CHAR ); 
return; 
} 


/* dexterity */ 
chance += get_curr_stat(ch,STAT_DEX); 
chance -= get_curr_stat(victim,STAT_DEX)/2; 

/* speed */ 
if (IS_SET(ch->off_flags,OFF_FAST) || IS_AFFECTED(ch,AFF_HASTE)) 
chance += 25; 
if (IS_SET(victim->off_flags,OFF_FAST) || IS_AFFECTED(victim,AFF_HASTE)) 
chance -= 10; 

/* level */ 
chance += (ch->level - victim->level) * 4; 

/* sloppy hack to prevent false zeroes */ 
if (chance % 5 == 0) 
chance += 1; 

/* now the attack */ 
if (number_percent() * 2  < chance) 
{ 
AFFECT_DATA af; 
act("{k$n is choked by a wire around the neck!{x",victim,NULL,NULL,TO_ROOM); 
act("{i$n slips a wire around your neck!{x",ch,NULL,victim,TO_VICT); 
multi_hit (ch, victim, gsn_garrote);
send_to_char("{7You choke and gag!{x\n\r",victim); 
check_improve(ch,gsn_garrote,TRUE,2); 
WAIT_STATE(ch,skill_table[gsn_garrote].beats); 

/* Leave the garrote on the choke the shit out of em */ 

af.where = TO_AFFECTS2; 
af.type = gsn_garrote; 
af.level = ch->level; 
af.duration = 3; 
af.location = APPLY_HITROLL; 
af.modifier = -150; 
af.bitvector = AFF2_GARROTE; 

affect_to_char(victim,&af); 
} 
else 
{ 
damage(ch,victim,0,gsn_garrote,DAM_NONE,TRUE); 
check_improve(ch,gsn_garrote,FALSE,2); 
WAIT_STATE(ch,skill_table[gsn_garrote].beats); 
} 
} 



void do_sidekick( CHAR_DATA *ch, char *argument )
{
    int dam;
    CHAR_DATA *victim;

    if(IS_NPC(ch))
    return;

if ( !IS_NPC(ch)
&& ch->level < skill_table[gsn_sidekick].skill_level[ch->class]
&& ch->level2 < skill_table[gsn_sidekick].skill_level[ch->class2]
&& ch->level3 < skill_table[gsn_sidekick].skill_level[ch->class3]
&& ch->level4 < skill_table[gsn_sidekick].skill_level[ch->class4] )
    {
        send_to_char("Huh?\n\r", ch );
        return;
    }
    
    if ( ( victim = ch->fighting ) == NULL )
    {
        send_to_char( "You aren't fighting anyone.\n\r", ch );
        return;
    }
    
    if ( get_skill(ch,gsn_sidekick) > number_percent())
    {
	dam = number_range (1, ch->level);
	dam += number_range(0,(ch->level)/3);
        dam += number_range(0,(ch->level)/3);
        dam += number_range(0,(ch->level)/3);
        dam += number_range(0,(ch->level)/4);
        dam += number_range(0,(ch->level)/4);
        dam += number_range(0,(ch->level)/4);
        dam += number_range(0,(ch->level)/4);
	dam += number_range(ch->level/3,ch->level/2);

        act("You kick $N brutally in the side!",ch,0,victim,TO_CHAR);
        act("$n kicks you brutally in the side!",ch,0,victim,TO_VICT);

        if(has_skill(ch,gsn_vital_hit))
        {
        	if( (get_skill(ch,gsn_vital_hit) / 12) > number_percent( ))
         	{
         		check_improve(ch,gsn_vital_hit,TRUE, 3);
         		dam = (dam * 8) / 5;
         	}
        }

        damage(ch,victim,dam, gsn_sidekick,DAM_BASH,TRUE);
        check_improve(ch,gsn_sidekick,TRUE,1);
    }
    else
    {
        damage( ch, victim, 0, gsn_sidekick,DAM_BASH,TRUE);
        check_improve(ch,gsn_sidekick,FALSE,1);
    }
    
    WAIT_STATE( ch, skill_table[gsn_sidekick].beats );

    return;
}

bool has_skill(CHAR_DATA *ch,int skill)
{
  return IS_NPC(ch) ? TRUE : (1 < ch->pcdata->learned[skill]);
}


/*
bool has_skill(CHAR_DATA *ch,int skill)
{
  return IS_NPC(ch) ? TRUE : (ch->level >= ch->pcdata->learnlvl[skill]); 
}
*/