/*************************************************************************** * 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. * ***************************************************************************/ /*************************************************************************** * God Wars Mud improvements copyright (C) 1994, 1995, 1996 by Richard * * Woolcock. This mud is NOT to be copied in whole or in part, or to be * * run without the permission of Richard Woolcock. Nobody else has * * permission to authorise the use of this code. * ***************************************************************************/ #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" /* * Local functions. */ void show_disc args( ( CHAR_DATA *ch ) ); void do_mindblast( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; int damage; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_AUSPEX) < 8) { send_to_char("You require level 8 Auspex to use a Mind Blast.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if ( arg[0] == '\0' ) { send_to_char( "Who do you want to Mind Blast?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (victim->position != POS_FIGHTING && victim->hit < victim->max_hit) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Mind Blast on you.",ch,NULL,victim,TO_VICT); } return; } if (IS_IMMUNE(victim,IMM_SHIELDED) ) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Mind Blast on you.",ch,NULL,victim,TO_VICT); } return; } if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Mind Blast on you.",ch,NULL,victim,TO_VICT); } return; } damage = victim->max_hit * 0.1; act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("You clutch your head as your mind seems to explode!\n\r",victim); act("$n clutches $s head in agony!",victim,NULL,NULL,TO_ROOM); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Mind Blast on you.",ch,NULL,victim,TO_VICT); } victim->hit -= damage; if ((IS_NPC(victim) && victim->hit < 1) || (!IS_NPC(victim) && victim->hit < -10)) { act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM); demon_gain(ch,victim); group_gain(ch,victim); victim->form = 8; killperson(ch,victim); WAIT_STATE( ch, 12 ); return; } stop_fighting(victim,TRUE); update_pos(victim); if (victim->position > POS_STUNNED) victim->position = POS_STUNNED; if (IS_NPC(victim)) do_kill(victim,ch->name); WAIT_STATE( ch, 12 ); return; } void do_willpower( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( IS_NPC(ch) ) return; if (arg[0] == '\0') { send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char(" -= Will Power =-\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); if (IS_WILLPOWER(ch, RES_ANIMALISM)) send_to_char("Animalism: You automatically try to resist Beast Within and Song of Serenity.\n\r",ch); else send_to_char("Animalism: You don't try to resist Beast Within and Song of Serenity.\n\r",ch); if (IS_WILLPOWER(ch, RES_AUSPEX)) send_to_char("Auspex: You automatically try to resist Unveil the Shrouded Mind.\n\r",ch); else send_to_char("Auspex: You don't try to resist Unveil the Shrouded Mind.\n\r",ch); if (IS_WILLPOWER(ch, RES_DOMINATE)) send_to_char("Dominate: You automatically try to resist Dominate attempts.\n\r",ch); else send_to_char("Dominate: You don't try to resist Dominate attempts.\n\r",ch); if (IS_WILLPOWER(ch, RES_PRESENCE)) send_to_char("Presence: You automatically try to resist Dread Gaze and Entrancement.\n\r",ch); else send_to_char("Presence: You don't try to resist Dread Gaze and Entrancement.\n\r",ch); if (IS_WILLPOWER(ch, RES_TOGGLE)) send_to_char("Toggle: You automatically keep burning willpower to resist attempts.\n\r",ch); else send_to_char("Toggle: You will only burn willpower to resist each first attempt.\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char("You may change any of the above by typing: willpower <value>\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char("Remaining resistance in seconds:\n\r", ch ); sprintf( buf,"Animalism: %d. Auspex: %d. Presence: %d. Dominate: %d.\n\r", ch->pcdata->resist[WILL_ANIMALISM], ch->pcdata->resist[WILL_AUSPEX], ch->pcdata->resist[WILL_PRESENCE], ch->pcdata->resist[WILL_DOMINATE]); send_to_char( buf, ch ); send_to_char("--------------------------------------------------------------------------------\n\r",ch); return; } if (!str_cmp(arg,"animalism")) { if (IS_WILLPOWER(ch, RES_ANIMALISM)) { send_to_char("You will no longer try to resist Beast Within and Song of Serenity.\n\r",ch); REMOVE_BIT(ch->pcdata->resist[0], RES_ANIMALISM); } else { send_to_char("You will now automatically try to resist Beast Within and Song of Serenity.\n\r",ch); SET_BIT(ch->pcdata->resist[0], RES_ANIMALISM); } } else if (!str_cmp(arg,"auspex")) { if (IS_WILLPOWER(ch, RES_AUSPEX)) { send_to_char("You will no longer try to resist Unveil the Shrouded Mind.\n\r",ch); REMOVE_BIT(ch->pcdata->resist[0], RES_AUSPEX); } else { send_to_char("You will now automatically try to resist Unveil the Shrouded Mind.\n\r",ch); SET_BIT(ch->pcdata->resist[0], RES_AUSPEX); } } else if (!str_cmp(arg,"dominate")) { if (IS_WILLPOWER(ch, RES_DOMINATE)) { send_to_char("You will no longer try to resist Domination attempts.\n\r",ch); REMOVE_BIT(ch->pcdata->resist[0], RES_DOMINATE); } else { send_to_char("You will now automatically try to resist Domination attempts.\n\r",ch); SET_BIT(ch->pcdata->resist[0], RES_DOMINATE); } } else if (!str_cmp(arg,"presence")) { if (IS_WILLPOWER(ch, RES_PRESENCE)) { send_to_char("You will no longer try to resist Dread Gaze and Entrancement.\n\r",ch); REMOVE_BIT(ch->pcdata->resist[0], RES_PRESENCE); } else { send_to_char("You will now automatically try to resist Dread Gaze and Entrancement.\n\r",ch); SET_BIT(ch->pcdata->resist[0], RES_PRESENCE); } } else if (!str_cmp(arg,"toggle")) { if (IS_WILLPOWER(ch, RES_TOGGLE)) { send_to_char("You will now only burn willpower to resist each first attempt.\n\r",ch); REMOVE_BIT(ch->pcdata->resist[0], RES_TOGGLE); } else { send_to_char("You will now automatically keep burning willpower to resist attempts.\n\r",ch); SET_BIT(ch->pcdata->resist[0], RES_TOGGLE); } } else { send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char(" -= Will Power =-\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); if (IS_WILLPOWER(ch, RES_ANIMALISM)) send_to_char("Animalism: You automatically try to resist Beast Within and Song of Serenity.\n\r",ch); else send_to_char("Animalism: You don't try to resist Beast Within and Song of Serenity.\n\r",ch); if (IS_WILLPOWER(ch, RES_AUSPEX)) send_to_char("Auspex: You automatically try to resist Unveil the Shrouded Mind.\n\r",ch); else send_to_char("Auspex: You don't try to resist Unveil the Shrouded Mind.\n\r",ch); if (IS_WILLPOWER(ch, RES_DOMINATE)) send_to_char("Dominate: You automatically try to resist Dominate attempts.\n\r",ch); else send_to_char("Dominate: You don't try to resist Dominate attempts.\n\r",ch); if (IS_WILLPOWER(ch, RES_PRESENCE)) send_to_char("Presence: You automatically try to resist Dread Gaze and Entrancement.\n\r",ch); else send_to_char("Presence: You don't try to resist Dread Gaze and Entrancement.\n\r",ch); if (IS_WILLPOWER(ch, RES_TOGGLE)) send_to_char("Toggle: You automatically keep burning willpower to resist attempts.\n\r",ch); else send_to_char("Toggle: You will only burn willpower to resist each first attempt.\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char("You may change any of the above by typing: willpower <value>\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char("Remaining resistance in seconds:\n\r", ch ); sprintf( buf,"Animalism: %d. Auspex: %d. Presence: %d. Dominate: %d.\n\r", ch->pcdata->resist[WILL_ANIMALISM], ch->pcdata->resist[WILL_AUSPEX], ch->pcdata->resist[WILL_PRESENCE], ch->pcdata->resist[WILL_DOMINATE]); send_to_char( buf, ch ); send_to_char("--------------------------------------------------------------------------------\n\r",ch); return; } return; } void do_changeling( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_VICISSITUDE) < 1) { send_to_char("You require level 1 Vicissitude to use Changeling.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Change to look like whom?\n\r", ch ); return; } if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "Not while polymorphed.\n\r", ch ); return; } if (IS_POLYAFF(ch,POLY_ZULO)) { send_to_char( "Not while in Zulo Form.\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(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if ( IS_IMMORTAL(victim) && victim != ch ) { send_to_char( "You can only change to look like avatars or lower.\n\r", ch ); return; } if (victim->sex != ch->sex) { send_to_char( "You can only change to look like people of the same sex as you.\n\r", ch ); return; } if ( ch == victim ) { if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "You already look like yourself!\n\r", ch ); return; } if (!IS_POLYAFF(ch, POLY_CHANGELING)) { send_to_char( "Nothing happens.\n\r", ch ); return; } sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name); act(buf,ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->polyaff, POLY_CHANGELING); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->vampaff, VAM_DISGUISED); REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE); free_string( ch->morph ); ch->morph = str_dup( "" ); act("Your features twist and distort until you looks like $n.",ch,NULL,NULL,TO_CHAR); return; } if (IS_VAMPAFF(ch,VAM_DISGUISED)) { if (!IS_POLYAFF(ch, POLY_CHANGELING)) { send_to_char( "Nothing happens.\n\r", ch ); return; } act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR); act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT); act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT); free_string( ch->morph ); ch->morph = str_dup( victim->name ); return; } act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR); act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT); act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT); SET_BIT(ch->polyaff, POLY_CHANGELING); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->vampaff, VAM_DISGUISED); SET_BIT(ch->extra, EXTRA_VICISSITUDE); free_string( ch->morph ); ch->morph = str_dup( victim->name ); return; } void do_fleshcraft( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg1 [MAX_INPUT_LENGTH]; char arg2 [MAX_INPUT_LENGTH]; char arg3 [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; one_argument( argument, arg1 ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_VICISSITUDE) < 2) { send_to_char("You require level 2 Vicissitude to use Fleshcraft.\n\r",ch); return; } if ( arg1[0] == '\0' ) { send_to_char( "Change to look like whom?\n\r", ch ); return; } if (!str_cmp(arg1,"mod") || !str_cmp(arg1,"modify")) { argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0') { send_to_char("Syntax: Fleshcraft Modify <target> <modification>\n\r",ch); return; } if ( ( victim = get_char_room( ch, arg2 ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (IS_NPC(victim)) { send_to_char( "You cannot fleshcraft an unwilling person.\n\r", ch ); return; } if (IS_MAGE(victim)) { send_to_char( "You cannot fleshcraft Mages.\n\r", ch ); return; } if (IS_WEREWOLF(victim)) { send_to_char( "You cannot fleshcraft Werewolfs.\n\r", ch ); return; } if (!IS_IMMUNE(victim,IMM_VAMPIRE) && ch != victim) { send_to_char( "You cannot fleshcraft an unwilling person.\n\r", ch ); return; } if (!str_cmp(arg3,"fins")) { if (IS_MOD(victim, MOD_FINS)) { if (ch == victim) { send_to_char("You push your fins back into your body!\n\r",ch); act("$n pushes $s fins back into $s body!",ch,NULL,NULL,TO_ROOM); } else { act("You push $N's fins back into $S body!",ch,NULL,victim,TO_CHAR); act("$n pushes your fins back into your body!",ch,NULL,victim,TO_VICT); act("$n pushes $N's fins back into $S body!",ch,NULL,victim,TO_NOTVICT); } REMOVE_BIT(victim->pcdata->bodymods, MOD_FINS); } else { if (ch == victim) { send_to_char("You pull a pair of fins out of your body!\n\r",ch); act("$n pulls a pair of fins out of $s body!",ch,NULL,NULL,TO_ROOM); } else { act("You pull a pair of fins out of $N's body!",ch,NULL,victim,TO_CHAR); act("$n pulls a pair of fins out of your body!",ch,NULL,victim,TO_VICT); act("$n pulls a pair of fins out of $N's body!",ch,NULL,victim,TO_NOTVICT); } SET_BIT(victim->pcdata->bodymods, MOD_FINS); } } else if (!str_cmp(arg3,"tail")) { if (IS_MOD(victim, MOD_TAIL)) { if (ch == victim) { send_to_char("You push your tail back into your body!\n\r",ch); act("$n pushes $s tail back into $s body!",ch,NULL,NULL,TO_ROOM); } else { act("You push $N's tail back into $S body!",ch,NULL,victim,TO_CHAR); act("$n pushes your tail back into your body!",ch,NULL,victim,TO_VICT); act("$n pushes $N's tail back into $S body!",ch,NULL,victim,TO_NOTVICT); } REMOVE_BIT(victim->pcdata->bodymods, MOD_TAIL); } else { if (ch == victim) { send_to_char("You pull a tail out of your backside!\n\r",ch); act("$n pulls a tail out of $s backside!",ch,NULL,NULL,TO_ROOM); } else { act("You pull a tail out of $N's backside!",ch,NULL,victim,TO_CHAR); act("$n pulls a tail out of your backside!",ch,NULL,victim,TO_VICT); act("$n pulls a tail out of $N's backside!",ch,NULL,victim,TO_NOTVICT); } SET_BIT(victim->pcdata->bodymods, MOD_TAIL); } } else if (!str_cmp(arg3,"wings")) { if (IS_MOD(victim, MOD_WINGS)) { if (IS_MOD(victim, MOD_UNFOLDED)) do_wings(victim,""); if (ch == victim) { send_to_char("You push your wings back into your shoulders!\n\r",ch); act("$n pushes $s wings back into $s shoulders!",ch,NULL,NULL,TO_ROOM); } else { act("You push $N's wings back into $S shoulders!",ch,NULL,victim,TO_CHAR); act("$n pushes your wings back into your shoulders!",ch,NULL,victim,TO_VICT); act("$n pushes $N's wings back into $S shoulders!",ch,NULL,victim,TO_NOTVICT); } REMOVE_BIT(victim->pcdata->bodymods, MOD_WINGS); } else { if (ch == victim) { send_to_char("You pull a pair of wings out of your shoulders!\n\r",ch); act("$n pulls a pair of wings out of $s shoulders!",ch,NULL,NULL,TO_ROOM); } else { act("You pull a pair of wings out of $N's shoulders!",ch,NULL,victim,TO_CHAR); act("$n pulls a pair of wings out of your shoulders!",ch,NULL,victim,TO_VICT); act("$n pulls a pair of wings out of $N's shoulders!",ch,NULL,victim,TO_NOTVICT); } SET_BIT(victim->pcdata->bodymods, MOD_WINGS); } } else send_to_char( "You cannot do that.\n\r", ch ); return; } if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "Not while polymorphed.\n\r", ch ); return; } if (IS_POLYAFF(ch,POLY_ZULO)) { send_to_char( "Not while in Zulo Form.\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg1 ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_IMMORTAL(victim) && victim != ch ) { send_to_char( "You cannot disguise yourself as them.\n\r", ch ); return; } if ( ch == victim ) { if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "You already look like yourself!\n\r", ch ); return; } if (!IS_POLYAFF(ch, POLY_FLESHCRAFT)) { send_to_char( "Nothing happens.\n\r", ch ); return; } sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name); act(buf,ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->polyaff, POLY_FLESHCRAFT); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->vampaff, VAM_DISGUISED); REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE); free_string( ch->morph ); ch->morph = str_dup( "" ); act("Your features twist and distort until you looks like $n.",ch,NULL,NULL,TO_CHAR); free_string( ch->long_descr ); ch->long_descr = str_dup( "" ); return; } if (IS_VAMPAFF(ch,VAM_DISGUISED)) { if (!IS_POLYAFF(ch, POLY_FLESHCRAFT)) { send_to_char( "Nothing happens.\n\r", ch ); return; } act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR); act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT); act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT); free_string( ch->morph ); if (IS_NPC(victim)) { ch->morph = str_dup( victim->short_descr ); free_string( ch->long_descr ); ch->long_descr = str_dup( victim->long_descr ); } else { ch->morph = str_dup( victim->name ); free_string( ch->long_descr ); ch->long_descr = str_dup( "" ); } return; } act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR); act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT); act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT); SET_BIT(ch->polyaff, POLY_FLESHCRAFT); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->vampaff, VAM_DISGUISED); SET_BIT(ch->extra, EXTRA_VICISSITUDE); free_string( ch->morph ); if (IS_NPC(victim)) { ch->morph = str_dup( victim->short_descr ); free_string( ch->long_descr ); ch->long_descr = str_dup( victim->long_descr ); } else { ch->morph = str_dup( victim->name ); free_string( ch->long_descr ); ch->long_descr = str_dup( "" ); } return; } void do_bonecraft( CHAR_DATA *ch, char *argument ) { char buf [MAX_STRING_LENGTH]; char arg1 [MAX_INPUT_LENGTH]; char arg2 [MAX_INPUT_LENGTH]; char arg3 [MAX_INPUT_LENGTH]; CHAR_DATA *victim; if (IS_NPC(ch)) return; one_argument( argument, arg1 ); smash_tilde(argument); if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_VICISSITUDE) < 3) { send_to_char("You require level 3 Vicissitude to use Bonecraft.\n\r",ch); return; } if ( argument[0] == '\0' || arg1[0] == '\0' ) { send_to_char( "Change to look like whom?\n\r", ch ); return; } if (!str_cmp(arg1,"mod") || !str_cmp(arg1,"modify")) { argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0') { send_to_char("Syntax: Bonecraft Modify <target> <modification>\n\r",ch); return; } if ( ( victim = get_char_room( ch, arg2 ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (IS_NPC(victim)) { send_to_char( "You cannot bonecraft an unwilling person.\n\r", ch ); return; } if (IS_MAGE(victim)) { send_to_char( "You cannot fleshcraft Mages.\n\r", ch ); return; } if (IS_WEREWOLF(victim)) { send_to_char( "You cannot fleshcraft Werewolfs.\n\r", ch ); return; } if (!IS_IMMUNE(victim,IMM_VAMPIRE) && ch != victim) { send_to_char( "You cannot bonecraft an unwilling person.\n\r", ch ); return; } if (!str_cmp(arg3,"tusks")) { if (IS_MOD(victim, MOD_TUSKS)) { if (ch == victim) { send_to_char("You push your tusks back into your jaw bone!\n\r",ch); act("$n pushes $s tusks back $s jaw bone!",ch,NULL,NULL,TO_ROOM); } else { act("You push $N's tusks back into $S jaw bone!",ch,NULL,victim,TO_CHAR); act("$n pushes your tusks back into your jaw bone!",ch,NULL,victim,TO_VICT); act("$n pushes $N's tusks back into $S jaw bone!",ch,NULL,victim,TO_NOTVICT); } REMOVE_BIT(victim->pcdata->bodymods, MOD_TUSKS); } else { if (ch == victim) { send_to_char("You pull a pair of tusks out of your jaw bone!\n\r",ch); act("$n pulls a pair of tusks out of $s jaw bone!",ch,NULL,NULL,TO_ROOM); } else { act("You pull a pair of tusks out of $N's jaw bone!",ch,NULL,victim,TO_CHAR); act("$n pulls a pair of tusks out of your jaw bone!",ch,NULL,victim,TO_VICT); act("$n pulls a pair of tusks out of $N's jaw bone!",ch,NULL,victim,TO_NOTVICT); } SET_BIT(victim->pcdata->bodymods, MOD_TUSKS); } } else if (!str_cmp(arg3,"horns")) { if (IS_MOD(victim, MOD_HORNS)) { if (ch == victim) { send_to_char("You push your horns back into the bone of your skull!\n\r",ch); act("$n pushes $s horns back into the bone of $s skull!",ch,NULL,NULL,TO_ROOM); } else { act("You push $N's horns back into the bone of $S skull!",ch,NULL,victim,TO_CHAR); act("$n pushes your horns back into the bone of your skull!",ch,NULL,victim,TO_VICT); act("$n pushes $N's horns back into the bone of $S skull!",ch,NULL,victim,TO_NOTVICT); } REMOVE_BIT(victim->pcdata->bodymods, MOD_HORNS); } else { if (ch == victim) { send_to_char("You pull a pair of horns out of the bone of your skull!\n\r",ch); act("$n pulls a pair of horns out of the bone of $s skull!",ch,NULL,NULL,TO_ROOM); } else { act("You pull a pair of horns out of the bone of $N's skull!",ch,NULL,victim,TO_CHAR); act("$n pulls a pair of horns out of the bone of your skull!",ch,NULL,victim,TO_VICT); act("$n pulls a pair of horns out of the bone of $N's skull!",ch,NULL,victim,TO_NOTVICT); } SET_BIT(victim->pcdata->bodymods, MOD_HORNS); } } else if (!str_cmp(arg3,"exoskeleton")) { if (IS_MOD(victim, MOD_EXOSKELETON)) { if (ch == victim) { send_to_char("You push your exoskeleton back under your skin!\n\r",ch); act("$n pushes $s exoskeleton back under $s skin!",ch,NULL,NULL,TO_ROOM); } else { act("You push $N's exoskeleton back under $S skin!",ch,NULL,victim,TO_CHAR); act("$n pushes your exoskeleton back under your skin!",ch,NULL,victim,TO_VICT); act("$n pushes $N's exoskeleton back under $S skin!",ch,NULL,victim,TO_NOTVICT); } REMOVE_BIT(victim->pcdata->bodymods, MOD_EXOSKELETON); } else { if (ch == victim) { send_to_char("You pull out an exoskeleton from under your skin!\n\r",ch); act("$n pulls out an exoskeleton from under $s skin!",ch,NULL,NULL,TO_ROOM); } else { act("You pull out an exoskeleton from under $N's skin!",ch,NULL,victim,TO_CHAR); act("$n pulls out an exoskeleton from under your skin!",ch,NULL,victim,TO_VICT); act("$n pulls out an exoskeleton from under $N's skin!",ch,NULL,victim,TO_NOTVICT); } SET_BIT(victim->pcdata->bodymods, MOD_EXOSKELETON); } } else send_to_char( "You cannot do that.\n\r", ch ); return; } if ( strlen(argument) > 20 ) { send_to_char( "Please limit your name to 20 characters or less.\n\r", ch ); return; } if ( str_cmp(argument,"self") && !check_parse_name( argument ) ) { send_to_char( "Illegal name.\n\r", ch ); return; } if (is_in(argument,"|Morglum*Rox*Alucard*Ryana*")) { send_to_char( "Illegal name.\n\r", ch ); return; } if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "Not while polymorphed.\n\r", ch ); return; } if (IS_POLYAFF(ch,POLY_ZULO)) { send_to_char( "Not while in Zulo Form.\n\r", ch ); return; } if ( !str_cmp(argument,ch->name) || !str_cmp(argument,"self") ) { if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "You already look like yourself!\n\r", ch ); return; } if (!IS_POLYAFF(ch, POLY_BONECRAFT)) { send_to_char( "Nothing happens.\n\r", ch ); return; } sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name); act(buf,ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->polyaff, POLY_BONECRAFT); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->vampaff, VAM_DISGUISED); REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE); free_string( ch->morph ); ch->morph = str_dup( "" ); act("Your features twist and distort until you look like $n.",ch,NULL,NULL,TO_CHAR); return; } if (IS_VAMPAFF(ch,VAM_DISGUISED)) { if (!IS_POLYAFF(ch, POLY_BONECRAFT)) { send_to_char( "Nothing happens.\n\r", ch ); return; } sprintf(buf,"Your features twist and distort until you look like %s.\n\r",argument); send_to_char(buf,ch); sprintf(buf,"$n's features twist and distort until $e looks like %s.",argument); act(buf,ch,NULL,NULL,TO_ROOM); free_string( ch->morph ); ch->morph = str_dup( argument ); return; } sprintf(buf,"Your features twist and distort until you look like %s.\n\r",argument); send_to_char(buf,ch); sprintf(buf,"$n's features twist and distort until $e looks like %s.",argument); act(buf,ch,NULL,NULL,TO_ROOM); SET_BIT(ch->polyaff, POLY_BONECRAFT); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->vampaff, VAM_DISGUISED); SET_BIT(ch->extra, EXTRA_VICISSITUDE); free_string( ch->morph ); ch->morph = str_dup( argument ); return; } DO_COM( do_zuloform ) { if (IS_NPC(ch)) return; if (get_disc(ch,DISC_VICISSITUDE) < 5 && get_tribe(ch,TRIBE_FIANNA) < 5) { STC( "Huh?\n\r", ch ); return; } if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "Not while polymorphed.\n\r", ch ); return; } if (IS_POLYAFF(ch,POLY_ZULO)) { if (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN)) ch->morph = str_dup("a huge werewolf"); else if (IS_BAALI(ch) && IS_POLYAFF(ch, POLY_ZULO)) ch->morph = str_dup("A great demonic beast"); if (IS_WEREWOLF(ch) && IS_SET(ch->act, PLR_WOLFMAN)) ch->morph = str_dup("A huge werewolf"); else { FILL_STRING( ch->morph, "" ); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->vampaff, VAM_DISGUISED); REMOVE_BIT(ch->vampaff, VAM_CLAWS); } REMOVE_BIT(ch->vampaff, VAM_NIGHTSIGHT); REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE); REMOVE_BIT(ch->polyaff, POLY_ZULO); send_to_char("Your body shrinks and distorts back to its normal form.\n\r",ch); if (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN)) act("An enormous black hairy monster's body shrinks and distorts into the form of $n.",ch,NULL,NULL,TO_ROOM); if (IS_BAALI(ch) && IS_POLYAFF(ch, POLY_ZULO)) act("A hideous monstrosity shrinks and distorts into the form of $n.",ch,NULL,NULL,TO_ROOM); else if (IS_WEREWOLF(ch) && IS_SET(ch->act, PLR_WOLFMAN)) act("A gigantic furry werewolf's body shrinks into the form of $n.",ch,NULL,NULL,TO_ROOM); else if (IS_WEREWOLF(ch)) act("A giant's body shrinks into the form of $n.",ch,NULL,NULL,TO_ROOM); else act("A huge black monster's body shrinks and distorts into the form of $n.",ch,NULL,NULL,TO_ROOM); return; } if (ch->mounted == IS_RIDING) do_dismount(ch,""); if (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN)) { send_to_char("Your body grows and distorts into an enormous black hairy monster.\n\r",ch); act("$n's body grows and distorts into an enormous black hairy monster.",ch,NULL,NULL,TO_ROOM); } else if (IS_BAALI(ch) && IS_POLYAFF(ch, POLY_ZULO)) { send_to_char("Your body grows and distorts into a hideous monstrosity.\n\r",ch); act("$n's body grows and distorts into a hideous monstrosity.",ch,NULL,NULL,TO_ROOM); } else if ( IS_WEREWOLF(ch) && IS_SET(ch->act, PLR_WOLFMAN)) { send_to_char("Your body grows into a gigantic furry werewolf.\n\r", ch ); act("$n's body grows into a gigantic furry werewolf.",ch,NULL,NULL,TO_ROOM); } else if ( IS_WEREWOLF( ch ) ) { send_to_char("Your body grows into a giant.\n\r", ch ); act("$n's body grows into a giant.",ch,NULL,NULL,TO_ROOM); } else { send_to_char("Your body grows and distorts into a huge black monster.\n\r",ch); act("$n's body grows and distorts into a huge black monster.",ch,NULL,NULL,TO_ROOM); } SET_BIT(ch->vampaff, VAM_CLAWS); SET_BIT(ch->vampaff, VAM_NIGHTSIGHT); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->vampaff, VAM_DISGUISED); SET_BIT(ch->extra, EXTRA_VICISSITUDE); SET_BIT(ch->polyaff, POLY_ZULO); if (IS_ABOMINATION(ch) && IS_SET(ch->act, PLR_WOLFMAN)) ch->morph = str_dup("an enormous black hairy monster"); else if (IS_WEREWOLF(ch) && IS_SET(ch->act, PLR_WOLFMAN)) ch->morph = str_dup("A gigantic furry werewolf"); else if (IS_WEREWOLF(ch)) ch->morph = str_dup("A giant"); else ch->morph = str_dup("A huge black monster"); return; } void do_plasmaform( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; if (IS_NPC(ch)) return; if ((!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) || IS_HEAD(ch, LOST_HEAD)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_VICISSITUDE) < 4) { send_to_char("You require level 4 Vicissitude to change into Plasma Form.\n\r",ch); return; } if (!IS_MORE(ch, MORE_PLASMA) && IS_AFFECTED(ch,AFF_POLYMORPH)) { send_to_char("Not from this form.\n\r",ch); return; } if ( ( obj = ch->pcdata->chobj ) != NULL && IS_EXTRA(ch, EXTRA_OSWITCH)) { ch->pcdata->obj_vnum = 0; obj->chobj = NULL; ch->pcdata->chobj = NULL; REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->extra, EXTRA_OSWITCH); REMOVE_BIT(ch->more, MORE_PLASMA); free_string(ch->morph); ch->morph = str_dup(""); act("$p transforms into $n.",ch,obj,NULL,TO_ROOM); act("Your reform your human body.",ch,obj,NULL,TO_CHAR); extract_obj(obj); if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT) { char_from_room(ch); char_to_room(ch,get_room_index(ROOM_VNUM_ALTAR)); } return; } if (IS_AFFECTED(ch,AFF_POLYMORPH)) { send_to_char( "You cannot do this while polymorphed.\n\r", ch); return; } if ((obj = create_object(get_obj_index(OBJ_VNUM_SPILT_BLOOD),0)) == NULL) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } if (ch->mounted == IS_RIDING) do_dismount(ch,""); obj_to_room(obj,ch->in_room); SET_BIT(obj->quest, QUEST_VANISH); act("$n transforms into $p and splashes to the ground.",ch,obj,NULL,TO_ROOM); act("You transform into $p and splash to the ground.",ch,obj,NULL,TO_CHAR); if (IS_EXTRA(ch, TIED_UP)) { act("The ropes binding you fall through your liquid form.",ch,NULL,NULL,TO_CHAR); act("The ropes binding $n fall through $s liquid form.",ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->extra, TIED_UP); REMOVE_BIT(ch->extra, GAGGED); REMOVE_BIT(ch->extra, BLINDFOLDED); } if (is_affected(ch, gsn_web)) { act("The webbing entrapping $n falls through $s liquid form.",ch,NULL,NULL,TO_ROOM); send_to_char("The webbing entrapping you falls through your liquid form.\n\r",ch); affect_strip(ch, gsn_web); } if (IS_AFFECTED(ch, AFF_WEBBED)) { act("The webbing entrapping $n falls through $s liquid form.",ch,NULL,NULL,TO_ROOM); send_to_char("The webbing entrapping you falls through your liquid form.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_WEBBED); } if (is_affected(ch, gsn_tendrils)) { act("The tendrils of darkness entrapping $n fall through $s liquid form.",ch,NULL,NULL,TO_ROOM); send_to_char("The tendrils of darkness entrapping you fall through your liquid form.\n\r",ch); affect_strip(ch, gsn_tendrils); } if (IS_AFFECTED(ch, AFF_SHADOW)) { act("The tendrils of darkness entrapping $n fall through $s liquid form.",ch,NULL,NULL,TO_ROOM); send_to_char("The tendrils of darkness entrapping you fall through your liquid form.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_SHADOW); } if (is_affected(ch, gsn_jail)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); affect_strip(ch, gsn_jail); } if (IS_AFFECTED(ch, AFF_JAIL)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_JAIL); } ch->pcdata->obj_vnum = OBJ_VNUM_SPILT_BLOOD; obj->chobj = ch; ch->pcdata->chobj = obj; SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->extra, EXTRA_OSWITCH); SET_BIT(ch->more, MORE_PLASMA); free_string(ch->morph); ch->morph = str_dup(obj->short_descr); return; } void do_portal( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; OBJ_DATA *obj; char arg [MAX_INPUT_LENGTH]; int duration; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && (!IS_DEMON(ch) || IS_ANGEL(ch))) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_DAIMOINON) < 3) { send_to_char("You require level 3 Daimoinon to create an Infernal Portal.\n\r",ch); return; } if ( arg[0] == '\0') { send_to_char( "Who do you wish to create a portal to?\n\r", ch ); return; } victim = get_char_world( ch, arg ); if ( ( victim = get_char_world( ch, arg ) ) == NULL || victim == ch || victim->in_room == NULL || ch->in_room == NULL || IS_NPC(victim) ) { send_to_char( "You failed.\n\r", ch ); return; } if ( !IS_IMMUNE(victim, IMM_SUMMON) || IS_SET(ch->in_room->room_flags, ROOM_PRIVATE) || IS_SET(ch->in_room->room_flags, ROOM_SOLITARY) || IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || 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->in_room->vnum == ch->in_room->vnum) { send_to_char( "You failed.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to create an Infernal Portal to you.",ch,NULL,victim,TO_VICT); } return; } duration = number_range(2,3) * 15; obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->value[0] = victim->in_room->vnum; obj->value[3] = ch->in_room->vnum; obj->timer = duration; free_string(obj->short_descr); obj->short_descr = str_dup("an infernal portal"); free_string(obj->description); obj->description = str_dup("An infernal portal of burning flames floats here."); if (IS_AFFECTED(ch,AFF_SHADOWPLANE)) obj->extra_flags = ITEM_SHADOWPLANE; obj_to_room( obj, ch->in_room ); obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->value[0] = ch->in_room->vnum; obj->value[3] = victim->in_room->vnum; obj->timer = duration; free_string(obj->short_descr); obj->short_descr = str_dup("an infernal portal"); free_string(obj->description); obj->description = str_dup("An infernal portal of burning flames floats here."); if (IS_AFFECTED(victim,AFF_SHADOWPLANE)) obj->extra_flags = ITEM_SHADOWPLANE; obj_to_room( obj, victim->in_room ); act( "$p bursts from the ground in front of $n.", ch, obj, NULL, TO_ROOM ); act( "$p bursts from the ground appears in front of you.", ch, obj, NULL, TO_CHAR ); act( "$p bursts from the ground appears in front of $n.", victim, obj, NULL, TO_ROOM ); act( "$p bursts from the ground appears in front of you.", ch, obj, victim, TO_VICT ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just created an Infernal Portal to you.",ch,NULL,victim,TO_VICT); } return; } void do_soultwist( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; int damage; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && (!IS_DEMON(ch) || IS_ANGEL(ch))) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_DAIMOINON) < 5) { send_to_char("You require level 5 Daimoinon to use Soul Twist.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if ( arg[0] == '\0' ) { send_to_char( "Who do you wish to use Soul Twist on?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if ( ch == victim ) { send_to_char( "Your soul isn't yours to destroy!\n\r", ch ); return; } if ( is_safe(ch, victim) ) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Soul Twist on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_EVIL(ch)) { send_to_char( "You are not evil enough to use Soul Twist.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Soul Twist on you.",ch,NULL,victim,TO_VICT); } return; } if (victim->alignment < 1) { send_to_char( "They are not good enough to use Soul Twist on.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Soul Twist on you.",ch,NULL,victim,TO_VICT); } return; } damage = victim->alignment; act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("You scream in agony as your very soul seems to be torn apart!\n\r",victim); act("$n clutches $s chest and screams in agony!",victim,NULL,NULL,TO_ROOM); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Soul Twist on you.",ch,NULL,victim,TO_VICT); } victim->hit -= damage; if ((IS_NPC(victim) && victim->hit < 1) || (!IS_NPC(victim) && victim->hit < -10)) { act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM); demon_gain(ch,victim); group_gain(ch,victim); victim->form = 9; killperson(ch,victim); WAIT_STATE( ch, 12 ); return; } update_pos(victim); if (IS_NPC(victim)) do_kill(victim,ch->name); WAIT_STATE( ch, 12 ); return; } void do_curse( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; OBJ_DATA *obj; char arg [MAX_INPUT_LENGTH]; int critical = number_range(1,4); argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && (!IS_DEMON(ch) || IS_ANGEL(ch))) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_DAIMOINON) < 4) { send_to_char("You require level 4 Daimoinon to use Curse.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if ( arg[0] == '\0' ) { send_to_char( "Who do you wish to curse?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (ch == victim) { send_to_char( "Now that would be really silly...\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); WAIT_STATE( ch, 12 ); if ( is_safe(ch, victim) ) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT); } return; } if (number_percent() > (14 - ch->vampgen)*get_disc(ch,DISC_DAIMOINON)) { send_to_char("Nothing happens.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT); } return; } if (critical == 1) { if (IS_ARM_L(victim,LOST_ARM)) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT); } return; } SET_BIT(victim->loc_hp[2],LOST_ARM); if (IS_BLEEDING(victim,BLEEDING_HAND_L)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L); send_to_char("Your scream in agony as your left arm falls off!\n\r",victim); act("$n screams in agony as $s left arm falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"arm"); if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM)) { if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_HOLD )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_WRIST_L )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_FINGER_L )) != NULL) take_item(victim,obj); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Curse on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); return; } else if (critical == 2) { if (IS_ARM_R(victim,LOST_ARM)) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT); } return; } SET_BIT(victim->loc_hp[3],LOST_ARM); if (IS_BLEEDING(victim,BLEEDING_HAND_R)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R); send_to_char("Your scream in agony as your right arm falls off!\n\r",victim); act("$n screams in agony as $s right arm falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"arm"); if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM)) { if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_WIELD )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_WRIST_R )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_FINGER_R )) != NULL) take_item(victim,obj); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Curse on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); return; } else if (critical == 3) { if (IS_LEG_L(victim,LOST_LEG)) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT); } return; } SET_BIT(victim->loc_hp[4],LOST_LEG); if (IS_BLEEDING(victim,BLEEDING_FOOT_L)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L); send_to_char("Your scream in agony as your left leg falls off!\n\r",victim); act("$n screams in agony as $s left leg falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"leg"); if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG)) { if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL) take_item(victim,obj); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Curse on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); return; } else if (critical == 4) { if (IS_LEG_R(victim,LOST_LEG)) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT); } return; } SET_BIT(victim->loc_hp[5],LOST_LEG); if (IS_BLEEDING(victim,BLEEDING_FOOT_R)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R); send_to_char("Your scream in agony as your right leg falls off!\n\r",victim); act("$n screams in agony as $s right leg falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"leg"); if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG)) { if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL) take_item(victim,obj); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Curse on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); return; } send_to_char("Nothing happens.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Curse on you.",ch,NULL,victim,TO_VICT); } return; } void do_conditioning( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_DOMINATE) < 2) { send_to_char("You require level 2 Dominate to use Conditioning.\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( "You can't condition yourself!\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if (is_safe(ch,victim)) return; if (IS_ITEMAFF(victim, ITEMA_SHADES) || IS_ITEMAFF(ch, ITEMA_SHADES) || !can_see(victim,ch)) { if (!IS_SET(ch->act,PLR_HOLYLIGHT) && get_disc(ch,DISC_DOMINATE) < 6) { send_to_char( "You are unable to make eye contact with them.\n\r", ch ); return; } } act("You stare deeply into $N's eyes.",ch,NULL,victim,TO_CHAR); act("$n stares deeply into $N's eyes.",ch,NULL,victim,TO_NOTVICT); act("$n stares deeply into your eyes.",ch,NULL,victim,TO_VICT); if (strlen(victim->pcdata->conding) > 2 && !str_cmp(victim->pcdata->conding,ch->name)) { free_string(victim->pcdata->conding); victim->pcdata->conding = str_dup( "" ); REMOVE_BIT(victim->more, MORE_LOYAL); act("You remove $N's conditioning.",ch,NULL,victim,TO_CHAR); act("$n removes your conditioning.",ch,NULL,victim,TO_VICT); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Conditioning on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && IS_VAMPIRE(victim) && victim->vampgen < ch->vampgen) { act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT); act("$s mind is too strong to overcome.",victim,NULL,ch,TO_VICT); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Conditioning on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && victim->pcdata->resist[WILL_DOMINATE] > 0) { act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Conditioning on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && ((victim->pcdata->willpower[0] >= 2 && IS_MORE(victim, MORE_LOYAL)) || victim->pcdata->willpower[0] >= 5) && strlen(victim->pcdata->conding) > 1) { if (IS_MORE(victim, MORE_LOYAL)) victim->pcdata->willpower[0] -= 2; else victim->pcdata->willpower[0] -= 5; victim->pcdata->resist[WILL_DOMINATE] = 60; send_to_char("You burn some willpower to resist Conditioning.\n\r",victim); act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Conditioning on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && IS_WILLPOWER(victim, RES_DOMINATE) && victim->pcdata->willpower[0] >= 10) { victim->pcdata->willpower[0] -= 10; victim->pcdata->resist[WILL_DOMINATE] = 60; if (!IS_WILLPOWER(victim, RES_TOGGLE)) REMOVE_BIT(victim->pcdata->resist[0], RES_DOMINATE); send_to_char("You burn some willpower to resist Conditioning.\n\r",victim); act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Conditioning on you.",ch,NULL,victim,TO_VICT); } return; } if (strlen(victim->pcdata->conding) > 1) { free_string(victim->pcdata->conding); victim->pcdata->conding = str_dup( "" ); REMOVE_BIT(victim->more, MORE_LOYAL); act("You remove $N's conditioning.",ch,NULL,victim,TO_CHAR); act("$n removes your conditioning.",ch,NULL,victim,TO_VICT); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Conditioning on you.",ch,NULL,victim,TO_VICT); } return; } free_string(victim->pcdata->conding); victim->pcdata->conding = str_dup( ch->name ); REMOVE_BIT(victim->more, MORE_LOYAL); act("You condition $N's mind.",ch,NULL,victim,TO_CHAR); act("$n conditions your mind.",ch,NULL,victim,TO_VICT); WAIT_STATE( ch, 12 ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Conditioning on you.",ch,NULL,victim,TO_VICT); } return; } int true_generation( CHAR_DATA *ch, char *argument ) { char arg1 [MAX_INPUT_LENGTH]; char arg2 [MAX_INPUT_LENGTH]; char arg3 [MAX_INPUT_LENGTH]; char arg4 [MAX_INPUT_LENGTH]; char arg5 [MAX_INPUT_LENGTH]; char arg6 [MAX_INPUT_LENGTH]; char arg7 [MAX_INPUT_LENGTH]; char arg8 [MAX_INPUT_LENGTH]; char arg9 [MAX_INPUT_LENGTH]; char arg10[MAX_INPUT_LENGTH]; char arg11[MAX_INPUT_LENGTH]; char arg12[MAX_INPUT_LENGTH]; int vampgen = 1; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); argument = one_argument( argument, arg4 ); argument = one_argument( argument, arg5 ); argument = one_argument( argument, arg6 ); argument = one_argument( argument, arg7 ); argument = one_argument( argument, arg8 ); argument = one_argument( argument, arg9 ); argument = one_argument( argument, arg10 ); argument = one_argument( argument, arg11 ); argument = one_argument( argument, arg12 ); if (IS_NPC(ch)) return 0; if (arg1[0] != '\0') {arg1[0] = UPPER(arg1[0]);vampgen = 2;} if (arg2[0] != '\0') {arg2[0] = UPPER(arg2[0]);vampgen = 3;} if (arg3[0] != '\0') {arg3[0] = UPPER(arg3[0]);vampgen = 4;} if (arg4[0] != '\0') {arg4[0] = UPPER(arg4[0]);vampgen = 5;} if (arg5[0] != '\0') {arg5[0] = UPPER(arg5[0]);vampgen = 6;} if (arg6[0] != '\0') {arg6[0] = UPPER(arg6[0]);vampgen = 7;} if (arg7[0] != '\0') {arg7[0] = UPPER(arg7[0]);vampgen = 8;} if (arg8[0] != '\0') {arg8[0] = UPPER(arg8[0]);vampgen = 9;} if (arg9[0] != '\0') {arg9[0] = UPPER(arg9[0]);vampgen = 10;} if (arg10[0] != '\0') {arg10[0] = UPPER(arg10[0]);vampgen = 11;} if (arg11[0] != '\0') {arg11[0] = UPPER(arg11[0]);vampgen = 12;} if (arg12[0] != '\0') {arg12[0] = UPPER(arg12[0]);vampgen = 13;} return vampgen; } void do_status( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (ch->race > 0) { send_to_char("You already have a reputation.\n\r",ch); return; } if (ch->race < 0) { send_to_char("Your reputation is too bad already.\n\r",ch); return; } if (ch->exp < 1) { send_to_char("It costs 1 exp to make yourself Known.\n\r",ch); return; } ch->race = 1; ch->exp--; send_to_char("You are now Known.\n\r",ch); return; } void do_tongue( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; int dam; int stance; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_SERPENTIS) < 1) { send_to_char("You require level 1 Serpentis to use Tongue of the Serpent.\n\r",ch); return; } if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char("Who do you wish to use Tongue of the Serpent on?\n\r",ch); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { if ( ( obj = get_obj_carry( ch, arg ) ) != NULL ) { if ( obj->item_type != ITEM_WEAPON ) { send_to_char( "You can only poison weapons with your serpentine tongue.\n\r", ch ); return; } if ( obj->value[0] != 0 ) { send_to_char( "This weapon cannot be poisoned.\n\r", ch ); return; } act("You run your long serpentine tongue along $p, poisoning it.",ch,obj,NULL,TO_CHAR); act("$n runs $s long serpentine tongue along $p, poisoning it.",ch,obj,NULL,TO_ROOM); obj->level = 5 * get_disc(ch,DISC_SERPENTIS); obj->value[0] = 53; return; } send_to_char( "They aren't here.\n\r", ch ); return; } } if ( ch == victim ) { act( "You touch your nose with your long serpentine tongue.",ch,NULL,victim,TO_CHAR); act( "$n touches $s nose with his long serpentine tongue.",ch,NULL,victim,TO_ROOM ); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Tongue of the Serpent on you.",ch,NULL,victim,TO_VICT); } return; } WAIT_STATE( ch, 6 ); dam = number_range(10,20); dam += char_damroll(ch); if (dam == 0) dam = 1; if ( !IS_AWAKE(victim) ) dam *= 2; if ( !IS_NPC(ch) && get_disc(ch,DISC_POTENCE) > 0) dam += dam * get_disc(ch,DISC_POTENCE) * 0.5; else if ( !IS_NPC(ch) && (IS_SET(ch->act, PLR_CHAMPION) || IS_SET(ch->act, PLR_DEMON)) && IS_SET(ch->pcdata->disc[C_POWERS], DEM_MIGHT) ) dam *= 1.5; if ( !IS_NPC(ch) ) dam = dam + (dam * ((ch->wpn[0]) * 0.01)); /* if ( !IS_NPC(ch) ) */ { stance = ch->stance[0]; if ( IS_STANCE(ch, STANCE_NORMAL) ) dam *= 1.25; else dam = dambonus(ch,victim,dam,stance); } if ( dam <= 0 ) dam = 1; damage( ch, victim, dam, gsn_tongue ); return; } void do_mummify( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_SERPENTIS) < 2) { send_to_char("You require level 2 Serpentis to Mummify yourself.\n\r",ch); return; } if ( ( obj = ch->pcdata->chobj ) != NULL && IS_EXTRA(ch, EXTRA_OSWITCH)) { REMOVE_BIT(ch->more, MORE_MUMMIFIED); ch->pcdata->obj_vnum = 0; obj->chobj = NULL; ch->pcdata->chobj = NULL; REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->extra, EXTRA_OSWITCH); free_string(ch->morph); ch->morph = str_dup(""); act("$p clambers to $s feet.",ch,obj,NULL,TO_ROOM); act("Your body unshrivels and returns to normal.",ch,obj,NULL,TO_CHAR); extract_obj(obj); if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT) { char_from_room(ch); char_to_room(ch,get_room_index(ROOM_VNUM_ALTAR)); } return; } if (IS_AFFECTED(ch,AFF_POLYMORPH)) { send_to_char( "You cannot do this while polymorphed.\n\r", ch); return; } if ((obj = create_object(get_obj_index(OBJ_VNUM_CORPSE_PC),0)) == NULL) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } mummify_corpse(ch,obj); if (ch->mounted == IS_RIDING) do_dismount(ch,""); obj_to_room(obj,ch->in_room); SET_BIT(obj->quest, QUEST_VANISH); act("$n shrivels up and falls to the ground.",ch,NULL,NULL,TO_ROOM); act("You shrivel up and fall to the ground.",ch,NULL,NULL,TO_CHAR); ch->pcdata->obj_vnum = OBJ_VNUM_CORPSE_PC; obj->chobj = ch; ch->pcdata->chobj = obj; SET_BIT(ch->more, MORE_MUMMIFIED); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->extra, EXTRA_OSWITCH); free_string(ch->morph); ch->morph = str_dup(obj->short_descr); return; } void mummify_corpse( CHAR_DATA *ch, OBJ_DATA *obj ) { char buf[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; if (obj->pIndexData->vnum != OBJ_VNUM_CORPSE_PC) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } sprintf(buf, obj->short_descr, ch->name); free_string(obj->short_descr); obj->short_descr = str_dup( buf ); sprintf(buf, obj->description, ch->name); free_string(obj->description); obj->description = str_dup( buf ); SET_BIT(obj->quest, QUEST_VANISH); return; } void staked_corpse( CHAR_DATA *ch, OBJ_DATA *obj ) { char buf[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; if (obj->pIndexData->vnum != OBJ_VNUM_CORPSE_PC) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } sprintf(buf, "corpse body %s", ch->name); free_string(obj->name); obj->name = str_dup( buf ); sprintf(buf, obj->short_descr, ch->name); free_string(obj->short_descr); obj->short_descr = str_dup( buf ); sprintf(buf, "The body of %s is lying here with a stake through its chest.", ch->name); free_string(obj->description); obj->description = str_dup( buf ); obj->weight = 150; obj->wear_flags = ITEM_TAKE; SET_BIT(obj->quest, QUEST_VANISH); return; } void do_baal( CHAR_DATA *ch, char *argument ) { AFFECT_DATA af; int sn, blood, potence, celerity, fortitude; if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_DAIMOINON) < 9) { send_to_char("You require level 9 Daimoinon to become Baal's Avatar.\n\r",ch); return; } if (is_affected(ch, gsn_demon)) { send_to_char("You are already possessed by the spirit of Baal.\n\r",ch); return; } if (get_disc(ch,DISC_POTENCE) < 5) potence = 5 - get_disc(ch,DISC_POTENCE); else if (get_disc(ch,DISC_POTENCE) < 10) potence = 1; else potence = 0; if (get_disc(ch,DISC_CELERITY) < 5) celerity = 5 - get_disc(ch,DISC_CELERITY); else if (get_disc(ch,DISC_CELERITY) < 10) celerity = 1; else celerity = 0; if (get_disc(ch,DISC_FORTITUDE) < 5) fortitude = 5 - get_disc(ch,DISC_FORTITUDE); else if (get_disc(ch,DISC_FORTITUDE) < 10) fortitude = 1; else fortitude = 0; blood = (potence + celerity + fortitude) * 10; if (blood < 1) { send_to_char("The spirit of Baal doesn't answer your call.\n\r",ch); return; } if (ch->blood[0] < blood) { send_to_char("You have insufficient blood.\n\r",ch); return; } ch->blood[0] -= blood; if ( ( sn = skill_lookup( "demonic possession" ) ) < 0 ) return; af.type = sn; af.duration = get_disc(ch,DISC_DAIMOINON); af.bitvector = 0; if (potence > 0) { af.location = APPLY_POTENCE; af.modifier = potence; affect_to_char( ch, &af ); } if (celerity > 0) { af.location = APPLY_CELERITY; af.modifier = celerity; affect_to_char( ch, &af ); } if (fortitude > 0) { af.location = APPLY_FORTITUDE; af.modifier = fortitude; affect_to_char( ch, &af ); } act( "$n's eyes burn with unholy strength!", ch, NULL, NULL, TO_ROOM ); send_to_char("Your eyes glow as you are infused with some of the power of Baal!\n\r",ch); WAIT_STATE( ch, 12 ); return; } void do_servant( CHAR_DATA *ch, char *argument ) { char buf [MAX_INPUT_LENGTH]; CHAR_DATA *victim; AFFECT_DATA af; int sn; if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_DAIMOINON) < 8) { send_to_char("You require level 8 Daimoinon to summon a Demonic Servant.\n\r",ch); return; } if (ch->pcdata->followers > 4) { send_to_char("Nothing happens.\n\r",ch); return; } ch->pcdata->followers++; victim=create_mobile( get_mob_index( MOB_VNUM_GUARDIAN ) ); char_to_room(victim,get_room_index(ROOM_VNUM_DISCONNECTION)); free_string(victim->lord); victim->lord = str_dup(ch->name); free_string(victim->name); victim->name = str_dup("demon servant"); free_string(victim->short_descr); victim->short_descr = str_dup("a demonic servant"); free_string(victim->long_descr); victim->long_descr = str_dup("A demonic servant stands here, awaiting orders.\n\r"); victim->sex = 1; victim->alignment = -1000; free_string(victim->description); victim->description = str_dup("He looks extremely powerful.\n\r"); victim->level = 100; victim->hit = 30000; victim->max_hit = 30000; victim->mana = 0; victim->max_mana = 1000; victim->move = 1000; victim->max_move = 1000; victim->hitroll = char_hitroll(ch) - 20; victim->damroll = char_damroll(ch) - 20; victim->armor = char_ac(ch) + 100; char_from_room(victim); char_to_room(victim,ch->in_room); strcpy(buf,"Come forth, creature of darkness, and do my bidding!"); do_say( ch, buf ); send_to_char( "A demon bursts from the ground and bows before you.\n\r",ch ); act( "$N bursts from the ground and bows before $n.", ch, NULL, victim, TO_ROOM ); if ( ( sn = skill_lookup( "guardian" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } add_follower( victim, ch ); af.type = sn; af.duration = 6666; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_CHARM; affect_to_char( victim, &af ); return; } void do_controlbeast( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; int cost = (100 - ch->truebeast); argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch)) { send_to_char("Huh?\n\r",ch); return; } if (ch->pcdata->wolf > 0) { send_to_char("Not while the beast is in control!\n\r",ch); return; } if (ch->beast > 99 || ch->truebeast > 99) { send_to_char("The beast has already taken over.\n\r",ch); return; } if (ch->pcdata->diableries[DIAB_EVER] > 0) { send_to_char("Those who drink of the hearts blood may not attain Golconda.\n\r",ch); return; } if (ch->beast < 1) { send_to_char("But you have already attained Golconda!\n\r",ch); return; } if (ch->truebeast < 1) { send_to_char("You are unable to exert any further control over your beast.\n\r",ch); return; } if (ch->practice < cost ) { sprintf(buf,"You need %d primal to try and control your beast.\n\r",cost); send_to_char(buf,ch); return; } if (arg[0] == '\0' || str_cmp(arg,"buy")) { sprintf(buf,"To lower your beast for the cost of %d primal, type: 'controlbeast buy'.\n\r",cost); send_to_char(buf,ch); return; } ch->practice -= cost; ch->truebeast--; send_to_char("You exert some control over your beast.\n\r",ch); return; } void do_shroudnight( CHAR_DATA *ch, char *argument ) { char buf [MAX_INPUT_LENGTH]; if (IS_NPC(ch)) return; if (IS_ABOMINATION(ch)) { if (get_disc(ch,DISC_OBTENEBRATION) < 1 && get_tribe(ch,TRIBE_UKTENA) < 1) { send_to_char("You require either level 1 Uktena or level 1 Obtenebration to summon darkness.\n\r",ch); return; } } else if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { if (!IS_WEREWOLF(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_tribe(ch,TRIBE_UKTENA) < 1) { send_to_char("You require the level 1 power of the Uktena to call the Shroud of Night.\n\r",ch); return; } } else if (!IS_WEREWOLF(ch) && get_disc(ch,DISC_OBTENEBRATION) < 1) { send_to_char("You require level 1 Obtenebration to use Shroud of Night.\n\r",ch); return; } if (ch->in_room == NULL) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_MORE(ch, MORE_DARKNESS)) { REMOVE_BIT(ch->more, MORE_DARKNESS); REMOVE_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); send_to_char("You banish the darkness from the room!\n\r", ch); act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); act("$n banishes the darkness from the room!",ch,NULL,NULL,TO_ROOM); ch->pcdata->darkness = 60; return; } if (IS_SET(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) { send_to_char("The room is already in darkness.\n\r", ch); return; } if (ch->pcdata->darkness > 0) { if (ch->pcdata->darkness > 1) sprintf(buf,"You cannot call upon the Shroud of Night for another %d seconds.\n\r",ch->pcdata->darkness); else sprintf(buf,"You cannot call upon the Shroud of Night for another 1 second.\n\r"); send_to_char(buf,ch); return; } SET_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); SET_BIT(ch->more, MORE_DARKNESS); ch->pcdata->darkness = 60; send_to_char("You call forth the Shroud of Night to darken the room!\n\r", ch); act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); act("The room is filled with darkness!",ch,NULL,NULL,TO_ROOM); return; } void do_silencedeath( CHAR_DATA *ch, char *argument ) { char buf [MAX_INPUT_LENGTH]; if (IS_NPC(ch)) return; if (get_disc(ch,DISC_QUIETUS) < 1 && get_auspice(ch,AUSPICE_RAGABASH) < 4) { send_to_char( "Huh?\n\r", ch ); return; } if (ch->in_room == NULL) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_MORE(ch, MORE_SILENCE)) { REMOVE_BIT(ch->more, MORE_SILENCE); REMOVE_BIT(ch->in_room->added_flags, ROOM2_SILENCE); send_to_char("You banish the silence from the room!\n\r", ch); act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); act("The room is no longer silent.",ch,NULL,NULL,TO_ROOM); ch->pcdata->silence = 60; return; } if (IS_SET(ch->in_room->added_flags, ROOM2_SILENCE)) { send_to_char("The room is already silent.\n\r", ch); return; } if (ch->pcdata->silence > 0) { if (ch->pcdata->silence > 1) sprintf(buf,"You cannot call upon the Silence of Death for another %d seconds.\n\r",ch->pcdata->silence); else sprintf(buf,"You cannot call upon the Silence of Death for another 1 second.\n\r"); send_to_char(buf,ch); return; } SET_BIT(ch->in_room->added_flags, ROOM2_SILENCE); SET_BIT(ch->more, MORE_SILENCE); ch->pcdata->silence = 60; send_to_char("You call forth the Silence of Death!\n\r", ch); act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); act("The room suddenly goes completely silent!",ch,NULL,NULL,TO_ROOM); return; } void do_weakness( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; AFFECT_DATA af; char arg [MAX_INPUT_LENGTH]; int sn; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_QUIETUS) < 2) { send_to_char("You require level 2 Quietus to use Weakness.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0') { send_to_char("Who do you wish to use Weakness on?\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( "Now that would just be plain stupid...\n\r", ch ); return; } if ( ( sn = skill_lookup( "weakness" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } if ( is_safe(ch, victim) ) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Weakness on you.",ch,NULL,victim,TO_VICT); } return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("You feel weaker!\n\r",victim); act("$n looks weaker.",victim,NULL,NULL,TO_ROOM); af.type = sn; af.location = APPLY_STR; af.modifier = 0 - get_disc(ch,DISC_QUIETUS); af.duration = number_range(1,2); af.bitvector = 0; affect_join( victim, &af ); WAIT_STATE( ch, 12 ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Weakness on you.",ch,NULL,victim,TO_VICT); } return; } void do_infirmity( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; AFFECT_DATA af; char arg [MAX_INPUT_LENGTH]; int sn; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_QUIETUS) < 3) { send_to_char("You require level 3 Quietus to use Infirmity.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0') { send_to_char("Who do you wish to use Infirmity on?\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( "Now that would just be plain stupid...\n\r", ch ); return; } if ( is_safe(ch, victim) ) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Infirmity on you.",ch,NULL,victim,TO_VICT); } return; } if ( ( sn = skill_lookup( "weakness" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("You feel weaker!\n\r",victim); send_to_char("You feel slower!\n\r",victim); send_to_char("You feel less healthy!\n\r",victim); act("$n looks weaker.",victim,NULL,NULL,TO_ROOM); act("$n looks slower.",victim,NULL,NULL,TO_ROOM); act("$n looks less healthy.",victim,NULL,NULL,TO_ROOM); af.type = sn; af.location = APPLY_STR; af.modifier = 0 - get_disc(ch,DISC_QUIETUS); af.duration = number_range(1,2); af.bitvector = 0; affect_join( victim, &af ); if ( ( sn = skill_lookup( "slowness" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } af.type = sn; af.location = APPLY_DEX; af.modifier = 0 - get_disc(ch,DISC_QUIETUS); af.duration = number_range(1,2); af.bitvector = 0; affect_join( victim, &af ); if ( ( sn = skill_lookup( "infirmity" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } af.type = sn; af.location = APPLY_CON; af.modifier = 0 - get_disc(ch,DISC_QUIETUS); af.duration = number_range(1,2); af.bitvector = 0; affect_join( victim, &af ); WAIT_STATE( ch, 12 ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Infirmity on you.",ch,NULL,victim,TO_VICT); } return; } void do_bloodagony( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char arg [MAX_INPUT_LENGTH]; char buf [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_QUIETUS) < 4) { send_to_char("You require level 4 Quietus to use Blood Agony.\n\r",ch); return; } if (ch->pcdata->bpoints > 0) { if (ch->pcdata->bpoints > 1) sprintf(buf,"You cannot use Blood Agony for another %d seconds.\n\r",ch->pcdata->bpoints); else sprintf(buf,"You cannot use Blood Agony for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( ch->blood[BLOOD_CURRENT] < 10 ) { send_to_char("You have insufficient blood.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "What weapon do you wish to use Blood Agony on?\n\r", ch ); return; } if ( ( obj = get_obj_carry( ch, arg ) ) == NULL ) { send_to_char( "You are not carrying that object.\n\r", ch ); return; } if ( obj->item_type != ITEM_WEAPON ) { send_to_char( "You may only use Blood Agony on a weapon.\n\r", ch ); return; } if ( IS_SET(obj->quest, QUEST_BLOODAGONY) ) { send_to_char( "This weapon is already covered in blood.\n\r", ch ); return; } if ( IS_SET(obj->quest, QUEST_BLOODAGONY) || IS_SET(obj->quest, QUEST_ARTIFACT) || IS_SET(obj->quest, QUEST_RELIC) || obj->chobj != NULL ) { send_to_char("You are unable to smear any blood on this weapon.\n\r",ch); return; } act("You cut open your wrist and smear some blood onto $p.",ch,obj,NULL,TO_CHAR); act("$n cuts open $s wrist and smears some blood onto $p.",ch,obj,NULL,TO_ROOM); SET_BIT(obj->quest, QUEST_BLOODAGONY); ch->blood[BLOOD_CURRENT] -= 10; ch->pcdata->bpoints = 60; if ( obj->spectype == 0 || obj->spectype == SITEM_SILVER ) { SET_BIT(obj->spectype, SITEM_MESSAGE); free_string(obj->chpoweruse); obj->chpoweruse = str_dup( "A few drops of blood drip from $p." ); free_string(obj->victpoweruse); obj->victpoweruse = str_dup( "A few drops of blood drip from $p carried by $n." ); obj->specpower = ch->specpower = get_disc(ch, DISC_QUIETUS) << 2; } return; } void do_spit( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj_lose; OBJ_DATA *obj_next; int dam; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_QUIETUS) < 5) { send_to_char("You require level 5 Quietus to use Taste of Death.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char("Who do you wish to use Taste of Death on?\n\r",ch); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } /* Morglum : Stop people using spit on themselves */ if ( ch == victim ) { send_to_char( "1 agg, 2 agg, 3 agg, DEAD!\n\r", ch ); return; } if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Taste of Death on you.",ch,NULL,victim,TO_VICT); } return; } WAIT_STATE( ch, 12 ); dam = number_range(10,20); dam += char_damroll(ch); if (dam == 0) dam = 1; if ( !IS_AWAKE(victim) ) dam *= 2; if ( !IS_NPC(ch) && get_disc(ch,DISC_POTENCE) > 0) dam += dam * get_disc(ch,DISC_POTENCE) * 0.5; else if ( !IS_NPC(ch) && IS_DEMON(ch) && IS_SET(ch->pcdata->disc[C_POWERS], DEM_MIGHT) ) dam *= 1.5; if ( !IS_NPC(ch) ) dam = dam + (dam * ((ch->wpn[0]) * 0.01)); if ( dam <= 0 ) dam = 1; else damage( ch, victim, dam, gsn_spit + TYPE_ADD_AGG ); if ( number_percent( ) < get_disc(ch,DISC_QUIETUS) ) { for (obj_lose = victim->carrying; obj_lose != NULL; obj_lose = obj_next) { obj_next = obj_lose->next_content; if ( IS_SET( obj_lose->quest, QUEST_SPELLPROOF ) ) continue; if ( IS_SET( obj_lose->quest, QUEST_RELIC ) || IS_SET( obj_lose->quest, QUEST_ARTIFACT ) ) continue; if ( obj_lose->points > 0 ) continue; if ( number_bits( 2 ) != 0 ) continue; if ( obj_lose->wear_loc == WEAR_NONE ) continue; if ( obj_lose->item_type == ITEM_BOOK || obj_lose->item_type == ITEM_PAGE ) continue; switch ( obj_lose->item_type ) { case ITEM_ARMOR: if ( obj_lose->condition > 0 ) { act( "$p is pitted and etched!", victim, obj_lose, NULL, TO_CHAR ); obj_lose->condition -= 25; if ( obj_lose->condition < 1 ) extract_obj( obj_lose ); } break; case ITEM_SCROLL: case ITEM_WAND: case ITEM_STAFF: case ITEM_TRASH: case ITEM_POTION: case ITEM_FURNITURE: case ITEM_FOOD: case ITEM_BOAT: case ITEM_PILL: case ITEM_CORPSE_NPC: case ITEM_DRINK_CON: case ITEM_CONTAINER: act( "$p fumes and dissolves!", victim, obj_lose, NULL, TO_CHAR ); extract_obj( obj_lose ); break; } } } return; } void do_shadowbody( CHAR_DATA *ch, char *argument ) { char buf [MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_OBTENEBRATION) < 3) { send_to_char("You require level 3 Obtenebration to transform into your Shadow Body.\n\r",ch); return; } if (IS_AFFECTED(ch, AFF_POLYMORPH)) { if (IS_POLYAFF(ch, POLY_SHADOW)) { REMOVE_BIT(ch->polyaff, POLY_SHADOW); REMOVE_BIT(ch->affected_by, AFF_ETHEREAL); } else { send_to_char( "You seem to be stuck in this form.\n\r", ch ); return; } act( "You transform into human form.", ch, NULL, NULL, TO_CHAR ); act( "$n transforms into human form.", ch, NULL, NULL, TO_ROOM ); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); clear_stats(ch); free_string( ch->morph ); ch->morph = str_dup( "" ); } else { if (ch->stance[0] != -1) do_stance(ch,""); if (ch->mounted == IS_RIDING) do_dismount(ch,""); act( "You transform into a black smoke.", ch, NULL, NULL, TO_CHAR ); act( "$n transforms into a black smoke.", ch, NULL, NULL, TO_ROOM ); if (IS_EXTRA(ch, TIED_UP)) { act("The ropes binding you fall through your ethereal form.",ch,NULL,NULL,TO_CHAR); act("The ropes binding $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->extra, TIED_UP); REMOVE_BIT(ch->extra, GAGGED); REMOVE_BIT(ch->extra, BLINDFOLDED); } if (is_affected(ch, gsn_web)) { act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM); send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch); affect_strip(ch, gsn_web); } if (is_affected(ch, gsn_jail)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); affect_strip(ch, gsn_jail); } if (IS_AFFECTED(ch, AFF_JAIL)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_JAIL); } SET_BIT(ch->polyaff, POLY_SHADOW); clear_stats(ch); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->affected_by, AFF_ETHEREAL); sprintf(buf, "%s the black smoke", ch->name); free_string( ch->morph ); ch->morph = str_dup( buf ); } return; } void do_arms( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; int sn; int level; int spelltype; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_OBTENEBRATION) < 2) { send_to_char("You require level 2 Obtenebration to use Arms of the Abyss.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char("Who do you wish to use the Arms of the Abyss on?\n\r",ch); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } if ( ch == victim ) { if (is_affected(ch, gsn_tendrils)) { act("The tendrils of darkness entrapping $n fall away.",ch,NULL,NULL,TO_ROOM); send_to_char("The tendrils of darkness entrapping you fall away.\n\r",ch); affect_strip(ch, gsn_tendrils); } else if (IS_AFFECTED(ch, AFF_SHADOW)) { act("The tendrils of darkness entrapping $n fall away.",ch,NULL,NULL,TO_ROOM); send_to_char("The tendrils of darkness entrapping you fall away.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_SHADOW); } else send_to_char( "Nothing happens.\n\r", ch ); return; } if ( IS_AFFECTED(victim, AFF_ETHEREAL) ) { send_to_char( "You cannot use Arms of the Abyss on an ethereal person.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Arms of the Abyss on you.",ch,NULL,victim,TO_VICT); } return; } if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Arms of the Abyss on you.",ch,NULL,victim,TO_VICT); } return; } if ( ( sn = skill_lookup( "tendrils" ) ) < 0 ) return; spelltype = skill_table[sn].target; level = get_disc(ch,DISC_OBTENEBRATION) * 5; (*skill_table[sn].spell_fun) ( sn, level, ch, victim ); WAIT_STATE( ch, 12 ); return; } void power_ghoul( CHAR_DATA *ch, CHAR_DATA *victim ) { int sn, disc; bool enhanced = FALSE; bool gain_disc; if ( IS_NPC(ch) || IS_NPC(victim) || !IS_HERO(victim) || !IS_VAMPIRE(ch)) return; if (victim->class == CLASS_NONE) victim->class = CLASS_GHOUL; else if (victim->class != CLASS_GHOUL) return; for ( sn = 0; sn <= DISC_MAX; sn++ ) { gain_disc = TRUE; switch ( sn ) { case DISC_ANIMALISM: case DISC_AUSPEX: case DISC_CELERITY: case DISC_DOMINATE: case DISC_FORTITUDE: case DISC_OBFUSCATE: case DISC_POTENCE: case DISC_PRESENCE: case DISC_PROTEAN: case DISC_SERPENTIS: case DISC_THAUMATURGY: case DISC_VICISSITUDE: break; default: gain_disc = FALSE; break; } if (!gain_disc) continue; if (ch->pcdata->powers[sn] > 0) disc = (1 + ch->pcdata->powers[sn]) * 0.5; else disc = 0; if (disc > victim->pcdata->powers[sn]) { victim->pcdata->powers[sn] = disc; enhanced = TRUE; } } if (enhanced) send_to_char("You feel the potency of the blood run through your body.\n\r",victim); return; } void do_lamprey( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; int level, dam; int blood = number_range(1,10); argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_OBTENEBRATION) < 4) { send_to_char("You require level 4 Obtenebration to Call the Lamprey.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char("Who do you wish to Call the Lamprey on?\n\r",ch); return; } if ( ( victim = ch->fighting ) == NULL ) { 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 would not be a good idea.\n\r", ch ); return; } if ( IS_AFFECTED(victim, AFF_ETHEREAL) ) { send_to_char( "You cannot Call the Lamprey on an ethereal person.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Call the Lamprey on you.",ch,NULL,victim,TO_VICT); } return; } if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Call the Lamprey on you.",ch,NULL,victim,TO_VICT); } return; } level = get_disc(ch,DISC_OBTENEBRATION) * 5; dam = blood * get_disc(ch,DISC_OBTENEBRATION) * level; damage(ch,victim,dam,gsn_tendrils); if (victim == NULL || victim->position == POS_DEAD) return; if ( victim->blood[BLOOD_CURRENT] < blood ) blood = victim->blood[BLOOD_CURRENT]; victim->blood[BLOOD_CURRENT] -= blood; ch->blood[BLOOD_CURRENT] += (blood * victim->blood[BLOOD_POTENCY]); if (ch->blood[BLOOD_CURRENT] >= ch->blood[BLOOD_POOL]) { ch->blood[BLOOD_CURRENT] = ch->blood[BLOOD_POOL]; if (IS_VAMPIRE(ch)) send_to_char("Your blood lust is sated.\n\r",ch); } if (IS_NPC(victim) || !IS_VAMPIRE(victim)) { power_ghoul(victim,ch); if (!IS_NPC(ch) && ch->pcdata->dpoints < (victim->blood[2] * 1000)) { ch->pcdata->dpoints += (blood * 60); if (ch->pcdata->dpoints > (victim->blood[2] * 100)) ch->pcdata->dpoints = (victim->blood[2] * 100); } if (victim->blood[0] > 0 && victim->blood[0] <= 50) { act("$n sways weakly from bloodloss.",victim,NULL,NULL,TO_ROOM); send_to_char("You feel weak from bloodloss.\n\r",victim); } else if (victim->blood[0] < 1) { act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM); group_gain(ch,victim); victim->form = 3; killperson(ch,victim); WAIT_STATE( ch, 12 ); return; } } if (IS_NPC(victim)) do_kill(victim,ch->name); WAIT_STATE( ch, 12 ); return; } void do_thanatopsis( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; ROOM_INDEX_DATA *pRoomIndex; ROOM_INDEX_DATA *location; char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_NECROMANCY) < 1) { send_to_char("You require level 1 Necromancy to perform Thanatopsis on a corpse.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "What do you wish to perform Thanatopsis on?\n\r", ch ); return; } if ( ( obj = get_obj_here( ch, arg ) ) == NULL ) { send_to_char( "You cannot seem to find that object.\n\r", ch ); return; } if (obj->item_type != ITEM_CORPSE_NPC && obj->item_type != ITEM_CORPSE_PC) { send_to_char( "That isn't a corpse.\n\r", ch ); return; } act("You examine $p carefully.",ch,obj,NULL,TO_CHAR); act("$n examines $p carefully.",ch,obj,NULL,TO_ROOM); if (strlen(obj->questmaker) < 1 || strlen(obj->questowner) < 1) { send_to_char( "You are unable to discover anything about the killer.\n\r", ch ); return; } sprintf(buf,"It seems that %s was killed by %s.\n\r",obj->questowner,obj->questmaker); send_to_char(buf,ch); if ( ( location = ch->in_room ) == NULL ) { send_to_char("Bug - Please inform Morglum.\n\r",ch); return; } if ( ( pRoomIndex = get_room_index(obj->specpower) ) == NULL ) { sprintf(buf,"You are unsure where %s was killed.\n\r",obj->questowner); send_to_char(buf,ch); } else { if (location == pRoomIndex) sprintf(buf,"It seems that %s was killed right here.\n\r", obj->questowner); else { char_from_room(ch); char_to_room(ch,pRoomIndex); sprintf(buf,"It seems that %s was killed at %s.\n\r", obj->questowner, ch->in_room->name); char_from_room(ch); char_to_room(ch,location); } send_to_char(buf,ch); } return; } void do_spiritgate( CHAR_DATA *ch, char *argument ) { OBJ_DATA *corpse; OBJ_DATA *obj; ROOM_INDEX_DATA *pRoomIndex; ROOM_INDEX_DATA *location; char arg [MAX_INPUT_LENGTH]; int duration, destination; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_NECROMANCY) < 3) { send_to_char("You require level 3 Necromancy to create a Spirit Gate.\n\r",ch); return; } if ( arg[0] == '\0') { send_to_char( "Which corpse do you wish to use to make a Spirit Gate?\n\r", ch ); return; } if ( ( corpse = get_obj_here( ch, arg ) ) == NULL ) { send_to_char( "You cannot seem to find that object.\n\r", ch ); return; } if (corpse->item_type == ITEM_CORPSE_PC) { send_to_char( "Not on that type of corpse.\n\r", ch ); return; } if (corpse->item_type != ITEM_CORPSE_NPC) { send_to_char( "That isn't a corpse.\n\r", ch ); return; } duration = number_range(2,3) * 15; if ( ( location = ch->in_room ) == NULL ) { send_to_char("Bug - Please inform Morglum.\n\r",ch); return; } if ( ( pRoomIndex = get_room_index(corpse->specpower) ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if (location == pRoomIndex) { send_to_char("Nothing happens.\n\r",ch); return; } destination = ch->in_room->vnum; obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->value[0] = corpse->specpower; obj->value[3] = destination; obj->timer = duration; free_string(obj->name); obj->name = str_dup("spirit gate portal"); free_string(obj->short_descr); obj->short_descr = str_dup("a spirit gate"); free_string(obj->description); obj->description = str_dup("A glowing spirit gate floats here."); if (IS_AFFECTED(ch,AFF_SHADOWPLANE)) obj->extra_flags = ITEM_SHADOWPLANE; obj_to_room( obj, location ); act( "$p shimmers into existance in front of $n.", ch, obj, NULL, TO_ROOM ); act( "$p shimmers into existance in front of you.", ch, obj, NULL, TO_CHAR ); char_from_room(ch); char_to_room(ch,pRoomIndex); obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->value[0] = destination; obj->value[3] = corpse->specpower; obj->timer = duration; free_string(obj->name); obj->name = str_dup("spirit gate portal"); free_string(obj->short_descr); obj->short_descr = str_dup("a spirit gate"); free_string(obj->description); obj->description = str_dup("A glowing spirit gate floats here."); if (IS_AFFECTED(ch,AFF_SHADOWPLANE)) obj->extra_flags = ITEM_SHADOWPLANE; obj_to_room( obj, ch->in_room ); act( "$p shimmers into existance.", ch, obj, NULL, TO_ROOM ); char_from_room(ch); char_to_room(ch,location); act("$p crumbles to dust.",ch,corpse,NULL,TO_CHAR); act("$n crumbles to dust.",ch,corpse,NULL,TO_ROOM); extract_obj(corpse); return; } void do_preservation( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_NECROMANCY) < 2) { send_to_char("You require level 2 Necromancy to perform Preservation.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "What do you wish to perform Preservation on?\n\r", ch ); return; } if ( ( obj = get_obj_here( ch, arg ) ) == NULL ) { send_to_char( "You cannot seem to find that object.\n\r", ch ); return; } if ( obj->chobj != NULL ) { send_to_char( "You are unable to preserve it.\n\r", ch ); return; } if (obj->item_type == ITEM_CORPSE_PC) send_to_char( "You cannot preserve that type of corpse.\n\r", ch ); else if (obj->item_type == ITEM_FOOD) { act("$p shrivels up.",ch,obj,NULL,TO_CHAR); act("$p shrivels up.",ch,obj,NULL,TO_ROOM); if (obj->value[0] > 1) obj->value[0] *= 0.5; ch->carry_weight -= obj->weight; if (obj->weight > 1) obj->weight *= 0.5; ch->carry_weight += obj->weight; obj->timer = -1; } else if (obj->item_type == ITEM_CORPSE_NPC) { if (strlen(obj->questowner) < 1) { act("You are unable to preserve $p.",ch,obj,NULL,TO_CHAR); return; } if (obj->timer < 1) { send_to_char( "It is already preserved.\n\r", ch ); return; } act("$p shrivels up.",ch,obj,NULL,TO_CHAR); act("$p shrivels up.",ch,obj,NULL,TO_ROOM); free_string(obj->short_descr); sprintf(buf, "the shriveled up corpse of %s",obj->questowner); obj->short_descr = str_dup(buf); free_string(obj->description); sprintf(buf, "The shriveled up corpse of %s is lying here.",obj->questowner); obj->description = str_dup(buf); ch->carry_weight -= obj->weight; if (obj->weight > 1) obj->weight *= 0.5; ch->carry_weight += obj->weight; obj->timer = -1; } else send_to_char( "You cannot preserve that object.\n\r", ch ); return; } void do_zombie( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; OBJ_DATA *obj; OBJ_DATA *obj_content; OBJ_DATA *obj_next; CHAR_DATA *victim; MOB_INDEX_DATA *pMobIndex; AFFECT_DATA af; int sn; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_NECROMANCY) < 5) { send_to_char("You require level 5 Necromancy to transform a corpse into a Zombie.\n\r",ch); return; } if (ch->pcdata->necromancy > 0) { if (ch->pcdata->necromancy > 1) sprintf(buf,"You cannot animate a Zombie for another %d seconds.\n\r",ch->pcdata->necromancy); else sprintf(buf,"You cannot animate a Zombie for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "What do you wish to animate as a Zombie?\n\r", ch ); return; } if ( ( obj = get_obj_here( ch, arg ) ) == NULL ) { send_to_char( "You cannot seem to find that object.\n\r", ch ); return; } if (obj->item_type != ITEM_CORPSE_NPC) { send_to_char( "You cannot animate that as a Zombie.\n\r", ch ); return; } if (obj->in_room == NULL) { send_to_char( "You better drop it first...don't want the little bugger animating in your pants.\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); if ( ( pMobIndex = get_mob_index( obj->value[2] ) ) == NULL ) { send_to_char( "Nothing happens.\n\r", ch ); return; } victim = create_mobile( pMobIndex ); if (victim->level > 200) victim->level = 200; victim->hitroll = victim->level; victim->damroll = victim->level; char_to_room(victim,ch->in_room); sprintf(buf,"The zombie of %s stands here.\n\r",victim->short_descr); free_string(victim->long_descr); victim->long_descr = str_dup(buf); sprintf(buf,"zombie %s",victim->name); free_string(victim->name); victim->name = str_dup(buf); sprintf(buf,"the zombie of %s",victim->short_descr); free_string(victim->short_descr); victim->short_descr = str_dup(buf); act("$n clambers to $s feet.",victim,NULL,NULL,TO_ROOM); free_string(victim->powertype); victim->powertype = str_dup("zombie"); for ( obj_content = obj->contains; obj_content != NULL; obj_content = obj_next ) { obj_next = obj_content->next_content; obj_from_obj(obj_content); obj_to_char(obj_content,victim); } extract_obj(obj); do_wear(victim,"all"); ch->pcdata->necromancy = 60; if (ch->pcdata->followers > 4) return; free_string(victim->lord); victim->lord = str_dup(ch->name); ch->pcdata->followers++; if ( ( sn = skill_lookup( "charm person" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } add_follower( victim, ch ); af.type = sn; af.duration = 5000; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_CHARM; affect_to_char( victim, &af ); return; } void do_hagswrinkles( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if ( get_disc(ch,DISC_THANATOSIS) < 1 && get_tribe(ch,TRIBE_BLACK_FURIES) < 4 ) { send_to_char( "Huh?\n\r", ch ); return; } if ( arg[0] == '\0' ) { send_to_char( "Change to look like whom?\n\r", ch ); return; } if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "Not while polymorphed.\n\r", ch ); return; } if (IS_POLYAFF(ch,POLY_ZULO)) { send_to_char( "Not while in Zulo Form.\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_IMMORTAL(victim) && victim != ch ) { send_to_char( "You cannot disguise yourself as them.\n\r", ch ); return; } if ( ch == victim ) { if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "You already look like yourself!\n\r", ch ); return; } if (!IS_POLYAFF(ch, POLY_HAGS)) { send_to_char( "Nothing happens.\n\r", ch ); return; } sprintf(buf,"$n's features twist and distort until $e looks like %s.",ch->name); act(buf,ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->polyaff, POLY_HAGS); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->vampaff, VAM_DISGUISED); REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE); free_string( ch->morph ); ch->morph = str_dup( "" ); act("Your features twist and distort until you looks like $n.",ch,NULL,NULL,TO_CHAR); free_string( ch->long_descr ); ch->long_descr = str_dup( "" ); return; } if (IS_VAMPAFF(ch,VAM_DISGUISED)) { if (!IS_POLYAFF(ch, POLY_HAGS)) { send_to_char( "Nothing happens.\n\r", ch ); return; } act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR); act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT); act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT); free_string( ch->morph ); if (IS_NPC(victim)) { ch->morph = str_dup( victim->short_descr ); free_string( ch->long_descr ); ch->long_descr = str_dup( victim->long_descr ); } else { ch->morph = str_dup( victim->name ); free_string( ch->long_descr ); ch->long_descr = str_dup( "" ); } return; } act("Your features twist and distort until you looks like $N.",ch,NULL,victim,TO_CHAR); act("$n's features twist and distort until $e looks like you.",ch,NULL,victim,TO_VICT); act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT); SET_BIT(ch->polyaff, POLY_HAGS); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->vampaff, VAM_DISGUISED); SET_BIT(ch->extra, EXTRA_VICISSITUDE); free_string( ch->morph ); if (IS_NPC(victim)) { ch->morph = str_dup( victim->short_descr ); free_string( ch->long_descr ); ch->long_descr = str_dup( victim->long_descr ); } else { ch->morph = str_dup( victim->name ); free_string( ch->long_descr ); ch->long_descr = str_dup( "" ); } return; } void do_ashes( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; if (IS_NPC(ch)) return; if ((!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) || IS_HEAD(ch, LOST_HEAD)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_THANATOSIS) < 3) { send_to_char("You require level 3 Thanatosis to change into a pile of Ashes.\n\r",ch); return; } if (!IS_MORE(ch, MORE_ASHES) && IS_AFFECTED(ch,AFF_POLYMORPH)) { send_to_char("Not from this form.\n\r",ch); return; } if ( ( obj = ch->pcdata->chobj ) != NULL && IS_EXTRA(ch, EXTRA_OSWITCH)) { ch->pcdata->obj_vnum = 0; obj->chobj = NULL; ch->pcdata->chobj = NULL; REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->extra, EXTRA_OSWITCH); REMOVE_BIT(ch->more, MORE_ASHES); free_string(ch->morph); ch->morph = str_dup(""); act("$p transforms into $n.",ch,obj,NULL,TO_ROOM); act("Your reform your human body.",ch,obj,NULL,TO_CHAR); extract_obj(obj); if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT) { char_from_room(ch); char_to_room(ch,get_room_index(ROOM_VNUM_ALTAR)); } return; } if (IS_AFFECTED(ch,AFF_POLYMORPH)) { send_to_char( "You cannot do this while polymorphed.\n\r", ch); return; } if ((obj = create_object(get_obj_index(OBJ_VNUM_ASHES),0)) == NULL) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } if (ch->mounted == IS_RIDING) do_dismount(ch,""); obj_to_room(obj,ch->in_room); SET_BIT(obj->quest, QUEST_VANISH); act("$n transforms into $p and falls to the ground.",ch,obj,NULL,TO_ROOM); act("You transform into $p and fall to the ground.",ch,obj,NULL,TO_CHAR); if (IS_EXTRA(ch, TIED_UP)) { act("The ropes binding you fall through your form.",ch,NULL,NULL,TO_CHAR); act("The ropes binding $n fall through $s form.",ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->extra, TIED_UP); REMOVE_BIT(ch->extra, GAGGED); REMOVE_BIT(ch->extra, BLINDFOLDED); } if (is_affected(ch, gsn_web)) { act("The webbing entrapping $n falls through $s form.",ch,NULL,NULL,TO_ROOM); send_to_char("The webbing entrapping you falls through your form.\n\r",ch); affect_strip(ch, gsn_web); } if (IS_AFFECTED(ch, AFF_WEBBED)) { act("The webbing entrapping $n falls through $s form.",ch,NULL,NULL,TO_ROOM); send_to_char("The webbing entrapping you falls through your form.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_WEBBED); } if (is_affected(ch, gsn_tendrils)) { act("The tendrils of darkness entrapping $n fall through $s form.",ch,NULL,NULL,TO_ROOM); send_to_char("The tendrils of darkness entrapping you fall through your form.\n\r",ch); affect_strip(ch, gsn_tendrils); } if (IS_AFFECTED(ch, AFF_SHADOW)) { act("The tendrils of darkness entrapping $n fall through $s form.",ch,NULL,NULL,TO_ROOM); send_to_char("The tendrils of darkness entrapping you fall through your form.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_SHADOW); } if (is_affected(ch, gsn_jail)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); affect_strip(ch, gsn_jail); } if (IS_AFFECTED(ch, AFF_JAIL)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_JAIL); } ch->pcdata->obj_vnum = OBJ_VNUM_ASHES; obj->chobj = ch; ch->pcdata->chobj = obj; SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->extra, EXTRA_OSWITCH); SET_BIT(ch->more, MORE_ASHES); free_string(ch->morph); ch->morph = str_dup(obj->short_descr); return; } void do_withering( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; OBJ_DATA *obj; char arg [MAX_INPUT_LENGTH]; int critical = number_range(1,4); argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_THANATOSIS) < 4) { send_to_char("You require level 4 Thanatosis to use Withering.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if ( arg[0] == '\0' ) { send_to_char( "Who do you wish to use Withering on?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (ch == victim) { send_to_char( "Now that would be really silly...\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); WAIT_STATE( ch, 12 ); if ( is_safe(ch, victim) ) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT); } return; } if (number_percent() > (14 - ch->vampgen)*get_disc(ch,DISC_THANATOSIS)) { send_to_char("Nothing happens.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT); } return; } if (critical == 1) { if (IS_ARM_L(victim,LOST_ARM)) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT); } return; } SET_BIT(victim->loc_hp[2],LOST_ARM); if (IS_BLEEDING(victim,BLEEDING_HAND_L)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L); send_to_char("Your left arm withers up and falls off!\n\r",victim); act("$n's left arm withers up and falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"arm"); if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM)) { if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_HOLD )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_WRIST_L )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_FINGER_L )) != NULL) take_item(victim,obj); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Withering on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); return; } else if (critical == 2) { if (IS_ARM_R(victim,LOST_ARM)) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT); } return; } SET_BIT(victim->loc_hp[3],LOST_ARM); if (IS_BLEEDING(victim,BLEEDING_HAND_R)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R); send_to_char("Your right arm withers up and falls off!\n\r",victim); act("$n's right arm withers up and falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"arm"); if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM)) { if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_WIELD )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_WRIST_R )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_FINGER_R )) != NULL) take_item(victim,obj); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Withering on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); return; } else if (critical == 3) { if (IS_LEG_L(victim,LOST_LEG)) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT); } return; } SET_BIT(victim->loc_hp[4],LOST_LEG); if (IS_BLEEDING(victim,BLEEDING_FOOT_L)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L); send_to_char("Your left leg withers up and falls off!\n\r",victim); act("$n's left leg withers up and falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"leg"); if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG)) { if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL) take_item(victim,obj); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Withering on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); return; } else if (critical == 4) { if (IS_LEG_R(victim,LOST_LEG)) { send_to_char( "Nothing happens.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT); } return; } SET_BIT(victim->loc_hp[5],LOST_LEG); if (IS_BLEEDING(victim,BLEEDING_FOOT_R)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R); send_to_char("Your right leg withers up and falls off!\n\r",victim); act("$n's right leg withers up and falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"leg"); if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG)) { if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL) take_item(victim,obj); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Withering on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); return; } send_to_char("Nothing happens.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Withering on you.",ch,NULL,victim,TO_VICT); } return; } void do_drainlife( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; int damage; if (IS_NPC(ch)) return; argument = one_argument( argument, arg ); if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_THANATOSIS) < 5) { send_to_char("You require level 5 Thanatosis to use Drain Life from someone.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char( "Who's lifeforce do you wish to Drain?\n\r", ch ); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Drain Life on you.",ch,NULL,victim,TO_VICT); } return; } if (ch->hit >= ch->max_hit) { send_to_char( "But you are already at full lifeforce!\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("You drain some of their lifeforce.\n\r",ch); send_to_char("You feel your lifeforce being drained away!\n\r",victim); damage = number_range(1,10) * (get_disc(ch,DISC_THANATOSIS) * 5); if (victim->hit <= damage) damage = victim->hit - 1; if (ch->hit + damage > ch->max_hit) damage -= (ch->max_hit - ch->hit); ch->hit += damage; victim->hit -= damage; if (victim->hit < 1) { act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM); if (!IS_NPC(victim)) update_pos(victim); else { demon_gain(ch,victim); group_gain(ch,victim); victim->form = 10; killperson(ch,victim); } return; } if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Drain Life on you.",ch,NULL,victim,TO_VICT); } if (IS_NPC(victim)) do_kill(victim,ch->name); WAIT_STATE( ch, 12 ); return; } void do_putrefaction( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; AFFECT_DATA af; char arg [MAX_INPUT_LENGTH]; int sn, level; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_THANATOSIS) < 2) { send_to_char("You require level 2 Thanatosis to use Putrefaction.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0') { send_to_char( "Who do you wish to use Putrefaction on?\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_AFFECTED(victim, AFF_ROT)) { send_to_char("Their flesh is already rotting.\n\r",ch); return; } if ( IS_NPC(victim) && IS_AFFECTED(victim, AFF_ETHEREAL) ) { send_to_char("They have no flesh to rot.\n\r",ch); return; } if (is_safe(ch, victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Putrefaction on you.",ch,NULL,victim,TO_VICT); } return; } if ( ( sn = skill_lookup( "rotting flesh" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("Your flesh begins to rot!\n\r",victim); act("$n's flesh begins to rot!",victim,NULL,NULL,TO_ROOM); level = get_disc(ch,DISC_THANATOSIS); af.type = sn; af.location = APPLY_CON; af.modifier = 0 - level; af.duration = number_range(level,(2*level)); af.bitvector = AFF_ROT; affect_join( victim, &af ); WAIT_STATE( ch, 12 ); return; } void do_scream( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim; CHAR_DATA *victim_next; int damage; bool no_dam = FALSE; one_argument( argument, arg ); if (IS_NPC(ch)) no_dam = TRUE; else { if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) no_dam = TRUE; else if (get_disc(ch,DISC_MELPOMINEE) < 1) no_dam = TRUE; if (IS_WEREWOLF(ch) && get_tribe(ch, TRIBE_GET_OF_FENRIS) > 2) no_dam = FALSE; } if (!IS_NPC(ch) && ch->pcdata->reina > 0) { if (ch->pcdata->reina > 1) sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina); else sprintf(buf,"Your voice will not recover for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "You scream loudly!\n\r", ch ); act("$n screams loudly!",ch,NULL,NULL,TO_ROOM); if (no_dam) return; if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); ch->pcdata->reina = 10; damage = get_disc(ch,DISC_MELPOMINEE) * 10; for ( victim = ch->in_room->people; victim; victim = victim_next ) { victim_next = victim->next_in_room; if ( victim == ch ) continue; if (IS_IMMORTAL(victim)) continue; if (!IS_NPC(victim) && (IS_VAMPIRE(victim) || IS_GHOUL(victim)) && get_disc(victim,DISC_MELPOMINEE) > 0) continue; if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Scream on you.",ch,NULL,victim,TO_VICT); } return; } send_to_char("You clutch your head in agony as your eardrums seem to explode!\n\r",victim); act("$n clutches $s head in agony!",victim,NULL,NULL,TO_ROOM); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Scream on you.",ch,NULL,victim,TO_VICT); } victim->hit -= damage; if ((IS_NPC(victim) && victim->hit < 1) || (!IS_NPC(victim) && victim->hit < -10)) { act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM); demon_gain(ch,victim); group_gain(ch,victim); victim->form = 11; killperson(ch,victim); } else { update_pos(victim); if (number_range(1,20) <= get_disc(ch,DISC_MELPOMINEE)) { victim->position = POS_STUNNED; send_to_char("You fall to the ground, stunned!\n\r",victim); act("$n falls to the ground, stunned!",victim,NULL,NULL,TO_ROOM); } else if (IS_NPC(victim)) do_kill(victim,ch->name); } } WAIT_STATE( ch, 12 ); return; } else if ( ( victim = get_char_room( ch, arg ) ) != NULL ) { if ( victim == ch ) { send_to_char( "You scream loudly at yourself!\n\r", ch ); act("$n screams loudly at $mself!",ch,NULL,NULL,TO_ROOM); return; } else { act("You scream loudly at $N!",ch,NULL,victim,TO_CHAR); act("$n screams loudly at you!",ch,NULL,victim,TO_VICT); act("$n screams loudly at $N!",ch,NULL,victim,TO_NOTVICT); } if (no_dam) return; if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (IS_IMMORTAL(victim)) return; if (!IS_NPC(victim) && (IS_VAMPIRE(victim) || IS_GHOUL(victim)) && get_disc(victim,DISC_MELPOMINEE) > 0) return; if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Scream on you.",ch,NULL,victim,TO_VICT); } return; } damage = get_disc(ch,DISC_MELPOMINEE) * number_range(10,20); ch->pcdata->reina = 10; send_to_char("You clutch your head in agony as your eardrums seem to explode!\n\r",victim); act("$n clutches $s head in agony!",victim,NULL,NULL,TO_ROOM); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Scream on you.",ch,NULL,victim,TO_VICT); } victim->hit -= damage; if ((IS_NPC(victim) && victim->hit < 1) || (!IS_NPC(victim) && victim->hit < -10)) { act("$n's body falls limply to the ground.",victim,NULL,NULL,TO_ROOM); demon_gain(ch,victim); group_gain(ch,victim); victim->form = 11; killperson(ch,victim); WAIT_STATE( ch, 12 ); return; } update_pos(victim); if (number_range(1,20) <= get_disc(ch,DISC_MELPOMINEE)) { victim->position = POS_STUNNED; send_to_char("You fall to the ground, stunned!\n\r",victim); act("$n falls to the ground, stunned!",victim,NULL,NULL,TO_ROOM); } else if (IS_NPC(victim)) do_kill(victim,ch->name); WAIT_STATE( ch, 12 ); return; } else { send_to_char( "They aren't here.\n\r", ch ); return; } return; } void do_spiritform( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_PROTEAN) < 7) { send_to_char("You require level 7 Protean to transform into Spirit Form.\n\r",ch); return; } if (IS_AFFECTED(ch, AFF_POLYMORPH)) { if (!IS_POLYAFF(ch,POLY_SPIRIT)) { send_to_char( "You cannot change from this form.\n\r", ch ); return; } act( "Your body regains its substance.", ch, NULL, NULL, TO_CHAR ); act( "$n's ethereal body regains its substance.", ch, NULL, NULL, TO_ROOM ); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->affected_by, AFF_ETHEREAL); REMOVE_BIT(ch->polyaff, POLY_SPIRIT); REMOVE_BIT(ch->extra, EXTRA_VICISSITUDE); REMOVE_BIT(ch->vampaff, VAM_DISGUISED); REMOVE_BIT(ch->vampaff, VAM_FLYING); free_string( ch->morph ); ch->morph = str_dup( "" ); return; } act( "You body becomes translucent and insubstancial.", ch, NULL, NULL, TO_CHAR ); act( "$n's body becomes translucent and insubstancial.", ch, NULL, NULL, TO_ROOM ); if (IS_EXTRA(ch, TIED_UP)) { act("The ropes binding you fall through your ethereal form.",ch,NULL,NULL,TO_CHAR); act("The ropes binding $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->extra, TIED_UP); REMOVE_BIT(ch->extra, GAGGED); REMOVE_BIT(ch->extra, BLINDFOLDED); } if (is_affected(ch, gsn_web)) { act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM); send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch); affect_strip(ch, gsn_web); } if (IS_AFFECTED(ch, AFF_WEBBED)) { act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM); send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_WEBBED); } if (is_affected(ch, gsn_tendrils)) { act("The tendrils of darkness entrapping $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM); send_to_char("The tendrils of darkness entrapping you fall through your ethereal form.\n\r",ch); affect_strip(ch, gsn_tendrils); } if (IS_AFFECTED(ch, AFF_SHADOW)) { act("The tendrils of darkness entrapping $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM); send_to_char("The tendrils of darkness entrapping you fall through your ethereal form.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_SHADOW); } if (is_affected(ch, gsn_jail)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); affect_strip(ch, gsn_jail); } if (IS_AFFECTED(ch, AFF_JAIL)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_JAIL); } SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->affected_by, AFF_ETHEREAL); SET_BIT(ch->polyaff, POLY_SPIRIT); SET_BIT(ch->extra, EXTRA_VICISSITUDE); SET_BIT(ch->vampaff, VAM_DISGUISED); SET_BIT(ch->vampaff, VAM_FLYING); free_string( ch->morph ); ch->morph = str_dup( ch->name ); return; } void do_spiritguardian( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) ) { if (IS_WEREWOLF(ch)) { if (get_auspice(ch, AUSPICE_THEURGE) < 4) { send_to_char("You require the level 4 Theurge power to summon your Guardian Spirit.\n\r",ch); return; } } else { send_to_char("Huh?\n\r",ch); return; } } else if (get_disc(ch,DISC_NECROMANCY) < 4) { send_to_char("You require level 4 Necromancy to summon your Spirit Guardian.\n\r",ch); return; } if (IS_MORE(ch, MORE_GUARDIAN) ) { send_to_char("You dismiss your Spirit Guardian.\n\r",ch); guardian_message( ch ); send_to_char("I shall return when you call me, Master.\n\r",ch); REMOVE_BIT(ch->more, MORE_GUARDIAN); return; } send_to_char("You call your Spirit Guardian.\n\r",ch); guardian_message( ch ); send_to_char("I have arrived, Master.\n\r",ch); SET_BIT(ch->more, MORE_GUARDIAN); return; } void do_succulence( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; AFFECT_DATA af; CHAR_DATA *victim; int sn; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_ANIMALISM) < 6) { send_to_char("You require level 6 Animalism to use Succulence.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who do you wish to use Succulence on?\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( "Not on yourself.\n\r", ch ); return; } if (!IS_NPC(victim)) { send_to_char( "Not on players.\n\r", ch ); return; } if (is_affected(victim, gsn_potency)) { send_to_char("You are unable to make them any more succulent.\n\r",ch); return; } if ( ( sn = skill_lookup( "blood potency" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } af.type = sn; af.duration = get_disc(ch,DISC_ANIMALISM) * 10; af.location = APPLY_BLOOD_POT; af.modifier = victim->blood[BLOOD_POTENCY]; af.bitvector = 0; affect_to_char( victim, &af ); af.location = APPLY_BLOOD_MAX; af.modifier = victim->blood[BLOOD_POOL]; affect_to_char( victim, &af ); victim->blood[BLOOD_CURRENT] *= 2; act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("You increase the quality of their blood.\n\r",ch); return; } void do_loyalty( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) ) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_DOMINATE) < 4) { send_to_char("You require level 4 Dominate to use Loyalty.\n\r",ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who do you wish to make loyal?\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( "You make yourself loyal to yourself!\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's\n\r", ch ); return; } if (strlen(victim->pcdata->conding) < 2 || str_cmp(victim->pcdata->conding,ch->name)) { send_to_char( "They are not conditioned to you.\n\r", ch ); return; } act("You stare deeply into $N's eyes.",ch,NULL,victim,TO_CHAR); act("$n stares deeply into $N's eyes.",ch,NULL,victim,TO_NOTVICT); act("$n stares deeply into your eyes.",ch,NULL,victim,TO_VICT); if (IS_MORE(victim,MORE_LOYAL) ) { act("You remove $N's loyalty to you.", ch, NULL, victim, TO_CHAR); act("You no longer feel quite so loyal to $n.", ch, NULL, victim, TO_VICT); REMOVE_BIT(victim->more, MORE_LOYAL); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Loyalty on you.",ch,NULL,victim,TO_VICT); } return; } act("You make $N completely loyal to you.", ch, NULL, victim, TO_CHAR); act("You suddenly feel completely loyal to $n.", ch, NULL, victim, TO_VICT); SET_BIT(victim->more, MORE_LOYAL); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Loyalty on you.",ch,NULL,victim,TO_VICT); } return; } void do_love( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) ) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_MELPOMINEE) < 4) { send_to_char("You require level 4 Melpominee to sing the Song of Love.\n\r",ch); return; } if (ch->pcdata->reina > 0) { if (ch->pcdata->reina > 1) sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina); else sprintf(buf,"Your voice will not recover for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who do you wish to use the Song of Love on?\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( "You're already in love with yourself.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's\n\r", ch ); return; } if (is_safe(ch,victim)) return; send_to_char("You sing the Song of Love.\n\r", ch); act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM ); ch->pcdata->reina = 60; if (strlen(victim->pcdata->love) > 2) { if (!str_cmp(victim->pcdata->love,ch->name)) { act("You remove $N's love for you!", ch, NULL, victim, TO_CHAR); act("You are no longer in love with $n!", ch, NULL, victim, TO_VICT); free_string(victim->pcdata->love); victim->pcdata->love = str_dup( "" ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Love on you.",ch,NULL,victim,TO_VICT); } } else { send_to_char( "They are already in love with someone else.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Love on you.",ch,NULL,victim,TO_VICT); } } return; } if (!IS_NPC(victim) && (IS_VAMPIRE(victim) || IS_GHOUL(victim)) && get_disc(victim,DISC_PRESENCE) >= get_disc(ch,DISC_PRESENCE) ) { send_to_char("They resist you.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Love on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && victim->pcdata->resist[WILL_PRESENCE] > 0) { send_to_char("They resist you.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Love on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && IS_WILLPOWER(victim, RES_PRESENCE) && victim->pcdata->willpower[0] >= 10) { victim->pcdata->willpower[0] -= 10; victim->pcdata->resist[WILL_PRESENCE] = 60; if (!IS_WILLPOWER(victim, RES_TOGGLE)) REMOVE_BIT(victim->pcdata->resist[0], RES_PRESENCE); send_to_char("You burn some willpower to resist Love.\n\r",victim); send_to_char("They resist you.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Love on you.",ch,NULL,victim,TO_VICT); } return; } act("You make $N fall in love with you!", ch, NULL, victim, TO_CHAR); act("You fall in love with $n!", ch, NULL, victim, TO_VICT); act("$N gazes lovingly into $n's eyes!", ch, NULL, victim, TO_NOTVICT); free_string(victim->pcdata->love); victim->pcdata->love = str_dup( ch->name ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Love on you.",ch,NULL,victim,TO_VICT); } return; } void do_frenzy( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) ) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_ANIMALISM) < 7) { send_to_char("You require level 7 Animalism to use Frenzy Trigger.\n\r",ch); return; } if ( ch->pcdata->wolf > 0 ) { send_to_char("You take a deep breath and force back your inner beast.\n\r",ch); act("$n takes a deep breath and forces back $s inner beast.",ch,NULL,NULL,TO_ROOM); ch->pcdata->wolf = 0; if (IS_VAMPAFF(ch, VAM_NIGHTSIGHT) && get_disc(ch,DISC_PROTEAN) > 0) do_nightsight(ch,""); if (IS_VAMPAFF(ch, VAM_FANGS)) do_fangs(ch,""); if (IS_VAMPAFF(ch, VAM_CLAWS) && get_disc(ch,DISC_PROTEAN) > 1) do_claws(ch,""); WAIT_STATE(ch,12); return; } if (!IS_VAMPAFF(ch, VAM_NIGHTSIGHT) && get_disc(ch,DISC_PROTEAN) > 0) do_nightsight(ch,""); if (!IS_VAMPAFF(ch, VAM_FANGS)) do_fangs(ch,""); if (!IS_VAMPAFF(ch, VAM_CLAWS) && get_disc(ch,DISC_PROTEAN) > 1) do_claws(ch,""); send_to_char("You bare yours fangs and growl as your inner beast consumes you.\n\r",ch); act("$n bares $s fangs and growls as $s inner beast consumes $m.",ch,NULL,NULL,TO_ROOM); ch->pcdata->wolf += number_range(10,20); WAIT_STATE(ch,12); return; } /* A coterie is a group of vampire players who work together. */ DO_COM( do_coterie ) { CHAR_DATA *victim; CHAR_DATA *gch; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; /* Remove the first 'word' from the entered string, and copy it into * arg. */ argument = one_argument( argument, arg ); /* Removes the tildes from argument for file-saving purposes. */ smash_tilde( argument ); /* This command cannot be used by Non-Player Characters (mobiles). */ if (IS_NPC(ch)) return; /* Only vampires should be able to form coteries. */ /* if (!IS_VAMPIRE(ch)) { huh( ch ); return; } */ /* If no parameters or the 'info' parameter are added, then the player * should see a list of all the members of their coterie if they have * one, or a list of coterie options if they don't. */ if ( arg[0] == '\0' || !str_cmp(arg, "info") ) { /* If they person belongs to a coterie, then this should list all * the coterie members. */ if (strlen(ch->pcdata->coterie) > 1 && strlen(ch->pcdata->leader) > 1 ) { /* Show the name of the coterie, and who founded it. */ sprintf( buf, "The %s coterie, lead by %s:\n\r", ch->pcdata->coterie, ch->pcdata->leader ); send_to_char( buf, ch ); send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); /* Display the following information about the coterie members: * Name: The name of the member. * Rank: Their position within the coterie - Leader, champion, etc. * Clan: What vampire clan they belong to. * Gen: What generation of vampire they are. * Hits: What condition of physical damage the vampire is in. * Exp: How many experience points the vampire has. * Status:How many players the vampire has killed. */ send_to_char("#b[ #wName#b ] [ #wRank#b ] [ #wClass#b ] [ #wHits#b ] [ #wExp#b ] [#wStatus#b]\n\r", ch ); /* Check each player in the char_list for a match. */ for ( gch = char_list; gch != NULL; gch = gch->next ) { if ( IS_NPC(gch) ) continue; /* if ( !IS_VAMPIRE(gch) ) continue; */ if ( IS_IMMORTAL( gch ) && !can_see( ch, gch ) ) continue; if ( strlen(gch->pcdata->coterie) < 2) continue; if ( strlen(gch->pcdata->leader) < 2) continue; if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue; if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) ) { /* Players with no clan are called Caitiff. The Serpents * of the Light and Daughters of Cacophony have too long * names to display on the screen, so I abbreviate them. */ if ( gch->class == CLASS_VAMPIRE ) strcpy( arg, "Vampire" ); else if ( gch->class == CLASS_WEREWOLF ) strcpy( arg, "Werewolf" ); else if ( gch->class == CLASS_ABOMINATION ) strcpy( arg, "Abomination" ); else if ( gch->class == CLASS_MAGE ) strcpy( arg, "Mage" ); else if ( gch->class == CLASS_LICH ) strcpy( arg, "Lich" ); else if ( gch->class == CLASS_SKINDANCER ) strcpy( arg, "Skindancer" ); else if ( gch->class == CLASS_DEMON ) strcpy( arg, "Demon" ); else if ( gch->class == CLASS_ANGEL ) strcpy( arg, "Angel" ); else if ( gch->class == CLASS_BAALI ) strcpy( arg, "Baali" ); else if ( gch->class == CLASS_BLACK_SPIRAL_DANCER ) strcpy( arg, "B.S.D." ); else if ( gch->class == CLASS_NEPHANDI ) strcpy( arg, "Nephandi" ); else if ( gch->class == CLASS_GHOUL ) strcpy( arg, "Ghoul" ); else strcpy( arg, "None" ); sprintf( buf, "#b[#n%-15s#b] [#n%8s#b] [#n%-13s#b] [#n%-8d#b] [#n%-13d#b] [ #n%-3d#b ]\n\r", capitalize( gch->name ), IS_MORE(gch, MORE_LEADER) ? " Leader " : IS_MORE(gch, MORE_CHAMPION) ? "Champion" : " Member ", arg, gch->hit, gch->exp, gch->race ); send_to_char( buf, ch ); } } send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); send_to_char( "For more information type 'coterie help'.\n\r", ch ); send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); return; } /* If the player doesn't belong to a coterie, then display the * information about how they can create one. */ send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); send_to_char(" -= Coterie Options =-\n\r",ch); send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); send_to_char("CHAMPION : Make a member into a champion.\n\r",ch); send_to_char("FOUND : Founds a new Coterie.\n\r",ch); send_to_char("INDUCT : Inducts a member into your coterie.\n\r",ch); send_to_char("INFO : Lists information on your coterie.\n\r",ch); send_to_char("LEAVE : Leaves your current Coterie.\n\r",ch); send_to_char("OUTCAST : Outcasts a member from your coterie.\n\r",ch); // send_to_char("READY : Coterie rules are completed.\n\r",ch); send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); return; } /* This allows a member to leave the coterie they currently belong to. */ if ( !str_cmp(arg, "leave") ) { /* Check if the person is actually a coterie member. */ if (strlen(ch->pcdata->coterie) < 2 || strlen(ch->pcdata->leader) < 2) { send_to_char( "But you are not a member of any coterie!\n\r", ch ); return; } /* Check each player in the char_list for a match. */ for ( gch = char_list; gch != NULL; gch = gch->next ) { if ( IS_NPC(gch) ) continue; /* if ( !IS_VAMPIRE(gch) ) continue; */ if ( strlen(gch->pcdata->coterie) < 2) continue; if ( strlen(gch->pcdata->leader) < 2) continue; if ( ch == gch ) continue; if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue; if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) ) { /* If the leader leaves their own coterie, then it will * be disbanded, and all other online members kicked out. */ if (IS_MORE(ch, MORE_LEADER)) { act( "Info -> $n has disbanded the coterie.", ch, NULL, gch, TO_VICT ); FILL_STRING( gch->pcdata->coterie, "" ); FILL_STRING( gch->pcdata->leader, "" ); } else act( "Info -> $n has left the coterie.", ch, NULL, gch, TO_VICT ); } } if (IS_MORE(ch, MORE_LEADER)) send_to_char("You disband the coterie.\n\r",ch); else send_to_char("You leave the coterie.\n\r",ch); REMOVE_BIT(ch->more, MORE_CHAMPION); FILL_STRING( ch->pcdata->coterie, "" ); FILL_STRING( ch->pcdata->leader, "" ); REMOVE_BIT(ch->more, MORE_LEADER); return; } /* This allows someone to found a new coterie. */ if ( !str_cmp(arg, "found") ) { /* You cannot already belong to a coterie. */ if (strlen(ch->pcdata->coterie) > 1) { send_to_char( "But you are already the member of a coterie!\n\r", ch ); return; } if (argument[0] == '\0') { send_to_char( "What do you wish to call your coterie?\n\r", ch ); return; } if (strlen(argument) < 5 || strlen(argument) > 20 ) { send_to_char( "Your coterie name should be between 5 and 20 characters long.\n\r", ch ); return; } /* Calculate and store the time the coterie was created. Two * coteries of the same name created by the same person at different * times are considered different coteries to prevent a single coterie * having different rules for different members. */ send_to_char("You have founded a new coterie!\n\r",ch); FILL_STRING( ch->pcdata->coterie, argument ); FILL_STRING( ch->pcdata->leader, ch->name ); SET_BIT(ch->more, MORE_LEADER); SET_BIT(ch->more, MORE_CHAMPION); return; } if ( !str_cmp(arg, "induct") ) { /* You cannot induct someone unless you actually belong to a * coterie. */ if (strlen(ch->pcdata->coterie) < 2 || strlen(ch->pcdata->leader) < 2) { send_to_char( "But you are not a member of any coterie!\n\r", ch ); return; } if (!IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) { send_to_char( "Only a coterie leader or champion can induct new members.\n\r", ch ); return; } if (!IS_MORE(ch, MORE_CHAMPION) && IS_MORE(ch, MORE_LEADER)) { send_to_char( "Your coterie has not yet been completely set up.\n\r", ch ); return; } if (argument[0] == '\0') { send_to_char( "Who do you wish to induct?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, argument ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } /* Only player vampires are allowed in the coterie. */ if (IS_NPC(victim)) { send_to_char( "Not on NPC's.\n\r", ch ); return; } /* if (!IS_VAMPIRE(victim)) { send_to_char( "You can only induct vampires.\n\r", ch ); return; } */ /* You cannot induct someone who is already in the coterie! */ if ( strlen(victim->pcdata->coterie) > 1 && strlen(victim->pcdata->leader) > 1 && !str_cmp(ch->pcdata->coterie,victim->pcdata->coterie) && !str_cmp(ch->pcdata->leader, victim->pcdata->leader) ) { send_to_char( "They are already a member of your coterie.\n\r", ch ); return; } /* People already in other coteries have to leave before joining * another one. */ if (strlen(victim->pcdata->coterie) > 1) { send_to_char( "They are already in a coterie.\n\r", ch ); return; } /* Unwilling people cannot be forced to join. */ if (!IS_IMMUNE(victim,IMM_VAMPIRE)) { send_to_char( "You cannot induct an unwilling person.\n\r", ch ); return; } act("You induct $N into your coterie.",ch,NULL,victim,TO_CHAR); act("$n inducts you into $s coterie.",ch,NULL,victim,TO_VICT); /* Check each player in the char_list for a match. */ for ( gch = char_list; gch != NULL; gch = gch->next ) { if ( IS_NPC(gch) ) continue; /* if ( !IS_VAMPIRE(gch) ) continue; */ if ( strlen(gch->pcdata->coterie) < 2) continue; if ( strlen(gch->pcdata->leader) < 2) continue; if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue; if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) ) act( "Info -> $N has been inducted to the coterie!", gch, NULL, victim, TO_CHAR ); } /* Clear all their coterie values and replace them with the * values of a coterie member. */ FILL_STRING( victim->pcdata->coterie, ch->pcdata->coterie ); FILL_STRING( victim->pcdata->leader, ch->pcdata->leader ); REMOVE_BIT(victim->more, MORE_CHAMPION); REMOVE_BIT(victim->more, MORE_LEADER); /* The new member has the same discipline requirements as the * person who inducted them. */ return; } if ( !str_cmp(arg, "outcast") ) { /* You cannot outcast someone unless you actually belong to their * coterie, and even then only a select few can do it. */ if (strlen(ch->pcdata->coterie) < 2 || strlen(ch->pcdata->leader) < 2) { send_to_char( "But you are not a member of any coterie!\n\r", ch ); return; } if (!IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) { send_to_char( "Only a coterie leader or champion can outcast members.\n\r", ch ); return; } if (!IS_MORE(ch, MORE_CHAMPION) && IS_MORE(ch, MORE_LEADER)) { send_to_char( "Your coterie has not yet been completely set up.\n\r", ch ); return; } /* Find the person to be outcast, and check that they are valid. */ if (argument[0] == '\0') { send_to_char( "Who do you wish to outcast?\n\r", ch ); return; } if ( ( victim = get_char_world( ch, argument ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (IS_NPC(victim)) { send_to_char( "Not on NPC's.\n\r", ch ); return; } /* if (!IS_VAMPIRE(victim)) { send_to_char( "You can only induct vampires.\n\r", ch ); return; } */ if (victim == ch) { send_to_char( "You cannot outcast yourself.\n\r", ch ); return; } if (strlen(victim->pcdata->coterie) < 2 || strlen(victim->pcdata->leader) < 2) { send_to_char( "They are not a member of your coterie.\n\r", ch ); return; } if (str_cmp(ch->pcdata->leader,victim->pcdata->leader)) { send_to_char( "They are not a member of your coterie.\n\r", ch ); return; } if (str_cmp(ch->pcdata->coterie,victim->pcdata->coterie)) { send_to_char( "They are not a member of your coterie.\n\r", ch ); return; } if (IS_MORE(victim, MORE_LEADER) || IS_MORE(victim, MORE_CHAMPION)) { send_to_char( "You can only outcast regular members.\n\r", ch ); return; } act("You outcast $N from the coterie.",ch,NULL,victim,TO_CHAR); act("$n outcasts you from the coterie.",ch,NULL,victim,TO_VICT); /* Clear the person's coterie values, as they are no longer a * coterie member. */ FILL_STRING( victim->pcdata->coterie, "" ); FILL_STRING( victim->pcdata->leader, "" ); REMOVE_BIT(victim->more, MORE_CHAMPION); /* Inform remaining members that their coterie has lost a member. */ for ( gch = char_list; gch != NULL; gch = gch->next ) { if ( IS_NPC(gch) ) continue; /* if ( !IS_VAMPIRE(gch) ) continue; */ if ( strlen(gch->pcdata->coterie) < 2) continue; if ( strlen(gch->pcdata->leader) < 2) continue; if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue; if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) ) act( "Info -> $N has been kicked out of the coterie!", gch, NULL, victim, TO_CHAR ); } return; } /* This allows a coterie leader to make someone into a champion - a * person who has the ability to recruit new members. A sort of * sub-leader. */ if ( !str_cmp(arg, "champion") ) { if (strlen(ch->pcdata->coterie) < 2 || strlen(ch->pcdata->leader) < 2) { send_to_char( "But you are not a member of any coterie!\n\r", ch ); return; } if (!IS_MORE(ch, MORE_LEADER)) { send_to_char( "Only a coterie leader can make someone a champion.\n\r", ch ); return; } if (!IS_MORE(ch, MORE_CHAMPION)) { send_to_char( "Your coterie has not yet been completely set up.\n\r", ch ); return; } /* Find the person to be made a champion, and check they are valid. */ if (argument[0] == '\0') { send_to_char( "Who do you wish to make into a champion?\n\r", ch ); return; } if ( ( victim = get_char_world( ch, argument ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (IS_NPC(victim)) { send_to_char( "Not on NPC's.\n\r", ch ); return; } /* if (!IS_VAMPIRE(victim)) { send_to_char( "Only on vampires.\n\r", ch ); return; } */ if (victim == ch) { send_to_char( "You cannot make yourself a champion!\n\r", ch ); return; } /* You can only make members of your own coterie into a champion. */ if (strlen(victim->pcdata->coterie) < 2 || strlen(victim->pcdata->leader) < 2) { send_to_char( "They are not a member of your coterie.\n\r", ch ); return; } if (str_cmp(ch->pcdata->leader,victim->pcdata->leader)) { send_to_char( "They are not a member of your coterie.\n\r", ch ); return; } if (str_cmp(ch->pcdata->coterie,victim->pcdata->coterie)) { send_to_char( "They are not a member of your coterie.\n\r", ch ); return; } /* Inform all members of the coterie that the person has been * made/unmade a champion. */ if (!IS_MORE(victim, MORE_CHAMPION)) { act("You make $N a coterie champion.",ch,NULL,victim,TO_CHAR); act("$n makes you a coterie champion.",ch,NULL,victim,TO_VICT); sprintf(buf,"Info -> $N has been made a champion!"); SET_BIT(victim->more, MORE_CHAMPION); } else { act("You remove $N's coterie champion position.",ch,NULL,victim,TO_CHAR); act("$n removes your coterie champion position.",ch,NULL,victim,TO_VICT); sprintf(buf,"Info -> $N is no longer a coterie champion!"); REMOVE_BIT(victim->more, MORE_CHAMPION); } for ( gch = char_list; gch != NULL; gch = gch->next ) { if ( IS_NPC(gch) ) continue; /* if ( !IS_VAMPIRE(gch) ) continue; */ if ( strlen(gch->pcdata->coterie) < 2) continue; if ( strlen(gch->pcdata->leader) < 2) continue; if ( str_cmp(ch->pcdata->leader,gch->pcdata->leader) ) continue; if ( !str_cmp(ch->pcdata->coterie,gch->pcdata->coterie) ) act( buf, gch, NULL, victim, TO_CHAR ); } return; } /* This is used when the coterie rules are complete and the coterie * is ready to take on new members. */ /* The 'coterie' command on its own lists the coterie options, unless * you already belong to a coterie in which case you won't have reached * this point. */ send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); send_to_char(" -= Coterie Options =-\n\r",ch); send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); send_to_char("CHAMPION : Make a member into a champion.\n\r",ch); send_to_char("FOUND : Founds a new Coterie.\n\r",ch); send_to_char("INDUCT : Inducts a member into your coterie.\n\r",ch); send_to_char("INFO : Lists information on your coterie.\n\r",ch); send_to_char("LEAVE : Leaves your current Coterie.\n\r",ch); send_to_char("OUTCAST : Outcasts a member from your coterie.\n\r",ch); send_to_char("#r--------------------------------------------------------------------------------\n\r",ch); return; } bool is_coterie args( ( CHAR_DATA *ch, CHAR_DATA *victim ) ); void do_ctalk( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; DESCRIPTOR_DATA *d; char buf[MSL]; if ( IS_NPC(ch) ) return; if ( strlen(ch->pcdata->coterie) < 2 || strlen(ch->pcdata->leader) < 2 ) { send_to_char("But you don't belong to a coterie!\n\r",ch); return; } if ( argument[0] == '\0' ) { send_to_char("Coterie-talk what?\n\r",ch); return; } if ( IS_MORE(ch, MORE_LEADER) ) act4("#y-=#n$n#y=-#n '#w$t#n'.", ch, argument, NULL, TO_CHAR); else act4("#y-#n$n#y-#n '#w$t#n'.", ch, argument, NULL, TO_CHAR); for ( d = descriptor_list; d != NULL; d = d->next ) { if ( d->connected != CON_PLAYING ) continue; if ( (victim = d->character) == NULL ) continue; if ( IS_NPC(victim) ) continue; // if ( !IS_VAMPIRE(victim) ) continue; if ( !is_coterie( ch, victim ) && !IS_HIGHJUDGE( victim ) ) continue; if ( !is_coterie( ch, victim ) && !str_cmp( ch->pcdata->leader, "Morglum" ) ) continue; if ( IS_SET( victim->deaf, CHANNEL_CTALK ) && !is_coterie( ch, victim ) ) continue; if ( IS_MORE(ch, MORE_LEADER) && is_coterie( ch, victim ) ) act4("#y-=#n$n#y=-#n '#w$t#n'.", ch, argument, victim, TO_VICT); else if ( is_coterie( ch, victim ) ) act4("#y-#n$n#y-#n '#w$t#n'.", ch, argument, victim, TO_VICT); else { if ( IS_MORE( ch, MORE_LEADER ) ) sprintf( buf, "(%s) #y-=#n%s#y=-#n '#w$t#n'.", ch->pcdata->leader, ch->name ); else sprintf( buf, "(%s) #y-#n%s#y-#n '#w$t#n'.", ch->pcdata->leader, ch->name ); act4( buf, ch, argument, victim, TO_VICT ); } } return; } bool is_coterie( CHAR_DATA *ch, CHAR_DATA *victim ) { if ( strlen( victim->pcdata->coterie ) < 2 ) return FALSE; if ( strlen( victim->pcdata->leader ) < 2 ) return FALSE; if ( str_cmp( ch->pcdata->coterie, victim->pcdata->coterie ) ) return FALSE; if ( str_cmp( ch->pcdata->leader, victim->pcdata->leader ) ) return FALSE; return TRUE; } void do_shadowstep( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; CHAR_DATA *victim; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (arg[0] == '\0') { send_to_char( "Who do you wish to shadowstep to?\n\r", ch ); return; } if (get_disc(ch,DISC_OBTENEBRATION) < 5) { send_to_char("You require level 5 Obtenebration to use Shadow Step.\n\r",ch); return; } if ( ( victim = get_char_world( ch, arg ) ) == NULL || victim == ch || victim->in_room == NULL || ch->in_room == NULL || (IS_NPC(victim) && !room_is_dark(victim->in_room)) || victim->level > (get_disc(ch,DISC_OBTENEBRATION) * 10)) { send_to_char( "Nothing happens.\n\r", ch ); return; } if ( victim->in_room == ch->in_room ) { send_to_char( "But you are already there!\n\r", ch ); return; } if ( 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->position != POS_STANDING || (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON) ) ) { send_to_char( "You are unable to focus on their location.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Summoning on you.",ch,NULL,victim,TO_VICT); } return; } send_to_char("You step into the shadows.\n\r",ch); act("$n steps into the shadows and vanishes from sight.",ch,NULL,NULL,TO_ROOM); char_from_room(ch); char_to_room(ch,victim->in_room); do_look(ch,""); send_to_char("You step out of the shadows.\n\r",ch); act("$N steps from the shadows.",victim,NULL,ch,TO_CHAR); act("$N steps from the shadows.",victim,NULL,ch,TO_ROOM); return; } void do_hand( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_DEMON(ch)) { if (!IS_WEREWOLF(ch) || get_auspice(ch, AUSPICE_AHROUN) < 5) { send_to_char("Huh?\n\r",ch); return; } } if (IS_MORE(ch,MORE_HAND_FLAME) ) { if (IS_ANGEL(ch)) { send_to_char("The glowing blue nimbus around your hands fades away.\n\r",ch); act("The glowing blue nimbus around $n's hands fades away.", ch, NULL, NULL, TO_ROOM); } else { send_to_char("The flames around your hands are extinguished.\n\r",ch); act("The flames around $n's hands die away.", ch, NULL, NULL, TO_ROOM); } REMOVE_BIT(ch->more, MORE_HAND_FLAME); if ( ch->in_room != NULL && ch->in_room->light > 0 ) --ch->in_room->light; return; } if (IS_ANGEL(ch)) { send_to_char("Your hands begin to glow with a blue nimbus.\n\r",ch); act("$n's hands begin to glow with a blue nimbus.",ch,NULL,NULL,TO_ROOM); } else { send_to_char("Your hands erupts into flames.\n\r",ch); act("$n's hands erupts into flames.",ch,NULL,NULL,TO_ROOM); } SET_BIT(ch->more, MORE_HAND_FLAME); if ( ch->in_room != NULL ) ++ch->in_room->light; return; } void do_flamebolt( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; int dam, hp, sn; char arg[MAX_INPUT_LENGTH]; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (IS_DEMON(ch) && !IS_ANGEL(ch)) { send_to_char("Huh?\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char( "Who do you wish to shoot a Flame Bolt at?\n\r", ch ); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } if ( is_safe(ch, victim) ) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act4("$n just failed to use Engulf on you.",ch,NULL,victim,TO_VICT); } return; } if ( ch == victim ) { send_to_char( "Now that would be just plain stupid.\n\r", ch ); return; } if ( ( sn = skill_lookup( "flame bolt" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); /* if (IS_ITEMAFF(victim, ITEMA_FIRESHIELD)) { send_to_char("Nothing happens.\n\r",ch); WAIT_STATE(ch, 6); return; } */ if ( IS_DEMON( victim ) ) { send_to_char("Nothing happens.\n\r",ch); WAIT_STATE(ch, 12); return; } if (!IS_NPC(victim) && victim->pcdata->atm >= number_percent()) { send_to_char("Nothing happens.\n\r",ch); WAIT_STATE(ch, 6); return; } dam = number_range(500,1000); hp = victim->hit; if (!IS_NPC(victim) && IS_VAMPIRE(victim) ) damage( ch, victim, (dam*2), (sn + TYPE_ADD_AGG) ); else damage( ch, victim, dam, (sn + TYPE_ADD_AGG) ); WAIT_STATE(ch, 6); if (victim == NULL || victim->position == POS_DEAD) return; if (!IS_NPC(victim) && IS_IMMUNE(victim, IMM_HEAT) ) {victim->hit = hp;victim->agg--;} else if (!IS_NPC(victim) && IS_VAMPIRE(victim) && get_disc(victim,DISC_DAIMOINON) > 5) {victim->hit = hp;victim->agg--;} else if (!IS_NPC(victim) && IS_WEREWOLF(victim) && get_auspice(victim,AUSPICE_AHROUN) > 4) {victim->hit = hp;victim->agg--;} update_pos(victim); return; } void do_engulf( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; int dam, hp, sn; char arg[MAX_INPUT_LENGTH]; one_argument( argument, arg ); if (IS_NPC(ch)) return; if ( !IS_DEMON( ch ) ) { if ( get_tribe(ch,TRIBE_WENDIGOS) < 4 ) { send_to_char("Huh?\n\r",ch); return; } } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char( "Who do you wish to Engulf?\n\r", ch ); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } if ( is_safe(ch, victim) ) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act4("$n just failed to use Engulf on you.",ch,NULL,victim,TO_VICT); } return; } if ( ch == victim ) { send_to_char( "Now that would be just plain stupid.\n\r", ch ); return; } if ( ( sn = skill_lookup( "flame bolt" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); /* if (IS_ITEMAFF(victim, ITEMA_FIRESHIELD)) { send_to_char("Nothing happens.\n\r",ch); WAIT_STATE(ch, 6); return; } */ if ( IS_DEMON( victim ) ) { send_to_char("Nothing happens.\n\r",ch); WAIT_STATE(ch, 12); return; } if (!IS_NPC(victim) && victim->pcdata->atm >= number_percent()) { send_to_char("Nothing happens.\n\r",ch); WAIT_STATE(ch, 6); return; } dam = number_range(500,1000); hp = victim->hit; if (!IS_NPC(victim) && IS_VAMPIRE(victim) ) damage( ch, victim, (dam*2), (sn + TYPE_ADD_AGG) ); else damage( ch, victim, dam, (sn + TYPE_ADD_AGG) ); WAIT_STATE(ch, 6); if (victim == NULL || victim->position == POS_DEAD) return; if (!IS_NPC(victim) && IS_IMMUNE(victim, IMM_HEAT) ) {victim->hit = hp;victim->agg--;} else if (!IS_NPC(victim) && IS_VAMPIRE(victim) && get_disc(victim,DISC_DAIMOINON) > 5) {victim->hit = hp;victim->agg--;} else if (!IS_NPC(victim) && IS_WEREWOLF(victim) && get_auspice(victim,AUSPICE_AHROUN) > 4) {victim->hit = hp;victim->agg--;} else if (!IS_AFFECTED(victim, AFF_FLAMING)) { send_to_char("You are engulfed in flames!\n\r",victim); act("$n is engulfed in flames!",victim,NULL,NULL,TO_ROOM); SET_BIT(victim->affected_by, AFF_FLAMING); } update_pos(victim); return; } void do_evileye( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int value; smash_tilde( argument ); argument = one_argument( argument, arg1 ); strcpy( arg2, argument ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch)) { send_to_char("Huh?\n\r",ch); return; } if ( arg1[0] != '\0' && !str_cmp( arg1, "on" ) ) { if (IS_MORE(ch, MORE_EVILEYE)) { send_to_char("You already have Evil Eye on.\n\r",ch); return; } send_to_char("Your Evil Eye is now ON.\n\r",ch); SET_BIT(ch->more, MORE_EVILEYE); return; } if ( arg1[0] != '\0' && !str_cmp( arg1, "off" ) ) { if (!IS_MORE(ch, MORE_EVILEYE)) { send_to_char("You already have Evil Eye off.\n\r",ch); return; } send_to_char("Your Evil Eye is now OFF.\n\r",ch); REMOVE_BIT(ch->more, MORE_EVILEYE); return; } if ( arg1[0] == '\0' || arg2[0] == '\0' ) { send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char(" -= Evil Eye =-\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char( "Format is: evileye <option> <value>\n\r", ch ); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char( "Option ON switches your Evil Eye on.\n\r", ch ); send_to_char( "Option OFF switches your Evil Eye off.\n\r", ch ); send_to_char( "Option ACTION is a text string action performed by you or the viewer.\n\r", ch ); send_to_char( "Option MESSAGE is a text string shown to the person looking at you.\n\r", ch ); send_to_char( "Option TOGGLE has values: Spell, Self, Other.\n\r", ch ); send_to_char("--------------------------------------------------------------------------------\n\r",ch); if ( strlen(ch->poweraction) < 2 ) sprintf(buf,"Current Action: None.\n\r"); else sprintf(buf,"Current Action: %s.\n\r",ch->poweraction); send_to_char(buf,ch); if ( strlen(ch->powertype) < 2 ) sprintf(buf,"Current Message: None.\n\r"); else sprintf(buf,"Current Message: %s.\n\r",ch->powertype); send_to_char(buf,ch); send_to_char("Current Toggle flags:",ch); if (IS_SET(ch->spectype,EYE_SPELL)) send_to_char(" Spell",ch); if (IS_SET(ch->spectype,EYE_SELFACTION)) send_to_char(" Self",ch); if (IS_SET(ch->spectype,EYE_ACTION)) send_to_char(" Other",ch); if (!IS_SET(ch->spectype,EYE_SPELL) && !IS_SET(ch->spectype,EYE_SELFACTION) && !IS_SET(ch->spectype,EYE_ACTION)) send_to_char(" None",ch); send_to_char(".\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); return; } value = is_number( arg2 ) ? atoi( arg2 ) : -1; if ( !str_cmp( arg1, "action" ) ) { if (is_in(arg2,"|quit*rem*drop*gift*claim*consent*propose*accept*vampi*ma *maj*sid *side *reca*/*l *lo *loo *look *exa*ha *hav *have *haven*")) { send_to_char("Illegal action type.\n\r",ch); return; } if (strlen(arg2) > 80) { send_to_char("Action too long, please limit it to 80 characters.\n\r",ch); return; } if (!str_cmp(arg2,"clear")) { free_string( ch->poweraction ); ch->poweraction = str_dup( "" ); send_to_char("Action cleared.\n\r",ch); return; } free_string( ch->poweraction ); ch->poweraction = str_dup( arg2 ); send_to_char("Action set.\n\r",ch); return; } else if ( !str_cmp( arg1, "message" ) ) { if (strlen(arg2) > 80) { send_to_char("Message too long, please limit it to 80 characters.\n\r",ch); return; } if (!str_cmp(arg2,"clear")) { free_string( ch->powertype ); ch->powertype = str_dup( "" ); send_to_char("Message cleared.\n\r",ch); return; } free_string( ch->powertype ); ch->powertype = str_dup( arg2 ); send_to_char("Message set.\n\r",ch); return; } else if ( !str_cmp( arg1, "toggle" ) ) { if ( !str_cmp( arg2, "spell" ) && IS_SET(ch->spectype,EYE_SPELL)) REMOVE_BIT(ch->spectype,EYE_SPELL); else if ( !str_cmp( arg2, "spell" ) && !IS_SET(ch->spectype,EYE_SPELL)) SET_BIT(ch->spectype,EYE_SPELL); else if ( !str_cmp( arg2, "self" ) && IS_SET(ch->spectype,EYE_SELFACTION)) REMOVE_BIT(ch->spectype,EYE_SELFACTION); else if ( !str_cmp( arg2, "self" ) && !IS_SET(ch->spectype,EYE_SELFACTION)) SET_BIT(ch->spectype,EYE_SELFACTION); else if ( !str_cmp( arg2, "other" ) && IS_SET(ch->spectype,EYE_ACTION)) REMOVE_BIT(ch->spectype,EYE_ACTION); else if ( !str_cmp( arg2, "other" ) && !IS_SET(ch->spectype,EYE_ACTION)) SET_BIT(ch->spectype,EYE_ACTION); else { send_to_char("TOGGLE flag should be one of: spell, self, other.\n\r",ch); return;} sprintf(buf,"%s flag toggled.\n\r",capitalize(arg2)); send_to_char(buf,ch); return; } else { send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char(" -= Evil Eye =-\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char( "Format is: evileye <option> <value>\n\r", ch ); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char( "Option ACTION is a text string action performed by you or the viewer.\n\r", ch ); send_to_char( "Option MESSAGE is a text string shown to the person looking at you.\n\r", ch ); send_to_char( "Option TOGGLE has values: Spell, Self, Other.\n\r", ch ); send_to_char("--------------------------------------------------------------------------------\n\r",ch); if ( strlen(ch->poweraction) < 2 ) sprintf(buf,"Current Action: None.\n\r"); else sprintf(buf,"Current Action: %s.\n\r",ch->poweraction); send_to_char(buf,ch); if ( strlen(ch->powertype) < 2 ) sprintf(buf,"Current Message: None.\n\r"); else sprintf(buf,"Current Message: %s.\n\r",ch->powertype); send_to_char(buf,ch); send_to_char("Current Toggle flags:",ch); if (IS_SET(ch->spectype,EYE_SPELL)) send_to_char(" Spell",ch); if (IS_SET(ch->spectype,EYE_SELFACTION)) send_to_char(" Self",ch); if (IS_SET(ch->spectype,EYE_ACTION)) send_to_char(" Other",ch); if (!IS_SET(ch->spectype,EYE_SPELL) && !IS_SET(ch->spectype,EYE_SELFACTION) && !IS_SET(ch->spectype,EYE_ACTION)) send_to_char(" None",ch); send_to_char(".\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); } return; } void do_spiriteyes( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) ) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_NECROMANCY) < 1) { send_to_char("You require level 1 Necromancy to use Spirit Eyes.\n\r",ch); return; } if (IS_VAMPAFF(ch,VAM_SPIRITEYES) ) { send_to_char("You can no longer see into the shadowlands.\n\r",ch); REMOVE_BIT(ch->vampaff, VAM_SPIRITEYES); return; } send_to_char("You can now see into the shadowlands.\n\r",ch); SET_BIT(ch->vampaff, VAM_SPIRITEYES); return; } void do_stake( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; CHAR_DATA *vch; OBJ_DATA *stake; OBJ_DATA *obj; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Stake whom?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { if ( ( obj = get_obj_here( ch, arg ) ) != NULL ) { if ( obj->item_type == ITEM_CORPSE_NPC ) { send_to_char("They have no stake in them to remove.\n\r",ch); return; } if ( obj->item_type != ITEM_CORPSE_PC ) { if (obj->chobj == NULL || obj->chobj != ch) send_to_char("How can you remove a stake from THAT?\n\r",ch); else send_to_char("There is no stake for you to remove.\n\r",ch); return; } if ( ( victim = obj->chobj ) == NULL ) { send_to_char("There is no stake for you to remove.\n\r",ch); return; } if ( ( stake = get_eq_char( victim, WEAR_STAKE ) ) == NULL ) { send_to_char("There is no stake for you to remove.\n\r",ch); return; } if (!IS_EXTRA(victim, EXTRA_OSWITCH) || !IS_MORE(victim, MORE_STAKED)) { send_to_char("There is no stake for you to remove.\n\r",ch); return; } else { REMOVE_BIT(victim->more, MORE_STAKED); victim->pcdata->obj_vnum = 0; obj->chobj = NULL; victim->pcdata->chobj = NULL; REMOVE_BIT(victim->affected_by, AFF_POLYMORPH); REMOVE_BIT(victim->extra, EXTRA_OSWITCH); free_string(victim->morph); victim->morph = str_dup(""); if (victim == ch) { act("You pull $p out of your heart.", ch, stake, victim, TO_CHAR); act("$n pulls $p out of $s chest.", ch, stake, victim, TO_ROOM); } else { act("You pull $p out of $N's heart.", ch, stake, victim, TO_CHAR); act("$n pulls $p out of $N's chest.", ch, stake, victim, TO_NOTVICT); send_to_char( "You feel the stake pulled from your heart.\n\r", victim ); } obj_from_char(stake); obj_to_char(stake,ch); stake->timer = -1; if (obj->carried_by != NULL) { if (victim != obj->carried_by) { act("You drop $N onto the floor.", obj->carried_by, NULL, victim, TO_CHAR); act("$n drops $N onto the floor.", obj->carried_by, NULL, victim, TO_NOTVICT); act("$n drops you onto the floor.", obj->carried_by, NULL, victim, TO_VICT); } } act("$n clambers to $s feet.",victim,NULL,NULL,TO_ROOM); act("You clamber back to your feet.",victim,NULL,NULL,TO_CHAR); extract_obj(obj); if (victim->in_room->vnum == ROOM_VNUM_IN_OBJECT) { char_from_room(victim); char_to_room(victim,get_room_index(ROOM_VNUM_ALTAR)); } } return; } send_to_char( "They aren't here.\n\r", ch ); return; } if ( ( stake = get_eq_char( victim, WEAR_STAKE ) ) != NULL ) { if (victim == ch) { act("You pull $p out of your heart.", ch, stake, victim, TO_CHAR); act("$n pulls $p out of $s chest.", ch, stake, victim, TO_ROOM); } else if (!IS_IMMUNE(victim,IMM_VAMPIRE)) send_to_char("They refuse to let you near them.\n\r",ch); else { act("You pull $p out of $N's heart.", ch, stake, victim, TO_CHAR); act("$n pulls $p out of $N's chest.", ch, stake, victim, TO_NOTVICT); act("$n pulls $p out of your chest.", ch, stake, victim, TO_VICT); } obj_from_char(stake); obj_to_char(stake,ch); return; } stake = get_eq_char( ch, WEAR_HOLD ); if ( stake == NULL || stake->item_type != ITEM_STAKE ) { stake = get_eq_char( ch, WEAR_WIELD ); if ( stake == NULL || stake->item_type != ITEM_STAKE ) { send_to_char( "How can you stake someone down without holding a stake?\n\r", ch ); return; } } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if ( ch == victim ) { send_to_char( "You cannot stake yourself.\n\r", ch ); return; } if (!IS_VAMPIRE(victim)) { send_to_char( "You can only stake vampires.\n\r", ch ); return; } if (victim->position > POS_MORTAL) { send_to_char( "You can only stake a vampire who is in torpor.\n\r", ch ); return; } if (get_eq_char(victim, WEAR_STAKE) != NULL) { send_to_char( "But they already have a stake through their chest!\n\r", ch ); return; } if ( is_safe(ch, victim) ) return; act("You raise $p over $N's chest.", ch, stake, victim, TO_CHAR); act("$n raises $p over $N's chest.", ch, stake, victim, TO_NOTVICT); if (IS_MORE(victim, MORE_DEFLECTION)) { act("$p explodes into tiny fragments in your hand.", ch, stake, NULL, TO_CHAR); act("$p explodes into tiny fragments in $n's hand.", ch, stake, victim, TO_ROOM); REMOVE_BIT(victim->more, MORE_DEFLECTION); extract_obj(stake); send_to_char("You fall to the ground, stunned.\n\r",ch); act("$n falls to the ground, stunned.", ch, NULL, NULL, TO_ROOM); ch->position = POS_STUNNED; return; } act("You plunge $p into $N's heart.", ch, stake, victim, TO_CHAR); act("$n plunges $p into $N's heart.", ch, stake, victim, TO_NOTVICT); if ( ( vch = victim->embrace ) != NULL ) { vch->embrace = NULL; vch->embraced = ARE_NONE; } victim->embrace = NULL; victim->embraced = ARE_NONE; obj_from_char(stake); obj_to_char(stake,victim); equip_char(victim, stake, WEAR_STAKE); if (IS_IMMUNE(victim,IMM_STAKE)) { send_to_char( "You feel a stake plunged through your chest.\n\r", victim ); return; } stake->timer = (0.05 * victim->beast) + 1; send_to_char( "You feel a stake plunged through your heart.\n\r", victim ); victim->pcdata->wolf = 0; if (IS_WEREWOLF(victim)) do_unwerewolf(victim,""); if (IS_VAMPAFF(victim, VAM_NIGHTSIGHT) && !IS_POLYAFF(victim, POLY_ZULO)) do_nightsight(victim,""); if (IS_VAMPAFF(victim, VAM_FANGS) && !IS_POLYAFF(victim, POLY_ZULO)) do_fangs(victim,""); if (IS_VAMPAFF(victim, VAM_CLAWS) && !IS_POLYAFF(victim, POLY_ZULO)) do_claws(victim,""); mortal_vamp(victim); if (IS_AFFECTED(ch,AFF_POLYMORPH)) clear_stats(victim); if ((obj = create_object(get_obj_index(OBJ_VNUM_CORPSE_PC),0)) == NULL) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } victim->hit = 1; victim->position = POS_STANDING; staked_corpse(victim,obj); if (victim->mounted == IS_RIDING) do_dismount(victim,""); obj_to_room(obj,victim->in_room); victim->pcdata->obj_vnum = OBJ_VNUM_CORPSE_PC; obj->chobj = victim; victim->pcdata->chobj = obj; SET_BIT(victim->more, MORE_STAKED); SET_BIT(victim->affected_by, AFF_POLYMORPH); SET_BIT(victim->extra, EXTRA_OSWITCH); free_string(victim->morph); victim->morph = str_dup(obj->short_descr); return; } void ritual_ward( CHAR_DATA *ch, int direction, int ward ) { OBJ_DATA *obj; EXIT_DATA *pexit; ROOM_INDEX_DATA *location; ROOM_INDEX_DATA *to_room; char arg [MAX_INPUT_LENGTH]; char buf [MAX_INPUT_LENGTH]; int duration = number_range(1,2) * 15; int rev; if (IS_NPC(ch)) return; if (ward != EX_WARD_GHOULS && ward != EX_WARD_LUPINES && ward != EX_WARD_KINDRED && ward != EX_WARD_SPIRITS ) { send_to_char( "Bug - Please inform Morglum.\n\r", ch ); return; } if (direction == DIR_NORTH) rev = DIR_SOUTH; else if (direction == DIR_SOUTH) rev = DIR_NORTH; else if (direction == DIR_EAST) rev = DIR_WEST; else if (direction == DIR_WEST) rev = DIR_EAST; else if (direction == DIR_UP) rev = DIR_DOWN; else if (direction == DIR_DOWN) rev = DIR_UP; else { send_to_char( "Bug - Please inform Morglum.\n\r", ch ); return; } switch (direction) { default: strcpy(arg,"north"); break; case DIR_NORTH: strcpy(arg,"north"); break; case DIR_SOUTH: strcpy(arg,"south"); break; case DIR_EAST: strcpy(arg,"east"); break; case DIR_WEST: strcpy(arg,"west"); break; case DIR_UP: strcpy(arg,"up"); break; case DIR_DOWN: strcpy(arg,"down"); break; } if ( ( pexit = ch->in_room->exit[direction] ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ( location = ch->in_room ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ( to_room = pexit->to_room ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_SET(pexit->exit_info, EX_WARD_GHOULS) || IS_SET(pexit->exit_info, EX_WARD_LUPINES) || IS_SET(pexit->exit_info, EX_WARD_KINDRED) || IS_SET(pexit->exit_info, EX_WARD_SPIRITS) ) { send_to_char("Nothing happens.\n\r",ch); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->item_type = ITEM_WARD; obj->value[0] = direction; obj->timer = duration; free_string(obj->name); obj->name = str_dup("ward"); free_string(obj->short_descr); if (ward == EX_WARD_GHOULS) obj->short_descr = str_dup("a Ward vs Ghouls"); else if (ward == EX_WARD_LUPINES) obj->short_descr = str_dup("a Ward vs Lupines"); else if (ward == EX_WARD_KINDRED) obj->short_descr = str_dup("a Ward vs Kindred"); else obj->short_descr = str_dup("a Ward vs Spirits"); if (direction == DIR_UP) sprintf(buf,"A small ward is drawn in the centre of the ceiling."); else if (direction == DIR_DOWN) sprintf(buf,"A small ward is drawn in the centre of the floor."); else sprintf(buf,"A small ward is drawn on the floor to the %s.",arg); free_string(obj->description); obj->description = str_dup(buf); obj_to_room( obj, ch->in_room ); SET_BIT(pexit->exit_info, ward); if (direction == DIR_UP) { act( "You carefully draw $p in the centre of the ceiling.", ch, obj, NULL, TO_CHAR ); act( "$n carefully draws $p in the centre of the ceiling.", ch, obj, NULL, TO_ROOM ); } else if (direction == DIR_DOWN) { act( "You carefully draw $p in the centre of the floor.", ch, obj, NULL, TO_CHAR ); act( "$n carefully draws $p in the centre of the floor.", ch, obj, NULL, TO_ROOM ); } else { sprintf(buf,"You carefully draw $p on the floor to the %s.",arg); act( buf, ch, obj, NULL, TO_CHAR ); sprintf(buf,"$n carefully draws $p on the floor to the %s.",arg); act( buf, ch, obj, NULL, TO_ROOM ); } WAIT_STATE(ch,12); if (location == to_room) return; char_from_room(ch); char_to_room(ch, to_room); if ( ( pexit = ch->in_room->exit[rev] ) == NULL ) return; if (IS_SET(pexit->exit_info, ward)) return; switch (rev) { default: strcpy(arg,"north"); break; case DIR_NORTH: strcpy(arg,"north"); break; case DIR_SOUTH: strcpy(arg,"south"); break; case DIR_EAST: strcpy(arg,"east"); break; case DIR_WEST: strcpy(arg,"west"); break; case DIR_UP: strcpy(arg,"up"); break; case DIR_DOWN: strcpy(arg,"down"); break; } obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->item_type = ITEM_WARD; obj->value[0] = rev; obj->timer = duration; free_string(obj->name); obj->name = str_dup("ward"); free_string(obj->short_descr); if (ward == EX_WARD_GHOULS) obj->short_descr = str_dup("a Ward vs Ghouls"); else if (ward == EX_WARD_LUPINES) obj->short_descr = str_dup("a Ward vs Lupines"); else if (ward == EX_WARD_KINDRED) obj->short_descr = str_dup("a Ward vs Kindred"); else obj->short_descr = str_dup("a Ward vs Spirits"); free_string(obj->description); obj->description = str_dup(""); obj_to_room( obj, ch->in_room ); SET_BIT(pexit->exit_info, ward); char_from_room(ch); char_to_room(ch, location); return; } void show_disc( CHAR_DATA *ch ) { char buf [MAX_STRING_LENGTH]; int level; if (IS_NPC(ch) || !IS_VAMPIRE(ch)) return; send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char(" -= Coterie Rules =-\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); if (IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) { send_to_char( "Syntax: coterie rules <option>\n\r", ch ); send_to_char( "Option can be any one of the following: \n\r", ch ); send_to_char( "Clans Sects Banned Basic Intermediate Advanced Expert Hp Generation Skill \n\r", ch ); send_to_char( "Stance Adv_Stance Golconda No_Diablerie No_Kill_Sect No_Kill_Coterie.\n\r", ch ); send_to_char("--------------------------------------------------------------------------------\n\r",ch); } sprintf( buf, "Sects allowed to join: %s.\n\r",ch->pcdata->cot_sides); send_to_char(buf,ch); sprintf( buf, "Clans allowed to join: %s.\n\r",ch->pcdata->cot_clans); send_to_char(buf,ch); for (level = COT_BANNED; level <= COT_EXPERT; level++) { switch (level) { default: break; case COT_BANNED: if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[level] > POW_NONE) send_to_char("Banned disciplines:",ch); break; case COT_BASIC: if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[level] > POW_NONE) send_to_char("Basic disciplines required (Level 1+):",ch); break; case COT_INTERMEDIATE: if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[level] > POW_NONE) send_to_char("Intermediate disciplines required (Level 3+):",ch); break; case COT_ADVANCED: if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[level] > POW_NONE) send_to_char("Advanced disciplines required (Level 5+):",ch); break; case COT_EXPERT: if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[level] > POW_NONE) send_to_char("Expert disciplines required (Level 6+):",ch); break; } if (IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION) && ch->pcdata->cot_min[level] <= POW_NONE) { send_to_char(" None.\n\r",ch); continue; } if (IS_SET(ch->pcdata->cot_min[level], POW_ANIMALISM)) send_to_char(" Animalism",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_AUSPEX)) send_to_char(" Auspex",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_CELERITY)) send_to_char(" Celerity",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_CHIMERSTRY)) send_to_char(" Chimerstry",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_DAIMOINON)) send_to_char(" Daimoinon",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_DOMINATE)) send_to_char(" Dominate",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_FORTITUDE)) send_to_char(" Fortitude",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_MELPOMINEE)) send_to_char(" Melpominee",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_NECROMANCY)) send_to_char(" Necromancy",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_OBEAH)) send_to_char(" Obeah",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_OBFUSCATE)) send_to_char(" Obfuscate",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_OBTENEBRATION)) send_to_char(" Obtenebration",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_POTENCE)) send_to_char(" Potence",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_PRESENCE)) send_to_char(" Presence",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_PROTEAN)) send_to_char(" Protean",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_QUIETUS)) send_to_char(" Quietus",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_SERPENTIS)) send_to_char(" Serpentis",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_THANATOSIS)) send_to_char(" Thanatosis",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_THAUMATURGY)) send_to_char(" Thaumaturgy",ch); if (IS_SET(ch->pcdata->cot_min[level], POW_VICISSITUDE)) send_to_char(" Vicissitude",ch); if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[level] > POW_NONE) send_to_char(".\n\r",ch); } if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[COT_HP] > 0 ) { sprintf(buf, "Minimum number of hit points required: %d.\n\r", ch->pcdata->cot_min[COT_HP]); send_to_char(buf,ch); } if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[COT_GENERATION] < 13 ) { sprintf(buf, "Highest generation permitted: %d.\n\r", ch->pcdata->cot_min[COT_GENERATION]); send_to_char(buf,ch); } if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[COT_SKILL] > 0 ) { sprintf(buf, "Minimum weapon skill required: %d.\n\r", ch->pcdata->cot_min[COT_SKILL]); send_to_char(buf,ch); } if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_ADV_STANCE)) { if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[COT_STANCE] > 0 ) { sprintf(buf, "Minimum advanced stance level required: %d.\n\r", ch->pcdata->cot_min[COT_STANCE]); send_to_char(buf,ch); } else send_to_char("You must have an advanced stance to join.\n\r",ch); } else if ((IS_MORE(ch, MORE_LEADER) && !IS_MORE(ch, MORE_CHAMPION)) || ch->pcdata->cot_min[COT_STANCE] > 0 ) { sprintf(buf, "Minimum stance level required: %d.\n\r", ch->pcdata->cot_min[COT_STANCE]); send_to_char(buf,ch); } if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_GOLCONDA)) send_to_char("You must have (and keep) Golconda.\n\r",ch); if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_DIABLERIE)) send_to_char("You must never commit diablerie.\n\r",ch); if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_SECT)) send_to_char("You must never decapitate someone of your sect.\n\r",ch); if (IS_SET(ch->pcdata->cot_min[COT_EXTRA], COT_NO_KILL_COTERIE)) send_to_char("You must never decapitate someone within the coterie.\n\r",ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); return; } void do_reina( CHAR_DATA *ch, char *argument ) { char buf [MAX_INPUT_LENGTH]; CHAR_DATA *rch; if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_MELPOMINEE) < 2) { send_to_char("You require level 2 Melpominee to sing the Song of Reina.\n\r",ch); return; } if (ch->in_room == NULL) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_MORE(ch, MORE_NEUTRAL)) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_MORE(ch, MORE_REINA)) { REMOVE_BIT(ch->more, MORE_REINA); REMOVE_BIT(ch->in_room->room_flags, ROOM_SAFE); send_to_char("The peaceful harmony in the air gradually fades away to nothing.\n\r", ch); act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); act("The peaceful harmony in the air gradually fades away to nothing.",ch,NULL,NULL,TO_ROOM); ch->pcdata->reina = 60; return; } if (IS_SET(ch->in_room->room_flags, ROOM_SAFE)) { send_to_char("You are unable to sing the Song of Reina here.\n\r", ch); return; } if (ch->pcdata->reina > 0) { if (ch->pcdata->reina > 1) sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina); else sprintf(buf,"Your voice will not recover for another 1 second.\n\r"); send_to_char(buf,ch); return; } SET_BIT(ch->in_room->room_flags, ROOM_SAFE); SET_BIT(ch->more, MORE_REINA); ch->pcdata->reina = 60; send_to_char("You sing the Song of Reina.\n\r", ch); act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM ); send_to_char("The air is filled with peaceful harmony.\n\r", ch); act("The air is filled with peaceful harmony.",ch,NULL,NULL,TO_ROOM); for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room ) { if ( rch->fighting != NULL ) stop_fighting( rch, TRUE ); } return; } void do_jail( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; int sn; int level; int spelltype; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_DEMON(ch)) { send_to_char("Huh?\n\r",ch); return; } if ( !IS_SET( ch->pcdata->disc[O_POWERS], DEM_JAIL ) ) { send_to_char( "You have not been granted the power of Jail.\n\r", ch ); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char("Who do you wish to use Jail of Water on?\n\r",ch); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } if ( ch == victim ) { if (is_affected(ch, gsn_jail)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); affect_strip(ch, gsn_jail); } else if (IS_AFFECTED(ch, AFF_JAIL)) { act("The band of water entrapping $n splash to the ground.",ch,NULL,NULL,TO_ROOM); send_to_char("The bands of water entrapping you splash to the ground.\n\r",ch); REMOVE_BIT(ch->affected_by, AFF_JAIL); } else send_to_char( "Nothing happens.\n\r", ch ); return; } if ( IS_AFFECTED(victim, AFF_ETHEREAL) ) { send_to_char( "You cannot use Jail of Water on an ethereal person.\n\r", ch ); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Jail of Water on you.",ch,NULL,victim,TO_VICT); } return; } if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Jail of Water on you.",ch,NULL,victim,TO_VICT); } return; } if ( ( sn = skill_lookup( "jail" ) ) < 0 ) return; spelltype = skill_table[sn].target; level = number_range(10,50); (*skill_table[sn].spell_fun) ( sn, level, ch, victim ); WAIT_STATE( ch, 15 ); return; } void do_flames( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; int dam, hp, sn; char arg[MAX_INPUT_LENGTH]; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch)) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch,DISC_DAIMOINON) < 7) { send_to_char("You require level 7 Daimoinon to use Flames of the Nether World.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char( "Who do you wish to strike with the Flames of the Nether World?\n\r", ch ); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } if ( is_safe(ch, victim) ) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Flames of the Nether World on you.",ch,NULL,victim,TO_VICT); } return; } if ( ch == victim ) { send_to_char( "Now that would be just plain stupid.\n\r", ch ); return; } if ( ( sn = skill_lookup( "flame bolt" ) ) < 0 ) { send_to_char( "Bug - please inform Morglum.\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); if (IS_ITEMAFF(victim, ITEMA_FIRESHIELD)) { send_to_char("Nothing happens.\n\r",ch); WAIT_STATE(ch, 6); return; } if (!IS_NPC(victim) && victim->pcdata->atm >= number_percent()) { send_to_char("Nothing happens.\n\r",ch); WAIT_STATE(ch, 6); return; } dam = number_range(50,100) * get_disc(ch,DISC_DAIMOINON); hp = victim->hit; if (!IS_NPC(victim) && IS_VAMPIRE(victim) ) damage( ch, victim, (dam*2), sn ); else damage( ch, victim, dam, sn ); WAIT_STATE(ch, 6); if (victim == NULL || victim->position == POS_DEAD) return; else if (!IS_MORE(victim, MORE_FLAMES)) { send_to_char("You are engulfed in infernal flames!\n\r",victim); act("$n is engulfed in infernal flames!",victim,NULL,NULL,TO_ROOM); SET_BIT(victim->affected_by, AFF_FLAMING); SET_BIT(victim->more, MORE_FLAMES); } update_pos(victim); return; } void do_courage( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_MELPOMINEE) < 3) { send_to_char("You require level 3 Melpominee to sing the Song of Courage.\n\r",ch); return; } if (ch->pcdata->reina > 0) { if (ch->pcdata->reina > 1) sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina); else sprintf(buf,"Your voice will not recover for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who do you wish to use Courage on?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == 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; } send_to_char("You sing the Song of Courage.\n\r", ch); act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM ); ch->pcdata->reina = 60; if (IS_MORE(victim, MORE_COURAGE)) { if (!IS_NPC(victim) && victim->pcdata->resist[WILL_PRESENCE] > 0 && ch != victim) { send_to_char("They resist you.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to remove Courage from you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && IS_WILLPOWER(victim, RES_PRESENCE) && victim->pcdata->willpower[0] >= 10 && ch != victim) { victim->pcdata->willpower[0] -= 10; victim->pcdata->resist[WILL_PRESENCE] = 60; if (!IS_WILLPOWER(victim, RES_TOGGLE)) REMOVE_BIT(victim->pcdata->resist[0], RES_PRESENCE); send_to_char("You burn some willpower to resist Anger.\n\r",victim); send_to_char("They resist you.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to remove Courage from you.",ch,NULL,victim,TO_VICT); } return; } if (ch != victim) send_to_char("You remove their Courage.\n\r",ch); send_to_char("You no longer feel quite so brave.\n\r",victim); WAIT_STATE( ch, 12 ); return; } if (ch != victim) send_to_char("You grant them great Courage.\n\r",ch); send_to_char("You suddenly feel very brave.\n\r",victim); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Courage on you.",ch,NULL,victim,TO_VICT); } SET_BIT(ch->more, MORE_COURAGE); WAIT_STATE( ch, 12 ); return; } void do_anger( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_MELPOMINEE) < 5) { send_to_char("You require level 5 Melpominee to sing the Song of Anger.\n\r",ch); return; } if (ch->pcdata->reina > 0) { if (ch->pcdata->reina > 1) sprintf(buf,"Your voice will not recover for another %d seconds.\n\r",ch->pcdata->reina); else sprintf(buf,"Your voice will not recover for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who do you wish to use the Song of Anger on?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == 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; } send_to_char("You sing the Song of Anger.\n\r", ch); act("$n sings a beautiful, haunting song.", ch, NULL, NULL, TO_ROOM ); ch->pcdata->reina = 60; if (IS_MORE(victim, MORE_ANGER)) { send_to_char("You no longer feel so angry.\n\r",victim); act("$n regains $s temper.",victim,NULL,NULL,TO_ROOM); REMOVE_BIT(victim->more, MORE_ANGER); WAIT_STATE( ch, 12 ); return; } if (!IS_NPC(victim) && victim->pcdata->resist[WILL_PRESENCE] > 0 && ch != victim) { send_to_char("They resist you.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Anger on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && IS_WILLPOWER(victim, RES_PRESENCE) && victim->pcdata->willpower[0] >= 10 && ch != victim) { victim->pcdata->willpower[0] -= 10; victim->pcdata->resist[WILL_PRESENCE] = 60; if (!IS_WILLPOWER(victim, RES_TOGGLE)) REMOVE_BIT(victim->pcdata->resist[0], RES_PRESENCE); send_to_char("You burn some willpower to resist Anger.\n\r",victim); send_to_char("They resist you.\n\r",ch); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Anger on you.",ch,NULL,victim,TO_VICT); } return; } if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Anger on you.",ch,NULL,victim,TO_VICT); } if (IS_MORE(victim, MORE_CALM)) { send_to_char("You no longer feel so calm.\n\r",victim); act("$n no longer seems quite so calm.",victim,NULL,NULL,TO_ROOM); REMOVE_BIT(victim->more, MORE_CALM); WAIT_STATE( ch, 12 ); return; } send_to_char("You suddenly feel very angry!\n\r",victim); act("$n snarls with anger.",victim,NULL,NULL,TO_ROOM); SET_BIT(victim->more, MORE_ANGER); WAIT_STATE( ch, 12 ); return; } void do_panacea( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_OBEAH) < 1) { send_to_char("You require level 1 Obeah to use Panacea.\n\r",ch); return; } if (ch->pcdata->obeah > 0) { if (ch->pcdata->obeah > 1) sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah); else sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who do you want to heal with Panacea?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (IS_EVIL(victim)) { send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch ); return; } if (!IS_MORE(ch, MORE_OBEAH)) do_obeah(ch,""); if (victim->loc_hp[6] > 0) { int sn = skill_lookup( "clot" ); act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM ); send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch ); ch->pcdata->obeah = 5; (*skill_table[sn].spell_fun) (sn,ch->level,ch,victim); } else { if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] + victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5]) != 0) { act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM ); send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch ); ch->pcdata->obeah = 10; reg_mend(victim); } else if (victim->hit < victim->max_hit) { victim->hit += get_disc(ch, DISC_OBEAH) * 1000; victim->agg -= get_disc(ch, DISC_OBEAH); if (victim->agg < 0) victim->agg = 0; act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM ); send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch ); ch->pcdata->obeah = 30; update_pos(victim); if (victim->hit >= victim->max_hit) { victim->hit = victim->max_hit; send_to_char("You have been completely healed!\n\r",victim); act("$n's wounds have been completely healed!",victim,NULL,NULL,TO_ROOM); } else { send_to_char("Your wounds begin to heal!\n\r",victim); act("$n's wounds begin to heal!",victim,NULL,NULL,TO_ROOM); } } else { send_to_char("They don't require any healing.\n\r",ch); return; } } if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Panacea on you.",ch,NULL,victim,TO_VICT); } return; } void do_anesthetic( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_OBEAH) < 2) { send_to_char("You require level 2 Obeah to use Anesthetic Touch.\n\r",ch); return; } if (ch->pcdata->obeah > 0) { if (ch->pcdata->obeah > 1) sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah); else sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who do you want to use Anesthetic Touch on?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (IS_EVIL(victim)) { send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch ); return; } if (!IS_MORE(ch, MORE_OBEAH)) do_obeah(ch,""); act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM ); send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch ); ch->pcdata->obeah = 30; if (IS_MORE(victim, MORE_CALM)) { send_to_char("You remove their immunity to pain.\n\r",ch); send_to_char("You no longer feel so oblivious to pain.\n\r",victim); REMOVE_BIT(victim->more, MORE_NOPAIN); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just removed Anesthetic Touch from you.",ch,NULL,victim,TO_VICT); } return; } send_to_char("You make them immune to pain.\n\r",ch); send_to_char("You feel completely oblivious to pain.\n\r",victim); SET_BIT(victim->more, MORE_NOPAIN); if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Anesthetic Touch on you.",ch,NULL,victim,TO_VICT); } return; } void do_neutral( CHAR_DATA *ch, char *argument ) { char buf [MAX_INPUT_LENGTH]; CHAR_DATA *rch; if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_OBEAH) < 3) { send_to_char("You require level 3 Obeah to create a Neutral Guard.\n\r",ch); return; } if (ch->pcdata->obeah > 0 && !IS_MORE(ch, MORE_NEUTRAL)) { if (ch->pcdata->obeah > 1) sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah); else sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r"); send_to_char(buf,ch); return; } if (ch->in_room == NULL) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_MORE(ch, MORE_REINA)) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_MORE(ch, MORE_NEUTRAL)) { REMOVE_BIT(ch->more, MORE_NEUTRAL); REMOVE_BIT(ch->in_room->room_flags, ROOM_SAFE); act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("The peaceful harmony in the air gradually fades away to nothing.\n\r", ch); act("The peaceful harmony in the air gradually fades away to nothing.",ch,NULL,NULL,TO_ROOM); ch->pcdata->obeah = 30; return; } if (IS_SET(ch->in_room->room_flags, ROOM_SAFE)) { send_to_char("You are unable to create a Neutral Guard here.\n\r", ch); return; } SET_BIT(ch->in_room->room_flags, ROOM_SAFE); SET_BIT(ch->more, MORE_NEUTRAL); act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM ); send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch ); ch->pcdata->obeah = 30; send_to_char("The air is filled with peaceful harmony.\n\r", ch); act("The air is filled with peaceful harmony.",ch,NULL,NULL,TO_ROOM); for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room ) { if ( rch->fighting != NULL ) stop_fighting( rch, TRUE ); } return; } void do_unburden( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_OBEAH) < 4) { send_to_char("You require level 4 Obeah to Unburden the Bestial Soul.\n\r",ch); return; } if (ch->pcdata->obeah > 0) { if (ch->pcdata->obeah > 1) sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah); else sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who's Soul do you wish to Unburden?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (ch == victim) { send_to_char( "You may not do this too yourself.\n\r", ch ); return; } if (!IS_VAMPIRE(victim) || IS_ABOMINATION(victim) || IS_LICH(victim)) { send_to_char( "You can only Unburden the Soul of a Kindred.\n\r", ch ); return; } if (!IS_IMMUNE(victim,IMM_VAMPIRE)) { send_to_char( "They must lower their defences before you can try to Unburden their Soul.\n\r", ch ); return; } if (victim->position > POS_RESTING) { send_to_char( "You better get them to sit down first.\n\r", ch ); return; } if (victim->beast == 100) { send_to_char( "Their Soul is too Bestial to Unburden.\n\r", ch ); return; } if (IS_EVIL(victim)) { send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch ); return; } if (!IS_MORE(ch, MORE_OBEAH)) do_obeah(ch,""); act( "You place your hands against $N's chest.", ch, NULL, victim, TO_CHAR ); act( "$n places $s hands against your chest.", ch, NULL, victim, TO_VICT ); act( "$n places $s hands against $N's chest.", ch, NULL, victim, TO_NOTVICT ); if (victim->beast > victim->truebeast && victim->beast > 1) { act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM ); send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch ); victim->beast -= get_disc(ch, DISC_OBEAH); if ( victim->beast < 1 ) victim->beast = 1; ch->pcdata->obeah = 30; if (victim->beast < victim->truebeast) victim->beast = victim->truebeast; send_to_char("You feel their beast weaken it's grip!\n\r",ch); send_to_char("You feel your beast weaken it's grip!\n\r",victim); } else { send_to_char("You are unable to help them any further.\n\r",ch); return; } if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Unburden the Bestial Soul on you.",ch,NULL,victim,TO_VICT); } send_to_char("Your hands drop to your sides.\n\r",ch); act( "$n's hands drop to $s sides.", ch, NULL, NULL, TO_ROOM ); return; } void do_renew( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; int sn, check, oldcheck; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch) && !IS_ANGEL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_OBEAH) < 5) { send_to_char("You require level 5 Obeah to use Renewed Vigor.\n\r",ch); return; } if (ch->position == POS_FIGHTING) { send_to_char("No way! You are still fighting!\n\r",ch); return; } if (ch->pcdata->obeah > 0) { if (ch->pcdata->obeah > 1) sprintf(buf,"You cannot call upon your Obeah powers for another %d seconds.\n\r",ch->pcdata->obeah); else sprintf(buf,"You cannot call upon your Obeah powers for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( arg[0] == '\0' ) { send_to_char( "Who do you want to use Renewed Vigor on?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They are not here.\n\r", ch ); return; } if (IS_EVIL(victim)) { send_to_char( "They are too evil to benefit from the powers of Obeah.\n\r", ch ); return; } if (!IS_MORE(ch, MORE_OBEAH)) do_obeah(ch,""); if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] + victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5] + victim->loc_hp[6]) == 0 && victim->hit == victim->max_hit) { send_to_char("They don't require any healing.\n\r",ch); return; } act( "$n's third eye begins to glow with an intense white light.", ch, NULL, NULL, TO_ROOM ); send_to_char( "Your third eye begins to glow with an intense white light.\n\r", ch ); ch->pcdata->obeah = 60; if ( (check = victim->loc_hp[6]) > 0) { oldcheck = 0; sn = skill_lookup( "clot" ); while ( oldcheck != (check = victim->loc_hp[6]) ) { oldcheck = check; (*skill_table[sn].spell_fun) (sn,ch->level,ch,victim); } } if ((check = (victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] + victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5])) > 0) { oldcheck = 0; while ( oldcheck != (check = victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] + victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5]) ) { oldcheck = check; reg_mend(victim); } } if (victim->hit < victim->max_hit) { victim->hit = victim->max_hit; victim->agg = 0; send_to_char("You have been completely healed!\n\r",victim); act("$n's wounds have been completely healed!",victim,NULL,NULL,TO_ROOM); update_pos(victim); } if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just used Renewed Vigor on you.",ch,NULL,victim,TO_VICT); } return; } void do_lick( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "You lick your lips and smile.\n\r", ch ); act("$n licks $s lips and smiles.",ch,NULL,NULL,TO_ROOM); return; } else if ( ( victim = get_char_room( ch, arg ) ) != NULL ) { if ( victim == ch ) { send_to_char( "You lick yourself.\n\r", ch ); act("$n licks $mself - YUCK.",ch,NULL,NULL,TO_ROOM); } else { act("You lick $M.",ch,NULL,victim,TO_CHAR); act("$n licks you.",ch,NULL,victim,TO_VICT); act("$n licks $N.",ch,NULL,victim,TO_NOTVICT); } return; } else { if (IS_VAMPIRE(ch)) { if (!str_cmp(arg,"l") || !str_cmp(arg,"left")) { if (!IS_ARM_L(ch, SLIT_WRIST)) { send_to_char("Your left wrist doesn't need licking shut.\n\r",ch); return; } act("You lick shut the cut in your left wrist.",ch,NULL,NULL,TO_CHAR); act("$n licks shut the cut in $s left wrist.",ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->loc_hp[6], BLEEDING_WRIST_L); REMOVE_BIT(ch->loc_hp[LOC_ARM_L], SLIT_WRIST); return; } else if (!str_cmp(arg,"r") || !str_cmp(arg,"right")) { if (!IS_ARM_R(ch, SLIT_WRIST)) { send_to_char("Your right wrist doesn't need licking shut.\n\r",ch); return; } act("You lick shut the cut in your right wrist.",ch,NULL,NULL,TO_CHAR); act("$n licks shut the cut in $s right wrist.",ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->loc_hp[6], BLEEDING_WRIST_R); REMOVE_BIT(ch->loc_hp[LOC_ARM_R], SLIT_WRIST); return; } } send_to_char( "They aren't here.\n\r", ch ); return; } return; } void do_breath( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj_lose; OBJ_DATA *obj_next; int dam, sn; one_argument( argument, arg ); if (IS_NPC(ch)) return; if ( ( sn = skill_lookup( "gas breath" ) ) < 0 ) { send_to_char( "Bug...please inform Morglum.\n\r", ch ); return; } if (!IS_VAMPIRE(ch) && !IS_GHOUL(ch)) { send_to_char( "Huh?\n\r", ch ); return; } if (get_disc(ch,DISC_SERPENTIS) < 5) { send_to_char("You require level 5 Serpentis to use Breath of the Basilisk.\n\r",ch); return; } if (IS_ITEMAFF(ch, ITEMA_PEACE)) do_majesty(ch,""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char("Who do you wish to use Breath of the Basilisk on?\n\r",ch); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } if (is_safe(ch,victim)) { if (!IS_NPC(victim) && ch != victim && IS_MORE(victim, MORE_GUARDIAN)) { guardian_message( victim ); act("$n just failed to use Breath of the Basilisk on you.",ch,NULL,victim,TO_VICT); } return; } dam = number_range(500,1000) * get_disc(ch, DISC_SERPENTIS) * get_disc(ch, DISC_SERPENTIS); if ( !IS_AWAKE(victim) ) dam *= 2; damage( ch, victim, dam, sn + TYPE_ADD_AGG ); WAIT_STATE( ch, 6 ); if ( number_percent( ) < (get_disc(ch,DISC_SERPENTIS) << 2) ) { for (obj_lose = victim->carrying; obj_lose != NULL; obj_lose = obj_next) { obj_next = obj_lose->next_content; if ( IS_SET( obj_lose->quest, QUEST_RELIC ) || IS_SET( obj_lose->quest, QUEST_ARTIFACT ) ) continue; if ( obj_lose->points > 0 ) continue; if ( IS_SET( obj_lose->quest, QUEST_SPELLPROOF ) ) continue; if ( obj_lose->item_type == ITEM_PAGE || obj_lose->item_type == ITEM_BOOK ) continue; if ( obj_lose->wear_loc == WEAR_NONE ) continue; if ( number_bits( 2 ) != 0 ) continue; switch ( obj_lose->item_type ) { case ITEM_ARMOR: if ( obj_lose->condition > 0 ) { act( "$p is pitted and etched!", victim, obj_lose, NULL, TO_CHAR ); obj_lose->condition -= 25; if ( obj_lose->condition < 1 ) extract_obj( obj_lose ); } break; case ITEM_SCROLL: case ITEM_WAND: case ITEM_STAFF: case ITEM_TRASH: case ITEM_POTION: case ITEM_FURNITURE: case ITEM_FOOD: case ITEM_BOAT: case ITEM_PILL: case ITEM_CORPSE_NPC: case ITEM_DRINK_CON: case ITEM_CONTAINER: act( "$p fumes and dissolves!", victim, obj_lose, NULL, TO_CHAR ); extract_obj( obj_lose ); break; } } } return; } void do_celerity( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( (IS_NPC(ch) || (!IS_VAMPIRE(ch) && !IS_GHOUL(ch))) && get_disc(ch, DISC_CELERITY) < 1 ) { send_to_char("Huh?\n\r",ch); return; } if (get_disc(ch, DISC_CELERITY) < 1) { send_to_char("But you don't have any Celerity!\n\r",ch); return; } if (arg[0] != '\0') { if (!str_cmp(arg,"renew")) { if (IS_WILLPOWER(ch, RES_CELERITY)) { send_to_char("You will no longer automatically renew Celerity when you are in a fight.\n\r",ch); REMOVE_BIT(ch->pcdata->resist[0], RES_CELERITY); } else { send_to_char("You will now automatically renew Celerity when you are in a fight.\n\r",ch); SET_BIT(ch->pcdata->resist[0], RES_CELERITY); } } else send_to_char("Type 'celerity' to activate, or 'celerity renew' to toggle autorenew.\n\r",ch); return; } else { if ( ch->blood[BLOOD_CURRENT] < 10 ) { send_to_char("You have insufficient blood.\n\r",ch); return; } if ( ch->pcdata->celerity > 60 ) { send_to_char("You are unable to burn any more blood for celerity.\n\r",ch); return; } else { if ( ch->pcdata->celerity > 0 ) send_to_char("You burn some more blood to keep your celerity running longer.\n\r",ch); else { send_to_char("You start moving with supernatural speed!\n\r",ch); act("$n starts moving with supernatural speed!",ch,NULL,NULL,TO_ROOM); } ch->pcdata->celerity += 60; ch->blood[BLOOD_CURRENT] -= 10; return; } } return; } void guardian_message( CHAR_DATA *ch ) { if ( IS_DEMON(ch) ) { if ( IS_ANGEL(ch) ) { send_to_char("Your little cherub whispers softly into your ear:\n\r",ch); act( "A little cherub on $n's shoulder whispers something into $n's ear.",ch,NULL,NULL,TO_ROOM); } else { send_to_char("Your pet imp whispers softly into your ear:\n\r",ch); act( "A tiny imp on $n's shoulder whispers something into $n's ear.",ch,NULL,NULL,TO_ROOM); } } else send_to_char("Your guardian spirit sends you a telepathic message:\n\r",ch); return; }