#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]);
}
*/