/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#include <glib.h>
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <tables.h>
#include <interp.h>
#include <fight.h>
extern void check_killer args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
extern void set_fighting args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
extern GString *get_player_class_string args(( CHAR_DATA *ch ));
extern void calc_stat args((CHAR_DATA *ch, CHAR_DATA *victim));
extern bool check_artifact args(( CHAR_DATA *ch ));
extern void diab_finish args(( CHAR_DATA *victim ));
void do_kill( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Kill 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 ( ch->in_room != NULL && IS_RAFFECTED(ch->in_room,ROOM_AFF_REINA))
{
send_to_char("You feel too peaceful.\n\r", ch);
return;
}
if ( victim == ch )
{
send_to_char( "You cannot kill yourself!\n\r", ch );
return;
}
if ( is_safe( ch, victim ) )
return;
if (check_pk(ch,victim,CHECK_DELAY|CHECK_ATTACK))
return;
if ( IS_AFFECTED(ch, AFF_CHARM) && ch->master == victim )
{
act( "$N is your beloved master.", ch, NULL, victim, TO_CHAR );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "You do the best you can!\n\r", ch );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to.\n\r",ch);
return;
}
if (!IS_NPC(ch) && (IS_SET(ch->extra, EXTRA_STANCE)) )
{
switch (ch->stance[11])
{
case STANCE_VIPER: do_stance(ch,"viper"); break;
case STANCE_CRANE: do_stance(ch,"crane"); break;
case STANCE_CRAB: do_stance(ch,"crab"); break;
case STANCE_MONGOOSE: do_stance(ch,"mongoose"); break;
case STANCE_BULL: do_stance(ch,"bull"); break;
case STANCE_DRAGON: do_stance(ch,"dragon"); break;
case STANCE_MANTIS: do_stance(ch,"mantis"); break;
case STANCE_SWALLOW: do_stance(ch,"swallow"); break;
case STANCE_TIGER: do_stance(ch,"tiger"); break;
case STANCE_MONKEY: do_stance(ch,"monkey"); break;
default: do_stance(ch,"none"); break;
}
}
if (!IS_NPC(ch) && !IS_NPC(victim))
{
ch->pk_timer = 8;
victim->pk_timer = 8;
}
WAIT_STATE( ch, 1 * PULSE_VIOLENCE );
check_killer( ch, victim );
if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_WEREWOLF)
&& number_range(1,3) == 1
&& ch->pcdata->powers[WPOWER_BOAR] > 1
&& victim->position == POS_STANDING)
{
if ( ch->pcdata->powers[WPOWER_RAT] > 4 )
{
ch->damroll += 400;
multi_hit( ch, victim, TYPE_UNDEFINED );
ch->damroll -= 400;
multi_hit( ch, victim, TYPE_UNDEFINED );
}
else
{
ch->damroll += 200;
multi_hit( ch, victim, TYPE_UNDEFINED );
ch->damroll -= 200;
}
if ( victim != NULL)
{
act("You charge into $N, knocking $M from $S feet.",ch,NULL,victim,TO_CHAR);
act("$n charges into $N, knocking $M from $S feet.",ch,NULL,victim,TO_NOTVICT);
act("$n charges into you, knocking you from your feet.",ch,NULL,victim,TO_VICT);
victim->position = POS_STUNNED;
set_attack_flag(ch,victim);
multi_hit( ch, victim, TYPE_UNDEFINED );
multi_hit( ch, victim, TYPE_UNDEFINED );
}
return;
}
set_attack_flag(ch,victim);
multi_hit( ch, victim, TYPE_UNDEFINED );
return;
}
void do_backstab( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Backstab 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 (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
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
|| obj->value[3] != 11 )
&& ( ( obj = get_eq_char( ch, WEAR_HOLD ) ) == NULL
|| obj->value[3] != 11 ) )
{
send_to_char( "You need to wield a piercing weapon.\n\r", ch );
return;
}
if ( victim->fighting != NULL )
{
send_to_char( "You can't backstab a fighting person.\n\r", ch );
return;
}
if ( victim->hit < victim->max_hit / 10 ) /* up to 10% - Dominion */
{
act( "$N is pretty hurt and suspicious ... you can't sneak up.",
ch, NULL, victim, TO_CHAR );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to lift your weapon.\n\r",ch);
return;
}
if (check_pk(ch,victim,CHECK_DELAY|CHECK_ATTACK))
{
return;
}
set_attack_flag(ch,victim);
check_killer( ch, victim );
WAIT_STATE( ch, skill_table[gsn_backstab].beats );
if ( !IS_NPC(victim) && IS_IMMMERIT(victim, IMM_MERIT_BACKSTAB) )
damage( ch, victim, 0, gsn_backstab );
else if ( !IS_NPC(victim) && IS_IMMFLAW(victim, IMM_FLAW_BACKSTAB))
damage( ch, victim, 2000, gsn_backstab );
else if ( !IS_AWAKE(victim)
|| IS_NPC(ch)
|| number_percent( ) < ch->pcdata->learned[gsn_backstab] )
multi_hit( ch, victim, gsn_backstab );
else
damage( ch, victim, 0, gsn_backstab );
playwave_toch(ch,10);
return;
}
void do_flee( CHAR_DATA *ch, char *argument )
{
ROOM_INDEX_DATA *was_in;
ROOM_INDEX_DATA *now_in;
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
GString *mxpout;
int attempt;
int number;
if ( ( victim = ch->fighting ) == NULL )
{
if ( ch->position == POS_FIGHTING )
ch->position = POS_STANDING;
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to leave.\n\r",ch);
return;
}
if (IS_AFFECTED(ch, AFF_WEBBED))
{
send_to_char("You are unable to move with all this sticky webbing on.\n\r",ch);
return;
}
if (!IS_NPC(ch) && IS_ADDED(ch,ADDED_FRENZY)
&& ch->pcdata->frenzy_action == FRENZY_FIGHT)
{
send_to_char("Not in this frenzy!\n\r",ch);
return;
}
if (!IS_NPC(victim) && (victim->pcdata->powers[WPOWER_SHARK] >= 2 || (IS_SWWF(victim) && get_auspice(victim,AUSPICE_AHROUN) > 3)) )
{
number = number_range(1,100);
if (number <= 25)
{
act( "You attempt to flee, but $n has clamped $s powerful jaws on your leg!", ch, NULL, victim, TO_CHAR );
act( "You clam your powerful jaws on $N preventing them from fleeing!", ch, NULL, victim, TO_VICT );
act( "$N tries to flee as $n clamps $s powerful jaws on $N holding $M in place!", ch, NULL, victim, TO_NOTVICT );
return;
}
}
if (!IS_NPC(ch) && ch->pcdata->stats[UNI_RAGE] >= 0)
{
if (IS_CLASS(ch,CLASS_VAMPIRE) && number_percent() <= ch->pcdata->stats[UNI_RAGE])
{
send_to_char("Your inner beast refuses to let you run!\n\r",ch);
WAIT_STATE(ch,12);
return;
}
else if (IS_CLASS(ch, CLASS_WEREWOLF) && number_percent() <= ch->pcdata->stats[UNI_RAGE] * 0.3)
{
send_to_char("Your rage is too great!\n\r",ch);
WAIT_STATE(ch,12);
return;
}
}
was_in = ch->in_room;
for ( attempt = 0; attempt < 6; attempt++ )
{
EXIT_DATA *pexit;
int door;
door = number_door( );
if ( ( pexit = was_in->exit[door] ) == 0
|| pexit->to_room == NULL
|| IS_SET(pexit->exit_info, EX_CLOSED)
|| ( IS_NPC(ch)
&& IS_SET(pexit->to_room->room_flags, ROOM_NO_MOB) ) )
continue;
move_char( ch, door );
if ( ( now_in = ch->in_room ) == was_in )
continue;
ch->in_room = was_in;
if (!IS_NPC(victim) && victim->pcdata->powers[WPOWER_CHAMELEON] >= 4)
{
mxpout = g_string_new("");
mxpconv(mxpout,dir_name[door],victim);
sprintf(buf,"%s has fled %s!", ch->name->str,mxpout->str);
send_to_char(buf,victim);
g_string_free(mxpout,TRUE);
}
else
act( "$n has fled!", ch, NULL, NULL, TO_ROOM );
playwave_toroom(ch, 3);
ch->in_room = now_in;
if ( !IS_NPC(ch) )
playwave_toch(ch,3);
send_to_char( "{yYou flee from combat! Coward!{x\n\r", ch );
send_to_char( "You lost 100 exp.\n\r", ch);
gain_exp( ch, -100 );
stop_fighting( ch, TRUE );
send_to_char("You pause to catch your breath.\n\r", ch );
WAIT_STATE(ch,PULSE_VIOLENCE);
return;
}
send_to_char( "{YPANIC! {yYou were unable to escape!{x\n\r", ch );
return;
}
void do_rescue( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *fch;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Rescue 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( "What about fleeing instead?\n\r", ch );
return;
}
if ( !IS_NPC(ch) && IS_NPC(victim) )
{
send_to_char( "Doesn't need your help!\n\r", ch );
return;
}
if ( ch->fighting == victim )
{
send_to_char( "Too late.\n\r", ch );
return;
}
if ( ( fch = victim->fighting ) == NULL )
{
send_to_char( "That person is not fighting right now.\n\r", ch );
return;
}
if (check_pk(ch,victim,CHECK_DELAY|CHECK_ATTACK))
{
return;
}
if (IS_AVATAR(ch) && (ch->creature != victim->creature))
{
send_to_char("Umm now that is just wrong... go rescue someone of your own class jerky.\n\r",ch);
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to lift your weapon.\n\r",ch);
return;
}
if ( is_safe(ch, fch) || is_safe(ch, victim) ) return;
WAIT_STATE( ch, skill_table[gsn_rescue].beats );
if ( !IS_NPC(ch) && number_percent( ) > ch->pcdata->learned[gsn_rescue] )
{
send_to_char( "You fail the rescue.\n\r", ch );
return;
}
if (!IS_NPC(victim) && IS_ADDED(victim,ADDED_FRENZY)
&& victim->pcdata->frenzy_action == FRENZY_FIGHT)
{
send_to_char("They connot be saved.\n\r",ch);
return;
}
act( "You rescue $N!", ch, NULL, victim, TO_CHAR );
act( "$n rescues you!", ch, NULL, victim, TO_VICT );
act( "$n rescues $N!", ch, NULL, victim, TO_NOTVICT );
stop_fighting( fch, FALSE );
stop_fighting( victim, FALSE );
check_killer( ch, fch );
if (ch->fighting == NULL)
set_fighting( ch, fch );
if (fch->fighting == NULL)
set_fighting( fch, ch );
set_attack_flag(ch,fch);
do_humanity(ch,"");
return;
}
void do_kick( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *boots;
double dam;
int stance;
if ( !IS_NPC(ch)
&& ch->level < skill_table[gsn_kick].skill_level)
{
send_to_char(
"First you should learn to kick.\n\r", ch );
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
return;
if(ch->move <= 0)
{
send_to_char("You can't find the energy to kick.\n\r",ch);
return;
}
WAIT_STATE( ch, skill_table[gsn_kick].beats );
if ( IS_NPC(ch) || number_percent( ) < ch->pcdata->learned[gsn_kick] )
dam = number_range(1,4);
else
{
dam = 0;
damage( ch, victim, (int)dam, gsn_kick );
return;
}
dam += char_damroll(ch);
if (dam == 0) dam = 1;
if ( !IS_AWAKE(victim) )
dam *= 2;
if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_VAMPIRE)
&& get_disc(ch, DISC_POTENCE) > 0
&& ch->pcdata->condition[COND_THIRST] > 20 )
dam *= (.25 * get_disc(ch, DISC_POTENCE) + 1);
if ( !IS_NPC(victim) && IS_CLASS(victim, CLASS_WEREWOLF) )
{
if (IS_SET(victim->special, SPC_WOLFMAN))
{
dam *= 0.5;
if (victim->pcdata->powers[WPOWER_BOAR] > 2 ) dam *= 0.5;
}
if ( ( boots = get_eq_char( ch, WEAR_FEET ) ) != NULL
&& IS_SET(boots->spectype, SITEM_SILVER)) dam *= 2;
}
/* Vampires should be tougher at night and weaker during the day. */
if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_VAMPIRE) )
{
switch (weather_info[ch->in_room->sector_type].sunlight)
{
case SUN_LIGHT:
if (IS_SET(ch->added,ADDED_NIGHTFALL))
dam *= 1.5;
else
dam /= 1.5;
case SUN_DARK:
dam *= 1.5;
default:
if (IS_SET(ch->added,ADDED_NIGHTFALL))
dam *= 1.5;
}
}
if ( !IS_NPC(ch) ) dam = dam + (dam * ((ch->wpn[0]+1) / 100));
if ( !IS_NPC(ch) )
{
stance = ch->stance[0];
if ( IS_STANCE(ch, STANCE_NORMAL) ) dam *= 1.25;
else dam = dambonus(ch,victim,(int)dam,stance);
}
if ( dam <= 0 )
dam = 1;
if ( !IS_NPC(victim) && IS_IMMMERIT(victim, IMM_MERIT_KICK) )
{
act("$N's blocks your attempt to kick!",ch,NULL,victim,TO_CHAR);
}
else
{
if (!IS_NPC(victim) && IS_IMMFLAW(victim,IMM_FLAW_KICK))
dam += dam;
damage( ch, victim, (int)dam, gsn_kick );
}
return;
}
void do_punch( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int dam;
int store;
bool broke = FALSE;
one_argument(argument,arg);
if ( IS_NPC(ch) ) return;
if ( ch->level < skill_table[gsn_punch].skill_level)
{
send_to_char( "First you should learn to punch.\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "You cannot punch yourself!\n\r", ch );
return;
}
if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
return;
if (is_safe(ch,victim)) return;
if ( victim->hit < victim->max_hit )
{
send_to_char( "They are hurt and suspicious.\n\r", ch );
return;
}
if ( victim->position < POS_FIGHTING )
{
send_to_char( "You can only punch someone who is standing.\n\r", ch );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to lift your arms.\n\r",ch);
return;
}
if (check_pk(ch,victim,CHECK_DELAY|CHECK_ATTACK))
{
return;
}
playwave_toroom(ch,8);
act("You draw your fist back and aim a punch at $N.",ch,NULL,victim,TO_CHAR);
act("$n draws $s fist back and aims a punch at you.",ch,NULL,victim,TO_VICT);
act("$n draws $s fist back and aims a punch at $N.",ch,NULL,victim,TO_NOTVICT);
WAIT_STATE( ch, skill_table[gsn_punch].beats );
if ( IS_NPC(ch) || number_percent( ) < ch->pcdata->learned[gsn_punch] )
dam = number_range(1,4);
else
{
dam = 0;
damage( ch, victim, dam, gsn_punch );
return;
}
dam += char_damroll(ch);
if (dam == 0) dam = 1;
if ( !IS_AWAKE(victim) )
dam *= 2;
if ( !IS_NPC(ch) ) dam = dam + (dam * (ch->wpn[0] / 100));
if ( dam <= 0 )
dam = 1;
if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_WEREWOLF) && IS_SET(victim->special, SPC_WOLFMAN) && victim->pcdata->powers[WPOWER_BOAR] > 3)
{
store = victim->hit;
victim->hit += dam;
damage( ch, victim, dam, gsn_punch );
victim->hit = store;
if (number_percent() <= 25 && !IS_ARM_L(ch,LOST_ARM) &&
!IS_ARM_L(ch,LOST_HAND))
{
if (!IS_ARM_L(ch, LOST_FINGER_I) && !IS_ARM_L(ch, BROKEN_FINGER_I))
{SET_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_I);broke = TRUE;}
if (!IS_ARM_L(ch, LOST_FINGER_M) && !IS_ARM_L(ch, BROKEN_FINGER_M))
{SET_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_M);broke = TRUE;}
if (!IS_ARM_L(ch, LOST_FINGER_R) && !IS_ARM_L(ch, BROKEN_FINGER_R))
{SET_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_R);broke = TRUE;}
if (!IS_ARM_L(ch, LOST_FINGER_L) && !IS_ARM_L(ch, BROKEN_FINGER_L))
{SET_BIT(ch->loc_hp[LOC_ARM_L],BROKEN_FINGER_L);broke = TRUE;}
if (broke)
{
act("The fingers on your left hand shatter under the impact of the blow!",ch,NULL,NULL,TO_CHAR);
act("The fingers on $n's left hand shatter under the impact of the blow! ",ch,NULL,NULL,TO_ROOM);
}
}
else if (number_percent() <= 25 && !IS_ARM_R(ch,LOST_ARM) &&
!IS_ARM_R(ch,LOST_HAND))
{
if (!IS_ARM_R(ch, LOST_FINGER_I) && !IS_ARM_R(ch, BROKEN_FINGER_I))
{SET_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_I);broke = TRUE;}
if (!IS_ARM_R(ch, LOST_FINGER_M) && !IS_ARM_R(ch, BROKEN_FINGER_M))
{SET_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_M);broke = TRUE;}
if (!IS_ARM_R(ch, LOST_FINGER_R) && !IS_ARM_R(ch, BROKEN_FINGER_R))
{SET_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_R);broke = TRUE;}
if (!IS_ARM_R(ch, LOST_FINGER_L) && !IS_ARM_R(ch, BROKEN_FINGER_L))
{SET_BIT(ch->loc_hp[LOC_ARM_R],BROKEN_FINGER_L);broke = TRUE;}
if (broke)
{
act("The fingers on your right hand shatter under the impact of the blow!",ch,NULL,NULL,TO_CHAR);
act("The fingers on $n's right hand shatter under the impact of the blow! ",ch,NULL,NULL,TO_ROOM);
}
}
stop_fighting(victim,TRUE);
return;
}
damage( ch, victim, dam, gsn_punch );
if (victim == NULL || victim->position == POS_DEAD || dam < 1) return;
if (victim->position == POS_FIGHTING) stop_fighting(victim,TRUE);
if (number_percent() <= 25 && !IS_HEAD(victim,BROKEN_NOSE)
&& !IS_HEAD(victim,LOST_NOSE))
{
act("Your nose shatters under the impact of the blow!",victim,NULL,NULL,TO_CHAR);
act("$n's nose shatters under the impact of the blow!",victim,NULL,NULL,TO_ROOM);
SET_BIT(victim->loc_hp[LOC_HEAD],BROKEN_NOSE);
}
else if (number_percent() <= 25 && !IS_HEAD(victim,BROKEN_JAW))
{
act("Your jaw shatters under the impact of the blow!",victim,NULL,NULL,TO_CHAR);
act("$n's jaw shatters under the impact of the blow!",victim,NULL,NULL,TO_ROOM);
SET_BIT(victim->loc_hp[LOC_HEAD],BROKEN_JAW);
}
if (IS_NPC(victim) && !IS_NPC(ch))
{
set_mob_stance(victim);
mob_remember(victim,ch,MEM_HOSTILE);
}
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->position = POS_STUNNED;
return;
}
void do_berserk( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
CHAR_DATA *vch;
CHAR_DATA *vch_next;
CHAR_DATA *mount;
int number_hit = 0;
int Berserk_Num;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if ( ch->level < skill_table[gsn_berserk].skill_level)
{
send_to_char( "You are not wild enough to go berserk.\n\r", ch );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to move.\n\r",ch);
return;
}
WAIT_STATE( ch, skill_table[gsn_berserk].beats );
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;
}
act("You go BERSERK!",ch,NULL,NULL,TO_CHAR);
act("$n goes BERSERK!",ch,NULL,NULL,TO_ROOM);
put_stance(ch);
Berserk_Num = number_range(1,10);
for ( vch = ch->in_room->people; vch != NULL; vch = vch_next )
{
vch_next = vch->next_in_room;
if (number_hit > Berserk_Num) continue;
if ( vch->in_room == NULL )
continue;
if ( !IS_NPC(vch) && vch->pcdata->chobj != NULL )
continue;
if ( ch == vch )
continue;
if ( vch->in_room == ch->in_room )
{
if (check_pk(ch, vch, CHECK_DELAY|CHECK_ATTACK))
continue;
if ( ( mount = ch->mount ) != NULL ) {if ( mount == vch ) continue;}
if (can_see(ch,vch))
{
if (!IS_NPC(vch))
set_attack_flag(ch,vch);
multi_hit( ch, vch, TYPE_UNDEFINED );
number_hit++;
}
}
}
do_beastlike(ch,"");
return;
}
/* Hurl skill by KaVir */
void do_hurl( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
CHAR_DATA *mount;
ROOM_INDEX_DATA *to_room;
EXIT_DATA *pexit;
EXIT_DATA *pexit_rev;
char buf [MAX_INPUT_LENGTH];
char direction [MAX_INPUT_LENGTH];
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
int door;
int rev_dir;
int dam;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( !IS_NPC(ch) && ch->pcdata->learned[gsn_hurl] < 1 )
{
send_to_char("Maybe you should learn the skill first?\n\r",ch);
return;
}
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char("They are not here.\n\r", ch);
return;
}
if ( victim == ch )
{
send_to_char( "How can you hurl yourself?\n\r", ch );
return;
}
if ( is_safe( ch, victim ) )
return;
if ( (mount = victim->mount) != NULL && victim->mounted == IS_MOUNT)
{
send_to_char("But they have someone on their back!\n\r",ch);
return;
}
else if ( (mount = victim->mount) != NULL && victim->mounted == IS_RIDING)
{
send_to_char("But they are riding!\n\r",ch);
return;
}
if ( !IS_NPC(victim) && IS_IMMMERIT(victim, IMM_MERIT_HURL) )
{
send_to_char("You are unable to get their feet off the ground.\n\r",ch);
return;
}
if ( IS_NPC(victim) && victim->level > 90 )
{
send_to_char("You are unable to get their feet off the ground.\n\r",ch);
return;
}
if ( (victim->hit < victim->max_hit)
|| ( victim->position == POS_FIGHTING && victim->fighting != ch) )
{
act( "$N is hurt and suspicious, and you are unable to approach $M.",
ch, NULL, victim, TO_CHAR );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to move.\n\r",ch);
return;
}
if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
return;
WAIT_STATE( ch, skill_table[gsn_hurl].beats );
if (!IS_NPC(victim) && !IS_IMMFLAW(victim,IMM_FLAW_HURL))
{
if ( !IS_NPC(ch) && number_percent( ) > ch->pcdata->learned[gsn_hurl] )
{
send_to_char("You are unable to get their feet off the ground.\n\r",ch);
multi_hit( victim, ch, TYPE_UNDEFINED );
return;
}
}
rev_dir = 0;
if ( arg2[0] == '\0' )
door = number_range(0,3);
else
{
if ( !str_cmp( arg2, "n" ) || !str_cmp( arg2, "north" ) )
door = 0;
else if ( !str_cmp( arg2, "e" ) || !str_cmp( arg2, "east" ) )
door = 1;
else if ( !str_cmp( arg2, "s" ) || !str_cmp( arg2, "south" ) )
door = 2;
else if ( !str_cmp( arg2, "w" ) || !str_cmp( arg2, "west" ) )
door = 3;
else
{
send_to_char("You can only hurl people north, south, east or west.\n\r", ch);
return;
}
}
if (door == 0) {sprintf(direction,"north");rev_dir = 2;}
if (door == 1) {sprintf(direction,"east");rev_dir = 3;}
if (door == 2) {sprintf(direction,"south");rev_dir = 0;}
if (door == 3) {sprintf(direction,"west");rev_dir = 1;}
if (( pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL)
{
sprintf(buf,"$n hurls $N into the %s wall.", direction);
act(buf,ch,NULL,victim,TO_NOTVICT);
sprintf(buf,"You hurl $N into the %s wall.", direction);
act(buf,ch,NULL,victim,TO_CHAR);
sprintf(buf,"$n hurls you into the %s wall.", direction);
act(buf,ch,NULL,victim,TO_VICT);
dam = number_range(ch->level, (ch->level * 4));
victim->hit = victim->hit - dam;
update_pos(victim);
if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill = ch->mkill + 1;
if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath = victim->mdeath + 1;
if (victim->position == POS_DEAD) {hurt_person(ch,victim,0);return;}
return;
}
pexit = victim->in_room->exit[door];
if (IS_SET(pexit->exit_info, EX_CLOSED) &&
!IS_AFFECTED(victim,AFF_PASS_DOOR ) &&
!ch->plane != PLANE_ETHEREAL)
{
if (IS_SET(pexit->exit_info, EX_LOCKED))
REMOVE_BIT(pexit->exit_info, EX_LOCKED);
if (IS_SET(pexit->exit_info, EX_CLOSED))
REMOVE_BIT(pexit->exit_info, EX_CLOSED);
sprintf(buf,"$n hoists $N in the air and hurls $M %s.", direction);
act(buf,ch,NULL,victim,TO_NOTVICT);
sprintf(buf,"You hoist $N in the air and hurl $M %s.", direction);
act(buf,ch,NULL,victim,TO_CHAR);
sprintf(buf,"$n hurls you %s, smashing you through the %s.", direction,pexit->keyword);
act(buf,ch,NULL,victim,TO_VICT);
sprintf(buf,"There is a loud crash as $n smashes through the $d.");
act(buf,victim,NULL,pexit->keyword,TO_ROOM);
if ( ( to_room = pexit->to_room ) != NULL
&& ( pexit_rev = to_room->exit[rev_dir] ) != NULL
&& pexit_rev->to_room == ch->in_room
&& pexit_rev->keyword != NULL )
{
if (IS_SET(pexit_rev->exit_info, EX_LOCKED))
REMOVE_BIT( pexit_rev->exit_info, EX_LOCKED );
if (IS_SET(pexit_rev->exit_info, EX_CLOSED))
REMOVE_BIT( pexit_rev->exit_info, EX_CLOSED );
if (door == 0) sprintf(direction,"south");
if (door == 1) sprintf(direction,"west");
if (door == 2) sprintf(direction,"north");
if (door == 3) sprintf(direction,"east");
char_from_room(victim);
char_to_room(victim,to_room);
sprintf(buf,"$n comes smashing in through the %s $d.", direction);
act(buf,victim,NULL,pexit->keyword,TO_ROOM);
dam = number_range(ch->level, (ch->level * 6));
victim->hit = victim->hit - dam;
update_pos(victim);
if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill = ch->mkill + 1;
if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath = victim->mdeath + 1;
if (victim->position == POS_DEAD) {hurt_person(ch,victim,0);return;}
}
}
else
{
sprintf(buf,"$n hurls $N %s.", direction);
act(buf,ch,NULL,victim,TO_NOTVICT);
sprintf(buf,"You hurl $N %s.", direction);
act(buf,ch,NULL,victim,TO_CHAR);
sprintf(buf,"$n hurls you %s.", direction);
act(buf,ch,NULL,victim,TO_VICT);
if (door == 0) sprintf(direction,"south");
if (door == 1) sprintf(direction,"west");
if (door == 2) sprintf(direction,"north");
if (door == 3) sprintf(direction,"east");
char_from_room(victim);
char_to_room(victim,to_room);
sprintf(buf,"$n comes flying in from the %s.", direction);
act(buf,victim,NULL,NULL,TO_ROOM);
dam = number_range(ch->level, (ch->level * 2));
victim->hit = victim->hit - dam;
update_pos(victim);
if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill = ch->mkill + 1;
if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath = victim->mdeath + 1;
if (victim->position == POS_DEAD) {hurt_person(ch,victim,0);return;}
}
return;
}
void do_disarm( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
int percent;
if ( !IS_NPC(ch)
&& ch->level < skill_table[gsn_disarm].skill_level)
{
send_to_char( "You don't know how to disarm opponents.\n\r", ch );
return;
}
if ( ( get_eq_char( ch, WEAR_WIELD ) == NULL )
&& ( get_eq_char( ch, WEAR_HOLD ) == NULL ) )
{
send_to_char( "You must wield a weapon to disarm.\n\r", ch );
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
if ( ( ( obj = get_eq_char( victim, WEAR_WIELD ) ) == NULL )
&& ( ( obj = get_eq_char( victim, WEAR_HOLD ) ) == NULL ) )
{
send_to_char( "Your opponent is not wielding a weapon.\n\r", ch );
return;
}
WAIT_STATE( ch, skill_table[gsn_disarm].beats );
percent = number_percent( ) + victim->level - ch->level;
if (!IS_NPC(victim) && IS_IMMFLAW(victim, IMM_FLAW_DISARM))
percent -= 40;
if (!IS_NPC(victim) && IS_IMMMERIT(victim, IMM_MERIT_DISARM))
send_to_char( "You failed.\n\r", ch );
else if ( IS_NPC(ch) || percent < ch->pcdata->learned[gsn_disarm] * 2 / 3 )
disarm( ch, victim );
else
send_to_char( "You failed.\n\r", ch );
return;
}
void do_sla( CHAR_DATA *ch, char *argument )
{
send_to_char( "If you want to SLAY, spell it out.\n\r", ch );
return;
}
void do_slay( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
one_argument( argument, arg2 );
if ( arg[0] == '\0' )
{
send_to_char( "Syntax: slay [Char] [Type]\n\r", ch );
send_to_char( " Types: Skin, Slit, Immolate, Demon, Shatter, Slit, Deheart, Pounce.\n\r", ch);
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "Suicide is a mortal sin.\n\r", ch );
return;
}
if ( !IS_NPC(victim) && get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( !str_cmp( arg2, "skin" ) )
{
act( "You rip the flesh from $N and send his soul to the fiery depths of hell.", ch, NULL, victim, TO_CHAR );
act( "Your flesh has been torn from your bones!", ch, NULL, victim, TO_VICT );
act( "Your bodyless soul now watches your bones incenerate in the fires of hell.", ch, NULL, victim, TO_VICT );
act( "$n rips the flesh off of $N, releasing his soul into the fiery depths of hell.", ch, NULL, victim, TO_NOTVICT );
}
else if ( !str_cmp( arg2, "deheart" ) )
{
act( "You rip through $N's chest and pull out $M beating heart in your hand.", ch, NULL, victim, TO_CHAR );
act( "You feel a sharp pain as $n rips into your chest!", ch, NULL, victim, TO_VICT );
act( "$n pulls our your beating heart in $M hand.", ch, NULL, victim, TO_VICT );
act( "Specks of blood hit your face as $n rips through $N's chest pulling out $M's beating heart.", ch, NULL, victim, TO_NOTVICT );
}
else if ( !str_cmp( arg2, "immolate" ) )
{
act( "Your fireball turns $N into a blazing inferno.", ch, NULL, victim, TO_CHAR );
act( "$n releases a searing fireball in your direction.", ch, NULL, victim, TO_VICT );
act( "$n points at $N, who bursts into a flaming inferno.", ch, NULL, victim, TO_NOTVICT );
}
else if ( !str_cmp( arg2, "shatter" ) )
{
act( "You freeze $N with a glance and shatter the frozen corpse into tiny shards.", ch, NULL, victim, TO_CHAR );
act( "$n freezes you with a glance and shatters your frozen body into tiny shards.", ch, NULL, victim, TO_VICT );
act( "$n freezes $N with a glance and shatters the frozen body into tiny shards.", ch, NULL, victim, TO_NOTVICT );
}
else if ( !str_cmp( arg2, "demon" ) )
{
act( "You gesture, and a demon appears. With a horrible grin, the creature turns on $N!", ch, NULL, victim, TO_CHAR );
act( "$N screams in panic before being eaten alive.", ch, NULL, victim, TO_CHAR );
act( "$n gestures, and a demon appears. The creature turns on you with a horrible grin.", ch, NULL, victim, TO_VICT );
act( "You scream in panic before being eaten alive.", ch, NULL, victim, TO_VICT );
act( "$n gestures, and a slavering demon appears. With a horrible grin, the foul creature turns on $N.", ch, NULL, victim, TO_NOTVICT );
act( "$N screams in panic before being eaten alive.", ch, NULL, victim, TO_NOTVICT );
}
else if ( !str_cmp( arg2, "pounce" ) )
{
act( "Leaping upon $N with bared fangs, you tear open $S throat and toss the corpse to the ground...", ch, NULL, victim, TO_CHAR );
act( "In a heartbeat, $n rips $s fangs through your throat!", ch, NULL, victim, TO_VICT );
act( "Your blood sprays and pours to the ground as your life ends...", ch, NULL, victim, TO_VICT );
act( "Leaping suddenly, $n sinks $s fangs into $N's throat!", ch, NULL, victim, TO_NOTVICT );
act( "As blood sprays and gushes to the ground, $n tosses $N's dying body away.", ch, NULL, victim, TO_NOTVICT );
}
else if ( !str_cmp( arg2, "slit" ))
{
act( "You calmly slit $N's throat.", ch, NULL, victim, TO_CHAR );
act( "$n reaches out with a clawed finger and calmly slits your throat.", ch, NULL, victim, TO_VICT );
act( "A claw extends from $n's hand as $M calmly slits $N's throat.", ch, NULL, victim, TO_NOTVICT );
}
else
{
act( "You slay $N in cold blood!", ch, NULL, victim, TO_CHAR );
act( "$n slays you in cold blood!", ch, NULL, victim, TO_VICT );
act( "$n slays $N in cold blood!", ch, NULL, victim, TO_NOTVICT );
}
raw_kill(victim);
return;
}
/* Had problems with people not dying when POS_DEAD...KaVir */
void do_killperson( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
one_argument( argument, arg );
if ( arg[0] == '\0' )
return;
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
return;
send_to_char( "{RYou have been KILLED!!{x\n\r\n\r", victim );
if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill = ch->mkill + 1;
if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath = victim->mdeath + 1;
raw_kill( victim );
return;
}
/* For decapitating players - KaVir */
void do_decapitate( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
OBJ_DATA *obj2;
char arg[MAX_INPUT_LENGTH];
GString *ch_class;
GString *vic_class;
GString *final_string;
int cap_bonus;
bool fHas_Arti = FALSE;
one_argument( argument, arg );
if ( IS_NPC(ch) ) return;
obj2 = get_eq_char( ch, WEAR_HOLD );
if ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL )
{
if ( ( obj2 = get_eq_char( ch, WEAR_HOLD ) ) == NULL )
{
send_to_char( "First you better get a weapon out!\n\r", ch );
return;
}
}
if ( ( obj != NULL && obj->item_type != ITEM_WEAPON ) )
{
if ( ( obj2 != NULL && obj2->item_type != ITEM_WEAPON ) )
{
send_to_char( "But you are not wielding any weapons!\n\r", ch );
return;
}
}
if ( ( obj != NULL && obj->value[3] != 1 && obj->value[3] != 3 )
&& ( obj2 != NULL && obj2->value[3] != 1 && obj2->value[3] != 3 ) )
{
send_to_char( "You need to wield a slashing or slicing weapon to decapitate.\n\r", ch );
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Decapitate 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 ( ch == victim )
{
send_to_char( "That might be a bit tricky...\n\r", ch );
return;
}
if (!IS_NPC(ch) && IS_SET(ch->pcdata->comm,COMM_AUTOPROTECT) && check_pk_range(ch,victim) )
{
send_to_char("You have been protected from decapatating a lower stat player\n\r",ch);
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "You can only decapitate other players.\n\r", ch );
return;
}
if ( !CAN_PK(ch) )
{
send_to_char( "You must be an avatar to decapitate someone.\n\r", ch );
return;
}
if ( !CAN_PK(victim) )
{
send_to_char( "You can only decapitate other avatars.\n\r", ch );
return;
}
if ( victim->position > 1 )
{
send_to_char( "You can only do this to mortally wounded players.\n\r", ch );
return;
}
if (is_safe(ch,victim)) return;
if ( IS_CLASS(ch, CLASS_VAMPIRE) && IS_SET(ch->special, SPC_INCONNU) &&
(IS_CLASS(victim, CLASS_VAMPIRE) || IS_VAMPAFF(victim, VAM_MORTAL)))
{
send_to_char( "You cannot decapitate another vampire.\n\r", ch );
return;
}
if ( IS_CLASS(victim, CLASS_VAMPIRE) && IS_SET(victim->special, SPC_INCONNU) &&
(IS_CLASS(ch, CLASS_VAMPIRE) || IS_VAMPAFF(ch, VAM_MORTAL)))
{
send_to_char( "You cannot decapitate an Inconnu vampire.\n\r", ch );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to lift your weapon.\n\r",ch);
return;
}
if (check_pk(ch,victim,CHECK_DELAY|CHECK_ATTACK))
{
return;
}
if ( ch->pk_timer < 1 )
{
send_to_char("You can't seem to get close enough.\n\r",ch);
send_to_char("Maybe if you were involved in the combat you'd have a better angle?\n\r",ch);
return;
}
ch_class = get_player_class_string(ch);
vic_class = get_player_class_string(victim);
final_string = g_string_new("");
g_string_sprintf(final_string,"a %s has been decapitated by a %s.",vic_class->str,ch_class->str);
do_info(ch,final_string->str);
act( "You bring your weapon down upon $N's neck!", ch, NULL, victim, TO_CHAR );
send_to_char( "Your head is sliced from your shoulders!\n\r", victim);
act( "$n swings $s weapon down towards $N's neck!", ch, NULL, victim, TO_NOTVICT );
act( "$n's head is sliced from $s shoulders!", victim, NULL, NULL, TO_ROOM);
act( "A misty white vapour pours from $N's corpse into your body.",ch,NULL,victim, TO_CHAR );
act( "A misty white vapour pours from $N's corpse into $n's body.",ch,NULL,victim, TO_NOTVICT );
act( "You double over in agony as raw energy pulses through your veins.",ch,NULL,NULL,TO_CHAR);
act( "$n doubles over in agony as sparks of energy crackle around $m.",ch,NULL,NULL,TO_NOTVICT);
if (IS_CLASS(victim, CLASS_VAMPIRE)) do_mortalvamp(victim,"");
else if (IS_SET(victim->special, SPC_WOLFMAN)) do_unwerewolf(victim,"");
if (IS_CLASS(victim, CLASS_MAGE) && IS_AFFECTED(victim, AFF_POLYMORPH))
do_unpolymorph(victim,"");
fHas_Arti = check_artifact(victim);
behead( victim );
do_beastlike(ch,"");
ch->pk_timer = 8;
victim->pcdata->stats[UNI_RAGE] = 0;
victim->level = 2;
do_save(ch,"");
do_save(victim,"");
victim->last_attacked = NULL;
if (IS_SWWF(victim))
shape_shift(victim, SHAPE_HOMID);
set_attack_flag(ch,victim);
cap_bonus = 0;
cap_bonus += ( number_range(10000,80000) * victim->race) ;
ch->exp += cap_bonus;
calc_stat(ch,victim);
g_string_sprintf( final_string, "{WYou gain {R%d{W experience points.{x\n\r", cap_bonus);
send_to_char( final_string->str, ch );
g_string_free(ch_class,TRUE);
g_string_free(vic_class,TRUE);
g_string_free(final_string,TRUE);
sprintf( log_buf, "%s decapitated by %s at %d.",
victim->name->str, ch->name->str, victim->in_room->vnum );
log_string2( log_buf );
logchan(log_buf,NULL,NULL,WIZ_DECAP,0,LEVEL_IMMORTAL);
//decap_note(ch,victim,DECAPT_DECAP,DECAPO_FOR_STAT);
return;
}
void do_tear( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
bool fHas_Arti = FALSE;
int cap_bonus;
GString *ch_class;
GString *vic_class;
GString *final_string;
one_argument( argument, arg );
final_string = g_string_new("");
if ( IS_NPC(ch) ) return;
if ( !IS_CLASS(ch, CLASS_WEREWOLF) && !IS_CLASS(ch, CLASS_SWWF))
{
send_to_char( "Huh?\n\r", ch );
return;
}
if ( IS_CLASS(ch, CLASS_WEREWOLF) && !IS_SET(ch->special, SPC_WOLFMAN))
{
send_to_char( "You can only tear heads off while in Crinos form.\n\r", ch );
return;
}
if (IS_SWWF(ch) && ch->pcdata->wwf_shape == SHAPE_HOMID)
{
send_to_char("You must be in some other form other then Homid.\n\r",ch);
return;
}
if ( !IS_VAMPAFF(ch, VAM_CLAWS))
{
send_to_char( "You better get your claws out first.\n\r", ch );
return;
}
if ( arg[0] == '\0' )
{
send_to_char("Who's head do you wish to tear off?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "That might be a bit tricky...\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "You can only tear the heads off other players.\n\r", ch );
return;
}
if ( !CAN_PK(ch) )
{
send_to_char( "You must be an avatar to tear someone's head off.\n\r", ch );
return;
}
if ( !CAN_PK(victim) )
{
send_to_char( "You can only tear the head off another avatar.\n\r", ch );
return;
}
if ( victim->position > 1 )
{
send_to_char( "You can only do this to mortally wounded players.\n\r", ch );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to swipe your claws.\n\r",ch);
return;
}
if (check_pk(ch,victim,CHECK_DELAY))
{
send_to_char("Not with a delay timer...\n\r",ch);
return;
}
if ( ch->pk_timer < 1 )
{
send_to_char("You can't seem to get close enough.\n\r",ch);
send_to_char("Maybe if you were involved in the combat you'd have a better angle?\n\r",ch);
return;
}
if (!IS_NPC(ch) && IS_SET(ch->pcdata->comm,COMM_AUTOPROTECT) && check_pk_range(ch,victim) )
{
send_to_char("You have been protected from tearing a lower stat player\n\r",ch);
return;
}
if (is_safe(ch,victim)) return;
act( "You tear $N's head from $S shoulders!", ch, NULL, victim, TO_CHAR );
send_to_char( "Your head is torn from your shoulders!\n\r", victim);
act( "$n tears $N's head from $S shoulders!", ch, NULL, victim, TO_NOTVICT );
/*
if ( victim->race < 1 && ch->race > 0 )
{
sprintf(buf,"%s has been decapitated by %s.",victim->name,ch->name);
do_info(ch,buf);
sprintf( log_buf, "%s decapitated by %s at %d for no status.",
victim->name, ch->name, victim->in_room->vnum );
log_string2( log_buf );
if (IS_CLASS(victim, CLASS_VAMPIRE)) do_mortalvamp(victim,"");
else if (IS_SET(victim->special, SPC_WOLFMAN)) do_unwerewolf(victim,"");
if (IS_CLASS(victim, CLASS_MAGE) && IS_AFFECTED(victim, AFF_POLYMORPH))
do_unpolymorph(victim,"");
behead( victim );
do_beastlike(ch,"");
ch->pkill = ch->pkill + 1;
victim->pdeath = victim->pdeath + 1;
return;
}
*/
ch_class = get_player_class_string(ch);
vic_class = get_player_class_string(victim);
g_string_sprintf(final_string,"a %s got thier head torn clean off by a %s.",vic_class->str,ch_class->str);
do_info(ch,final_string->str);
g_string_free(ch_class,TRUE);
g_string_free(vic_class,TRUE);
g_string_free(final_string,TRUE);
victim->pdeath = victim->pdeath + 1;
victim->pcdata->stats[UNI_RAGE] = 0;
victim->level = 2;
if (IS_SWWF(victim))
shape_shift(victim, SHAPE_HOMID);
set_attack_flag(ch,victim);
victim->last_attacked = NULL;
act( "A misty white vapour pours from $N's corpse into your body.", ch, NULL, victim, TO_CHAR );
act( "A misty white vapour pours from $N's corpse into $n's body.", ch, NULL, victim, TO_NOTVICT );
act( "You double over in agony as raw energy pulses through your veins.", ch, NULL, NULL, TO_CHAR );
act( "$n doubles over in agony as sparks of energy crackle around $m.", ch, NULL, NULL, TO_NOTVICT );
if (IS_CLASS(victim, CLASS_VAMPIRE))
do_mortalvamp(victim,"");
else if (IS_SET(victim->special, SPC_WOLFMAN))
do_unwerewolf(victim,"");
if (IS_CLASS(victim, CLASS_MAGE) && IS_AFFECTED(victim, AFF_POLYMORPH))
do_unpolymorph(victim,"");
fHas_Arti = check_artifact(victim);
behead( victim );
do_beastlike(ch,"");
ch->pk_timer = 8;
do_save(ch,"");
do_save(victim,"");
if (fHas_Arti)
{
sprintf( log_buf, "%s decapitated by %s at %d for artifact.",
victim->name->str, ch->name->str, victim->in_room->vnum );
log_string2( log_buf );
logchan(log_buf,NULL,NULL,WIZ_DECAP,0,LEVEL_IMMORTAL);
//decap_note(ch,victim,DECAPT_TEAR,DECAPO_FOR_ARTI);
return;
}
cap_bonus = 0;
cap_bonus += ( number_range(10000,80000) * victim->race) ;
calc_stat(ch,victim);
sprintf( buf, "{WYou gain {R%d{W experience points.{x\n\r", cap_bonus);
send_to_char( buf, ch );
sprintf( log_buf, "%s decapitated by %s at %d.",
victim->name->str, ch->name->str, victim->in_room->vnum );
logchan(log_buf,NULL,NULL,WIZ_DECAP,0,LEVEL_IMMORTAL);
log_string2( log_buf );
//decap_note(ch,victim,DECAPT_TEAR,DECAPO_FOR_STAT);
return;
}
void do_crack( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
OBJ_DATA *right;
OBJ_DATA *left;
right = get_eq_char( ch, WEAR_WIELD );
left = get_eq_char( ch, WEAR_HOLD );
if (right != NULL && right->pIndexData->vnum == 12) obj = right;
else if (left != NULL && left->pIndexData->vnum == 12) obj = left;
else
{
send_to_char("You are not holding any heads.\n\r",ch);
return;
}
act("You hurl $p at the floor.", ch, obj, NULL, TO_CHAR);
act("$n hurls $p at the floor.", ch, obj, NULL, TO_ROOM);
act("$p cracks open, leaking brains out across the floor.", ch, obj, NULL, TO_CHAR);
if (obj->chobj != NULL)
{act("$p cracks open, leaking brains out across the floor.", ch, obj, obj->chobj, TO_NOTVICT);
act("$p crack open, leaking brains out across the floor.", ch, obj, obj->chobj, TO_VICT);}
else
{act("$p cracks open, leaking brains out across the floor.", ch, obj, NULL, TO_ROOM);}
crack_head(ch,obj,obj->name->str);
obj_from_char(obj);
extract_obj(obj);
}
/* Voodoo skill by KaVir */
void do_voodoo( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char buf [MAX_INPUT_LENGTH];
char part1 [MAX_INPUT_LENGTH];
char part2 [MAX_INPUT_LENGTH];
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0')
{
send_to_char( "Who do you wish to use voodoo magic on?\n\r", ch );
return;
}
if ( ( obj = get_eq_char( ch, WEAR_HOLD ) ) == NULL)
{
if ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL)
{
send_to_char( "You are not holding a voodoo doll.\n\r", ch );
return;
}
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
sprintf(part2,obj->name->str);
sprintf(part1,"%s voodoo doll",victim->name->str);
if ( str_infix(part1,part2) )
{
sprintf(buf,"But you are holding %s, not %s!\n\r",obj->short_descr->str,victim->name->str);
send_to_char( buf, ch );
return;
}
if ( arg2[0] == '\0')
{
send_to_char( "You can 'stab', 'burn' or 'throw' the doll.\n\r", ch );
}
else if ( !str_cmp(arg2, "stab") )
{
WAIT_STATE(ch,12);
act("You stab a pin through $p.", ch, obj, NULL, TO_CHAR);
act("$n stabs a pin through $p.", ch, obj, NULL, TO_ROOM);
if (!IS_NPC(victim) && IS_IMMMERIT(victim, IMM_MERIT_VOODOO)) return;
act("You feel an agonizing pain in your chest!", victim, NULL, NULL, TO_CHAR);
act("$n clutches $s chest in agony!", victim, NULL, NULL, TO_ROOM);
if (!IS_NPC(victim) && IS_IMMFLAW(victim, IMM_FLAW_VOODOO))
damage(ch,victim,100,0);
}
else if ( !str_cmp(arg2, "burn") )
{
WAIT_STATE(ch,12);
act("You set fire to $p.", ch, obj, NULL, TO_CHAR);
act("$n sets fire to $p.", ch, obj, NULL, TO_ROOM);
act("$p burns to ashes.", ch, obj, NULL, TO_CHAR);
act("$p burns to ashes.", ch, obj, NULL, TO_ROOM);
obj_from_char(obj);
extract_obj(obj);
if (!IS_NPC(victim) && IS_IMMMERIT(victim, IMM_MERIT_VOODOO)) return;
if (IS_AFFECTED(victim,AFF_FLAMING) )
return;
SET_BIT(victim->affected_by, AFF_FLAMING);
act("You suddenly burst into flames!", victim, NULL, NULL, TO_CHAR);
act("$n suddenly bursts into flames!", victim, NULL, NULL, TO_ROOM);
if (!IS_NPC(victim) && IS_IMMFLAW(victim, IMM_FLAW_VOODOO))
damage(ch,victim,100,0);
}
else if ( !str_cmp(arg2, "throw") )
{
WAIT_STATE(ch,12);
act("You throw $p to the ground.", ch, obj, NULL, TO_CHAR);
act("$n throws $p to the ground.", ch, obj, NULL, TO_ROOM);
obj_from_char(obj);
obj_to_room(obj, ch->in_room);
if (!IS_NPC(victim) && IS_IMMMERIT(victim, IMM_MERIT_VOODOO)) return;
if (victim->position < POS_STANDING)
return;
if (victim->position == POS_FIGHTING)
stop_fighting(victim, TRUE);
act("A strange force picks you up and hurls you to the ground!", victim, NULL, NULL, TO_CHAR);
act("$n is hurled to the ground by a strange force.", victim, NULL, NULL, TO_ROOM);
victim->position = POS_RESTING;
victim->hit = victim->hit - number_range(ch->level,(5*ch->level));
if (!IS_NPC(victim) && IS_IMMFLAW(victim, IMM_FLAW_VOODOO))
damage(ch,victim,100,0);
update_pos(victim);
}
else
{
send_to_char( "You can 'stab', 'burn' or 'throw' the doll.\n\r", ch );
}
return;
}
void do_stomp( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int dam;
int might_break = 0;
one_argument(argument,arg);
if ( IS_NPC(ch) ) return;
if ( ch->level < skill_table[gsn_stomp].skill_level)
{
send_to_char( "First you should learn to stomp.\n\r", ch );
return;
}
if ( arg == NULL )
{
if ( ch->fighting != NULL )
{
victim = ch->fighting;
}
else
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "Stomp who?\n\r", ch);
return;
}
if ( ch == victim )
{
send_to_char( "You cannot stomp yourself!\n\r", ch );
return;
}
if (check_pk(ch,victim,CHECK_DELAY|CHECK_ATTACK))
return;
if (is_safe(ch,victim)) return;
if ( victim->position < POS_FIGHTING )
{
send_to_char( "You can only stomp someone who is standing.\n\r", ch );
return;
}
if(victim->move <= -300)
{
send_to_char("They aren't going anywhere.\n\r",ch);
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to stomp your foot.\n\r",ch);
return;
}
if (check_disc(ch,victim,CDISC_PK|CDISC_TSAFE|CDISC_PLANE|CDISC_REINA))
return;
WAIT_STATE( ch, skill_table[gsn_stomp].beats );
if ( IS_NPC(ch) || number_percent( ) < ch->pcdata->learned[gsn_stomp] )
{
dam = number_range(100,400);
victim->move -= number_range(400,600);
}
else
{
dam = 0;
damage( ch, victim, dam, gsn_stomp );
return;
}
set_attack_flag(ch,victim);
switch ( number_range(1,3) )
{
case 1:
act("You lift your leg up and stomp $N's foot hard.",ch,NULL,victim,TO_CHAR);
act("$n brings a stomp down hard on your foot.",ch,NULL,victim,TO_VICT);
act("$n stomps hard on $N's foot.",ch,NULL,victim,TO_NOTVICT);
might_break = -1; /* Pick a toe */
break;
case 2:
act("You rake your heel across $N's shin.",ch,NULL,victim,TO_CHAR);
act("$n's heel cuts into your shin as $s stomps down on your leg.",ch,NULL,victim,TO_VICT);
act("$n rakes $s heel hard across $N's shin.",ch,NULL,victim,TO_NOTVICT);
might_break = BROKEN_LEG;
break;
case 3:
act("Your heel tears into $S calf.",ch,NULL,victim,TO_CHAR);
act("$n's heel rips into your calf with a powerful stomp.",ch,NULL,victim,TO_VICT);
act("$n's powerful stomp rips into $N's calf.",ch,NULL,victim,TO_NOTVICT);
might_break = BROKEN_LEG;
break;
}
if ( !IS_AWAKE(victim) )
dam *= 2;
damage( ch, victim, dam, gsn_stomp );
if (victim == NULL || victim->position == POS_DEAD || dam < 1) return;
if (number_percent() <= 10 && might_break == -1)
{
/* Gotta break a toe. Pick a leg, and pick a toe. */
might_break = 2^(number_range(8,12)); /* get the number for the TOE bits */
if ( number_percent() < 50 && !IS_LEG_R(victim, might_break) ) /* 50/50 left or right */
{
SET_BIT(victim->loc_hp[LOC_LEG_R], might_break);
act("Your toe shatters under the impact of the stomp!",victim,NULL,NULL,TO_CHAR);
act("$n's toe shatters under the impact of the stomp!",victim,NULL,NULL,TO_ROOM);
}
else if ( !IS_LEG_L(victim, might_break) )
{
SET_BIT(victim->loc_hp[LOC_LEG_L], might_break);
act("Your toe shatters under the impact of the stomp!",victim,NULL,NULL,TO_CHAR);
act("$n's toe shatters under the impact of the stomp!",victim,NULL,NULL,TO_ROOM);
}
/* Maybe we broke something, maybe it was already broke, but we are done here */
return;
}
else if (number_percent() <= 10 && might_break == BROKEN_LEG && !IS_LEG_R(victim,might_break))
{
act("Your right leg shatters under the impact of the stomp!",victim,NULL,NULL,TO_CHAR);
act("$n's right leg shatters under the impact of the stomp!",victim,NULL,NULL,TO_ROOM);
SET_BIT(victim->loc_hp[LOC_LEG_R], might_break);
}
else if (number_percent() <= 10 && might_break == BROKEN_LEG && !IS_LEG_L(victim,might_break))
{
act("Your left leg shatters under the impact of the stomp!",victim,NULL,NULL,TO_CHAR);
act("$n's left leg shatters under the impact of the stomp!",victim,NULL,NULL,TO_ROOM);
SET_BIT(victim->loc_hp[LOC_LEG_L], might_break);
}
return;
}
void do_surrender( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *mob;
if ( ch->level > 2 )
{
send_to_char( "I don't think so...\n\r", ch );
return;
}
if ( (mob = ch->fighting) == NULL )
{
send_to_char( "But you're not fighting!\n\r", ch );
return;
}
act( "You surrender to $N!", ch, NULL, mob, TO_CHAR );
act( "$n surrenders to you!", ch, NULL, mob, TO_VICT );
act( "$n tries to surrender to $N!", ch, NULL, mob, TO_NOTVICT );
stop_fighting( ch, TRUE );
if ( !IS_NPC( ch ) && IS_NPC( mob )
&& ( !HAS_TRIGGER( mob, TRIG_SURR )
|| !mp_percent_trigger( mob, ch, NULL, NULL, TRIG_SURR ) ) )
{
act( "$N seems to ignore your cowardly act!", ch, NULL, mob, TO_CHAR );
multi_hit( mob, ch, TYPE_UNDEFINED );
}
}
void do_bash( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int chance = 50;
one_argument(argument,arg);
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->position < POS_FIGHTING)
{
act("You'll have to let $M get back up first.",ch,NULL,victim,TO_CHAR);
return;
}
if (victim == ch)
{
send_to_char("You try to bash your brains out, but fail.\n\r",ch);
return;
}
if (is_safe(ch,victim))
return;
if (IS_AFFECTED(ch,AFF_CHARM) && ch->master == victim)
{
act("But $N is your friend!",ch,NULL,victim,TO_CHAR);
return;
}
if ( !can_see( ch, victim ) )
{
send_to_char("You get a running start, and slam right into a wall.\n\r",ch);
return;
}
/* modifiers */
/* size and weight */
chance += ch->carry_weight / 250;
chance -= victim->carry_weight / 200;
/* stats */
chance += get_curr_str(ch);
chance -= (get_curr_dex(victim) * 4)/3;
chance -= GET_AC(victim) / 5;
if (number_percent() < chance )
{
act("{i$n sends you sprawling with a powerful bash!{x",
ch,NULL,victim,TO_VICT);
act("{hYou slam into $N, and send $M flying!{x",ch,NULL,victim,TO_CHAR);
act("{k$n sends $N sprawling with a powerful bash.{x",
ch,NULL,victim,TO_NOTVICT);
WAIT_STATE(ch,24);
victim->position = POS_RESTING;
damage(ch,victim,number_range(2,2 + 2 + chance/20),TYPE_BASH);
}
else
{
damage(ch,victim,0,TYPE_BASH);
act("{hYou fall flat on your face!{x",
ch,NULL,victim,TO_CHAR);
act("{k$n falls flat on $s face.{x",
ch,NULL,victim,TO_NOTVICT);
act("{iYou evade $n's bash, causing $m to fall flat on $s face.{x",
ch,NULL,victim,TO_VICT);
ch->position = POS_RESTING;
WAIT_STATE(ch,24);
}
}
/* For decapitating players - KaVir */
void do_diablerize( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int cap_bonus;
bool fHas_Arti = FALSE;
GString *ch_class;
GString *vic_class;
GString *final_string;
one_argument( argument, arg );
final_string = g_string_new("");
if ( IS_NPC(ch) ) return;
if (!IS_CLASS(ch,CLASS_VAMPIRE))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Diablerize 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 (!IS_NPC(ch) && !IS_VAMPAFF(ch,VAM_FANGS))
{
send_to_char("You might wanna have your fangs out for this one.\n\r",ch);
return;
}
if ( ch == victim )
{
send_to_char( "That might be a bit tricky...\n\r", ch );
return;
}
if (!IS_NPC(ch) && IS_SET(ch->pcdata->comm,COMM_AUTOPROTECT) && check_pk_range(ch,victim) )
{
send_to_char("You have been protected from diablerizing a lower stat player\n\r",ch);
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "You can only diablerize other players.\n\r", ch );
return;
}
if ( !CAN_PK(ch) )
{
send_to_char( "You must be an avatar to diablerize someone.\n\r", ch );
return;
}
if ( !CAN_PK(victim) )
{
send_to_char( "You can only diablerize other avatars.\n\r", ch );
return;
}
if ( victim->position > 1 )
{
send_to_char( "You can only do this to mortally wounded players.\n\r", ch );
return;
}
if (is_safe(ch,victim)) return;
if ( !IS_CLASS(victim, CLASS_VAMPIRE) )
{
send_to_char( "You can only diablerize other vampires.\n\r", ch );
return;
}
if ( IS_CLASS(victim, CLASS_VAMPIRE) && IS_SET(victim->special, SPC_INCONNU) &&
(IS_CLASS(ch, CLASS_VAMPIRE) || IS_VAMPAFF(ch, VAM_MORTAL)))
{
send_to_char( "You cannot diablerize an Inconnu vampire.\n\r", ch );
return;
}
if(ch->move <= 0)
{
send_to_char("You can't find the energy to lift your head.\n\r",ch);
return;
}
if (check_pk(ch,victim,CHECK_DELAY|CHECK_ATTACK))
{
return;
}
if ( ch->pk_timer < 1 )
{
send_to_char("You can't seem to get close enough.\n\r",ch);
send_to_char("Maybe if you were involved in the combat you'd have a better angle?\n\r",ch);
return;
}
act( "You bring your fangs down upon $N's neck!", ch, NULL, victim, TO_CHAR );
send_to_char( "Your blood starts to burn as you feel your life force slipping away!\n\r", victim);
act( "$n swings $s head towards $N's neck!", ch, NULL, victim, TO_NOTVICT );
act( "$n's falls to the ground lifeless.", victim, NULL, NULL, TO_ROOM);
victim->last_attacked = NULL;
ch_class = get_player_class_string(ch);
vic_class = get_player_class_string(victim);
g_string_sprintf(final_string,"a %s has been Diablerized by a %s.",vic_class->str,ch_class->str);
do_info(ch,final_string->str);
g_string_free(ch_class,TRUE);
g_string_free(vic_class,TRUE);
g_string_free(final_string,TRUE);
act( "A misty white vapour pours from $N's corpse into your body.",ch,NULL,victim, TO_CHAR );
act( "A misty white vapour pours from $N's corpse into $n's body.",ch,NULL,victim, TO_NOTVICT );
act( "You double over in agony as raw energy pulses through your veins.",ch,NULL,NULL,TO_CHAR);
act( "$n doubles over in agony as sparks of energy crackle around $m.",ch,NULL,NULL,TO_NOTVICT);
if (IS_CLASS(victim, CLASS_VAMPIRE)) do_mortalvamp(victim,"");
else if (IS_SET(victim->special, SPC_WOLFMAN)) do_unwerewolf(victim,"");
if (IS_CLASS(victim, CLASS_MAGE) && IS_AFFECTED(victim, AFF_POLYMORPH))
do_unpolymorph(victim,"");
fHas_Arti = check_artifact(victim);
diab_finish( victim );
do_beastlike(ch,"");
ch->pk_timer = 8;
victim->pcdata->stats[UNI_RAGE] = 0;
victim->level = 2;
if (!IS_SET(ch->added,ADDED_DIABLERIE))
SET_BIT(ch->added,ADDED_DIABLERIE);
ch->pcdata->diab[DIAB_TIME] = 20;
ch->pcdata->diab[DIAB_EVER]++;
send_to_char("You feel wicked as a aura of diablerie surrounds your body.\n\r",ch);
set_attack_flag(ch,victim);
if (IS_SWWF(victim))
shape_shift(victim, SHAPE_HOMID);
do_save(ch,"");
do_save(victim,"");
if (fHas_Arti)
{
sprintf( log_buf, "%s decapitated by %s at %d for artifact.",
victim->name->str, ch->name->str, victim->in_room->vnum );
log_string2( log_buf );
logchan(log_buf,NULL,NULL,WIZ_DECAP,0,LEVEL_IMMORTAL);
//decap_note(ch,victim,DECAPT_DIAB,DECAPO_FOR_ARTI);
return;
}
cap_bonus = 0;
cap_bonus += ( number_range(10000,80000) * victim->race) ;
calc_stat(ch,victim);
sprintf( buf, "{WYou gain {R%d{W experience points.{x\n\r", cap_bonus);
send_to_char( buf, ch );
sprintf( log_buf, "%s diablerized by %s at %d.",
victim->name->str, ch->name->str, victim->in_room->vnum );
log_string2( log_buf );
logchan(log_buf,NULL,NULL,WIZ_DECAP,0,LEVEL_IMMORTAL);
//decap_note(ch,victim,DECAPT_DIAB,DECAPO_FOR_STAT);
return;
}