/***************************************************************************
* 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. *
***************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1996 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@pacinfo.com) *
* Gabrielle Taylor (gtaylor@pacinfo.com) *
* Brian Moore (rom@rom.efn.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Tartarus/doc/rom.license *
***************************************************************************/
/***************************************************************************
* Tartarus code is copyright (C) 1997-1998 by Daniel Graham *
* In using this code you agree to comply with the Tartarus license *
* found in the file /Tartarus/doc/tartarus.doc *
***************************************************************************/
/***************************************************************************
* POSmud code is copyright (C) 1999-2000 and for exclusive use of *
* POSmud only. Hah! *
***************************************************************************/
/* DIO'S STUFF HERE. */
#include "include.h"
bool isCabalGuard( CHAR_DATA *ch );
void one_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ));
bool check_chargeset args( ( CHAR_DATA *ch, CHAR_DATA *victim ));
int is_spec_skill args((int sn));
bool is_specced args((CHAR_DATA *ch, int spec));
DECLARE_DO_FUN(do_myell);
DECLARE_DO_FUN(do_look);
DECLARE_DO_FUN(do_yell);
DECLARE_DO_FUN(do_say);
DECLARE_DO_FUN(easy_induct);
void do_prep( CHAR_DATA *ch )
{
CHAR_DATA *victim=0;
int chance;
AFFECT_DATA af;
if ( (chance = get_skill(ch,gsn_asscounter)) == 0
|| (!IS_NPC(ch)
&& ch->level < skill_table[gsn_asscounter].skill_level[ch->class]))
{
send_to_char("You don't know how to do that.\n\r",ch);
return;
}
if (is_affected(ch,gsn_asscounter))
{
send_to_char("You cannot counter again so soon.\n\r",ch);
return;
}
if (ch->mana < 50)
{
send_to_char("You can't find the energy to concentrate on countering.\n\r",ch);
return;
}
if ((victim = ch->fighting) == NULL)
{
send_to_char("But you aren't fighting anyone!\n\r",ch);
return;
}
/* modifiers */
/* size */
if (ch->size < victim->size)
chance -= 20;
/* dex */
chance += get_curr_stat(ch,STAT_DEX);
chance -= get_curr_stat(victim,STAT_DEX) * 3 / 2;
/* speed */
if (IS_SET(ch->off_flags,OFF_FAST) || is_affected(ch,skill_lookup("haste")))
chance += 10;
if (IS_SET(victim->off_flags,OFF_FAST) || is_affected(victim,skill_lookup("haste")))
chance -= 40;
/* level */
chance += (ch->drain_level + ch->level - victim->level - victim->drain_level) * 2;
if (number_percent() < chance)
{
WAIT_STATE(ch,PULSE_VIOLENCE);
ch->mana -= 50;
send_to_char("Heightening your senses you concentrate on countering your foe!\n\r",ch);
act("$n face grows grim as he focuses his concentration.",ch,NULL,NULL,TO_ROOM);
check_improve(ch,gsn_asscounter,TRUE,1);
init_affect(&af);
af.where = TO_AFFECTS;
af.aftype = AFT_SKILL;
af.type = gsn_asscounter;
af.level = ch->level;
af.duration = 1;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
affect_to_char(ch,&af);
}
else
{
WAIT_STATE(ch,PULSE_VIOLENCE);
ch->mana -= 25;
send_to_char("You attempt to focus your concentration, but fail.\n\r",ch);
check_improve(ch,gsn_asscounter,FALSE,1);
}
}
void do_flurry(CHAR_DATA *ch,char *argument)
{
CHAR_DATA *victim;
int chance, numhits, i, skill, dam;
OBJ_DATA *weapon;
OBJ_DATA *weapon2;
skill = get_skill(ch,gsn_flurry);
if ( skill == 0 )
{
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;
}
/* CLS - Need to check to see if they are even wielding a primary or secondary weapon. */
weapon = get_eq_char(ch,WEAR_WIELD);
if(weapon == NULL)
{
send_to_char("You first need to find a weapon to flurry with.\n\r",ch);
return;
}
weapon2 = get_eq_char(ch,WEAR_DUAL_WIELD);
if(weapon2 == NULL)
{
send_to_char("You need to find another weapon to flurry with.\n\r",ch);
return;
}
if ((weapon->value[0] != WEAPON_SWORD) || (weapon2->value[0] != WEAPON_SWORD) )
{
send_to_char("You must be wielding two swords to flurry.\n\r",ch);
return;
}
chance = number_percent();
if (chance > skill) {
act("You attempt to start a flurry, but fail.",ch,0,victim,TO_CHAR);
act("$n flails out wildly with $s swords but blunders.",ch,0,0,TO_ROOM);
check_improve(ch,gsn_flurry,FALSE,2);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
return;
}
if ((chance + skill) > 175) {
numhits = 7;
} else if ((chance + skill) > 160) {
numhits = 6;
} else if ((chance + skill) > 145) {
numhits = 5;
} else if ((chance + skill) > 130) {
numhits = 4;
} else if ((chance + skill) > 115) {
numhits = 3;
} else if ((chance + skill) > 100) {
numhits = 2;
} else if ((chance + skill) > 85) {
numhits = 2;
} else {
numhits = 2;
}
act("You begin a wild flurry of attacks!",ch,0,victim,TO_CHAR);
act("$n begins a wild flurry of attacks!",ch,0,0,TO_ROOM);
for ( i=0; i< numhits; i++ ) {
if (number_percent() > 80) {
dam = dice( 45/4, 7 );
damage( ch, victim, dam, gsn_flurry,DAM_NONE,TRUE);
dam = dam - dam/5;
continue;
}
one_hit(ch,victim,gsn_flurry);
}
check_improve(ch,gsn_flurry,TRUE,1);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
if ((numhits = 2))
{
ch->move -= 25;
}
else if ((numhits = 3))
{
ch->move -= 50;
}
else if ((numhits = 4))
{
ch->move -= 75;
}
else if ((numhits = 5))
{
ch->move -= 100;
}
else if ((numhits = 6))
{
ch->move -= 125;
}
else if ((numhits = 7))
{
ch->move -= 150;
}else{
ch->move -= 25;
}
return;
}
void do_drum(CHAR_DATA *ch,char *argument)
{
CHAR_DATA *victim;
int chance, numhits, i, dam, skill;
OBJ_DATA *weapon;
OBJ_DATA *weapon2;
skill = get_skill(ch,gsn_drum);
if ( skill == 0 )
{
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;
}
/* CLS - Need to check to see if they are even wielding a primary or secondary weapon. */
weapon = get_eq_char(ch,WEAR_WIELD);
if(weapon == NULL)
{
send_to_char("You first need to find a weapon to drum with.\n\r",ch);
return;
}
weapon2 = get_eq_char(ch,WEAR_DUAL_WIELD);
if(weapon2 == NULL)
{
send_to_char("You need to find another weapon to drum with.\n\r",ch);
return;
}
if ((weapon->value[0] != WEAPON_MACE) || (weapon2->value[0] != WEAPON_MACE) )
{
send_to_char("You must be wielding two maces to drum.\n\r",ch);
return;
}
chance = number_percent();
dam = dice( 51/3, 7 );
if (chance > skill) {
act("You attempt to start drumming with your maces, but fail.",ch,0,victim,TO_CHAR);
act("$n attempts to start drumming with two maces, but fails.",ch,0,0,TO_ROOM);
check_improve(ch,gsn_drum,FALSE,1);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
return;
}
if ((chance + skill) > 175) {
numhits = 4;
} else if ((chance + skill) > 160) {
numhits = 3;
} else if ((chance + skill) > 145) {
numhits = 2;
} else {
numhits = 2;
}
act("$n drums at $N with $s maces.",ch,0,victim,TO_NOTVICT);
act("$n drums at you with $s maces.",ch,0,victim,TO_VICT);
act("You drum at $N with your maces.",ch,0,victim,TO_CHAR);
for ( i=0; i < numhits; i++ ) {
if (number_percent() > 95) {
damage( ch, victim, 0, gsn_drum,DAM_NONE,TRUE);
dam = dam - dam/5;
continue;
}
one_hit(ch,victim,gsn_drum);
}
damage_old(ch,victim,dam,gsn_drum,DAM_BASH,TRUE);
check_improve(ch,gsn_drum,TRUE,1);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
return;
}
void do_siton(CHAR_DATA *ch,char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int chance=0, dam, sn_fart;
char buf[MAX_STRING_LENGTH];
one_argument(argument,arg);
if ( (get_skill(ch,gsn_siton) == 0 )
|| ch->level < skill_table[gsn_siton].skill_level[ch->class])
{
if (!IS_NPC(ch))
{
send_to_char("You don't have the skill to sit on people.\n\r",ch);
return;
}
}
if(ch->position==POS_FIGHTING) {
act("You can't sit on people while you're fighting!",ch,0,0,TO_CHAR);
return;
}
if (arg[0] == '\0')
{
send_to_char("Sit on who?\n\r",ch);
return;
}
else if ((victim = get_char_room(ch,arg)) == NULL)
{
send_to_char("They aren't here.\n\r",ch);
return;
}
if (victim == ch)
{
send_to_char("You can't sit on yourself.\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;
}
/* speed */
if (IS_SET(ch->off_flags,OFF_FAST) || IS_AFFECTED(ch,AFF_HASTE))
chance += 5;
if (IS_SET(victim->off_flags,OFF_FAST) || IS_AFFECTED(victim,AFF_HASTE))
chance -= 15;
chance += get_curr_stat(ch,STAT_DEX)/2;
chance -= get_curr_stat(victim,STAT_DEX)/2;
if (IS_AFFECTED(victim,AFF_FLYING))
chance -= dice(2,5);
/* level */
chance += (ch->level - victim->level)*3;
chance -= 55;
act("$n shrieks, waddles furiously, and leaps forward!",ch,0,victim,TO_NOTVICT);
act("$n shrieks, waddles furiously, and leaps forward!",ch,0,victim,TO_VICT);
act("You shriek, waddle furiously, and leap foward!",ch,0,victim,TO_CHAR);
act("$N's eyes widen in pure terror as $n's shadow descends apon $M.",ch,0,victim,TO_NOTVICT);
act("Your eyes widen in pure terror as $n's shadow descends apon you!",ch,0,victim,TO_VICT);
act("$N's eyes widen in pure terror as your shadow descends apon $M.",ch,0,victim,TO_CHAR);
if (!IS_NPC(ch) && !IS_NPC(victim)
&& (victim->fighting == NULL || ch->fighting == NULL))
{
sprintf(buf,"Help! %s is sitting on me!",PERS(ch,victim));
do_myell(victim,buf);
}
dam = ch->level*2 + number_percent()*2 - 50;
damage_old(ch,victim,dam,gsn_siton,DAM_BASH,TRUE);
check_improve(ch,gsn_siton,TRUE,1);
if (number_percent() > chance)
{
dam = dam+100;
act("Seizing upon $N's weakness, $n sits on the head of $N and releases a spurt of methane!",ch,0,victim,TO_NOTVICT);
act("Seizing upon your weakness, $n sits on your head and releases a spurt of methane!",ch,0,victim,TO_VICT);
act("Seizing upon $N's weakness, you sit on $S head and release a spurt of methane!",ch,0,victim,TO_CHAR);
if (!IS_NPC(ch) && !IS_NPC(victim))
{
sprintf(buf,"Help! %s is farting on me!",PERS(ch,victim));
do_myell(victim,buf);
}
sn_fart = skill_lookup("gas breath");
damage_old(ch,victim,dam,sn_fart,DAM_BASH,TRUE);
}
WAIT_STATE(ch,PULSE_VIOLENCE*3);
WAIT_STATE(victim,PULSE_VIOLENCE*2);
return;
}
void do_knife( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj, *weapon;
char buf[MAX_STRING_LENGTH];
one_argument( argument, arg );
if ( (get_skill(ch,gsn_knife) == 0 )
|| ch->level < skill_table[gsn_knife].skill_level[ch->class])
{
if (!IS_NPC(ch))
{
send_to_char("You don't know how to knife.\n\r",ch);
return;
}
}
if (arg[0] == '\0')
{
send_to_char("Knife whom?\n\r",ch);
return;
}
if (ch->fighting != NULL)
{
send_to_char("No way! You're still fighting!\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( "Bah, you can't knife yourself.\n\r", ch );
return;
}
if ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL)
{
send_to_char( "You need to wield a weapon to knife.\n\r", ch );
return;
}
weapon = get_eq_char(ch,WEAR_WIELD);
if (weapon == NULL)
{
send_to_char("You must be wielding a weapon to knife.\n\r",ch);
return;
}
if (weapon->value[0] != WEAPON_DAGGER)
{
weapon = get_eq_char(ch,WEAR_DUAL_WIELD);
if (weapon == NULL)
{
send_to_char("You must be wielding a weapon to knife.\n\r",ch);
return;
}
}
if (weapon->value[0] != WEAPON_DAGGER)
{
send_to_char("You need to be wielding a dagger to knife.\n\r",ch);
return;
}
if ( is_safe( ch, victim ) )
return;
if (check_chargeset(ch,victim)) {return;}
WAIT_STATE( ch, PULSE_VIOLENCE);
if ( number_percent( ) < get_skill(ch,gsn_knife))
{
check_improve(ch,gsn_knife,TRUE,1);
if (!IS_NPC(ch) && !IS_NPC(victim))
{
switch(number_range(0,1))
{
case (0):
sprintf(buf,"Die, %s you knifing fool!",PERS(ch,victim));
break;
case (1):
sprintf(buf,"Help! %s is knifing me!",PERS(ch,victim));
break;
}
do_myell(victim,buf);
}
one_hit( ch, victim, gsn_knife );
}
else
{
check_improve(ch,gsn_knife,FALSE,2);
if (!IS_NPC(ch) && !IS_NPC(victim))
{
switch(number_range(0,1))
{
case (0):
sprintf(buf,"Die, %s you knifing fool!",PERS(ch,victim));
break;
case (1):
sprintf(buf,"Help! %s knifed me!",PERS(ch,victim));
break;
}
do_myell(victim,buf);
}
damage( ch, victim, 0, gsn_knife,DAM_NONE,TRUE);
}
return;
}
void do_praclist( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int sn;
CHAR_DATA *victim;
int col;
col = 0;
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0')
{
send_to_char( "See whose praclist?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
return;
for ( sn = 0; sn < MAX_SKILL; sn++ )
{
if ( skill_table[sn].name == NULL )
break;
if (skill_table[sn].skill_level[victim->class] > 52)
continue;
if ( victim->level < skill_table[sn].skill_level[victim->class]
|| victim->pcdata->learned[sn] < 1 /* skill is not known */)
continue;
if (is_spec_skill(sn) != -1 && !is_specced(victim,is_spec_skill(sn))) {
sprintf( buf, "{W%-18s{x {R%3d%%{x ",
skill_table[sn].name, victim->pcdata->learned[sn] );
send_to_char( buf, ch );
if ( ++col % 3 == 0 )
send_to_char( "\n\r", ch );
continue;
}
sprintf( buf, "%-18s %3d%% ",
skill_table[sn].name, victim->pcdata->learned[sn] );
send_to_char( buf, ch );
if ( ++col % 3 == 0 )
send_to_char( "\n\r", ch );
}
if ( col % 3 != 0 )
send_to_char( "\n\r", ch );
sprintf( buf, "%d practice sessions left.\n\r",
victim->practice );
send_to_char( buf, ch );
return;
}
void do_decapitate(CHAR_DATA *ch,char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int chance, skill;
OBJ_DATA *disarmed;
char arg[MAX_INPUT_LENGTH];
AFFECT_DATA af;
one_argument( argument, arg );
if ( (chance = get_skill(ch,gsn_decapitate)) == 0 )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (arg[0] == '\0') {
victim = ch->fighting;
if (victim == NULL) {
send_to_char("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 (!is_wielded(ch,WEAPON_AXE,WIELD_TWO)) {
send_to_char("You must be wielding two axes to attempt to decapitate.\n\r",ch);
return;
}
disarmed=get_eq_char(ch,WEAR_WIELD);
act("$n whirls $s axes impressively with $s hands, and brings their blades together at $N's neck!",ch,0,victim,TO_NOTVICT);
act("$n whirls $s axes impressively with $s hands, and brings their blades together at your neck!",ch,0,victim,TO_VICT);
act("You whirl your axes impressively with your hands, and bring their blades together at $N's neck!",ch,0,victim,TO_CHAR);
/* IF NO DECAPITATE CODE */
chance = number_percent();
skill = get_skill(ch,gsn_decapitate);
if (get_trust(ch) == MAX_LEVEL) {
chance = 0;
}
if ((chance > (skill/10)) && (chance - (skill/10)) < 50) {
sprintf(buf,"Help! %s is slicing my head off!",PERS(ch,victim));
do_myell(victim,buf);
one_hit(ch, victim, gsn_decapitate);
check_improve(ch,gsn_decapitate,FALSE,1);
WAIT_STATE(ch,3*PULSE_VIOLENCE);
return;
}
if (chance > (skill/10)) {
sprintf(buf,"Die, %s you decapitating fool!",PERS(ch,victim));
do_myell(victim,buf);
damage( ch, victim, 0, gsn_decapitate,DAM_NONE,TRUE);
switch(number_range(0,1)) {
case (0):
disarmed = get_eq_char(ch,WEAR_WIELD);
case (1):
disarmed = get_eq_char(ch,WEAR_DUAL_WIELD);
}
if (IS_OBJ_STAT(disarmed,ITEM_NOREMOVE)) {
act("Your weapon won't budge!",ch,disarmed,0,TO_CHAR);
act("$n's weapon won't budge!",ch,disarmed,0,TO_ROOM);
} else {
act("Your grip on $p loosens and you send it flying!",ch,disarmed,0,TO_CHAR);
act("$n's grip on $p loosens and $m sends it flying!",ch,disarmed,0,TO_ROOM);
obj_from_char(disarmed);
if (IS_OBJ_STAT(disarmed,ITEM_NODROP)) {
obj_to_char(disarmed, ch);
} else {
obj_to_room(disarmed, ch->in_room);
}
}
check_improve(ch,gsn_decapitate,FALSE,1);
WAIT_STATE(ch,3*PULSE_VIOLENCE);
return;
}
act("$n \x01B[1;31m+++ DECAPITATES +++\x01B[0;37m $N!",ch,0,victim,TO_NOTVICT);
act("$n \x01B[1;31m+++ DECAPITATES +++\x01B[0;37m you!",ch,0,victim,TO_VICT);
act("You \x01B[1;31m+++ DECAPITATE +++\x01B[0;37m $N!",ch,0,victim,TO_CHAR);
init_affect(&af);
af.where = TO_AFFECTS;
af.type = gsn_decapitate;
af.aftype = AFT_SKILL;
af.bitvector = 0;
af.modifier = 0;
af.duration = 1;
af.location = 0;
af.level = ch->level;
affect_to_char(victim, &af);
act("You see the world from a new perspective as your head hits the ground.",victim,0,0,TO_CHAR);
raw_kill(ch,victim);
check_improve(ch,gsn_decapitate,TRUE,3);
WAIT_STATE(ch,PULSE_VIOLENCE);
return;
}
void do_lightwalk(CHAR_DATA *ch,char *argument)
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
int level;
one_argument(argument,arg1);
if (get_skill(ch,gsn_lightwalk) == 0)
{
send_to_char("Huh?\n\r",ch);
return;
}
if (cabal_down(ch,CABAL_PROTECTOR))
return;
if (is_affected(ch,gsn_insect_swarm))
{
send_to_char("You can't concentrate with all these insects swarming you.\n\r",ch);
return;
}
if (ch->mana < 70)
{
send_to_char("You do not have the mana.\n\r",ch);
return;
}
if (number_percent() > ch->pcdata->learned[gsn_lightwalk])
{
send_to_char("You fail to be transported.\n\r",ch);
check_improve(ch,gsn_lightwalk,FALSE,1);
ch->mana -= 35;
return;
}
level=ch->level;
victim = get_char_world(ch,arg1);
if ( victim == NULL
|| victim == ch
|| victim->in_room == NULL
|| IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
|| !can_see_room(ch,victim->in_room)
|| (victim->in_room->cabal != 0 && victim->in_room->cabal != CABAL_PROTECTOR)
|| ch->in_room->guild != 0
|| victim->in_room->guild != 0
|| (IS_NPC(victim) && IS_SET(victim->imm_flags,IMM_SUMMON))
|| IS_SET(victim->in_room->room_flags, ROOM_SAFE)
|| IS_SET(victim->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET(victim->in_room->room_flags, ROOM_SOLITARY)
|| IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL)
|| victim->level >= level + 9
|| (saves_spell( level, victim,DAM_OTHER) )
|| (!IS_NPC(victim) && !can_pk(ch,victim) && IS_SET(victim->act,PLR_NOSUMMON)))
{ ch->mana -= 35;
send_to_char("You failed.\n\r",ch);
WAIT_STATE(ch,12);
return;
}
ch->mana -= 70;
act("$n becomes enshrouded in a bright white light and vanishes!",ch,0,0,TO_ROOM);
char_from_room(ch);
char_to_room(ch,victim->in_room);
send_to_char("You become enshrouded in a bright white light and appear at your target.\n\r",ch);
act("$n appears in a bright flash of light.",ch,0,0,TO_ROOM);
do_look(ch,"auto");
WAIT_STATE(ch,12);
return;
}
void do_bobbit(CHAR_DATA *ch,char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *weapon;
OBJ_DATA *weapon2;
char arg1[MAX_INPUT_LENGTH];
AFFECT_DATA af;
argument = one_argument( argument, arg1 );
if (get_skill(ch,gsn_bobbit) == 0)
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( arg1[0] == '\0')
{
send_to_char("Perform the Bobbit on who?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch)
{
send_to_char( "You can't cut off your own wanker.\n\r", ch);
return;
}
/* CHECK IF WIELDING TWO DAGGERS */
weapon = get_eq_char(ch,WEAR_WIELD);
weapon2 = get_eq_char(ch,WEAR_DUAL_WIELD);
if(weapon == NULL)
{
send_to_char("You first need to find a weapon to Bobbit with.\n\r",ch);
return;
}
if(weapon2 == NULL)
{
send_to_char("You need to find another weapon to Bobbit with.\n\r",ch);
return;
}
if (weapon == NULL || weapon2 == NULL || (weapon->value[0] != WEAPON_DAGGER && weapon2->value[0] != WEAPON_DAGGER) )
{
send_to_char("You must be wielding two daggers to attempt to Bobbit.\n\r",ch);
return;
}
if (victim->position != POS_SLEEPING && !(ch->level > LEVEL_HERO))
{
send_to_char("You cannot do this when that person is awake!\n\r",ch);
return;
}
if (victim->sex != SEX_MALE) {
send_to_char("But that isn't a guy!\n\r",ch);
return;
}
act("$n slowly lowers $N's pants, whips out two glinting daggers, and slashes madly!",ch,0,victim,TO_NOTVICT);
act("You feel your pants being lowered. Curious.",ch,0,victim,TO_VICT);
act("You slower lower $N's pants, brandish two glinting daggers, and slash madly!",ch,0,victim,TO_CHAR);
switch(number_range(0,3)) {
case (0):
sprintf(buf,"Help! %s is severing my private parts!",PERS(ch,victim));
break;
case (1):
sprintf(buf,"Help! %s is slicing off my genitalia!",PERS(ch,victim));
break;
case (2):
sprintf(buf,"Help! %s is chopping off my organs of generation!",PERS(ch,victim));
break;
case (3):
sprintf(buf,"Help! %s is chopping off my reproductive organs!",PERS(ch,victim));
break;
}
act("You shriek in pure horror!",victim,0,0,TO_CHAR);
act("$n shrieks in pure horror!",victim,0,0,TO_ROOM);
do_myell(victim,buf);
one_hit(ch, victim, gsn_bobbit);
check_improve(ch,gsn_bobbit,TRUE,1);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
init_affect(&af);
af.where = TO_AFFECTS;
af.type = gsn_bobbit;
af.aftype = AFT_SKILL;
af.level = ch->level;
af.duration = ch->level/5;
af.bitvector = 0;
af.location = APPLY_DEX;
af.modifier = -15;
affect_to_char(victim,&af);
af.location = APPLY_SEX;
af.modifier = 2;
af.bitvector = 0;
affect_to_char(victim,&af);
return;
}
void do_impale(CHAR_DATA *ch,char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int chance, skill;
OBJ_DATA *weapon;
char arg[MAX_INPUT_LENGTH];
AFFECT_DATA af;
one_argument( argument, arg );
if ( (chance = get_skill(ch,gsn_impale)) == 0 )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (ch->fighting != NULL)
{
send_to_char("No way! You're still fighting!\n\r",ch);
return;
}
/* CHECK IF PRIMARY WIELDING SPEAR */
weapon = get_eq_char(ch,WEAR_WIELD);
if (weapon == NULL)
{
send_to_char("You first need to find a weapon to impale with.\n\r",ch);
return;
}
if (weapon->value[0] != WEAPON_SPEAR )
{
send_to_char("You must be wielding a spear to be able to impale.\n\r",ch);
return;
}
if ( arg[0] == '\0')
{
send_to_char("Impale 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 (victim==ch)
{
send_to_char("Trying to impale yourself ?\n\r", ch);
return;
}
if (victim->fighting != NULL) //Impale Fix to stop lamers *Ceial*
{
send_to_char("They are moving too much to impale.\n\r",ch);
return;
}
if (victim->hit < victim->max_hit*8/10)
{
send_to_char("They are too hurt and watchful to impale right now...\n\r",ch);
return;
}
if (is_safe( ch, victim ))
return;
if (is_affected(victim,gsn_impale)) {
send_to_char( "They already have a chest wound.\n\r", ch );
return;
}
if (check_chargeset(ch,victim)) {return;}
act("$n drives $s spear forward into $N's chest, attempting to pierce $S heart!",ch,0,victim,TO_NOTVICT);
act("$n drives $s spear forward into your chest, attempting to pierce your heart!",ch,0,victim,TO_VICT);
act("You drive your spear forward into $N's chest, attempting to pierce $S heart!",ch,0,victim,TO_CHAR);
chance = number_percent();
skill = get_skill(ch,gsn_impale);
if ((skill > 90) && (chance > 95)) {
act("$n \x01B[1;31m+++ IMPALES +++\x01B[0;37m $N!",ch,0,victim,TO_NOTVICT);
act("$n \x01B[1;31m+++ IMPALES +++\x01B[0;37m you!",ch,0,victim,TO_VICT);
act("You \x01B[1;31m+++ IMPALE +++\x01B[0;37m $N!",ch,0,victim,TO_CHAR);
raw_kill(ch,victim);
act("You gasp for breath as you feel your heart explode.",victim,0,0,TO_CHAR);
check_improve(ch,gsn_impale,TRUE,3);
WAIT_STATE(ch,PULSE_VIOLENCE);
return;
}
if (!IS_NPC(victim)) {
switch(number_range(0,2)) {
case (0):
sprintf(buf,"Help! %s is skewering me on a spear!",PERS(ch,victim));
break;
case (1):
sprintf(buf,"Help! %s is spiking my heart!",PERS(ch,victim));
break;
case (2):
sprintf(buf,"Help! %s is impaling me!",PERS(ch,victim));
break;
}
do_myell(victim,buf);
}
if (skill < chance+5) {
check_improve(ch,gsn_impale,FALSE,2);
damage( ch, victim, 0, gsn_impale,DAM_NONE,TRUE);
multi_hit( victim, ch, TYPE_UNDEFINED );
return;
} else {
one_hit(ch, victim, gsn_impale);
check_improve(ch,gsn_impale,TRUE,1);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
init_affect(&af);
af.where = TO_AFFECTS;
af.type = gsn_impale;
af.aftype = AFT_MALADY;
af.level = ch->level;
af.duration = ch->level/5;
af.bitvector = 0;
af.location = APPLY_DEX;
af.modifier = -(ch->level/5);
affect_to_char(victim,&af);
af.location = APPLY_STR;
af.modifier = -(ch->level/5);
af.bitvector = 0;
affect_to_char(victim,&af);
return;
}
}
void do_affrem(CHAR_DATA *ch, char *argument) {
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int sn;
argument = one_argument(argument,arg1);
argument = one_argument(argument,arg2);
if (arg1[0] == '\0')
{
send_to_char("Syntax: affrem <char> <affect>\n\r",ch);
return;
}
if ((victim = get_char_world(ch,arg1)) == NULL)
{
send_to_char( "They aren't playing.\n\r",ch);
return;
}
if (arg2[0] == '\0')
{
send_to_char("Syntax: affrem <char> <affect>\n\r",ch);
return;
}
sn = 0;
if ((sn = skill_lookup(arg2)) < 0)
{
send_to_char("No such skill or spell.\n\r", ch);
return;
}
if (!(is_affected(victim,sn)))
{
send_to_char("Target is not affected by that.\n\r", ch);
return;
}
affect_strip(victim, sn);
if (skill_table[sn].msg_off )
{
send_to_char(skill_table[sn].msg_off, victim );
send_to_char("\n\r", victim);
}
sprintf(buf,"The %s affect is removed from %s.\n\r",skill_table[sn].name,victim->name);
send_to_char(buf, ch);
return;
}
void do_divine_intervention(CHAR_DATA *ch, char *argument) {
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char arg3[MAX_STRING_LENGTH];
char arg4[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int enchant_type, value, duration;
bool isgoodaffect;
AFFECT_DATA af;
argument = one_argument(argument,arg1);
argument = one_argument(argument,arg2);
argument = one_argument(argument,arg3);
argument = one_argument(argument,arg4);
if ((arg1[0] == '\0') || (arg2[0] == '\0') || (arg3[0] == '\0') || arg4[0] == '\0')
{
send_to_char("Syntax: intervention <char> <affect> <value> <duration>\n\r",ch);
send_to_char("Affects: hp mana move ac hitroll damroll saves\n\r", ch);
return;
}
if ((victim = get_char_world(ch,arg1)) == NULL)
{
send_to_char("They aren't playing.\n\r",ch);
return;
}
if (!(is_number(arg3))) {
send_to_char("Value must be numeric.\n\r",ch);
return;
}
if (!(is_number(arg4))) {
send_to_char("Duration must be numeric.\n\r",ch);
return;
}
isgoodaffect = FALSE;
value = atoi(arg3);
duration = atoi(arg4);
if (!str_prefix(arg2,"hp")) {
if (value > 0) {isgoodaffect = TRUE;}
enchant_type=APPLY_HIT;
} else if (!str_prefix(arg2,"mana")) {
if (value > 0) {isgoodaffect = TRUE;}
enchant_type=APPLY_MANA;
} else if (!str_prefix(arg2,"move")) {
if (value > 0) {isgoodaffect = TRUE;}
enchant_type=APPLY_MOVE;
} else if (!str_prefix(arg2,"ac")) {
if (value < 0) {isgoodaffect = TRUE;}
enchant_type=APPLY_AC;
} else if (!str_prefix(arg2,"hitroll")) {
if (value > 0) {isgoodaffect = TRUE;}
enchant_type=APPLY_HITROLL;
} else if (!str_prefix(arg2,"damroll")) {
if (value > 0) {isgoodaffect = TRUE;}
enchant_type=APPLY_DAMROLL;
} else if (!str_prefix(arg2,"saves")) {
if (value < 0) {isgoodaffect = TRUE;}
enchant_type=APPLY_SAVING_SPELL;
} else {
send_to_char("No affect of that name.\n\r",ch);
return;
}
init_affect(&af);
af.where = TO_AFFECTS;
af.type = gsn_divine_intervention;
af.aftype = AFT_SKILL;
af.level = ch->level;
af.duration = duration;
af.modifier = value;
af.bitvector = 0;
af.location = enchant_type;
affect_to_char(victim,&af);
if (isgoodaffect == TRUE)
{
sprintf(buf,"%s is blessed with %s.\n\r",victim->name,arg2);
send_to_char(buf,ch);
send_to_char("You have been blessed by the Immortals.\n\r", victim);
} else {
sprintf(buf,"%s is cursed with %s.\n\r",victim->name,arg2);
send_to_char(buf,ch);
send_to_char("You have been cursed by the Immortals.\n\r", victim);
}
return;
}
void do_ccb( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
int cabal;
DESCRIPTOR_DATA *d;
argument = one_argument(argument,arg1);
strcpy(arg2, argument);
if (arg1[0] == '\0' )
{
send_to_char("Syntax: ccb <cabal> <message>\n\r",ch);
return;
}
if (arg2[0] == '\0' )
{
send_to_char("Syntax: ccb <cabal> <message>\n\r",ch);
return;
}
cabal = cabal_lookup(arg1);
if (!(cabal)) {
send_to_char("That's not a valid cabal.\n\r",ch);
return;
}
if (IS_SET(ch->act,PLR_COLOR))
{
sprintf(buf, "\x01B[1;37m%s%s: %s\x01B[0;37m\n\r",
cabal_table[cabal].who_name,
IS_NPC(ch) ? ch->short_descr : ch->name,
arg2
);
} else {
sprintf(buf, "%s%s: %s\n\r",
cabal_table[cabal].who_name,
IS_NPC(ch) ? ch->short_descr : ch->name,
arg2
);
}
send_to_char(buf, ch);
for (d = descriptor_list; d != NULL; d = d->next)
{
if (d->connected == CON_PLAYING)
{
if (((d->character != ch) && (!IS_SET(d->character->comm,COMM_NOCABAL)) && (d->character->cabal) && (d->character->cabal == cabal))
|| ((IS_SET(d->character->comm,COMM_ALL_CABALS)) && (d->character != ch)))
{
/* if (d->character->cabal != cabal) {
continue;
} */
if (IS_SET(d->character->act,PLR_COLOR))
{
sprintf(buf, "\x01B[1;37m%s%s: %s\x01B[0;37m\n\r",
cabal_table[cabal].who_name,
PERS(ch,d->character),
arg2
);
} else {
sprintf(buf, "%s%s: %s\n\r",
cabal_table[cabal].who_name,
PERS(ch,d->character),
arg2
);
}
send_to_char(buf, d->character);
}
}
}
return;
}
void do_stun( CHAR_DATA *ch,char *argument)
{
AFFECT_DATA af;
CHAR_DATA *victim;
int chance;
OBJ_DATA *weapon;
if ((chance = get_skill(ch,gsn_stun)) == 0
|| ( ch->level < skill_table[gsn_stun].skill_level[ch->class]) )
{
send_to_char("You don't know how to stun people.\n\r",ch);
return;
}
if ((victim = ch->fighting) == NULL)
{
send_to_char("You can't stun anyone if you're not fighting.\n\r",ch);
return;
}
if (victim == ch)
{
send_to_char("You pummel yourself repeatedly to no avail.\n\r",ch);
return;
}
weapon = get_eq_char(ch,WEAR_WIELD);
if (weapon != NULL) {
send_to_char("You cannot stun while wielding a weapon.\n\r",ch);
return;
}
if (is_safe(ch,victim))
return;
if (victim->position == POS_SLEEPING)
{
send_to_char("But that person is already asleep!\n\r",ch);
return;
}
if (is_affected(victim,gsn_stun))
{
send_to_char("They are already quite stunned.\n\r",ch);
return;
}
chance += (ch->drain_level - victim->level);
if (is_affected(victim,skill_lookup("haste")))
chance -= 20;
if (is_affected(ch,skill_lookup("haste")))
chance += 10;
chance -= 25;
if (ch->level == MAX_LEVEL) {
chance = 100;
}
if (!(str_cmp(race_table[victim->race].name,"lich")))
{
chance = 0;
}
act("You pummel $N with your fists, stunning $m.",ch,0,victim,TO_CHAR);
act("$n pummmels $N with $s fists, stunning $M.",ch,0,victim,TO_NOTVICT);
act("$n pummels at you with $s fists, stunning you.",ch,0,victim,TO_VICT);
if (number_percent() < chance)
{
init_affect(&af);
af.where = TO_AFFECTS;
af.level = ch->level;
af.location = 0;
af.type = gsn_stun;
af.aftype = AFT_SKILL;
af.duration = 2;
af.bitvector = 0;
af.modifier = 0;
affect_to_char(victim,&af);
stop_fighting(victim, TRUE);
victim->position = POS_SLEEPING;
check_improve(ch,gsn_stun,TRUE,2);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
return;
} else {
one_hit(ch, victim, gsn_stun);
check_improve(ch,gsn_stun,FALSE,3);
WAIT_STATE(ch, 3*PULSE_VIOLENCE);
WAIT_STATE(victim, PULSE_VIOLENCE);
}
return;
}
void spell_divine_aid(int sn,int level,CHAR_DATA *ch,void *vo,int target)
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
int dam, eng=0, gsn, add;
dam = level * 3;
if (IS_GOOD(ch)) {
eng = 1;
} else if (IS_EVIL(ch)) {
eng = -1;
} else {
switch(number_range(0,1)) {
case (0):
eng = 1;
break;
case (1):
eng = -1;
break;
}
dam -= level + 25;
}
if (eng == 1) {
act("$n summons forth an angel to aid $m!",ch,NULL,victim,TO_NOTVICT);
act("$n summons forth an angel to aid $m!",ch,NULL,victim,TO_VICT);
act("You summon forth an angel to aid you!",ch,NULL,victim,TO_CHAR);
gsn = skill_lookup("wrath");
dam += add = number_percent();
damage_old(ch,victim,dam,gsn,DAM_HOLY,TRUE);
dam -= add;
dam += add = number_percent();
damage_old(ch,victim,dam,gsn,DAM_HOLY,TRUE);
dam -= add;
dam += add = number_percent();
damage_old(ch,victim,dam,gsn,DAM_HOLY,TRUE);
} else {
act("$n summons forth a demon to aid $m!",ch,NULL,victim,TO_NOTVICT);
act("$n summons forth a demon to aid $m!",ch,NULL,victim,TO_VICT);
act("You summon forth a demon to aid you!",ch,NULL,victim,TO_CHAR);
gsn = skill_lookup("dark wrath");
dam += add = number_percent();
damage_old(ch,victim,dam,gsn,DAM_NEGATIVE,TRUE);
dam -= add;
dam += add = number_percent();
damage_old(ch,victim,dam,gsn,DAM_NEGATIVE,TRUE);
dam -= add;
dam += add = number_percent();
damage_old(ch,victim,dam,gsn,DAM_NEGATIVE,TRUE);
}
return;
}
void do_shieldbash( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int chance, wait;
char buf[MAX_STRING_LENGTH];
bool FightingCheck;
OBJ_DATA *obj;
if (ch->fighting != NULL)
FightingCheck = TRUE;
else
FightingCheck = FALSE;
one_argument(argument,arg);
if ( (chance = get_skill(ch,gsn_shieldbash)) == 0
|| (IS_NPC(ch) && !IS_SET(ch->off_flags,OFF_BASH))
|| (!IS_NPC(ch)
&& ch->level < skill_table[gsn_shieldbash].skill_level[ch->class]))
{
send_to_char("Shield bashing? What's that?\n\r",ch);
return;
}
if (arg[0] == '\0')
{
victim = ch->fighting;
if (victim == NULL)
{
send_to_char("But you aren't fighting anyone!\n\r",ch);
return;
}
}
else if ((victim = get_char_room(ch,arg)) == NULL)
{
send_to_char("They aren't here.\n\r",ch);
return;
}
if (victim->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 head with your shield, but fail.\n\r",ch);
return;
}
if (is_safe(ch,victim))
return;
if ( ( obj = get_eq_char( ch, WEAR_SHIELD ) ) == NULL )
{
send_to_char("You need a shield to bash with it!\n\r",ch);
return;
}
if (IS_AFFECTED(ch,AFF_CHARM) && ch->master == victim)
{
act("But $N is your friend!",ch,NULL,victim,TO_CHAR);
return;
}
if ( is_safe( ch, victim ) )
return;
if (is_affected(victim, gsn_protective_shield))
{
act("Your shield bash seems to slide around $N.", ch, NULL, victim, TO_CHAR);
act("$n's bash slides off your protective shield.", ch, NULL, victim,
TO_VICT);
act("$n's bash seems to slide around $N.",ch,NULL,victim,TO_NOTVICT);
return;
}
/* modifiers */
/* size and weight */
chance += ch->carry_weight / 25;
chance -= victim->carry_weight / 20;
if (ch->size < victim->size)
chance += (ch->size - victim->size) * 25;
else
chance += (ch->size - victim->size) * 10;
/* stats */
chance += get_curr_stat(ch,STAT_STR);
chance -= get_curr_stat(victim,STAT_DEX) * 4/3;
/* speed */
if (IS_SET(ch->off_flags,OFF_FAST))
chance += 10;
if (IS_SET(victim->off_flags,OFF_FAST))
chance -= 20;
/* level */
chance += (ch->level - victim->level) * 2;
/* now the attack */
if (number_percent() < chance)
{
act("$n sends you sprawling with a powerful shield bash!",
ch,NULL,victim,TO_VICT);
act("You slam into $N with your shield, and send $M flying!",ch,NULL,victim,TO_CHAR);
act("$n sends $N sprawling with a powerful bash with his shield.",
ch,NULL,victim,TO_NOTVICT);
check_improve(ch,gsn_shieldbash,TRUE,1);
wait = 3;
switch(number_bits(2)) {
case 0: wait = 1; break;
case 1: wait = 2; break;
case 2: wait = 4; break;
case 3: wait = 3; break;
}
WAIT_STATE(victim, wait * PULSE_VIOLENCE);
WAIT_STATE(ch,skill_table[gsn_shieldbash].beats+PULSE_VIOLENCE);
victim->position = POS_RESTING;
damage(ch,victim,number_range(4,4 + 4 * ch->size + chance/3),gsn_shieldbash,
DAM_BASH, TRUE);
}
else
{
damage(ch,victim,0,gsn_shieldbash,DAM_BASH, TRUE);
act("You fall flat on your face!",
ch,NULL,victim,TO_CHAR);
act("$n falls flat on $s face.",
ch,NULL,victim,TO_NOTVICT);
act("You evade $n's shield bash, causing $m to fall flat on $s face.",
ch,NULL,victim,TO_VICT);
check_improve(ch,gsn_shieldbash,FALSE,1);
ch->position = POS_RESTING;
WAIT_STATE(ch,skill_table[gsn_shieldbash].beats * 3/2);
}
if (!(IS_NPC(victim)) && !(IS_NPC(ch)) && victim->position > POS_STUNNED
&& !FightingCheck)
{
if (!can_see(victim, ch))
do_yell(victim, "Help! Someone is bashing me with a shield!");
else
{
sprintf(buf, "Help! %s is bashing me with a shield!",
PERS(ch,victim));
do_yell(victim, buf);
}
}
}
void do_boneshatter( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *weapon;
int skill;
AFFECT_DATA af;
if ((skill = get_skill(ch,gsn_boneshatter)) == 0) {
send_to_char("You don't know how to boneshatter properly.\n\r",ch);
return;
}
if ((victim = ch->fighting) == NULL)
{
send_to_char("You can't shatter bones when you're not fighting.\n\r",ch);
return;
}
weapon = get_eq_char(ch,WEAR_WIELD);
if (weapon == NULL)
{
send_to_char("You must be wielding a weapon for that.\n\r",ch);
return;
}
if (weapon->value[0] != WEAPON_MACE)
{
weapon = get_eq_char(ch,WEAR_DUAL_WIELD);
if (weapon == NULL)
{
send_to_char("You must be wielding a weapon to for that.\n\r",ch);
return;
}
}
if (weapon->value[0] != WEAPON_MACE)
{
send_to_char("You need to be wielding a mace to shatter bones.\n\r",ch);
return;
}
if (is_affected(victim,gsn_boneshatter)) {
send_to_char("Those bones are already shattered.\n\r",ch);
return;
}
act("You bring $p around with bone-shattering force!",ch,weapon,victim,TO_CHAR);
act("$n brings $p around with bone-shattering force!",ch,weapon,0,TO_ROOM);
if (number_percent( ) < (get_skill(ch,gsn_boneshatter) - 15))
{
one_hit(ch, victim, gsn_boneshatter);
init_affect(&af);
af.where = TO_AFFECTS;
af.type = gsn_boneshatter;
af.aftype = AFT_SKILL;
af.level = ch->level;
af.duration = ch->level/5;
af.bitvector = 0;
af.location = APPLY_DEX;
af.modifier = 1-(ch->level/5);
affect_to_char(victim,&af);
af.location = APPLY_STR;
af.modifier = 1-(ch->level/5);
af.bitvector = 0;
affect_to_char(victim,&af);
check_improve(ch,gsn_boneshatter,TRUE,1);
WAIT_STATE(ch,PULSE_VIOLENCE*2);
} else {
damage(ch, victim, 0, gsn_boneshatter,DAM_NONE,TRUE);
check_improve(ch,gsn_boneshatter,FALSE,2);
WAIT_STATE(ch,PULSE_VIOLENCE*2);
}
return;
}
void spell_rejuvenate( int sn, int level, CHAR_DATA *ch, void *vo,int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
victim->hit = UMIN( victim->hit + 300, victim->max_hit );
update_pos( victim );
send_to_char( "A very warm feeling fills your body.\n\r", victim );
if ( ch != victim )
send_to_char( "Ok.\n\r", ch );
return;
}
void do_powers(CHAR_DATA *ch, char *argument)
{
BUFFER *buffer;
char arg[MAX_INPUT_LENGTH];
char skill_list[LEVEL_HERO + 1][MAX_STRING_LENGTH];
char skill_columns[LEVEL_HERO + 1];
int gn, gns, sn, level, min_lev = 1, max_lev = LEVEL_HERO;
bool fAll = FALSE, found = FALSE;
char buf[MAX_STRING_LENGTH];
if (IS_NPC(ch))
return;
if (ch->cabal == 0) {
send_to_char("You are homeless; you have no powers.\n\r",ch);
return;
}
if (argument[0] != '\0')
{
fAll = TRUE;
if (str_prefix(argument,"all"))
{
argument = one_argument(argument,arg);
if (!is_number(arg))
{
send_to_char("Arguments must be numerical or all.\n\r",ch);
return;
}
max_lev = atoi(arg);
if (max_lev < 1 || max_lev > LEVEL_HERO)
{
sprintf(buf,"Levels must be between 1 and %d.\n\r",LEVEL_HERO);
send_to_char(buf,ch);
return;
}
if (argument[0] != '\0')
{
argument = one_argument(argument,arg);
if (!is_number(arg))
{
send_to_char("Arguments must be numerical or all.\n\r",ch);
return;
}
min_lev = max_lev;
max_lev = atoi(arg);
if (max_lev < 1 || max_lev > LEVEL_HERO)
{
sprintf(buf,"Levels must be between 1 and %d.\n\r",LEVEL_HERO);
send_to_char(buf,ch);
return;
}
if (min_lev > max_lev)
{
send_to_char("That would be silly.\n\r",ch);
return;
}
}
}
}
/* initialize data */
for (level = 0; level < LEVEL_HERO + 1; level++)
{
skill_columns[level] = 0;
skill_list[level][0] = '\0';
}
gn = group_lookup(cabal_table[ch->cabal].name);
for (gns = 0; gns < MAX_SKILL; gns++)
{
if (group_table[gn].spells[gns] == NULL )
break;
sn = skill_lookup(group_table[gn].spells[gns]);
if ((level = skill_table[sn].skill_level[ch->class]) < LEVEL_HERO + 1
&& level >= min_lev && level <= max_lev
&& ch->pcdata->learned[sn] > 0)
{
found = TRUE;
level = skill_table[sn].skill_level[ch->class];
if (ch->level < level) {
sprintf(buf,"%-18s n/a ", skill_table[sn].name);
} else {
sprintf(buf,"%-18s %3d%% ",skill_table[sn].name, ch->pcdata->learned[sn]);
}
if (skill_list[level][0] == '\0')
{
sprintf(skill_list[level],"\n\rLevel %2d: %s",level,buf);
} else /* append */ {
if ( ++skill_columns[level] % 2 == 0)
{
strcat(skill_list[level],"\n\r ");
}
strcat(skill_list[level],buf);
}
}
}
/* return results */
if (!found)
{
send_to_char("No powers found.\n\r",ch);
return;
}
buffer = new_buf();
for (level = 0; level < LEVEL_HERO + 1; level++)
{
if (skill_list[level][0] != '\0')
{
add_buf(buffer,skill_list[level]);
}
}
add_buf(buffer,"\n\r");
page_to_char(buf_string(buffer),ch);
free_buf(buffer);
return;
}
void spell_spiderhands( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
CHAR_DATA *victim = (CHAR_DATA *) vo;
AFFECT_DATA af;
if (is_affected(victim, sn))
{
if (victim == ch)
send_to_char("You is already affected by spiderhands.\n\r",ch);
else
act("$N is already affected by spiderhands.",ch,NULL,victim,TO_CHAR);
return;
}
init_affect(&af);
af.where = TO_AFFECTS;
af.type = sn;
af.aftype = AFT_POWER;
af.level = level;
af.duration = 10;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( victim, &af );
send_to_char( "Your hands are covered in a sticky coating.\n\r", victim );
if ( ch != victim )
act("$N's hands are covered in a sticky coating.",ch,NULL,victim,TO_CHAR);
return;
}
bool check_chargeset(CHAR_DATA *ch, CHAR_DATA *victim)
{
int chance;
OBJ_DATA *weapon;
if ((chance = get_skill(victim,gsn_chargeset)) == 0
|| victim->level < skill_table[gsn_chargeset].skill_level[ch->class])
return FALSE;
/* check if primary wielding a polearm */
weapon = get_eq_char(victim,WEAR_WIELD);
if (weapon == NULL)
{
return FALSE;
}
if ((weapon->value[0] != WEAPON_POLEARM && weapon->value[0] != WEAPON_STAFF && weapon->value[0] != WEAPON_SPEAR))
{
return FALSE;
}
/* determine ups/downs in chance */
if (!can_see(victim,ch))
chance -= 30;
chance += (victim->level - ch->level);
if (victim->position != POS_FIGHTING && IS_AWAKE(victim))
{
if (number_percent() < chance)
{
act("$n's attack is suddenly halted by the tip of $p!",ch,weapon,victim,TO_VICT);
act("Your attack is suddenly halted by the tip of $p!",ch,weapon,victim,TO_CHAR);
act("$n's attack is suddenly halted by the tip of $p!",ch,weapon,victim,TO_NOTVICT);
check_improve(victim,gsn_chargeset,TRUE,1);
one_hit(victim,ch,gsn_chargeset);
return TRUE;
}
act("Your $p fails to stop $n.",ch,weapon,victim,TO_VICT);
check_improve(victim,gsn_chargeset,FALSE,2);
}
return FALSE;
}
void do_headclap( CHAR_DATA *ch,char *argument)
{
AFFECT_DATA af;
CHAR_DATA *victim;
int chance;
char buf[MAX_STRING_LENGTH];
char arg[MAX_STRING_LENGTH];
OBJ_DATA *weapon;
one_argument (argument, arg);
if ((chance = get_skill(ch,gsn_headclap)) == 0)
{
send_to_char("You don't know how to headclap people.\n\r",ch);
return;
}
if (arg[0] == '\0')
{
victim = ch->fighting;
if (victim == NULL)
{
send_to_char("But you aren't fighting anyone.\n\r",ch);
return;
}
}
else if ((victim = get_char_room(ch,arg)) == NULL)
{
send_to_char("They aren't here.\n\r",ch);
return;
}
if (is_affected(victim,gsn_noheadclap))
{
send_to_char("They are guarding their ears to well.\n\r",ch);
return;
}
if (victim == ch)
{
send_to_char("You headclap yourself repeatedly to no avail.\n\r",ch);
return;
}
weapon = get_eq_char(ch,WEAR_WIELD);
if (weapon != NULL) {
send_to_char("You cannot headclap while wielding a weapon.\n\r",ch);
return;
}
if (is_safe(ch,victim))
return;
if (is_affected(victim,gsn_deafen))
{
send_to_char("Their ears are already deafened.\n\r",ch);
return;
}
chance += ch->level - victim->level;
chance += get_curr_stat(ch,STAT_STR);
chance -= get_curr_stat(victim,STAT_DEX);
if (is_affected(ch,skill_lookup("haste")))
chance += 10;
if (is_affected(victim,skill_lookup("haste")))
chance -= 10;
chance -= 45;
if (chance > 60) {
chance = 60;
}
if (ch->level == MAX_LEVEL) {
chance = 100;
}
if (!IS_NPC(victim) && (victim->fighting == NULL)) {
switch(number_range(0,1)) {
case (0):
sprintf(buf,"Help! %s is slapping my head!",PERS(ch,victim));
break;
case (1):
sprintf(buf,"Help! %s is boxing my ears!",PERS(ch,victim));
break;
}
do_myell(victim,buf);
}
act("You whirl your arms at $N, slamming your palms against $S head!",ch,0,victim,TO_CHAR);
act("$n whirls $s arms at $N, slamming $s palms against $S head!",ch,0,victim,TO_NOTVICT);
act("$n whirls $s arms at you, slamming $s palms against your head!",ch,0,victim,TO_VICT);
init_affect(&af);
af.where = TO_AFFECTS;
af.level = ch->level;
af.location = 0;
af.type = gsn_deafen;
af.duration = 4;
af.bitvector = 0;
af.modifier = 0;
if (number_percent() < chance)
{
one_hit(ch, victim, gsn_headclap);
act("$n appears deafened.",victim,0,0,TO_ROOM);
act("A loud ringing fills your ears... you can't hear anything!",victim,0,0,TO_CHAR);
init_affect(&af);
af.duration = 2;
affect_to_char(victim,&af);
af.where = TO_AFFECTS;
af.location = 0;
af.bitvector = 0;
af.type=gsn_noheadclap;
af.aftype = AFT_SKILL;
af.duration=10;
affect_to_char(victim,&af);
check_improve(ch,gsn_headclap,TRUE,2);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
return;
} else {
one_hit(ch, victim, gsn_headclap);
check_improve(ch,gsn_headclap,FALSE,3);
WAIT_STATE(ch,2*PULSE_VIOLENCE);
}
return;
}
void do_heroimm( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_STRING_LENGTH];
if (IS_NPC(ch))
return;
one_argument(argument,arg);
if (ch->level < MAX_LEVEL) {
return;
}
if (arg[0] == '\0')
{
send_to_char("Heroimm who?\n\r",ch);
return;
}
if ((victim = get_char_world(ch,arg)) == NULL) {
send_to_char("They aren't here.\n\r", ch);
return;
}
if (victim == ch) {
send_to_char("Uh, no?\n\r",ch);
return;
}
if (IS_HEROIMM(victim)) {
send_to_char("They are already a Hero Imm.\n\r", ch);
return;
}
SET_BIT(victim->act,PLR_HEROIMM);
SET_BIT(victim->act,PLR_HOLYLIGHT);
victim->max_hit = 10000;
victim->hit = victim->max_hit;
victim->max_mana = 10000;
victim->mana = victim->max_mana;
victim->max_move = 10000;
victim->move = victim->max_move;
send_to_char("They are now a Hero Immortal.\n\r", ch);
send_to_char("You are now a Hero Immortal.\n\r", victim);
return;
}
void check_eagle_eyes(CHAR_DATA *ch, CHAR_DATA *victim)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *gch;
int chance;
for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room )
{
if (gch == ch || gch == victim) {
continue;
}
if (!can_see(gch,ch)) {
continue;
}
chance = get_skill(gch,gsn_eagle_eyes);
if (chance == 0) {
continue;
}
if (number_percent() < chance)
{
sprintf(buf,"You notice %s slipping into %s's inventory.\n\r",PERS(ch,gch),PERS(victim,gch));
send_to_char(buf,gch);
check_improve(gch,gsn_eagle_eyes,TRUE,1);
}
}
return;
}
bool check_cutoff(CHAR_DATA *ch, CHAR_DATA *victim)
{
int chance;
OBJ_DATA *weapon;
if ((chance = get_skill(victim,gsn_cutoff)) == 0)
return FALSE;
/* check if primary wielding a polearm */
weapon = get_eq_char(victim,WEAR_WIELD);
if (weapon == NULL)
{
return FALSE;
}
if ((weapon->value[0] != WEAPON_POLEARM && weapon->value[0] != WEAPON_STAFF && weapon->value[0] != WEAPON_SPEAR))
{
return FALSE;
}
/* determine ups/downs in chance */
if (!can_see(victim,ch))
chance -= 30;
chance += (victim->level - ch->level);
if (chance > 65)
chance = 65;
if (number_percent() < chance)
{
act("$n's route of escape is cut off by $p.",ch,weapon,victim,TO_VICT);
act("Your route of escape is cut off by $p.",ch,weapon,victim,TO_CHAR);
act("$n's route of escape is cut off by $p.",ch,weapon,victim,TO_NOTVICT);
check_improve(victim,gsn_cutoff,TRUE,1);
return TRUE;
} else {
act("You fail to cut off $n's route of escape.",ch,weapon,victim,TO_VICT);
check_improve(victim,gsn_cutoff,FALSE,2);
return FALSE;
}
}
void report_cabal_items(CHAR_DATA *ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char pbuf[MAX_STRING_LENGTH];
CHAR_DATA *gch;
CHAR_DATA *guardian;
OBJ_DATA *obj;
OBJ_DATA *obj_next;
bool found;
bool afound;
int total=0;
if (strstr(argument,"which items") || strstr(argument,"Which items"))
{
if (ch->cabal == 0 && !IS_IMMORTAL(ch))
return;
found = FALSE;
afound = FALSE;
guardian = NULL;
for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room )
{
if (isCabalGuard(gch)) {
if (ch->cabal != gch->cabal && !IS_IMMORTAL(ch)) {
continue;
}
sprintf(buf,"I hold ");
for (obj = gch->carrying; obj != NULL; obj = obj_next )
{
obj_next = obj->next_content;
if ((obj->pIndexData->vnum) && isCabalItem(obj))
{
total++;
found = TRUE;
if (obj_next != NULL) {
sprintf(pbuf,"%s, ",obj->short_descr);
strcat(buf,pbuf);
} else {
if (total == 1) {
sprintf(pbuf,"%s.",obj->short_descr);
strcat(buf,pbuf);
} else {
sprintf(pbuf,"and %s.",obj->short_descr);
strcat(buf,pbuf);
}
}
}
}
guardian=gch;
if (!found) {
strcat(buf,"nothing.");
}
afound = TRUE;
}
}
if(afound && guardian!=NULL)
do_say(guardian,buf);
return;
}
guardian=NULL;
if (strstr(argument,"where is") || strstr(argument,"Where is"))
{
if (ch->cabal == 0 && !IS_IMMORTAL(ch))
return;
for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room )
{
if (isCabalGuard(gch)) {
if (ch->cabal == gch->cabal || IS_IMMORTAL(ch)) {
guardian=gch;
}
}
}
if(guardian==NULL)
return;
for (obj = object_list; obj != NULL; obj = obj_next)
{
obj_next = obj->next;
if ((obj->pIndexData->vnum) && obj->pIndexData->cabal>0 && obj->pIndexData->cabal==guardian->cabal && obj->carried_by!=NULL)
{
sprintf(pbuf,"%s is carried by %s.",obj->short_descr,IS_NPC(obj->carried_by) ? obj->carried_by->short_descr : obj->carried_by->name);
break;
}
}
if(guardian!=NULL && pbuf!=NULL && obj!=NULL)
do_say(guardian,pbuf);
}
}