#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>
// 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] )
{
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] )
{
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] )
{
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->level < skill_table[gsn_relinquish].skill_level[ch->class2]
&& ch->level < skill_table[gsn_relinquish].skill_level[ch->class3] )
{
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] )
{
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] )
{
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] )
{
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, "");
}