/***************************************************************************
* 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 copyright (C) 1994, 1995, 1996 by Richard Woolcock *
* *
* Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
* This mud is NOT to be copied in whole or in part, or to be run without *
* the permission of Matthew Little. 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"
#include "garou.h"
extern bool nosafe;
/*
* Local functions.
*/
NCLANS_DATA *nclans_table;
void adv_spell_damage args ((CHAR_DATA * ch, OBJ_DATA * book,
OBJ_DATA * page, char *argument));
void adv_spell_affect args ((CHAR_DATA * ch, OBJ_DATA * book,
OBJ_DATA * page, char *argument));
void adv_spell_action args ((CHAR_DATA * ch, OBJ_DATA * book,
OBJ_DATA * page, char *argument));
void birth_write args ((CHAR_DATA * ch, char *argument));
bool birth_ok args ((CHAR_DATA * ch, char *argument));
/* Need to get rid of those flames somehow - KaVir */
void do_smother (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (arg[0] == '\0')
{
send_to_char ("Smother whom?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char
("You cannot smother yourself.\n\rUse 'rolldirt' instead.\n\r", ch);
return;
}
if (!IS_AFFECTED (victim, AFF_FLAMING))
{
send_to_char ("But they are not on fire!\n\r", ch);
return;
}
if (number_percent () > (ch->level * 2))
{
act ("You try to smother the flames around $N but fail!", ch, NULL,
victim, TO_CHAR);
act ("$n tries to smother the flames around you but fails!", ch, NULL,
victim, TO_VICT);
act ("$n tries to smother the flames around $N but fails!", ch, NULL,
victim, TO_NOTVICT);
if (number_percent () > 98 && !IS_AFFECTED (ch, AFF_FLAMING) && !WORN_ARTIFACT (ch, ARTI_DEMONS_HEART))
{
act ("A spark of flame from $N's body sets you on fire!", ch, NULL,
victim, TO_CHAR);
act ("A spark of flame from your body sets $n on fire!", ch, NULL,
victim, TO_VICT);
act ("A spark of flame from $N's body sets $n on fire!", ch, NULL,
victim, TO_NOTVICT);
SET_BIT (ch->affected_by, AFF_FLAMING);
do_humanity (ch, "");
}
return;
}
act ("You manage to smother the flames around $M!", ch, NULL, victim,
TO_CHAR);
act ("$n manages to smother the flames around you!", ch, NULL, victim,
TO_VICT);
act ("$n manages to smother the flames around $N!", ch, NULL, victim,
TO_NOTVICT);
REMOVE_BIT (victim->affected_by, AFF_FLAMING);
do_humanity (ch, "");
return;
}
DO_COM (do_rolldirt)
{
CHAR_DATA *vch;
bool set_fire = FALSE;
if (!IS_AFFECTED (ch, AFF_FLAMING))
{
send_to_char ("You are not on fire.\n\r", ch);
return;
}
act ("$n rolls about in the dirt.", ch, NULL, NULL, TO_ROOM);
send_to_char ("You roll about in the dirt.\n\r", ch);
if (IS_AFFECTED (ch, AFF_FLAMING) && number_percent () > 80
&& ch->in_room != NULL)
{
set_fire = TRUE;
for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
{
if (number_percent () < 65)
continue;
if (!IS_HERO (vch))
continue;
if (IS_IMMORTAL (vch))
continue;
if (IS_AFFECTED (vch, AFF_FLAMING))
continue;
if (WORN_ARTIFACT (vch, ARTI_DEMONS_HEART))
continue;
act ("A spark leaps from $n's body and sets you on fire!", ch, NULL,
vch, TO_VICT);
act ("A spark leaps from your body and sets $N on fire!", ch, NULL,
vch, TO_CHAR);
act ("A sprak leaps from $n's body and sets $N on fire!", ch, NULL,
vch, TO_NOTVICT);
SET_BIT (vch->affected_by, AFF_FLAMING);
}
}
if (set_fire)
return;
if (number_percent () < 25)
{
send_to_char ("The flames around your body die out.\n\r", ch);
act ("The flames around $n's body die out.", ch, NULL, NULL, TO_ROOM);
REMOVE_BIT (ch->affected_by, AFF_FLAMING);
}
return;
}
/* Loads of Vampire powers follow. KaVir */
void do_fangs (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
{
if (!IS_DEMPOWER (ch, DEM_FANGS))
{
send_to_char ("You haven't been granted the gift of fangs.\n\r", ch);
return;
}
}
else if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_WEREWOLF))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
{
send_to_char ("Your beast won't let you retract your fangs.\n\r", ch);
return;
}
if (IS_VAMPAFF (ch, VAM_FANGS))
{
send_to_char ("Your fangs slide back into your gums.\n\r", ch);
act ("$n's fangs slide back into $s gums.", ch, NULL, NULL, TO_ROOM);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
return;
}
send_to_char ("Your fangs extend out of your gums.\n\r", ch);
act ("A pair of razor sharp fangs extend from $n's mouth.", ch, NULL, NULL,
TO_ROOM);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
return;
}
void do_shift (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
int toform = 0;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF))
{
do_rand_typo (ch);
return;
}
if (arg[0] == '\0')
{
send_to_char
("You can shift between the following forms: Homid, Glabro, Crinos, Hispo, Lupus.\n\r",
ch);
return;
}
if (!str_cmp (arg, "homid"))
toform = 1;
else if (!str_cmp (arg, "glabro"))
toform = 2;
else if (!str_cmp (arg, "crinos"))
toform = 3;
else if (!str_cmp (arg, "hispo"))
toform = 4;
else if (!str_cmp (arg, "lupus"))
toform = 5;
else
{
send_to_char
("You can shift between the following forms: Homid, Glabro, Crinos, Hispo, Lupus.\n\r",
ch);
return;
}
if (ch->pcdata->stats[UNI_FORM0] < 1 || ch->pcdata->stats[UNI_FORM0] > 5)
ch->pcdata->stats[UNI_FORM0] = 1;
if (ch->pcdata->stats[UNI_FORM0] == toform)
{
send_to_char ("You are already in that form.\n\r", ch);
return;
}
ch->pcdata->stats[UNI_FORM1] = toform;
return;
}
void do_claws (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
{
if (!IS_DEMPOWER (ch, DEM_CLAWS))
{
send_to_char ("You haven't been granted the gift of claws.\n\r", ch);
return;
}
}
else if (IS_CLASS (ch, CLASS_NINJA))
{
if (ch->pcdata->powers[NPOWER_NINGENNO] < 1)
{
send_to_char
("You have not learned the Ningenno principle to 1.\n\r", ch);
return;
}
if (ch->move < 500)
{
send_to_char ("You don't have enough movement points!\n\r", ch);
return;
}
}
else if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_DRAGON)
&& !IS_CLASS (ch, CLASS_WEREWOLF))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_PROT) < 2)
{
send_to_char ("You need level 2 protean first.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
{
send_to_char ("Your beast won't let you retract your claws.\n\r", ch);
return;
}
if (IS_VAMPAFF (ch, VAM_CLAWS))
{
if (IS_CLASS (ch, CLASS_VAMPIRE))
{
send_to_char ("Your claws slide back under your nails.\n\r", ch);
act ("$n's claws slide back under $s nails.", ch, NULL, NULL,
TO_ROOM);
}
else if (IS_CLASS (ch, CLASS_NINJA)
&& ch->pcdata->powers[NPOWER_NINGENNO] > 0)
{
send_to_char ("You shove your iron claws up your sleeves.\n\r", ch);
act ("$n shoves $s iron claws up $e sleeves.", ch, NULL, NULL,
TO_ROOM);
}
else
{
send_to_char ("Your talons slide back into your fingers.\n\r", ch);
act ("$n's talons slide back into $s fingers.", ch, NULL, NULL,
TO_ROOM);
}
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE))
{
send_to_char ("Sharp claws extend from under your finger nails.\n\r",
ch);
act ("Sharp claws extend from under $n's finger nails.", ch, NULL, NULL,
TO_ROOM);
}
else if (IS_CLASS (ch, CLASS_NINJA)
&& ch->pcdata->powers[NPOWER_NINGENNO] > 0)
{
send_to_char ("Iron claws come sliding from your sleeves.\n\r", ch);
act ("Iron claws come sliding from under $n's sleeves.", ch, NULL, NULL,
TO_ROOM);
ch->move -= 500;
}
else
{
send_to_char ("Razor sharp talons extend from your fingers.\n\r", ch);
act ("Razor sharp talons extend from $n's fingers.", ch, NULL, NULL,
TO_ROOM);
}
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
return;
}
void do_nightsight (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_DEMON)
&& !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS (ch, CLASS_WEREWOLF)
&& !IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_DRAGON)
&& !IS_SET (ch->special, SPC_CHAMPION))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_HIGHLANDER))
{
if (!IS_DEMPOWER (ch, HPOWER_NIGHTSIGHT))
{
stc ("You have not gained the power of vision.\n\r", ch);
return;
}
}
if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
{
if (!IS_DEMPOWER (ch, DEM_EYES))
{
send_to_char ("You haven't been granted the gift of nightsight.\n\r",
ch);
return;
}
}
if (IS_CLASS (ch, CLASS_DRAGON)
&& !IS_SET (ch->pcdata->dragonaff, DRA_TRUESIGHT))
{
send_to_char ("You don't have sight beyond sight yet.\n\r", ch);
return;
}
else if (IS_CLASS (ch, CLASS_WEREWOLF))
{
if (ch->gifts[METIS] < 3)
{
do_rand_typo (ch);
return;
}
}
else if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_PROT) < 1
&& get_disc(ch, VAM_OBTE) < 3)
{
send_to_char ("You need level 1 protean first.\n\r", ch);
return;
}
else if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 1)
{
stc ("You must obtain a level one knowledge of Awareness first.\n\r",
ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
{
send_to_char ("Not while your beast is in control.\n\r", ch);
return;
}
if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
{
send_to_char ("The red glow in your eyes fades.\n\r", ch);
act ("The red glow in $n's eyes fades.", ch, NULL, NULL, TO_ROOM);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
return;
}
send_to_char ("Your eyes start glowing red.\n\r", ch);
act ("$n's eyes start glowing red.", ch, NULL, NULL, TO_ROOM);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
return;
}
void do_anarch (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 (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (strlen (ch->clan) > 1)
{
send_to_char ("But you are already in a clan!\n\r", ch);
return;
}
if (IS_SET (ch->special, SPC_INCONNU))
{
send_to_char ("But you are already an Inconnu!\n\r", ch);
return;
}
if (IS_SET (ch->special, SPC_ANARCH))
{
send_to_char ("You are no longer an Anarch.\n\r", ch);
sprintf (buf, "%s is no longer an Anarch!", ch->name);
class_info (buf, ch);
REMOVE_BIT (ch->special, SPC_ANARCH);
return;
}
send_to_char ("You are now an Anarch.\n\r", ch);
sprintf (buf, "%s is now an Anarch!", ch->name);
class_info (buf, ch);
SET_BIT (ch->special, SPC_ANARCH);
return;
}
void do_rogue (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DEMON))
{
do_rand_typo (ch);
return;
}
if (strlen (ch->clan) > 1)
{
send_to_char ("But you are already in a clan!\n\r", ch);
return;
}
if (IS_SET (ch->special, SPC_ANARCH))
{
send_to_char ("You are no longer a Rogue.\n\r", ch);
REMOVE_BIT (ch->special, SPC_ANARCH);
sprintf (buf, "%s is no longer a Rogue.", ch->name);
class_info (buf, ch);
return;
}
send_to_char ("You are now an Rogue.\n\r", ch);
SET_BIT (ch->special, SPC_ANARCH);
sprintf (buf, "%s is now a Demon Rogue.", ch->name);
class_info (buf, ch);
return;
}
void do_ronin (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF))
{
do_rand_typo (ch);
return;
}
if (strlen (ch->clan) > 1)
{
send_to_char ("But you are already in a clan!\n\r", ch);
return;
}
if (IS_SET (ch->special, SPC_ANARCH))
{
send_to_char ("You are no longer a Ronin.\n\r", ch);
REMOVE_BIT (ch->special, SPC_ANARCH);
sprintf (buf, "%s is no longer a Ronin.", ch->name);
class_info (buf, ch);
return;
}
send_to_char ("You are now an Ronin.\n\r", ch);
SET_BIT (ch->special, SPC_ANARCH);
sprintf (buf, "%s is now a Ronin.", ch->name);
class_info (buf, ch);
return;
}
void do_inconnu (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 (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (strlen (ch->clan) > 1 && ch->pcdata->stats[UNI_GEN] < 3)
{
send_to_char ("You cannot abandon your clan!\n\r", ch);
return;
}
if (ch->pcdata->rank < AGE_ELDER && ch->pcdata->stats[UNI_GEN] > 2)
{
send_to_char ("You must be at least an Elder to become an Inconnu.\n\r",
ch);
return;
}
if (IS_SET (ch->special, SPC_INCONNU))
{
send_to_char ("But you are already an Inconnu!\n\r", ch);
return;
}
if (ch->exp < 1000000)
{
send_to_char ("It costs 1000000 exp to become an Inconnu.\n\r", ch);
return;
}
if (IS_SET (ch->special, SPC_ANARCH))
REMOVE_BIT (ch->special, SPC_ANARCH);
free_string (ch->clan);
ch->clan = str_dup ("");
ch->exp -= 1000000;
send_to_char ("You are now an Inconnu.\n\r", ch);
sprintf (buf, "%s is now an Inconnu!", ch->name);
class_info (buf, ch);
SET_BIT (ch->special, SPC_INCONNU);
return;
}
void do_shadowsight (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
{
if (!IS_DEMPOWER (ch, DEM_SHADOWSIGHT))
{
send_to_char
("You haven't been granted the gift of shadowsight.\n\r", ch);
return;
}
}
else if (!IS_CLASS (ch, CLASS_WEREWOLF))
{
if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_MONK))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBTE) < 2)
{
send_to_char
("You are not trained in the Obtenebration discipline.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 2)
{
stc ("You must obtain a level two knowledge of Awareness first.\n\r",
ch);
return;
}
}
if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
{
send_to_char ("You can no longer see between planes.\n\r", ch);
REMOVE_BIT (ch->affected_by, AFF_SHADOWSIGHT);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE)
&& ch->pcdata->condition[COND_THIRST] < 10)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE))
ch->pcdata->condition[COND_THIRST] -= number_range (5, 10);
send_to_char ("You can now see between planes.\n\r", ch);
SET_BIT (ch->affected_by, AFF_SHADOWSIGHT);
return;
}
void do_bite (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
int clancount;
bool can_sire = FALSE;
bool outcast = FALSE;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE) || (ch->pcdata->stats[UNI_GEN] < 1))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->stats[UNI_CURRENT] == -1)
ch->pcdata->stats[UNI_CURRENT] = ch->pcdata->stats[UNI_AFF];
can_sire = FALSE;
if (ch->pcdata->stats[UNI_GEN] <= 6)
can_sire = TRUE;
if (!can_sire)
{
send_to_char ("You are not able to create any childer.\n\r", ch);
return;
}
clancount = 0;
if (IS_VAMPPASS (ch, VAM_VICISSITUDE))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_PROTEAN))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_CELERITY))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_FORTITUDE))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_POTENCE))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_OBFUSCATE))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_OBTENEBRATION))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_SERPENTIS))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_AUSPEX))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_DOMINATE))
clancount = clancount + 1;
if (IS_VAMPPASS (ch, VAM_PRESENCE))
clancount = clancount + 1;
if (arg[0] == '\0')
{
send_to_char ("Bite whom?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (IS_NPC (victim))
{
send_to_char ("Not on NPC's.\n\r", ch);
return;
}
if (IS_IMMORTAL (victim))
{
send_to_char ("Not on Immortal's.\n\r", ch);
return;
}
if (victim->max_hit < 3000)
{
stc ("You need 3000hps before you can be classed\n\r", victim);
stc ("They need 3000hps before they can be classed\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char ("You cannot bite yourself.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_MAGE))
{
send_to_char ("You cannot bite mages.\n\r", ch);
return;
}
if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
{
send_to_char ("You can only bite avatars.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_DROW))
{
send_to_char (" Not on a drow!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_MONK))
{
send_to_char ("You cannot bite monks.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_WEREWOLF))
{
send_to_char ("You are unable to create werevamps!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_VAMPIRE) && ch->beast != 100)
{
send_to_char ("But they are already a vampire!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_DROW))
{
send_to_char ("Not on drows!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_NINJA))
{
send_to_char ("You cannot bite ninjas.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_DEMON)
|| IS_SET (victim->special, SPC_CHAMPION))
{
send_to_char ("But they have no soul!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_HIGHLANDER))
{
send_to_char ("You cannot turn highlanders into vampires.\n\r", ch);
return;
}
if (!IS_IMMUNE (victim, IMM_VAMPIRE) && ch->beast != 100)
{
send_to_char ("You cannot bite an unwilling person.\n\r", ch);
return;
}
if (!IS_VAMPAFF (ch, VAM_FANGS) && ch->beast != 100)
{
send_to_char ("First you better get your fangs out!\n\r", ch);
return;
}
if (IS_VAMPAFF (ch, VAM_DISGUISED) && ch->beast != 100)
{
send_to_char ("You must reveal your true nature to bite someone.\n\r",
ch);
return;
}
if (ch->exp < 1000 && ch->beast != 100)
{
send_to_char ("You cannot afford the 1000 exp to create a childe.\n\r",
ch);
return;
}
if (ch->beast == 100 || ch->pcdata->stats[UNI_RAGE] > 0)
{
if (!IS_VAMPAFF (ch, VAM_FANGS))
do_fangs (ch, "");
act ("Your jaw opens wide and you leap hungrily at $N.", ch, NULL,
victim, TO_CHAR);
act ("$n's jaw opens wide and $e leaps hungrily at $N.", ch, NULL,
victim, TO_NOTVICT);
act ("$n's jaw opens wide and $e leaps hungrily at you.", ch, NULL,
victim, TO_VICT);
one_hit (ch, victim, -1, 0);
return;
}
if (ch->beast > 0)
ch->beast += 1;
ch->exp = ch->exp - 1000;
act ("You sink your teeth into $N.", ch, NULL, victim, TO_CHAR);
act ("$n sinks $s teeth into $N.", ch, NULL, victim, TO_NOTVICT);
act ("$n sinks $s teeth into your neck.", ch, NULL, victim, TO_VICT);
victim->class = CLASS_VAMPIRE;
if (victim->pcdata->stats[UNI_GEN] != 0)
{
save_char_obj (ch);
save_char_obj (victim);
send_to_char ("Your vampiric status has been restored.\n\r", victim);
return;
}
if (IS_SET (ch->special, SPC_SIRE) || ch->pcdata->stats[UNI_GEN] < 3
|| IS_SET (ch->special, SPC_PRINCE))
{
if (IS_SET (ch->special, SPC_SIRE))
REMOVE_BIT (ch->special, SPC_SIRE);
if (IS_SET (ch->special, SPC_ANARCH) && strlen (ch->clan) < 2)
outcast = TRUE;
}
else
outcast = TRUE;
send_to_char ("You are now a vampire.\n\r", victim);
victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
free_string (victim->lord);
if (ch->pcdata->stats[UNI_GEN] == 1)
victim->lord = str_dup (ch->name);
else
{
sprintf (buf, "%s %s", ch->lord, ch->name);
victim->lord = str_dup (buf);
}
if (ch->pcdata->stats[UNI_GEN] != 1)
{
if (victim->pcdata->stats[UNI_CURRENT] == -1)
victim->pcdata->stats[UNI_CURRENT] = victim->pcdata->stats[UNI_AFF];
/* Remove hp bonus from fortitude */
if (IS_VAMPPASS (victim, VAM_FORTITUDE)
&& !IS_VAMPAFF (victim, VAM_FORTITUDE))
{
victim->max_hit = victim->max_hit - 50;
victim->hit = victim->hit - 50;
if (victim->hit < 1)
victim->hit = 1;
}
/* Remove any old powers they might have */
if (IS_VAMPPASS (victim, VAM_PROTEAN))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_PROTEAN);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_PROTEAN);
}
if (IS_VAMPPASS (victim, VAM_VICISSITUDE))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_VICISSITUDE);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_VICISSITUDE);
}
if (IS_VAMPPASS (victim, VAM_CELERITY))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_CELERITY);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_CELERITY);
}
if (IS_VAMPPASS (victim, VAM_FORTITUDE))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_FORTITUDE);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_FORTITUDE);
}
if (IS_VAMPPASS (victim, VAM_POTENCE))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_POTENCE);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_POTENCE);
}
if (IS_VAMPPASS (victim, VAM_OBFUSCATE))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_OBFUSCATE);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_OBFUSCATE);
}
if (IS_VAMPPASS (victim, VAM_OBTENEBRATION))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_OBTENEBRATION);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_OBTENEBRATION);
}
if (IS_VAMPPASS (victim, VAM_SERPENTIS))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_SERPENTIS);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_SERPENTIS);
}
if (IS_VAMPPASS (victim, VAM_AUSPEX))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_AUSPEX);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_AUSPEX);
}
if (IS_VAMPPASS (victim, VAM_DOMINATE))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_DOMINATE);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_DOMINATE);
}
if (IS_VAMPPASS (victim, VAM_PRESENCE))
{
REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_PRESENCE);
REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_PRESENCE);
}
/* Give the vampire the base powers of their sire */
if (IS_VAMPPASS (ch, VAM_FORTITUDE)
&& !IS_VAMPAFF (victim, VAM_FORTITUDE))
{
victim->max_hit = victim->max_hit + 50;
victim->hit = victim->hit + 50;
}
if (IS_VAMPPASS (ch, VAM_PROTEAN))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_PROTEAN);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_PROTEAN);
}
if (IS_VAMPPASS (ch, VAM_VICISSITUDE))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_VICISSITUDE);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_VICISSITUDE);
}
if (IS_VAMPPASS (ch, VAM_CELERITY))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_CELERITY);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_CELERITY);
}
if (IS_VAMPPASS (ch, VAM_FORTITUDE))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_FORTITUDE);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_FORTITUDE);
}
if (IS_VAMPPASS (ch, VAM_POTENCE))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_POTENCE);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_POTENCE);
}
if (IS_VAMPPASS (ch, VAM_OBFUSCATE))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_OBFUSCATE);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_OBFUSCATE);
}
if (IS_VAMPPASS (ch, VAM_OBTENEBRATION))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_OBTENEBRATION);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_OBTENEBRATION);
}
if (IS_VAMPPASS (ch, VAM_SERPENTIS))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_SERPENTIS);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_SERPENTIS);
}
if (IS_VAMPPASS (ch, VAM_AUSPEX))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_AUSPEX);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_AUSPEX);
}
if (IS_VAMPPASS (ch, VAM_DOMINATE))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_DOMINATE);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_DOMINATE);
}
if (IS_VAMPPASS (ch, VAM_PRESENCE))
{
SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_PRESENCE);
SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_PRESENCE);
}
}
save_char_obj (ch);
save_char_obj (victim);
return;
}
void do_claw (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
bool can_sire = FALSE;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF) || (ch->pcdata->stats[UNI_GEN] < 1))
{
do_claws (ch, "");
return;
}
if (ch->pcdata->stats[UNI_GEN] <= 3)
can_sire = TRUE;
if (!can_sire)
{
send_to_char ("You are unable to spread your gift.\n\r", ch);
return;
}
if (ch->pcdata->stats[UNI_GEN] == 1 && ch->pcdata->stats[UNI_AFF] >= 4)
{
send_to_char ("You have already created 4 tribal leaders.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Claw whom?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (IS_NPC (victim))
{
send_to_char ("Not on NPC's.\n\r", ch);
return;
}
if (IS_IMMORTAL (victim))
{
send_to_char ("Not on Immortal's.\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char ("You cannot claw yourself.\n\r", ch);
return;
}
if (victim->max_hit < 3000)
{
stc ("You need 3000hps before you can be classed\n\r", ch);
stc ("They need 3000hps before they can be classed\n\r", victim);
return;
}
if (IS_CLASS (victim, CLASS_MONK))
{
send_to_char ("You cannot claw monks.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_MAGE))
{
send_to_char ("You cannot bite mages.\n\r", ch);
return;
}
if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
{
send_to_char ("You can only claw avatars.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_DROW))
{
send_to_char ("Not on a drow!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_VAMPIRE)
|| IS_SET (victim->pcdata->stats[UNI_AFF], VAM_MORTAL))
{
send_to_char ("You are unable to create werevamps!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_DEMON)
|| IS_SET (victim->special, SPC_CHAMPION))
{
send_to_char ("But they have no soul!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_HIGHLANDER))
{
send_to_char ("You cannot turn highlanders into werewolves.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_NINJA))
{
send_to_char ("You cannot turn ninjas into werewolves.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_WEREWOLF))
{
send_to_char ("But they are already a werewolf!\n\r", ch);
return;
}
if (!IS_IMMUNE (victim, IMM_VAMPIRE))
{
send_to_char ("You cannot claw an unwilling person.\n\r", ch);
return;
}
if (!IS_VAMPAFF (ch, VAM_CLAWS))
{
send_to_char ("First you better get your claws out!\n\r", ch);
return;
}
if (ch->exp < 10000)
{
send_to_char
("You cannot afford the 10000 exp to pass on the gift.\n\r", ch);
return;
}
ch->exp = ch->exp - 10000;
if (ch->pcdata->stats[UNI_CURRENT] < 1)
ch->pcdata->stats[UNI_CURRENT] = 1;
else
ch->pcdata->stats[UNI_CURRENT] += 1;
if (IS_SET (ch->special, SPC_SIRE))
REMOVE_BIT (ch->special, SPC_SIRE);
act ("You plunge your claws into $N.", ch, NULL, victim, TO_CHAR);
act ("$n plunges $s claws into $N.", ch, NULL, victim, TO_NOTVICT);
act ("$n plunges $s claws into your chest.", ch, NULL, victim, TO_VICT);
victim->class = CLASS_WEREWOLF;
send_to_char ("You are now a werewolf.\n\r", victim);
victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
free_string (victim->lord);
if (ch->pcdata->stats[UNI_GEN] == 1)
victim->lord = str_dup (ch->name);
else
{
sprintf (buf, "%s %s", ch->lord, ch->name);
victim->lord = str_dup (buf);
}
victim->pcdata->stats[UNI_AFF] = 0;
victim->pcdata->stats[UNI_CURRENT] = 0;
save_char_obj (ch);
save_char_obj (victim);
return;
}
void do_demonform (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_DEMON))
{
do_rand_typo (ch);
return;
}
if (!IS_DEMPOWER (ch, DEM_FORM) && IS_CLASS (ch, CLASS_DEMON))
{
send_to_char ("You haven't been granted the gift of demonform.\n\r",
ch);
return;
}
if (IS_POLYAFF (ch, POLY_ZULO))
{
REMOVE_BIT (ch->polyaff, POLY_ZULO);
REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
free_string (ch->morph);
ch->morph = str_dup ("");
return;
}
else if (IS_AFFECTED (ch, AFF_POLYMORPH))
{
send_to_char ("You cant demon form when changed.\n\r", ch);
return;
}
if (ch->stance[0] != -1)
do_stance (ch, "");
if (ch->mounted == IS_RIDING)
do_dismount (ch, "");
act ("You transform into a huge demon.", ch, NULL, NULL, TO_CHAR);
act ("$n's body grows and distorts into a huge demon.", ch, NULL, NULL,
TO_ROOM);
SET_BIT (ch->polyaff, POLY_ZULO);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
switch(ch->pcdata->stats[UNI_GEN])
{
case 1:
sprintf(buf, "%s the pit lord", ch->name);
break;
case 2:
sprintf(buf, "%s the pit fiend", ch->name);
break;
case 3:
sprintf(buf, "%s the gelugon", ch->name);
break;
case 4:
sprintf(buf, "%s the cornugon", ch->name);
break;
case 5:
sprintf(buf, "%s the amnizu", ch->name);
break;
case 6:
sprintf(buf, "%s the erinyes", ch->name);
break;
case 7:
sprintf(buf, "%s the hamatula", ch->name);
break;
case 8:
sprintf(buf, "%s the osyluth", ch->name);
break;
case 9:
sprintf(buf, "%s the abishai", ch->name);
break;
case 10:
sprintf(buf, "%s the barbazu", ch->name);
break;
case 11:
sprintf(buf, "%s the spinagon", ch->name);
break;
case 12:
sprintf(buf, "%s the nupperibo", ch->name);
break;
default:
sprintf(buf, "%s the lemure", ch->name);
break;
}
// sprintf (buf, "%s the great demonic beast", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
return;
}
void do_zuloform (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (get_disc(ch, VAM_VICI) < 2)
{
send_to_char
("You must obtain at least level 2 in Vicissitude to use Zuloform.\n\r",
ch);
return;
}
if (IS_EXTRA (ch, EXTRA_DRAGON))
{
send_to_char ("You cannot unzulo while a dragon.\n\r", ch);
return;
}
if (IS_POLYAFF (ch, POLY_ZULO))
{
REMOVE_BIT (ch->polyaff, POLY_ZULO);
REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
free_string (ch->morph);
ch->morph = str_dup ("");
return;
}
else if (IS_AFFECTED (ch, AFF_POLYMORPH))
{
send_to_char ("You cant zulo when changed.\n\r", ch);
return;
}
if (ch->stance[0] != -1)
do_stance (ch, "");
if (ch->mounted == IS_RIDING)
do_dismount (ch, "");
act ("You transform into large beast.", ch, NULL, NULL, TO_CHAR);
act ("$n's body grows and distorts into a large beast.", ch, NULL, NULL,
TO_ROOM);
SET_BIT (ch->polyaff, POLY_ZULO);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
sprintf (buf, "%s the big black monster", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
return;
}
DO_COM (do_clanname)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (arg[0] == '\0')
{
send_to_char ("Who's clan do you wish to change or name?\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (IS_NPC (victim))
return;
smash_tilde (argument);
if (strlen (argument) < 0 || strlen (argument) > 26)
{
send_to_char ("Clan name should be between 0 and 26 letters long.\n\r",
ch);
send_to_char ("Leave a blank to remove clan.\n\r", ch);
return;
}
free_string (victim->clan);
victim->clan = str_dup (argument);
send_to_char ("Clan set.\n\r", ch);
if (ch != victim)
send_to_char ("Clan set.\n\r", victim);
return;
}
void do_stake (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
OBJ_DATA *stake;
char arg[MAX_INPUT_LENGTH];
int blood;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (arg[0] == '\0')
{
send_to_char ("Stake whom?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", 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_CLASS (victim, CLASS_VAMPIRE))
{
send_to_char ("You can only stake vampires.\n\r", ch);
return;
}
if (victim->position > POS_MORTAL)
{
send_to_char
("You can only stake down a vampire who is mortally wounded.\n\r",
ch);
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);
send_to_char ("You feel a stake plunged through your heart.\n\r", victim);
if (IS_IMMUNE (victim, IMM_STAKE))
return;
/* Have to make sure they have enough blood to change back */
blood = victim->pcdata->condition[COND_THIRST];
victim->pcdata->condition[COND_THIRST] = 666;
/* To take care of vampires who have powers in affect. */
if (IS_VAMPAFF (victim, VAM_DISGUISED))
do_mask (victim, "self");
if (IS_IMMUNE (victim, IMM_SHIELDED))
do_shield (victim, "");
if (IS_AFFECTED (victim, AFF_SHADOWPLANE))
do_shadowplane (victim, "");
if (IS_VAMPAFF (victim, VAM_FANGS))
do_fangs (victim, "");
if (IS_VAMPAFF (victim, VAM_CLAWS))
do_claws (victim, "");
if (IS_VAMPAFF (victim, VAM_NIGHTSIGHT))
do_nightsight (victim, "");
if (IS_AFFECTED (victim, AFF_SHADOWSIGHT))
do_shadowsight (victim, "");
if (IS_SET (victim->act, PLR_HOLYLIGHT))
do_truesight (victim, "");
if (IS_VAMPAFF (victim, VAM_CHANGED))
do_change (victim, "human");
if (IS_POLYAFF (victim, POLY_SERPENT))
do_serpent (victim, "");
victim->pcdata->stats[UNI_RAGE] = 0;
victim->pcdata->condition[COND_THIRST] = blood;
obj_from_char (stake);
obj_to_char (stake, victim);
ch->exp = ch->exp + 1000;
return;
}
void do_mask (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_DRAGON))
{
do_rand_typo (ch);
return;
}
if (get_disc(ch, VAM_OBFU) < 3 && IS_CLASS (ch, CLASS_VAMPIRE))
{
send_to_char ("You need level 4 obfuscate first.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_DRAGON)
&& !IS_SET (ch->pcdata->dragonaff, DRA_MASK))
{
send_to_char ("You haven't gained the power to mask people yet.\n\r",
ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Change to look like whom?\n\r", ch);
return;
}
if (!str_cmp (arg, "Tijer"))
{
send_to_char ("You failed!\r\n", ch);
return;
}
if (IS_AFFECTED (ch, AFF_POLYMORPH) && !IS_VAMPAFF (ch, VAM_DISGUISED))
{
send_to_char ("Not while polymorphed.\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 mask avatars or lower.\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 40
&& IS_CLASS (ch, CLASS_VAMPIRE))
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
ch->pcdata->condition[COND_THIRST] -= number_range (30, 40);
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;
}
sprintf (buf, "Your form shimmers and transforms into %s.", ch->name);
act (buf, ch, NULL, victim, TO_CHAR);
sprintf (buf, "%s's form shimmers and transforms into %s.", ch->morph,
ch->name);
act (buf, ch, NULL, victim, TO_ROOM);
REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
free_string (ch->morph);
ch->morph = str_dup ("");
return;
}
if (IS_VAMPAFF (ch, VAM_DISGUISED))
{
sprintf (buf, "Your form shimmers and transforms into a clone of %s.",
victim->name);
act (buf, ch, NULL, victim, TO_CHAR);
sprintf (buf, "%s's form shimmers and transforms into a clone of %s.",
ch->morph, victim->name);
act (buf, ch, NULL, victim, TO_NOTVICT);
sprintf (buf, "%s's form shimmers and transforms into a clone of you!",
ch->morph);
act (buf, ch, NULL, victim, TO_VICT);
free_string (ch->morph);
ch->morph = str_dup (victim->name);
return;
}
sprintf (buf, "Your form shimmers and transforms into a clone of %s.",
victim->name);
act (buf, ch, NULL, victim, TO_CHAR);
sprintf (buf, "%s's form shimmers and transforms into a clone of %s.",
ch->name, victim->name);
act (buf, ch, NULL, victim, TO_NOTVICT);
sprintf (buf, "%s's form shimmers and transforms into a clone of you!",
ch->name);
act (buf, ch, NULL, victim, TO_VICT);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
free_string (ch->morph);
ch->morph = str_dup (victim->name);
return;
}
void do_change (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (ch->fight_timer > 0)
{
send_to_char ("Not until your fight timer expires.\n\r", ch);
return;
}
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (get_disc(ch, VAM_PROT) < 3)
{
send_to_char ("You are not trained in the Protean discipline.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char
("You can change between 'human', 'bat', 'wolf' and 'mist' forms.\n\r",
ch);
return;
}
if (!str_cmp (arg, "bat"))
{
if (IS_AFFECTED (ch, AFF_POLYMORPH))
{
send_to_char ("You can only polymorph from human form.\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 50)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (ch->stance[0] != -1)
do_stance (ch, "");
if (ch->mounted == IS_RIDING)
do_dismount (ch, "");
ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
clear_stats (ch);
act ("You transform into bat form.", ch, NULL, NULL, TO_CHAR);
act ("$n transforms into a bat.", ch, NULL, NULL, TO_ROOM);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_FLYING);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_SONIC);
SET_BIT (ch->polyaff, POLY_BAT);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
sprintf (buf, "%s the vampire bat", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
return;
}
else if (!str_cmp (arg, "wolf"))
{
if (IS_AFFECTED (ch, AFF_POLYMORPH))
{
send_to_char ("You can only polymorph from human form.\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 50)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (ch->stance[0] != -1)
do_stance (ch, "");
if (ch->mounted == IS_RIDING)
do_dismount (ch, "");
ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
act ("You transform into wolf form.", ch, NULL, NULL, TO_CHAR);
act ("$n transforms into a dire wolf.", ch, NULL, NULL, TO_ROOM);
clear_stats (ch);
if (ch->wpn[0] > 0)
{
ch->hitroll += (ch->wpn[0]);
ch->damroll += (ch->wpn[0]);
ch->armor -= (ch->wpn[0] * 3);
}
ch->pcdata->mod_str = 10;
SET_BIT (ch->polyaff, POLY_WOLF);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
ch->max_hit = ch->max_hit + 500;
ch->hit = ch->hit + 500;
sprintf (buf, "%s the dire wolf", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
return;
}
else if (!str_cmp (arg, "mist"))
{
if (IS_AFFECTED (ch, AFF_POLYMORPH))
{
send_to_char ("You can only polymorph from human form.\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 50)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (ch->stance[0] != -1)
do_stance (ch, "");
if (ch->mounted == IS_RIDING)
do_dismount (ch, "");
ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
act ("You transform into mist form.", ch, NULL, NULL, TO_CHAR);
act ("$n transforms into a white mist.", 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);
}
clear_stats (ch);
SET_BIT (ch->polyaff, POLY_MIST);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
SET_BIT (ch->affected_by, AFF_ETHEREAL);
sprintf (buf, "%s the white mist", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
return;
}
else if (!str_cmp (arg, "human"))
{
if (!IS_AFFECTED (ch, AFF_POLYMORPH))
{
send_to_char ("You are already in human form.\n\r", ch);
return;
}
if (IS_VAMPAFF (ch, VAM_CHANGED) && IS_POLYAFF (ch, POLY_BAT))
{
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_FLYING);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_SONIC);
REMOVE_BIT (ch->polyaff, POLY_BAT);
}
else if (IS_VAMPAFF (ch, VAM_CHANGED) && IS_POLYAFF (ch, POLY_WOLF))
{
REMOVE_BIT (ch->polyaff, POLY_WOLF);
ch->max_hit = ch->max_hit - 500;
ch->hit = ch->hit - 500;
if (ch->hit < 1)
ch->hit = 1;
}
else if (IS_VAMPAFF (ch, VAM_CHANGED) && IS_POLYAFF (ch, POLY_MIST))
{
REMOVE_BIT (ch->polyaff, POLY_MIST);
REMOVE_BIT (ch->affected_by, AFF_ETHEREAL);
}
else
{
/* In case they try to change to human from a non-vamp form */
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);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
clear_stats (ch);
free_string (ch->morph);
ch->morph = str_dup ("");
return;
}
else
send_to_char
("You can change between 'human', 'bat', 'wolf' and 'mist' forms.\n\r",
ch);
return;
}
void do_stat (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char lin[MAX_STRING_LENGTH];
char age[MAX_STRING_LENGTH];
int blood;
int bloodpool;
if (IS_CLASS (ch, CLASS_FAE))
{
centre_text
("-------------------------==| Changeling Arts |==----------------------",
ch);
sprintf (buf, "%-14.14s [%d] %-14.14s [%d] %-14.14s [%d]", "Chicanery",
ch->pcdata->powers[FAE_CHIC], "Legerdemain",
ch->pcdata->powers[FAE_LEGE], "Primal",
ch->pcdata->powers[FAE_PRIM]);
centre_text (buf, ch);
sprintf (buf, "%-14.14s [%d] %-14.14s [%d] %-14.14s [%d]",
"Soothsay", ch->pcdata->powers[FAE_SOOT],
"Sovereign", ch->pcdata->powers[FAE_SOVE],
"Wayfare", ch->pcdata->powers[FAE_WAYF]);
centre_text (buf, ch);
stc (" Arts <ART> Improve - Learn new arts\n\r", ch);
divide_to_char (ch);
return;
}
if (ch->pcdata->stats[UNI_GEN] <= 0)
ch->pcdata->stats[UNI_GEN] = 13;
{
int chargen = ch->pcdata->stats[UNI_GEN];
switch (chargen)
{
default:
bloodpool = 100;
break;
case 1:
bloodpool= 5000;
case 2:
bloodpool= 2000;
break;
case 3:
bloodpool = 1000;
break;
case 4:
bloodpool= 500;
break;
case 5:
bloodpool= 400;
break;
case 6:
bloodpool= 300;
break;
case 7:
bloodpool= 200;
break;
case 8:
bloodpool= 150;
break;
case 9:
bloodpool= 140;
break;
case 10:
bloodpool= 130;
break;
case 11:
bloodpool = 120;
break;
case 12:
bloodpool= 110;
break;
case 13:
bloodpool = 100;
break;
}
}
blood = ch->pcdata->condition[COND_THIRST];
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
return;
if (ch->pcdata->rank == AGE_ANCILLA)
sprintf (age, "Ancilla");
else if (ch->pcdata->rank == AGE_CHILDE)
sprintf (age, "Childe");
else if (ch->pcdata->rank == AGE_NEONATE)
sprintf (age, "Neonate");
else if (ch->pcdata->rank == AGE_ELDER)
sprintf (age, "Elder");
else if (ch->pcdata->rank == AGE_METHUSELAH)
sprintf (age, "Methuselah");
sprintf (lin,
"---------------------------------------------------------------------------\n\r");
send_to_char (lin, ch);
send_to_char (" Vampire Status\n\r", ch);
send_to_char (lin, ch);
sprintf (buf,
"Generation: %d Bloodpool:%d Age:%s Blood:%d\n\r",
ch->pcdata->stats[UNI_GEN], bloodpool, age, blood);
send_to_char (buf, ch);
send_to_char (lin, ch);
send_to_char (" Disciplines\n\r", ch);
send_to_char (lin, ch);
sprintf (buf,
"Animalism: [%d] Celerity: [%d] Fortitude: [%d]\n\r",
get_disc(ch, VAM_ANIM), get_disc(ch, VAM_CELE),
get_disc(ch, VAM_FORT));
send_to_char (buf, ch);
sprintf (buf,
"Obtenebration:[%d] Presence: [%d] Quietus: [%d]\n\r",
get_disc(ch, VAM_OBTE), get_disc(ch, VAM_PRES),
get_disc(ch, VAM_QUIE));
send_to_char (buf, ch);
sprintf (buf,
"Thaumaturgy: [%d] Auspex: [%d] Dominate: [%d]\n\r",
get_disc(ch, VAM_THAU), get_disc(ch, VAM_AUSP),
get_disc(ch, VAM_DOMI));
send_to_char (buf, ch);
sprintf (buf,
"Obfuscate: [%d] Potence: [%d] Protean: [%d]\n\r",
get_disc(ch, VAM_OBFU), get_disc(ch, VAM_POTE),
get_disc(ch, VAM_PROT));
send_to_char (buf, ch);
sprintf (buf,
"Serpentis: [%d] Vicissitude:[%d] Daimoinon: [%d]\n\r",
get_disc(ch, VAM_SERP), get_disc(ch, VAM_VICI),
get_disc(ch, VAM_DAIM));
send_to_char (buf, ch);
sprintf (buf,
"Chimerstry: [%d] Obeah: [%d] Melpominee: [%d]\n\r",
get_disc(ch, VAM_CHIM), get_disc(ch, VAM_OBEA),
get_disc(ch, VAM_MELP));
send_to_char (buf, ch);
sprintf (buf,
"Necromancy: [%d] Thanatosis: [%d]\n\r",
get_disc(ch, VAM_NECR), get_disc(ch, VAM_THAN));
stc (buf, ch);
send_to_char (lin, ch);
return;
}
void do_clandisc (CHAR_DATA * ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (arg1[0] == '\0' && arg2[0] == '\0')
{
do_stat (ch, "");
return;
}
if (arg2[0] == '\0')
{
if (!str_cmp (arg1, "animalism"))
{
send_to_char ("Animalism: The discipline of nature control.\n\r",
ch);
if (get_disc(ch, VAM_ANIM) < 1)
send_to_char ("You have none of the Animalism powers.\n\r", ch);
if (get_disc(ch, VAM_ANIM) > 0)
send_to_char
("Serenity: You can soothe the most aggressive soul (Golconda Required).\n\r",
ch);
return;
}
else if (!str_cmp (arg1, "auspex"))
{
send_to_char
("Auspex: The discipline of extrasensory awareness.\n\r", ch);
if (get_disc(ch, VAM_AUSP) < 1)
send_to_char
("You have none of the Auspex discipline powers.\n\r", ch);
if (get_disc(ch, VAM_AUSP) > 0)
send_to_char
("Truesight: The user can see everything, including invis.\n\r",
ch);
if (get_disc(ch, VAM_AUSP) > 1)
send_to_char
("Scry: Allows you to view the room the specified target is in.\n\r",
ch);
if (get_disc(ch, VAM_AUSP) > 3)
send_to_char
("Readaura: Gives you detained information about a creature or object.\n\r",
ch);
return;
}
else if (!str_cmp (arg1, "celerity"))
{
send_to_char ("Celerity: The discipline of superior speed.\n\r", ch);
return;
}
else if (!str_cmp (arg1, "chimerstry"))
{
send_to_char ("chimerstry: The discipline of illusion.\n\r", ch);
return;
}
else if (!str_cmp (arg1, "daimoinon"))
{
send_to_char ("Daimoinon: The discipline of dark corruption.\n\r",
ch);
if (get_disc(ch, VAM_DAIM) < 1)
send_to_char
("You have none of the Daimoinon discipline powers.\n\r", ch);
return;
}
else if (!str_cmp (arg1, "dominate"))
{
send_to_char ("Dominate: The discipline of control.\n\r", ch);
if (get_disc(ch, VAM_DOMI) < 1)
send_to_char
("You have none of the Dominate discipline powers.\n\r", ch);
if (get_disc(ch, VAM_DOMI) > 0)
send_to_char
("Command: You can plant suggestions in the mind of others.\n\r",
ch);
if (get_disc(ch, VAM_DOMI) > 1)
send_to_char
("Shield: You are able to shield your mind from scrying and aura-reading.\n\r",
ch);
if (get_disc(ch, VAM_DOMI) > 3)
send_to_char
("Possession: You can take control of mobs by feeding them blood.\n\r",
ch);
return;
}
else if (!str_cmp (arg1, "fortitude"))
{
send_to_char
("Fortitude: The discipline of supernatural toughness and vigor.\n\r",
ch);
if (get_disc(ch, VAM_FORT) < 1)
send_to_char ("You have no fortitude.\n\r", ch);
return;
}
else if (!str_cmp (arg1, "obfuscate"))
{
send_to_char ("Obfuscate: The discipline of stealth.\n\r", ch);
if (get_disc(ch, VAM_OBFU) < 1)
send_to_char
("You have none of the Obfuscate discipline powers.\n\r", ch);
return;
}
else if (!str_cmp (arg1, "obtenebration"))
{
send_to_char
("Obtenebration: The discipline of darkness manipulation.\n\r",
ch);
if (get_disc(ch, VAM_OBTE) < 1)
send_to_char
("You have none of the Obtenebration discipline powers.\n\r",
ch);
return;
}
else if (!str_cmp (arg1, "potence"))
{
send_to_char ("Potence: The discipline of superior strength.\n\r",
ch);
return;
}
else if (!str_cmp (arg1, "presence"))
{
send_to_char
("Presence: The discipline of appeal and attractiveness.\n\r",
ch);
if (get_disc(ch, VAM_PRES) < 1)
send_to_char
("You have none of the Presence discipline powers.\n\r", ch);
return;
}
else if (!str_cmp (arg1, "protean"))
{
send_to_char
("Protean: The discipline of neutral transformation.\n\r", ch);
if (get_disc(ch, VAM_PROT) < 1)
send_to_char
("You have none of the Protean discipline powers.\n\r", ch);
return;
}
else if (!str_cmp (arg1, "quietus"))
{
send_to_char ("Quietus: The discipline of death.\n\r", ch);
if (get_disc(ch, VAM_QUIE) < 1)
send_to_char
("You have none of the Quietus discipline powers.\n\r", ch);
if (get_disc(ch, VAM_QUIE) > 3)
send_to_char
("Spit: You can project your deadly spit at a foe\n\r", ch);
return;
}
else if (!str_cmp (arg1, "serpentis"))
{
send_to_char
("Serpentis: The discipline of temptation and corruption.\n\r",
ch);
if (get_disc(ch, VAM_SERP) < 1)
send_to_char
("You have none of the Serpentis discipline powers.\n\r", ch);
return;
}
else if (!str_cmp (arg1, "thaumaturgy"))
{
send_to_char ("Thaumaturgy: The discipline of blood magic.\n\r", ch);
if (get_disc(ch, VAM_THAU) < 1)
send_to_char
("You have none of the Thaumaturgy discipline powers.\n\r",
ch);
if (get_disc(ch, VAM_THAU) > 0)
send_to_char
("Theft: You can take from the blood pool of other players.\n\r",
ch);
return;
}
else if (!str_cmp (arg1, "vicissitude"))
{
send_to_char
("Vicissitude: The discipline of evil body control.\n\r", ch);
if (get_disc(ch, VAM_VICI) < 1)
send_to_char
("You have none of the Vicissitude discipline powers.\n\r",
ch);
if (get_disc(ch, VAM_VICI) > 3)
send_to_char
("Zuloform: Transformation into a powerfull being.\n\r", ch);
return;
}
do_stat (ch, "");
return;
}
if (!str_cmp (arg2, "improve"))
{
int improve;
int cost;
int max;
int maxlevel = 5;
/*
if (ch->[UNI_GEN] == 13)
maxlevel=5;
else if (ch->[UNI_GEN] == 12)
maxlevel=5;
else if (ch->[UNI_GEN] == 11)
maxlevel=5;
else if (ch->[UNI_GEN] == 10)
maxlevel=5;
else if (ch->[UNI_GEN] == 9)
maxlevel=5;
else if (ch->[UNI_GEN] == 8)
maxlevel=5;
else if (ch->[UNI_GEN] == 7)
maxlevel=5;
else if (ch->[UNI_GEN] == 6)
maxlevel=5;
else if (ch->[UNI_GEN] == 5)
maxlevel=5;
else if (ch->[UNI_GEN] == 4)
maxlevel=5;
else
maxlevel=5;
*/
if (!str_cmp (arg1, "animalism"))
{
improve = VAM_ANIM;
max = maxlevel;
}
else if (!str_cmp (arg1, "auspex"))
{
improve = VAM_AUSP;
max = maxlevel;
}
else if (!str_cmp (arg1, "celerity"))
{
improve = VAM_CELE;
max = maxlevel;
}
else if (!str_cmp (arg1, "chimerstry"))
{
improve = VAM_CHIM;
max = maxlevel;
}
else if (!str_cmp (arg1, "dominate"))
{
improve = VAM_DOMI;
max = maxlevel;
}
else if (!str_cmp (arg1, "daimoinon"))
{
improve = VAM_DAIM;
max = maxlevel;
}
else if (!str_cmp (arg1, "fortitude"))
{
improve = VAM_FORT;
max = maxlevel;
}
else if (!str_cmp (arg1, "obfuscate"))
{
improve = VAM_OBFU;
max = maxlevel;
}
else if (!str_cmp (arg1, "obtenebration"))
{
improve = VAM_OBTE;
max = maxlevel;
}
else if (!str_cmp (arg1, "potence"))
{
improve = VAM_POTE;
max = maxlevel;
}
else if (!str_cmp (arg1, "presence"))
{
improve = VAM_PRES;
max = maxlevel;
}
else if (!str_cmp (arg1, "protean"))
{
improve = VAM_PROT;
max = maxlevel;
}
else if (!str_cmp (arg1, "quietus"))
{
improve = VAM_QUIE;
max = maxlevel;
}
else if (!str_cmp (arg1, "serpentis"))
{
improve = VAM_SERP;
max = maxlevel;
}
else if (!str_cmp (arg1, "thaumaturgy"))
{
improve = VAM_THAU;
max = maxlevel;
}
else if (!str_cmp (arg1, "vicissitude"))
{
improve = VAM_VICI;
max = maxlevel;
}
else if (!str_cmp (arg1, "obeah"))
{
improve = VAM_OBEA;
max = 5;
}
else if (!str_cmp (arg1, "melpominee"))
{
improve = VAM_MELP;
max = 5;
}
else if (!str_cmp (arg1, "necromancy"))
{
improve = VAM_NECR;
max = 5;
}
else if (!str_cmp (arg1, "thanatosis"))
{
improve = VAM_THAN;
max = 5;
}
else
{
send_to_char ("You can improve:\n\r", ch);
send_to_char
(" Animalism, Auspex, Celerity, Dominate, Fortitude, Obfuscate,\n\r",
ch);
send_to_char
(" Obtenebration, Potence, Presence, Protean, Quietus, Serpentis,\n\r",
ch);
send_to_char
(" Thaumaturgy, Vicissitude, Melpominee, Necormancy or Thanatosis.\n\r",
ch);
return;
}
cost = (ch->pcdata->powers[improve] + 1) * 10;
arg1[0] = UPPER (arg1[0]);
if (ch->pcdata->powers[improve] >= max
&& ch->pcdata->rank == AGE_METHUSELAH)
{
sprintf (buf,
"You have already gained all the powers of the %s discipline.\n\r",
arg1);
send_to_char (buf, ch);
return;
}
if (ch->pcdata->powers[improve] >= max)
{
sprintf (buf, "You have already maxed %s.\n\r", arg1);
send_to_char (buf, ch);
return;
}
if (cost > ch->practice)
{
sprintf (buf,
"It costs you %d primal to improve your %s discipline.\n\r",
cost, arg1);
send_to_char (buf, ch);
return;
}
ch->pcdata->powers[improve] += 1;
ch->practice -= cost;
sprintf (buf, "You improve your ability in the %s discipline.\n\r",
arg1);
send_to_char (buf, ch);
}
else
send_to_char
("To improve a discipline, type: Clandisc <discipline type> improve.\n\r",
ch);
return;
}
void do_defences (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_IMMUNE (ch, IMM_VAMPIRE))
{
send_to_char ("You lower your defences!.\n\r", ch);
SET_BIT (ch->immune, IMM_VAMPIRE);
return;
}
send_to_char ("You raise your defences!\n\r", ch);
REMOVE_BIT (ch->immune, IMM_VAMPIRE);
return;
}
void do_shadowplane (CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[SILENTSTRIDERS] < 5)
{
stc ("You must obtain the fifth gift of the Silent Striders to Reach the Umbra.\n\r", ch);
return;
}
else if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBTE) < 3)
{
send_to_char
("You are not trained in the Obtenebration discipline.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE)
&& ch->pcdata->condition[COND_THIRST] < 75)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE))
ch->pcdata->condition[COND_THIRST] -= number_range (65, 75);
if (IS_SET (ch->flag2, AFF2_INARENA))
{
stc ("Not while you're in the arena.\n\r", ch);
return;
}
if (IS_SET (ch->war, WARRING))
{
stc ("Not while in a war!\n\r", ch);
return;
}
if (ch->fight_timer > 0)
{
stc ("Not with a fight timer!\n\r", ch);
return;
}
if (arg[0] == '\0')
{
if (!IS_AFFECTED (ch, AFF_SHADOWPLANE))
{
send_to_char ("You fade into the plane of shadows.\n\r", ch);
act ("The shadows flicker and swallow up $n.", ch, NULL, NULL,
TO_ROOM);
SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
do_look (ch, "auto");
return;
}
REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
send_to_char ("You fade back into the real world.\n\r", ch);
act ("The shadows flicker and $n fades into existance.", ch, NULL, NULL,
TO_ROOM);
do_look (ch, "auto");
return;
}
if ((obj = get_obj_here (ch, arg)) == NULL)
{
send_to_char ("What do you wish to toss into the shadow plane?\n\r",
ch);
return;
}
if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
send_to_char ("You toss it to the ground and it vanishes.\n\r", ch);
else
send_to_char ("You toss it into a shadow and it vanishes.\n\r", ch);
return;
}
void do_introduce (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_GEN] > 0
&& ch->pcdata->stats[UNI_GEN] < 13)
do_tradition (ch, ch->lord);
else if (IS_CLASS (ch, CLASS_WEREWOLF) && IS_HERO (ch) &&
ch->pcdata->stats[UNI_GEN] > 0 && ch->pcdata->stats[UNI_GEN] < 5)
do_bloodline (ch, ch->lord);
else if (IS_CLASS (ch, CLASS_DEMON) && IS_HERO (ch))
do_demonintro (ch, "");
else if (IS_CLASS (ch, CLASS_MAGE) && IS_HERO (ch))
do_mageintro (ch, "");
else
do_rand_typo (ch);
return;
}
void do_demonintro (CHAR_DATA * ch, char *argument)
{
char arg1[MIL];
char arg2[MIL];
char arg3[MIL];
char buf[MSL];
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
argument = one_argument (argument, arg3);
if (IS_NPC (ch))
return;
if (arg1 != '\0')
arg1[0] = UPPER (arg1[0]);
if (arg2 != '\0')
arg2[0] = UPPER (arg2[0]);
if (arg3 != '\0')
arg3[0] = UPPER (arg3[0]);
if (!str_cmp (ch->clan, ""))
{
sprintf (buf, "In the name of Satan i spread my corruption.");
do_say (ch, buf);
sprintf (buf, "I am %s, demon of no clan.", ch->name);
do_say (ch, buf);
sprintf (buf, "Worship Satan in all that he is.");
do_say (ch, buf);
}
else if (IS_SET (ch->special, SPC_DEMON_LORD))
{
sprintf (buf, "In the name of Satan i spread my corruption.");
do_say (ch, buf);
sprintf (buf, "I am %s Demon Lord of the %s Clan.", ch->name, ch->clan);
do_say (ch, buf);
sprintf (buf, "Worhip Satan in all that he is.");
do_say (ch, buf);
}
else
{
sprintf (buf, "In the name of Satan i spread my corruption.");
do_say (ch, buf);
sprintf (buf, "I am %s Demon of the %s Clan.", ch->name, ch->clan);
do_say (ch, buf);
sprintf (buf, "Worship Satan in all that he is.");
do_say (ch, buf);
}
return;
}
void do_mageintro (CHAR_DATA * ch, char *argument)
{
char arg1[MIL];
char arg2[MIL];
char arg3[MIL];
char buf[MSL];
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
argument = one_argument (argument, arg3);
if (IS_NPC (ch))
return;
if (arg1 != '\0')
arg1[0] = UPPER (arg1[0]);
if (arg2 != '\0')
arg2[0] = UPPER (arg2[0]);
if (arg3 != '\0')
arg3[0] = UPPER (arg3[0]);
if (!str_cmp (ch->clan, ""))
{
sprintf (buf,
"In the name of Lilith i announce my knowledge of magick");
do_say (ch, buf);
sprintf (buf, "I am %s, Rogue mage", ch->name);
do_say (ch, buf);
sprintf (buf, "Magick is the power, do not be afraid to learn it.");
do_say (ch, buf);
}
else if (ch->level == LEVEL_ARCHMAGE)
{
sprintf (buf,
"In the name of Lilith, i announce my knowledge of magick.");
do_say (ch, buf);
sprintf (buf, "I am %s Oracle %s .", ch->name, ch->clan);
do_say (ch, buf);
sprintf (buf, "Magick is the power, do not be afraid to use it.");
do_say (ch, buf);
}
else if (ch->level == LEVEL_MAGE)
{
sprintf (buf,
"In the name of Lilith, i announce my knowledge of magick.");
do_say (ch, buf);
sprintf (buf, "I am %s Adept of %s.", ch->name, ch->clan);
do_say (ch, buf);
sprintf (buf, "Magick is the power, do not be afraid to use it.");
do_say (ch, buf);
}
else
{
sprintf (buf,
"In the name of Lilith i announce my knowledge of magic.");
do_say (ch, buf);
sprintf (buf, "I am %s Disciple of %s.", ch->name, ch->clan);
do_say (ch, buf);
sprintf (buf, "Magick is the power, do not be afraid to use it.");
do_say (ch, buf);
}
return;
}
void do_bloodline (CHAR_DATA * ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
argument = one_argument (argument, arg3);
if (IS_NPC (ch))
return;
if (arg1 != '\0')
arg1[0] = UPPER (arg1[0]);
if (arg2 != '\0')
arg2[0] = UPPER (arg2[0]);
if (arg3 != '\0')
arg3[0] = UPPER (arg3[0]);
if (!str_cmp (arg1, "kavir"))
strcpy (arg1, "KaVir");
if (!str_cmp (ch->clan, "") && ch->pcdata->stats[UNI_GEN] != 1)
{
strcpy (buf, "In the name of Gaia, I announce my Garou heritage.");
do_say (ch, buf);
sprintf (buf, "My name is %s, I am a Ronin of no tribe.", ch->name);
do_say (ch, buf);
return;
}
if ( !str_cmp(ch->clan, "Black Spiral Dancers"))
strcpy(buf,"In the name of the Wyrm, I renounce my Garou heritage.");
else
strcpy (buf, "In the name of Gaia, I announce my Garou heritage.");
do_say (ch, buf);
if (ch->pcdata->stats[UNI_GEN] != 1)
{
if (ch->pcdata->stats[UNI_GEN] == 4)
sprintf (buf2, "%s", arg3);
else if (ch->pcdata->stats[UNI_GEN] == 3)
sprintf (buf2, "%s", arg2);
else if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf2, "%s", arg1);
if (ch->pcdata->stats[UNI_GEN] == 1)
{
if ( !str_cmp(ch->clan, "Black Spiral Dancers"))
sprintf(buf,"My name is %s, chosen Champion of the Wyrm.", ch->name);
else
sprintf (buf, "My name is %s, chosen Champion of Gaia.", ch->name);
}
if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf, "My name is %s, Chieftain of the %s tribe, pup of %s.",
ch->name, ch->clan, buf2);
else
sprintf (buf, "My name is %s, of the %s tribe, pup of %s.", ch->name,
ch->clan, buf2);
do_say (ch, buf);
}
if (arg3[0] != '\0')
{
sprintf (buf, "My name is %s, of the %s tribe, pup of %s.",
arg3, ch->clan, arg2);
do_say (ch, buf);
}
if (arg2[0] != '\0')
{
if (arg1[0] != '\0')
sprintf (buf, "My name is %s, Chieftain of the %s tribe, pup of %s.",
arg2, ch->clan, arg1);
else
sprintf (buf, "My name is %s, of the %s tribe, pup of %s.", arg2,
ch->clan, arg1);
do_say (ch, buf);
}
if (ch->pcdata->stats[UNI_GEN] == 1)
{
if ( !str_cmp(ch->clan, "Black Spiral Dancers"))
sprintf(buf,"My name is %s, chosen Champion of the Wyrm.", ch->name);
else
sprintf(buf,"My name is %s, chosen Champion of Gaia.", ch->name);
}
else
{
if ( !str_cmp(ch->clan, "Black Spiral Dancers"))
sprintf(buf,"My name is %s, chosen Champion of the Wyrm.", arg1);
else
sprintf(buf,"My name is %s, chosen Champion of Gaia.", arg1);
}
do_say(ch,buf);
return;
}
void do_tradition (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];
char buf[MAX_INPUT_LENGTH];
char buf2[MAX_INPUT_LENGTH];
char buf3[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;
if (arg1[0] != '\0')
{
arg1[0] = UPPER (arg1[0]);
vampgen = 1;
}
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;
}
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE) || (ch->pcdata->stats[UNI_GEN] < 1)
|| (ch->pcdata->stats[UNI_GEN] > 13))
{
send_to_char ("Huh?\n\r", ch);
return;
}
/*
if (strlen (ch->clan) < 2)
{
sprintf (buf, "My name is %s.", ch->name);
do_say (ch, buf);
sprintf (buf, "I am Caitiff.");
do_say (ch, buf);
sprintf (buf, "I have no lineage.");
do_say (ch, buf);
return;
}
*/
switch (ch->pcdata->stats[UNI_GEN])
{
default:
sprintf (buf3, "Childe");
break;
case 1:
case 2:
case 3:
sprintf (buf3, "Antediluvian");
break;
case 4:
case 5:
sprintf (buf3, "Methuselah");
break;
case 6:
case 7:
case 8:
sprintf (buf3, "Elder");
break;
case 9:
case 10:
sprintf (buf3, "Ancilla");
break;
case 11:
case 12:
case 13:
sprintf (buf3, "Neonate");
break;
}
if (ch->pcdata->stats[UNI_GEN] == 13)
sprintf (buf2, "Thirteenth");
else if (ch->pcdata->stats[UNI_GEN] == 12)
sprintf (buf2, "Twelfth");
else if (ch->pcdata->stats[UNI_GEN] == 11)
sprintf (buf2, "Eleventh");
else if (ch->pcdata->stats[UNI_GEN] == 10)
sprintf (buf2, "Tenth");
else if (ch->pcdata->stats[UNI_GEN] == 9)
sprintf (buf2, "Ninth");
else if (ch->pcdata->stats[UNI_GEN] == 8)
sprintf (buf2, "Eighth");
else if (ch->pcdata->stats[UNI_GEN] == 7)
sprintf (buf2, "Seventh");
else if (ch->pcdata->stats[UNI_GEN] == 6)
sprintf (buf2, "Sixth");
else if (ch->pcdata->stats[UNI_GEN] == 5)
sprintf (buf2, "Fifth");
else if (ch->pcdata->stats[UNI_GEN] == 4)
sprintf (buf2, "Fourth");
else if (ch->pcdata->stats[UNI_GEN] == 3)
sprintf (buf2, "Third");
else if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf2, "Second");
if (vampgen == 1)
sprintf (buf,
"As is the tradition, I recite the lineage of %s, Sire of all Kindred.",
ch->name);
else
{
sprintf (buf, "As is the tradition, I recite the lineage of %s.",
ch->name);
do_say (ch, buf);
sprintf (buf, "I am %s, %s of the %s Generation.", ch->name, buf3,
buf2);
}
do_say (ch, buf);
if (vampgen != 1)
{
if (vampgen == 13)
sprintf (buf2, "%s", arg12);
else if (vampgen == 12)
sprintf (buf2, "%s", arg11);
else if (vampgen == 11)
sprintf (buf2, "%s", arg10);
else if (vampgen == 10)
sprintf (buf2, "%s", arg9);
else if (vampgen == 9)
sprintf (buf2, "%s", arg8);
else if (vampgen == 8)
sprintf (buf2, "%s", arg7);
else if (vampgen == 7)
sprintf (buf2, "%s", arg6);
else if (vampgen == 6)
sprintf (buf2, "%s", arg5);
else if (vampgen == 5)
sprintf (buf2, "%s", arg4);
else if (vampgen == 4)
sprintf (buf2, "%s", arg3);
else if (vampgen == 3)
sprintf (buf2, "%s", arg2);
else if (vampgen == 2)
sprintf (buf2, "%s", arg1);
if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf,
"My name is %s. I am an Antediluvian. My sire is %s.",
ch->name, buf2);
else if (ch->pcdata->stats[UNI_GEN] == 3
|| (arg2[0] != '\0' && arg3[0] == '\0'))
sprintf (buf,
"My name is %s. I am %s. The Antedilivian of my line is %s.",
ch->name, ch->clan, buf2);
else
sprintf (buf, "My name is %s. I am %s. My sire is %s.", ch->name,
ch->clan, buf2);
do_say (ch, buf);
}
if (arg12[0] != '\0')
{
sprintf (buf, "My name is %s. I am %s. My sire is %s.",
arg12, ch->clan, arg11);
do_say (ch, buf);
}
if (arg11[0] != '\0')
{
sprintf (buf, "My name is %s. I am %s. My sire is %s.",
arg11, ch->clan, arg10);
do_say (ch, buf);
}
if (arg10[0] != '\0')
{
sprintf (buf, "My name is %s. I am %s. My sire is %s.",
arg10, ch->clan, arg9);
do_say (ch, buf);
}
if (arg9[0] != '\0')
{
sprintf (buf, "My name is %s. I am %s. My sire is %s.",
arg9, ch->clan, arg8);
do_say (ch, buf);
}
if (arg8[0] != '\0')
{
sprintf (buf, "My name is %s. I am %s. My sire is %s.",
arg8, ch->clan, arg7);
do_say (ch, buf);
}
if (arg7[0] != '\0')
{
sprintf (buf, "My name is %s. I am %s. My sire is %s.",
arg7, ch->clan, arg6);
do_say (ch, buf);
}
if (arg6[0] != '\0')
{
sprintf (buf, "My name is %s. I am %s. My sire is %s.",
arg6, ch->clan, arg5);
do_say (ch, buf);
}
if (arg5[0] != '\0')
{
sprintf (buf, "My name is %s. I am %s. My sire is %s.",
arg5, ch->clan, arg4);
do_say (ch, buf);
}
if (arg4[0] != '\0')
{
sprintf (buf, "My name is %s. My sire is %s.", arg4, arg3);
do_say (ch, buf);
}
if (arg3[0] != '\0')
{
sprintf (buf,
"My name is %s. I am %s. The Antediluvian of my line is %s.",
arg3, ch->clan, arg2);
do_say (ch, buf);
}
if (arg2[0] != '\0')
{
sprintf (buf, "My name is %s. I am an Antediluvian. My sire is %s.",
arg2, arg1);
do_say (ch, buf);
}
if (vampgen == 1)
{
sprintf (buf,
"I am %s, cursed by God to drink only blood and eat only ashes.",
ch->name);
//sprintf(buf,"My name is %s. I am he who sired all those of the Blood.",ch->name);
}
else
sprintf (buf, "My name is %s. All Kindred are my childer.", arg1);
do_say (ch, buf);
return;
}
void do_otradition (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 buf[MAX_INPUT_LENGTH];
char buf2[MAX_INPUT_LENGTH];
char buf3[MAX_INPUT_LENGTH];
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);
if (IS_NPC (ch))
return;
if (arg1 != '\0')
arg1[0] = UPPER (arg1[0]);
if (arg2 != '\0')
arg2[0] = UPPER (arg2[0]);
if (arg3 != '\0')
arg3[0] = UPPER (arg3[0]);
if (arg4 != '\0')
arg4[0] = UPPER (arg4[0]);
if (arg5 != '\0')
arg5[0] = UPPER (arg5[0]);
if (arg6 != '\0')
arg6[0] = UPPER (arg6[0]);
if (!str_cmp (arg1, "kavir"))
strcpy (arg1, "KaVir");
if (!IS_CLASS (ch, CLASS_VAMPIRE) || (ch->pcdata->stats[UNI_GEN] < 1)
|| (ch->pcdata->stats[UNI_GEN] > 13))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf3, "Antediluvian");
else if (ch->pcdata->rank == AGE_NEONATE)
sprintf (buf3, "Neonate");
else if (ch->pcdata->rank == AGE_ANCILLA)
sprintf (buf3, "Ancilla");
else if (ch->pcdata->rank == AGE_ELDER)
sprintf (buf3, "Elder");
else if (ch->pcdata->rank == AGE_METHUSELAH)
sprintf (buf3, "Methuselah");
else
sprintf (buf3, "Childe");
if (ch->pcdata->stats[UNI_GEN] == 7)
sprintf (buf2, "Seventh");
else if (ch->pcdata->stats[UNI_GEN] == 6)
sprintf (buf2, "Sixth");
else if (ch->pcdata->stats[UNI_GEN] == 5)
sprintf (buf2, "Fifth");
else if (ch->pcdata->stats[UNI_GEN] == 4)
sprintf (buf2, "Fourth");
else if (ch->pcdata->stats[UNI_GEN] == 3)
sprintf (buf2, "Third");
else if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf2, "Second");
if (ch->pcdata->stats[UNI_GEN] == 1)
sprintf (buf,
"As is the tradition, I recite the lineage of %s, Sire of all Kindred.",
ch->name);
else
sprintf (buf,
"As is the tradition, I recite the lineage of %s, %s of the %s Generation.",
ch->name, buf3, buf2);
do_say (ch, buf);
if (ch->pcdata->stats[UNI_GEN] != 1)
{
if (ch->pcdata->stats[UNI_GEN] == 7)
sprintf (buf2, "%s", arg6);
else if (ch->pcdata->stats[UNI_GEN] == 6)
sprintf (buf2, "%s", arg5);
else if (ch->pcdata->stats[UNI_GEN] == 5)
sprintf (buf2, "%s", arg4);
else if (ch->pcdata->stats[UNI_GEN] == 4)
sprintf (buf2, "%s", arg3);
else if (ch->pcdata->stats[UNI_GEN] == 3)
sprintf (buf2, "%s", arg2);
else if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf2, "%s", arg1);
if (IS_SET (ch->special, SPC_ANARCH) || strlen (ch->clan) < 2)
sprintf (buf, "My name is %s. I am of no clan. My sire is %s.",
ch->name, buf2);
else if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf, "My name is %s. I founded %s. My sire is %s.",
ch->name, ch->clan, buf2);
else
sprintf (buf, "My name is %s. I am of %s. My sire is %s.",
ch->name, ch->clan, buf2);
do_say (ch, buf);
}
if (arg6[0] != '\0')
{
sprintf (buf, "My name is %s. My sire is %s.", arg6, arg5);
do_say (ch, buf);
}
if (arg5[0] != '\0')
{
sprintf (buf, "My name is %s. My sire is %s.", arg5, arg4);
do_say (ch, buf);
}
if (arg4[0] != '\0')
{
sprintf (buf, "My name is %s. My sire is %s.", arg4, arg3);
do_say (ch, buf);
}
if (arg3[0] != '\0')
{
sprintf (buf, "My name is %s. My sire is %s.", arg3, arg2);
do_say (ch, buf);
}
if (arg2[0] != '\0')
{
sprintf (buf, "My name is %s. My sire is %s.", arg2, arg1);
do_say (ch, buf);
}
if (ch->pcdata->stats[UNI_GEN] == 1)
sprintf (buf, "My name is %s. All Kindred are my childer.", ch->name);
else
sprintf (buf, "My name is %s. All Kindred are my childer.", arg1);
do_say (ch, buf);
if (ch->pcdata->stats[UNI_GEN] == 7)
sprintf (buf,
"My name is %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s. Recognize my lineage.",
ch->name, arg6, arg5, arg4, arg3, arg2, arg1);
if (ch->pcdata->stats[UNI_GEN] == 6)
sprintf (buf,
"My name is %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s. Recognize my lineage.",
ch->name, arg5, arg4, arg3, arg2, arg1);
if (ch->pcdata->stats[UNI_GEN] == 5)
sprintf (buf,
"My name is %s, childe of %s, childe of %s, childe of %s, childe of %s. Recognize my lineage.",
ch->name, arg4, arg3, arg2, arg1);
if (ch->pcdata->stats[UNI_GEN] == 4)
sprintf (buf,
"My name is %s, childe of %s, childe of %s, childe of %s. Recognize my lineage.",
ch->name, arg3, arg2, arg1);
if (ch->pcdata->stats[UNI_GEN] == 3)
sprintf (buf,
"My name is %s, childe of %s, childe of %s. Recognize my lineage.",
ch->name, arg2, arg1);
if (ch->pcdata->stats[UNI_GEN] == 2)
sprintf (buf, "My name is %s, childe of %s. Recognize my lineage.",
ch->name, arg1);
if (ch->pcdata->stats[UNI_GEN] == 1)
sprintf (buf, "My name is %s. Recognize my lineage.", ch->name);
do_say (ch, buf);
return;
}
void do_darkheart (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (get_disc(ch, VAM_SERP) < 1)
{
send_to_char ("You need level 1 serpent first.\n\r", ch);
return;
}
if (IS_IMMUNE (ch, IMM_STAKE))
{
send_to_char ("But you've already torn your heart out!\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 100)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
ch->pcdata->condition[COND_THIRST] -= 100;
send_to_char
("You rip your heart from your body and toss it to the ground.\n\r",
ch);
act ("$n rips $s heart out and tosses it to the ground.", ch, NULL, NULL,
TO_ROOM);
make_part (ch, "heart");
ch->hit = ch->hit - number_range (10, 20);
update_pos (ch);
if (ch->position == POS_DEAD && !IS_HERO (ch))
{
send_to_char ("You have been KILLED!!\n\r\n\r", ch);
raw_kill (ch, ch);
ch->form = 2;
return;
}
SET_BIT (ch->immune, IMM_STAKE);
return;
}
void do_truesight (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_HIGHLANDER)
&& !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_DEMON)
&& !IS_CLASS (ch, CLASS_DRAGON) && !IS_CLASS (ch, CLASS_WRAITH))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS(ch, CLASS_WRAITH) && ( ch->arcanoi[WLIFE] < 4 ))
{
stc("You have not obtained this power yet.\n\r",ch);
return;
}
if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
{
if (!IS_DEMPOWER (ch, DEM_TRUESIGHT))
{
send_to_char ("You haven't been granted the gift of truesight.\n\r",
ch);
return;
}
}
if (IS_CLASS (ch, CLASS_DRAGON)
&& !IS_SET (ch->pcdata->dragonaff, DRA_TRUESIGHT))
{
send_to_char ("You don't have sight beyond sight yet.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_HIGHLANDER))
{
if (!IS_DEMPOWER (ch, HPOWER_VISION))
{
stc ("You have not gained the power of vision.\n\r", ch);
return;
}
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_AUSP) < 1)
{
send_to_char
("You need level 1 auspex before you can use truesight.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 3)
{
stc ("You must obtain level 3 Awareness to use Truesight.\n\r", ch);
return;
}
if (IS_SET (ch->act, PLR_HOLYLIGHT))
{
REMOVE_BIT (ch->act, PLR_HOLYLIGHT);
send_to_char ("Your senses return to normal.\n\r", ch);
}
else
{
SET_BIT (ch->act, PLR_HOLYLIGHT);
send_to_char ("Your senses increase to incredible proportions.\n\r",
ch);
}
return;
}
void do_scry (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
ROOM_INDEX_DATA *chroom;
ROOM_INDEX_DATA *victimroom;
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
bool found = FALSE;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 4)
{
stc ("You must obtain level 4 Awareness to use scry.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_HIGHLANDER))
{
if (!IS_DEMPOWER (ch, HPOWER_SCRY))
{
stc ("You have not gained the power of scry.\n\r", ch);
return;
}
}
if (IS_CLASS (ch, CLASS_DROW))
{
if (!IS_SET (ch->pcdata->powers[1], DPOWER_DROWSCRY))
{
stc ("You must be granted the power of divination.\n\r", ch);
return;
}
}
if (IS_CLASS (ch, CLASS_DRAGON)
&& !IS_SET (ch->pcdata->dragonaff, DRA_SCRY))
{
send_to_char ("You can't see people who are far away yet.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_AUSP) < 2)
{
stc ("You must obtain level 2 Auspex to scry.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_FAE) && ch->pcdata->powers[FAE_SOOT] < 3)
{
stc ("You must obtain the third Art of Soothsay to use tattletale.\n\r",
ch);
return;
}
else if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
{
if (!IS_DEMPOWER (ch, DEM_SCRY))
{
send_to_char ("You haven't been granted the gift of scry.\n\r", ch);
return;
}
}
else if (IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[PHILODOX] < 3)
{
stc ("You need level 3 philodox to use scry.\n\r", ch);
return;
}
else if (IS_CLASS (ch, CLASS_MAGE) && ch->spheres[MCOR] < 2)
{
stc ("You must obtain level two Correspondence to use Scry.\n\r", ch);
return;
}
else if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_ITEMAFF (ch, ITEMA_VISION)
&& !IS_CLASS (ch, CLASS_NINJA) && !IS_CLASS (ch, CLASS_MAGE)
&& !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_WEREWOLF)
&& !IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_HIGHLANDER)
&& !IS_CLASS (ch, CLASS_DRAGON) && !IS_CLASS (ch, CLASS_FAE))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_SORA] < 1)
{
send_to_char ("You have not learned the Sora principle to 1.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_NINJA) && ch->move < 600)
{
send_to_char
("You don't have enough movement points to scry someone.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char
("You close your eyes and mentally survey the surrounding area.\n\r",
ch);
act ("$n closes $s eyes and a look of concentration crosses $s face.",
ch, NULL, NULL, TO_ROOM);
for (d = first_descriptor; d != NULL; d = d->next)
{
if (d->connected != CON_PLAYING)
continue;
if ((victim = d->character) == NULL)
continue;
if (IS_NPC (victim) || victim->in_room == NULL)
continue;
if (victim == ch)
continue;
if (IS_IMMORTAL (victim))
continue;
if (!can_see (ch, victim))
continue;
if (IS_AFFECTED (victim, AFF_POLYMORPH))
sprintf (buf, "%s: ", victim->morph);
else
sprintf (buf, "%s: ", victim->name);
send_to_char (buf, ch);
if (victim->fight_timer > 0)
sprintf (buf, "%s.\n\r", victim->in_room->name);
else if (nosafe)
sprintf (buf, "%s.\n\r", victim->in_room->name);
else if (!IS_IMMUNE (victim, IMM_SHIELDED))
sprintf (buf, "%s.\n\r", victim->in_room->name);
else if (WORN_ARTIFACT(ch, ARTI_MAIDENS_BREATH))
sprintf (buf, "%s.\n\r", victim->in_room->name);
else
sprintf (buf, "(shielded).\n\r");
send_to_char (buf, ch);
found = TRUE;
}
if (!found)
send_to_char ("You cannot seem to locate anyone.\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (IS_SUPER_NPC (victim))
{
send_to_char ("You are unable to locate them.\n\r", ch);
return;
}
if (IS_IMMORTAL (victim))
{
stc ("You Failed.\n\r", ch);
return;
}
if (!IS_CLASS (ch, CLASS_DEMON) && !IS_SET (ch->special, SPC_CHAMPION) &&
ch->pcdata->condition[COND_THIRST] < 25
&& !IS_ITEMAFF (ch, ITEMA_VISION) && !IS_CLASS (ch, CLASS_NINJA)
&& !IS_CLASS (ch, CLASS_MAGE) && !IS_CLASS (ch, CLASS_HIGHLANDER)
&& !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_WEREWOLF)
&& !IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_DRAGON)
&& !IS_CLASS (ch, CLASS_FAE) )
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (!IS_ITEMAFF (ch, ITEMA_VISION) && IS_CLASS (ch, CLASS_VAMPIRE))
ch->pcdata->condition[COND_THIRST] -= number_range (15, 25);
if (IS_SET (victim->flag2, AFF2_SPIRITGUARD))
{
act ("Your spirit guardian sends you a message:", ch, NULL, victim,
TO_VICT);
act ("\"$n is scrying you.\"", ch, NULL, victim, TO_VICT);
}
if (!IS_NPC (victim) && (IS_IMMUNE (victim, IMM_SHIELDED) ||
(IS_CLASS (victim, CLASS_DROW)
&& IS_SET (ch->pcdata->powers[1],
DPOWER_DROWSHIELD)))
&& !IS_ITEMAFF (ch, ITEMA_VISION) && victim->fight_timer == 0
&& !nosafe && !WORN_ARTIFACT(ch, ARTI_MAIDENS_BREATH))
{
send_to_char ("You are unable to locate them.\n\r", ch);
return;
}
if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
{
stc ("You are unable to locate them.\n\r", ch);
return;
}
chroom = ch->in_room;
victimroom = victim->in_room;
char_from_room (ch);
char_to_room (ch, victimroom);
if (IS_AFFECTED (ch, AFF_SHADOWPLANE)
&& (!IS_AFFECTED (victim, AFF_SHADOWPLANE)))
{
REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
do_look (ch, "auto");
SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
}
else if (!IS_AFFECTED (ch, AFF_SHADOWPLANE)
&& (IS_AFFECTED (victim, AFF_SHADOWPLANE)))
{
SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
do_look (ch, "auto");
REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
}
else
do_look (ch, "auto");
char_from_room (ch);
char_to_room (ch, chroom);
return;
}
void do_readaura (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
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_CLASS (ch, CLASS_VAMPIRE) && !IS_ITEMAFF (ch, ITEMA_VISION)
&& !IS_CLASS (ch, CLASS_NINJA) && !IS_CLASS (ch, CLASS_MONK)
&& !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS(ch, CLASS_WRAITH))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS( ch, CLASS_WRAITH ) && ch->arcanoi[WLIFE] < 2 )
{
send_to_char("You do not have the power to do this.\n\r", ch );
return;
}
if (IS_CLASS (ch, CLASS_HIGHLANDER))
{
if (!IS_DEMPOWER (ch, HPOWER_READAURA))
{
stc ("You have not gained that power.\n\r", ch);
return;
}
}
if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_SORA] < 2)
{
send_to_char ("You have not learned the Sora principle to 2.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_NINJA) && ch->move < 600)
{
send_to_char ("You don't have enough movement points to readaura.\n\r",
ch);
return;
}
if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[SPIRIT] < 2)
{
send_to_char ("You have not learned that ability.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_AUSP) < 4
&& !IS_ITEMAFF (ch, ITEMA_VISION) && !IS_CLASS (ch, CLASS_NINJA)
&& !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS(ch, CLASS_WRAITH))
{
send_to_char ("You need level 4 auspex first.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Read the aura on what?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
if ((obj = get_obj_carry (ch, arg)) == NULL)
{
send_to_char ("Read the aura on what?\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 50
&& !IS_ITEMAFF (ch, ITEMA_VISION) && !IS_CLASS (ch, CLASS_NINJA)
&& !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS(ch, CLASS_WRAITH))
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (!IS_ITEMAFF (ch, ITEMA_VISION))
ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
act ("$n examines $p intently.", ch, obj, NULL, TO_ROOM);
spell_identify (skill_lookup ("identify"), ch->level, ch, obj);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 50
&& !IS_ITEMAFF (ch, ITEMA_VISION) && !IS_CLASS (ch, CLASS_NINJA)
&& !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS(ch, CLASS_WRAITH))
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (!IS_ITEMAFF (ch, ITEMA_VISION))
ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
if (!IS_NPC (victim) && (IS_IMMUNE (victim, IMM_SHIELDED)
|| (IS_CLASS (victim, CLASS_DROW)
&& IS_SET (victim->pcdata->powers[1],
DPOWER_DROWSHIELD)))
&& !IS_ITEMAFF (ch, ITEMA_VISION))
{
send_to_char ("You are unable to read their aura.\n\r", ch);
return;
}
if (IS_SUPER_NPC (victim))
{
act ("You are unable to read $S aura.", ch, NULL, victim, TO_CHAR);
return;
}
act ("$n examines $N intently.", ch, NULL, victim, TO_NOTVICT);
act ("$n examines you intently.", ch, NULL, victim, TO_VICT);
if (IS_NPC (victim))
sprintf (buf, "%s is an NPC.\n\r", victim->short_descr);
else
{
if (victim->level == 12)
sprintf (buf, "%s is an Implementor.\n\r", victim->name);
else if (victim->level == 11)
sprintf (buf, "%s is a High Judge.\n\r", victim->name);
else if (victim->level == 10)
sprintf (buf, "%s is a Judge.\n\r", victim->name);
else if (victim->level == 9)
sprintf (buf, "%s is an Enforcer.\n\r", victim->name);
else if (victim->level == 8)
sprintf (buf, "%s is a Quest Maker.\n\r", victim->name);
else if (victim->level == 7)
sprintf (buf, "%s is a Builder.\n\r", victim->name);
else if (victim->level >= 3)
sprintf (buf, "%s is an Avatar.\n\r", victim->name);
else
sprintf (buf, "%s is a Mortal.\n\r", victim->name);
}
send_to_char (buf, ch);
if (!IS_NPC (victim))
{
sprintf (buf, "Str:%d, Int:%d, Wis:%d, Dex:%d, Con:%d.\n\r",
get_curr_str (victim), get_curr_int (victim),
get_curr_wis (victim), get_curr_dex (victim),
get_curr_con (victim));
send_to_char (buf, ch);
}
sprintf (buf, "Hp:%d/%d, Mana:%d/%d, Move:%d/%d.\n\r", victim->hit,
victim->max_hit, victim->mana, victim->max_mana, victim->move,
victim->max_move);
send_to_char (buf, ch);
sprintf (buf, "Hitroll:%d, Damroll:%d, AC:%d.\n\r",
char_hitroll (victim), char_damroll (victim), char_ac (victim));
send_to_char (buf, ch);
if (!IS_NPC (victim))
{
sprintf (buf, "Status:%d, ", victim->race);
send_to_char (buf, ch);
if (IS_CLASS (victim, CLASS_VAMPIRE))
{
sprintf (buf, "Blood:%d, ", victim->pcdata->condition[COND_THIRST]);
send_to_char (buf, ch);
}
}
sprintf (buf, "Alignment:%d.\n\r", victim->alignment);
send_to_char (buf, ch);
if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_PREGNANT))
act ("$N is pregnant.", ch, NULL, victim, TO_CHAR);
if (IS_CLASS (ch, CLASS_NINJA))
{
ch->move -= 600;
return;
}
return;
}
void do_mortal (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
int blood;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (get_disc(ch, VAM_OBFU) < 4)
{
send_to_char ("You need level 4 obfuscate first.\n\r", ch);
return;
}
if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_VAMPAFF (ch, VAM_MORTAL))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE))
{
if (ch->pcdata->condition[COND_THIRST] < 100)
{
send_to_char ("You must be at full blood to use this power.\n\r",
ch);
return;
}
blood = ch->pcdata->condition[COND_THIRST];
ch->pcdata->condition[COND_THIRST] = 666;
if (IS_VAMPAFF (ch, VAM_DISGUISED))
do_mask (ch, "self");
if (IS_IMMUNE (ch, IMM_SHIELDED))
do_shield (ch, "");
if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
do_shadowplane (ch, "");
if (IS_VAMPAFF (ch, VAM_FANGS))
do_fangs (ch, "");
if (IS_VAMPAFF (ch, VAM_CLAWS))
do_claws (ch, "");
if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
do_nightsight (ch, "");
if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
do_shadowsight (ch, "");
if (IS_SET (ch->act, PLR_HOLYLIGHT))
do_truesight (ch, "");
if (IS_VAMPAFF (ch, VAM_CHANGED))
do_change (ch, "human");
if (IS_POLYAFF (ch, POLY_SERPENT))
do_serpent (ch, "");
ch->pcdata->stats[UNI_RAGE] = 0;
ch->pcdata->condition[COND_THIRST] = blood;
send_to_char
("Colour returns to your skin and you warm up a little.\n\r", ch);
act ("Colour returns to $n's skin.", ch, NULL, NULL, TO_ROOM);
REMOVE_BIT (ch->class, CLASS_VAMPIRE);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
return;
}
send_to_char ("You skin pales and cools.\n\r", ch);
act ("$n's skin pales slightly.", ch, NULL, NULL, TO_ROOM);
ch->class = CLASS_VAMPIRE;
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
return;
}
void do_mortalvamp (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
int blood;
int pos = ch->position;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (IS_CLASS (ch, CLASS_VAMPIRE))
{
ch->position = POS_STANDING;
/* Have to make sure they have enough blood to change back */
blood = ch->pcdata->condition[COND_THIRST];
ch->pcdata->condition[COND_THIRST] = 666;
/* Remove physical vampire attributes when you take mortal form */
if (IS_VAMPAFF (ch, VAM_DISGUISED))
do_mask (ch, "self");
if (IS_IMMUNE (ch, IMM_SHIELDED))
do_shield (ch, "");
if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
do_shadowplane (ch, "");
if (IS_VAMPAFF (ch, VAM_FANGS))
do_fangs (ch, "");
if (IS_VAMPAFF (ch, VAM_CLAWS))
do_claws (ch, "");
if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
do_nightsight (ch, "");
if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
do_shadowsight (ch, "");
if (IS_SET (ch->act, PLR_HOLYLIGHT))
do_truesight (ch, "");
if (IS_VAMPAFF (ch, VAM_CHANGED))
do_change (ch, "human");
if (IS_POLYAFF (ch, POLY_SERPENT))
do_serpent (ch, "");
if (IS_EXTRA (ch, EXTRA_DRAGON))
do_dragonform (ch, "");
if (IS_POLYAFF (ch, POLY_ZULO))
do_zuloform (ch, "");
ch->position = pos;
ch->pcdata->stats[UNI_RAGE] = 0;
ch->pcdata->condition[COND_THIRST] = blood;
send_to_char ("You lose your vampire powers.\n\r", ch);
REMOVE_BIT (ch->class, CLASS_VAMPIRE);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
return;
}
send_to_char ("You regain your vampire powers.\n\r", ch);
ch->class = CLASS_VAMPIRE;
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
return;
}
void do_shield (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_VAMPIRE)
&& !IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_DEMON)
&& !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS (ch, CLASS_MAGE)
&& !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS(ch, CLASS_WRAITH))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS( ch, CLASS_WRAITH) && (ch->arcanoi[WLIFE] < 1 ) )
{
stc("You do not know how to use this.\n\r",ch);
return;
}
if (IS_CLASS (ch, CLASS_HIGHLANDER))
{
if (!IS_DEMPOWER (ch, HPOWER_SHIELD))
{
stc ("You have not gained the power of shield.\n\r", ch);
return;
}
}
if (IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[SILVERFANGS] < 4)
{
stc ("You need level 5 Silver Fangs first!\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 5)
{
stc ("You must obtain level 5 Awareness to use shield.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_DROW)
&& !IS_SET (ch->pcdata->powers[1], DPOWER_DROWSHIELD))
{
send_to_char ("You don't have that power.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBFU) < 2)
{
send_to_char ("You need level 2 obfuscate first.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
{
if (!IS_DEMPOWER (ch, DEM_SHIELD))
{
send_to_char ("You haven't been granted the gift of shielding.\n\r",
ch);
return;
}
}
if (IS_CLASS (ch, CLASS_VAMPIRE)
&& ch->pcdata->condition[COND_THIRST] < 60)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_MAGE)
&& (ch->spheres[MCOR] < 2 && ch->spheres[MMIN] < 1))
{
stc ("You must obtain level two Correspondence to Shield your being.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE))
ch->pcdata->condition[COND_THIRST] -= number_range (50, 60);
if (!IS_IMMUNE (ch, IMM_SHIELDED))
{
if (IS_CLASS(ch, CLASS_WRAITH))
stc("You cut a strand connecting you to the mortal world, shielding your aura.\n\r",ch);
else
send_to_char ("You shield your aura from those around you.\n\r", ch);
SET_BIT (ch->immune, IMM_SHIELDED);
return;
}
if (IS_CLASS(ch,CLASS_WRAITH))
stc("You re-tie a link to the mortal world.\n\r",ch);
else
send_to_char ("You stop shielding your aura.\n\r", ch);
REMOVE_BIT (ch->immune, IMM_SHIELDED);
return;
}
void do_serpent (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (get_disc(ch, VAM_SERP) < 2)
{
send_to_char ("You need level 2 serpent first.\n\r", ch);
return;
}
if (IS_AFFECTED (ch, AFF_POLYMORPH))
{
if (!IS_POLYAFF (ch, POLY_SERPENT))
{
send_to_char ("You cannot polymorph from this form.\n\r", ch);
return;
}
act ("You transform back into human.", ch, NULL, NULL, TO_CHAR);
act ("$n transform into human form.", ch, NULL, NULL, TO_ROOM);
REMOVE_BIT (ch->polyaff, POLY_SERPENT);
REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
clear_stats (ch);
free_string (ch->morph);
ch->morph = str_dup ("");
ch->max_hit = ch->max_hit - 250;
ch->hit = ch->hit - 250;
if (ch->hit < 1)
ch->hit = 1;
ch->max_mana = ch->max_mana + 50;
return;
}
if (ch->pcdata->condition[COND_THIRST] < 50)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
clear_stats (ch);
if (ch->wpn[0] > 0)
{
ch->hitroll += ch->wpn[0] * 0.75;
ch->damroll += ch->wpn[0] * 0.75;
ch->armor -= ch->wpn[0] * 3;
}
if (ch->stance[0] != -1)
do_stance (ch, "");
if (ch->mounted == IS_RIDING)
do_dismount (ch, "");
ch->pcdata->mod_str = 10;
act ("You transform into a huge serpent.", ch, NULL, NULL, TO_CHAR);
act ("$n transforms into a huge serpent.", ch, NULL, NULL, TO_ROOM);
SET_BIT (ch->polyaff, POLY_SERPENT);
SET_BIT (ch->affected_by, AFF_POLYMORPH);
sprintf (buf, "%s the huge serpent", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
ch->max_hit = ch->max_hit + 250;
ch->hit = ch->hit + 250;
ch->max_mana = ch->max_mana - 50;
return;
}
void do_regenerate (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->stats[UNI_RAGE] > 0)
{
send_to_char
("You cannot control your regenerative powers while the beast is so strong.\n\r",
ch);
return;
}
if (ch->position == POS_FIGHTING)
{
send_to_char ("You cannot regenerate while fighting.\n\r", ch);
return;
}
if (ch->hit >= ch->max_hit && ch->mana >= ch->max_mana
&& ch->move >= ch->max_move)
{
send_to_char ("But you are already completely regenerated!\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 10)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
ch->pcdata->condition[COND_THIRST] -= number_range (5, 10);
if (ch->hit >= ch->max_hit && ch->mana >= ch->max_mana
&& ch->move >= ch->max_move)
{
send_to_char ("Your body has completely regenerated.\n\r", ch);
act ("$n's body completely regenerates itself.", ch, NULL, NULL,
TO_ROOM);
}
else
send_to_char ("Your body slowly regenerates itself.\n\r", ch);
if (ch->hit < 1)
{
ch->hit += number_range (1, 3);
update_pos (ch);
WAIT_STATE (ch, 24);
}
else
{
int conamount = (get_curr_con (ch) + 1);
int intamount = (get_curr_int (ch) + 1);
int dexamount = (get_curr_dex (ch) + 1);
int a = ch->max_hit / 400;
int b = ch->max_mana / 400;
int c = ch->max_move / 400;
if (a < 1)
a = 1;
if (b < 1)
b = 1;
if (c < 1)
c = 1;
a *= number_range(1,5);
b *= number_range(1,5);
c *= number_range(1,5);
if (a < 5)
a = 5;
if (b < 5)
b = 5;
if (c < 5)
c = 5;
a += ((conamount - (conamount % 10)) * dice (3, 25));
b += ((intamount - (intamount % 10)) * dice (3, 25));
c += ((dexamount - (dexamount % 10)) * dice (3, 25));
if (IS_AFFECTED (ch, AFF_FLAMING))
{
a /= 4;
b /= 4;
c /= 4;
}
if (ch->fight_timer > 0)
{
a /= 4;
b /= 4;
c /= 4;
}
if ((a + ch->hit) > ch->max_hit)
a = (ch->max_hit - ch->hit);
if ((b + ch->mana) > ch->max_mana)
b = (ch->max_mana - ch->mana);
if ((c + ch->move) > ch->max_move)
c = (ch->max_move - ch->move);
ch->hit += a;
ch->mana += b;
ch->move += c;
update_pos (ch);
if (IS_SET (ch->more, PLR_SEE_REGEN))
{
if (a > 0)
stcf (ch,
"#wYour body repairs the damage you have suffered. #g[ #c+%d hp #g]#n\n\r",
a);
if (b > 0)
stcf (ch,
"#wYour mind harnesses nearby latent energy. #g[ #c+%d mana #g]#n\n\r",
b);
if (c > 0)
stcf (ch,
"#wYou slowly regain your stamina. #g[ #c+%d move #g]#n\n\r",
c);
}
}
WAIT_STATE (ch, 12);
return;
}
void reg_mend (CHAR_DATA * ch)
{
int ribs = 0;
int teeth = 0;
if (IS_BODY (ch, BROKEN_RIBS_1))
ribs += 1;
if (IS_BODY (ch, BROKEN_RIBS_2))
ribs += 2;
if (IS_BODY (ch, BROKEN_RIBS_4))
ribs += 4;
if (IS_BODY (ch, BROKEN_RIBS_8))
ribs += 8;
if (IS_BODY (ch, BROKEN_RIBS_16))
ribs += 16;
if (IS_HEAD (ch, LOST_TOOTH_1))
teeth += 1;
if (IS_HEAD (ch, LOST_TOOTH_2))
teeth += 2;
if (IS_HEAD (ch, LOST_TOOTH_4))
teeth += 4;
if (IS_HEAD (ch, LOST_TOOTH_8))
teeth += 8;
if (IS_HEAD (ch, LOST_TOOTH_16))
teeth += 16;
if (ribs > 0)
{
if (IS_BODY (ch, BROKEN_RIBS_1))
REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_1);
if (IS_BODY (ch, BROKEN_RIBS_2))
REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_2);
if (IS_BODY (ch, BROKEN_RIBS_4))
REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_4);
if (IS_BODY (ch, BROKEN_RIBS_8))
REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_8);
if (IS_BODY (ch, BROKEN_RIBS_16))
REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_16);
ribs -= 1;
if (ribs >= 16)
{
ribs -= 16;
SET_BIT (ch->loc_hp[1], BROKEN_RIBS_16);
}
if (ribs >= 8)
{
ribs -= 8;
SET_BIT (ch->loc_hp[1], BROKEN_RIBS_8);
}
if (ribs >= 4)
{
ribs -= 4;
SET_BIT (ch->loc_hp[1], BROKEN_RIBS_4);
}
if (ribs >= 2)
{
ribs -= 2;
SET_BIT (ch->loc_hp[1], BROKEN_RIBS_2);
}
if (ribs >= 1)
{
ribs -= 1;
SET_BIT (ch->loc_hp[1], BROKEN_RIBS_1);
}
act ("One of $n's ribs snap back into place.", ch, NULL, NULL, TO_ROOM);
act ("One of your ribs snap back into place.", ch, NULL, NULL, TO_CHAR);
}
else if (IS_HEAD (ch, LOST_EYE_L))
{
act ("An eyeball appears in $n's left eye socket.", ch, NULL, NULL,
TO_ROOM);
act ("An eyeball appears in your left eye socket.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_EYE_L);
}
else if (IS_HEAD (ch, LOST_EYE_R))
{
act ("An eyeball appears in $n's right eye socket.", ch, NULL, NULL,
TO_ROOM);
act ("An eyeball appears in your right eye socket.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_EYE_R);
}
else if (IS_HEAD (ch, LOST_EAR_L))
{
act ("An ear grows on the left side of $n's head.", ch, NULL, NULL,
TO_ROOM);
act ("An ear grows on the left side of your head.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_EAR_L);
}
else if (IS_HEAD (ch, LOST_EAR_R))
{
act ("An ear grows on the right side of $n's head.", ch, NULL, NULL,
TO_ROOM);
act ("An ear grows on the right side of your head.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_EAR_R);
}
else if (IS_HEAD (ch, LOST_NOSE))
{
act ("A nose grows on the front of $n's face.", ch, NULL, NULL,
TO_ROOM);
act ("A nose grows on the front of your face.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_NOSE);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], BROKEN_NOSE);
}
else if (teeth > 0)
{
if (IS_HEAD (ch, LOST_TOOTH_1))
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_1);
if (IS_HEAD (ch, LOST_TOOTH_2))
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_2);
if (IS_HEAD (ch, LOST_TOOTH_4))
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_4);
if (IS_HEAD (ch, LOST_TOOTH_8))
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_8);
if (IS_HEAD (ch, LOST_TOOTH_16))
REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_16);
teeth -= 1;
if (teeth >= 16)
{
teeth -= 16;
SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_16);
}
if (teeth >= 8)
{
teeth -= 8;
SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_8);
}
if (teeth >= 4)
{
teeth -= 4;
SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_4);
}
if (teeth >= 2)
{
teeth -= 2;
SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_2);
}
if (teeth >= 1)
{
teeth -= 1;
SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_1);
}
act ("A missing tooth grows in your mouth.", ch, NULL, NULL, TO_CHAR);
act ("A missing tooth grows in $n's mouth.", ch, NULL, NULL, TO_ROOM);
}
else if (IS_HEAD (ch, BROKEN_NOSE))
{
act ("$n's nose snaps back into place.", ch, NULL, NULL, TO_ROOM);
act ("Your nose snaps back into place.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], BROKEN_NOSE);
}
else if (IS_HEAD (ch, BROKEN_JAW))
{
act ("$n's jaw snaps back into place.", ch, NULL, NULL, TO_ROOM);
act ("Your jaw snaps back into place.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], BROKEN_JAW);
}
else if (IS_HEAD (ch, BROKEN_SKULL))
{
act ("$n's skull knits itself back together.", ch, NULL, NULL, TO_ROOM);
act ("Your skull knits itself back together.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_HEAD], BROKEN_SKULL);
}
else if (IS_BODY (ch, BROKEN_SPINE))
{
act ("$n's spine knits itself back together.", ch, NULL, NULL, TO_ROOM);
act ("Your spine knits itself back together.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_BODY], BROKEN_SPINE);
}
else if (IS_BODY (ch, BROKEN_NECK))
{
act ("$n's neck snaps back into place.", ch, NULL, NULL, TO_ROOM);
act ("Your neck snaps back into place.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_BODY], BROKEN_NECK);
}
else if (IS_ARM_L (ch, LOST_ARM))
{
act ("An arm grows from the stump of $n's left shoulder.", ch, NULL,
NULL, TO_ROOM);
act ("An arm grows from the stump of your left shoulder.", ch, NULL,
NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_ARM);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_ARM);
SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_HAND);
}
else if (IS_ARM_R (ch, LOST_ARM))
{
act ("An arm grows from the stump of $n's right shoulder.", ch, NULL,
NULL, TO_ROOM);
act ("An arm grows from the stump of your right shoulder.", ch, NULL,
NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_ARM);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_ARM);
SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_HAND);
}
else if (IS_LEG_L (ch, LOST_LEG))
{
act ("A leg grows from the stump of $n's left hip.", ch, NULL, NULL,
TO_ROOM);
act ("A leg grows from the stump of your left hip.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_LEG_L], LOST_LEG);
REMOVE_BIT (ch->loc_hp[LOC_LEG_L], BROKEN_LEG);
SET_BIT (ch->loc_hp[LOC_LEG_L], LOST_FOOT);
}
else if (IS_LEG_R (ch, LOST_LEG))
{
act ("A leg grows from the stump of $n's right hip.", ch, NULL, NULL,
TO_ROOM);
act ("A leg grows from the stump of your right hip.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_LEG_R], LOST_LEG);
REMOVE_BIT (ch->loc_hp[LOC_LEG_R], BROKEN_LEG);
SET_BIT (ch->loc_hp[LOC_LEG_R], LOST_FOOT);
}
else if (IS_ARM_L (ch, BROKEN_ARM))
{
act ("$n's left arm snaps back into place.", ch, NULL, NULL, TO_ROOM);
act ("Your left arm snaps back into place.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_ARM);
}
else if (IS_ARM_R (ch, BROKEN_ARM))
{
act ("$n's right arm snaps back into place.", ch, NULL, NULL, TO_ROOM);
act ("Your right arm snaps back into place.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_ARM);
}
else if (IS_LEG_L (ch, BROKEN_LEG))
{
act ("$n's left leg snaps back into place.", ch, NULL, NULL, TO_ROOM);
act ("Your left leg snaps back into place.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_LEG_L], BROKEN_LEG);
}
else if (IS_LEG_R (ch, BROKEN_LEG))
{
act ("$n's right leg snaps back into place.", ch, NULL, NULL, TO_ROOM);
act ("Your right leg snaps back into place.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_LEG_R], BROKEN_LEG);
}
else if (IS_ARM_L (ch, LOST_HAND))
{
act ("A hand grows from the stump of $n's left wrist.", ch, NULL, NULL,
TO_ROOM);
act ("A hand grows from the stump of your left wrist.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_HAND);
SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_THUMB);
SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_I);
SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_M);
SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_R);
SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_L);
}
else if (IS_ARM_R (ch, LOST_HAND))
{
act ("A hand grows from the stump of $n's right wrist.", ch, NULL, NULL,
TO_ROOM);
act ("A hand grows from the stump of your right wrist.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_HAND);
SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_THUMB);
SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_I);
SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_M);
SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_R);
SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_L);
}
else if (IS_LEG_L (ch, LOST_FOOT))
{
act ("A foot grows from the stump of $n's left ankle.", ch, NULL, NULL,
TO_ROOM);
act ("A foot grows from the stump of your left ankle.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_LEG_L], LOST_FOOT);
}
else if (IS_LEG_R (ch, LOST_FOOT))
{
act ("A foot grows from the stump of $n's right ankle.", ch, NULL, NULL,
TO_ROOM);
act ("A foot grows from the stump of your right ankle.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_LEG_R], LOST_FOOT);
}
else if (IS_ARM_L (ch, LOST_THUMB))
{
act ("A thumb slides out of $n's left hand.", ch, NULL, NULL, TO_ROOM);
act ("A thumb slides out of your left hand.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_THUMB);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_THUMB);
}
else if (IS_ARM_L (ch, BROKEN_THUMB))
{
act ("$n's left thumb snaps back into place.", ch, NULL, NULL, TO_ROOM);
act ("Your left thumb snaps back into place.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_THUMB);
}
else if (IS_ARM_L (ch, LOST_FINGER_I))
{
act ("An index finger slides out of $n's left hand.", ch, NULL, NULL,
TO_ROOM);
act ("An index finger slides out of your left hand.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_I);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_I);
}
else if (IS_ARM_L (ch, BROKEN_FINGER_I))
{
act ("$n's left index finger snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your left index finger snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_I);
}
else if (IS_ARM_L (ch, LOST_FINGER_M))
{
act ("A middle finger slides out of $n's left hand.", ch, NULL, NULL,
TO_ROOM);
act ("A middle finger slides out of your left hand.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_M);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_M);
}
else if (IS_ARM_L (ch, BROKEN_FINGER_M))
{
act ("$n's left middle finger snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your left middle finger snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_M);
}
else if (IS_ARM_L (ch, LOST_FINGER_R))
{
act ("A ring finger slides out of $n's left hand.", ch, NULL, NULL,
TO_ROOM);
act ("A ring finger slides out of your left hand.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_R);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_R);
}
else if (IS_ARM_L (ch, BROKEN_FINGER_R))
{
act ("$n's left ring finger snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your left ring finger snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_R);
}
else if (IS_ARM_L (ch, LOST_FINGER_L))
{
act ("A little finger slides out of $n's left hand.", ch, NULL, NULL,
TO_ROOM);
act ("A little finger slides out of your left hand.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_L);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_L);
}
else if (IS_ARM_L (ch, BROKEN_FINGER_L))
{
act ("$n's left little finger snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your left little finger snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_L);
}
else if (IS_ARM_R (ch, LOST_THUMB))
{
act ("A thumb slides out of $n's right hand.", ch, NULL, NULL, TO_ROOM);
act ("A thumb slides out of your right hand.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_THUMB);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_THUMB);
}
else if (IS_ARM_R (ch, BROKEN_THUMB))
{
act ("$n's right thumb snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your right thumb snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_THUMB);
}
else if (IS_ARM_R (ch, LOST_FINGER_I))
{
act ("An index finger slides out of $n's right hand.", ch, NULL, NULL,
TO_ROOM);
act ("An index finger slides out of your right hand.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_I);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_I);
}
else if (IS_ARM_R (ch, BROKEN_FINGER_I))
{
act ("$n's right index finger snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your right index finger snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_I);
}
else if (IS_ARM_R (ch, LOST_FINGER_M))
{
act ("A middle finger slides out of $n's right hand.", ch, NULL, NULL,
TO_ROOM);
act ("A middle finger slides out of your right hand.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_M);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_M);
}
else if (IS_ARM_R (ch, BROKEN_FINGER_M))
{
act ("$n's right middle finger snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your right middle finger snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_M);
}
else if (IS_ARM_R (ch, LOST_FINGER_R))
{
act ("A ring finger slides out of $n's right hand.", ch, NULL, NULL,
TO_ROOM);
act ("A ring finger slides out of your right hand.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_R);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_R);
}
else if (IS_ARM_R (ch, BROKEN_FINGER_R))
{
act ("$n's right ring finger snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your right ring finger snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_R);
}
else if (IS_ARM_R (ch, LOST_FINGER_L))
{
act ("A little finger slides out of $n's right hand.", ch, NULL, NULL,
TO_ROOM);
act ("A little finger slides out of your right hand.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_L);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_L);
}
else if (IS_ARM_R (ch, BROKEN_FINGER_L))
{
act ("$n's right little finger snaps back into place.", ch, NULL, NULL,
TO_ROOM);
act ("Your right little finger snaps back into place.", ch, NULL, NULL,
TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_L);
}
else if (IS_BODY (ch, CUT_THROAT))
{
if (IS_SET (ch->loc_hp[6], BLEEDING_THROAT))
return;
act ("The wound in $n's throat closes up.", ch, NULL, NULL, TO_ROOM);
act ("The wound in your throat closes up.", ch, NULL, NULL, TO_CHAR);
REMOVE_BIT (ch->loc_hp[LOC_BODY], CUT_THROAT);
}
return;
}
void vamp_rage (CHAR_DATA * ch)
{
if (IS_NPC (ch))
return;
send_to_char ("You scream with rage as the beast within consumes you!\n\r",
ch);
act ("$n screams with rage as $s inner beast consumes $m!.", ch, NULL,
NULL, TO_ROOM);
do_beastlike (ch, "");
do_rage (ch, "");
return;
}
void do_humanity (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_VAMPIRE) && ch->beast > 0
&& ch->beast < 100 && number_range (1, 500) <= ch->beast)
{
if (ch->beast == 1)
{
send_to_char ("You have attained Golconda!\n\r", ch);
if (!IS_SET (ch->more, GOT_GOLCONDA))
ch->exp += 1000000;
SET_BIT (ch->more, GOT_GOLCONDA);
if (!IS_IMMUNE (ch, IMM_SUNLIGHT))
SET_BIT (ch->immune, IMM_SUNLIGHT);
}
else
send_to_char ("You feel slightly more in control of your beast.\n\r",
ch);
ch->beast -= 1;
}
return;
}
//Temp Till i add Diablerie - Mac
void do_gainbeast (CHAR_DATA * ch, char *argument)
{
int cost = 1000000;
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (ch->beast > 0)
{
stc ("Your beast is already started to take control\n\r", ch);
return;
}
if (ch->exp < cost)
{
stcprintf (ch, "You need %d exp to gain a beast point\n\r", cost);
return;
}
ch->exp -= cost;
ch->beast += 1;
stc ("You feel your beast take more control over your actions.\n\r", ch);
return;
}
void do_beastlike (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
int blood;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_VAMPIRE) && ch->beast < 100
&& ch->beast > 0 && number_range (1, 500) <= ch->beast)
{
if (ch->beast < 99)
send_to_char
("You feel your beast take more control over your actions.\n\r",
ch);
else
send_to_char
("Your beast has fully taken over control of your actions!\n\r",
ch);
ch->beast += 1;
blood = ch->pcdata->condition[COND_THIRST];
ch->pcdata->condition[COND_THIRST] = 666;
if ((IS_VAMPAFF (ch, VAM_PROTEAN)
|| (IS_VAMPAFF (ch, VAM_OBTENEBRATION)))
&& !IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
do_nightsight (ch, "");
if (!IS_VAMPAFF (ch, VAM_FANGS))
do_fangs (ch, "");
if (IS_VAMPAFF (ch, VAM_PROTEAN) && !IS_VAMPAFF (ch, VAM_CLAWS))
do_claws (ch, "");
ch->pcdata->condition[COND_THIRST] = blood;
}
return;
}
void do_feed (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
char bufch[MAX_INPUT_LENGTH];
char bufvi[MAX_INPUT_LENGTH];
int blood;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (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_CLASS (victim, CLASS_VAMPIRE))
{
send_to_char ("Blood does them no good at all.\n\r", ch);
return;
}
if (!IS_IMMUNE (victim, IMM_VAMPIRE))
{
send_to_char ("They refuse to drink your blood.\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 20)
{
send_to_char ("You don't have enough blood.\n\r", ch);
return;
}
blood = number_range (5, 10);
ch->pcdata->condition[COND_THIRST] -= (blood * 2);
victim->pcdata->condition[COND_THIRST] += blood;
if (IS_AFFECTED (ch, AFF_POLYMORPH))
sprintf (bufch, ch->morph);
else
sprintf (bufch, ch->name);
if (IS_AFFECTED (victim, AFF_POLYMORPH))
sprintf (bufvi, victim->morph);
else
sprintf (bufvi, victim->name);
sprintf (buf, "You cut open your wrist and feed some blood to %s.", bufvi);
act (buf, ch, NULL, victim, TO_CHAR);
sprintf (buf, "%s cuts open $s wrist and feeds some blood to %s.", bufch,
bufvi);
act (buf, ch, NULL, victim, TO_NOTVICT);
if (victim->position < POS_RESTING)
send_to_char ("You feel some blood poured down your throat.\n\r",
victim);
else
{
sprintf (buf, "%s cuts open $s wrist and feeds you some blood.", bufch);
act (buf, ch, NULL, victim, TO_VICT);
}
return;
}
void do_upkeep (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
char buf2[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (IS_CLASS (ch, CLASS_HIGHLANDER))
{
hlupkeep (ch);
return;
}
if (IS_CLASS (ch, CLASS_MAGE))
{
do_mageupkeep (ch, "");
return;
}
if (IS_CLASS (ch, CLASS_WEREWOLF))
{
wwupkeep (ch);
return;
}
if (IS_CLASS (ch, CLASS_DROW))
{
drowupkeep (ch);
return;
}
if (IS_CLASS (ch, CLASS_MONK))
{
monkupkeep (ch);
return;
}
if (IS_CLASS (ch, CLASS_FAE))
{
send_to_char ("[< Fae upkeep >]\n\r\n\r", ch);
if (IS_SET (ch->newbits, NEW_MONKFLAME))
send_to_char ("Your hands are engulfed by flames!\n\r", ch);
if (IS_SET (ch->flag2, AFF2_SPIRITGUARD))
send_to_char ("Your spirit guardian has been awakened.\n\r", ch);
if (IS_SET (ch->garou1, WW_GRANITE))
send_to_char ("You have a wall of power protecting you.\n\r", ch);
if (IS_SET (ch->extra2, EXTRA2_FAESPEED))
send_to_char ("You move faster than the eye can follow.\n\r", ch);
if (IS_IMMUNE (ch, IMM_SHIELDED))
send_to_char ("You aura is shielded.\n\r", ch);
if (IS_SET (ch->extra2, EXTRA2_WYRM))
send_to_char ("You are in the elder form.\n\r", ch);
if (IS_SET (ch->special, SPC_SEEMING))
send_to_char ("You are in your seeming form.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
{
send_to_char
("--------------------------------------------------------------------------------\n\r",
ch);
send_to_char (" -= Demonic powers =-\n\r",
ch);
send_to_char
("--------------------------------------------------------------------------------\n\r",
ch);
if (ch->pcdata->powers[DPOWER_FLAGS] < 1)
send_to_char ("You have no demonic powers.\n\r", ch);
if (IS_DEMPOWER (ch, DEM_FANGS))
{
if (IS_VAMPAFF (ch, VAM_FANGS))
send_to_char
("You have a pair of long pointed fangs extending from your gums.\n\r",
ch);
else
send_to_char
("You have a pair of long pointed fangs, but they are not currently extended.\n\r",
ch);
}
if (IS_DEMPOWER (ch, DEM_CLAWS))
{
if (IS_VAMPAFF (ch, VAM_CLAWS))
send_to_char
("You have a pair of razor sharp claws extending from your fingers.\n\r",
ch);
else
send_to_char
("You have a pair of razor sharp claws, but they are not currently extended.\n\r",
ch);
}
if (IS_DEMPOWER (ch, DEM_HORNS))
{
if (IS_DEMAFF (ch, DEM_HORNS))
send_to_char
("You have a pair of curved horns extending from your forehead.\n\r",
ch);
else
send_to_char
("You have a pair of curved horns, but they are not currently extended.\n\r",
ch);
}
if (IS_DEMPOWER (ch, DEM_TAIL))
{
if (IS_DEMAFF (ch, DEM_TAIL))
send_to_char
("You have a long tail extended from you back side.\n\r", ch);
else
send_to_char ("You have a tail, but it is not being used.\n\r",
ch);
}
if (IS_DEMPOWER (ch, DEM_HOOVES))
{
if (IS_DEMAFF (ch, DEM_HOOVES))
send_to_char ("You have hooves instead of feet.\n\r", ch);
else
send_to_char
("You are able to transform your feet into hooves at will.\n\r",
ch);
}
if (IS_DEMPOWER (ch, DEM_EYES))
{
if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
send_to_char
("Your eyes are glowing bright red, allowing you to see in the dark.\n\r",
ch);
else
send_to_char
("You are able to see in the dark, although that power is not currently activated.\n\r",
ch);
}
if (IS_DEMPOWER (ch, DEM_WINGS))
{
if (!IS_DEMAFF (ch, DEM_WINGS))
send_to_char
("You have the ability to extend wings from your back.\n\r",
ch);
else if (IS_DEMAFF (ch, DEM_UNFOLDED))
send_to_char
("You have a pair of large leathery wings unfolded behind your back.\n\r",
ch);
else
send_to_char
("You have a pair of large leathery wings folded behind your back.\n\r",
ch);
}
if (IS_DEMPOWER (ch, DEM_MIGHT))
send_to_char ("Your muscles ripple with supernatural strength.\n\r",
ch);
if (IS_DEMPOWER (ch, DEM_TOUGH))
send_to_char
("Your skin reflects blows with supernatural toughness.\n\r", ch);
if (IS_DEMPOWER (ch, DEM_SPEED))
send_to_char ("You move with supernatural speed and grace.\n\r", ch);
if (IS_DEMPOWER (ch, DEM_TRAVEL))
send_to_char ("You are able to travel to other demons at will.\n\r",
ch);
if (IS_DEMPOWER (ch, DEM_SCRY))
send_to_char
("You are able to scry over great distances at will.\n\r", ch);
if (IS_DEMPOWER (ch, DEM_SHADOWSIGHT))
{
if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
send_to_char ("You are able see things in the shadowplane.\n\r",
ch);
else
send_to_char
("You are able to view the shadowplane, although you are not currently doing so.\n\r",
ch);
}
}
else if (IS_CLASS (ch, CLASS_VAMPIRE))
{
send_to_char
("--------------------------------------------------------------------------------\n\r",
ch);
send_to_char (" -= Vampire upkeep =-\n\r",
ch);
send_to_char
("--------------------------------------------------------------------------------\n\r",
ch);
send_to_char ("Staying alive...upkeep 1.\n\r", ch);
if (IS_SET (ch->newbits, NEW_NOPAIN))
{
send_to_char ("You are oblivious to pain.\n\r", ch);
}
if (IS_VAMPAFF (ch, VAM_DISGUISED))
{
if (ch->beast == 0)
sprintf (buf, "You are disguised as %s...no upkeep.\n\r",
ch->morph);
else if (ch->beast == 100)
sprintf (buf, "You are disguised as %s...upkeep 10-20.\n\r",
ch->morph);
else
sprintf (buf, "You are disguised as %s...upkeep 5-10.\n\r",
ch->morph);
send_to_char (buf, ch);
}
if (IS_IMMUNE (ch, IMM_SHIELDED))
{
if (ch->beast == 0)
sprintf (buf, "You are shielded...no upkeep.\n\r");
else if (ch->beast == 100)
sprintf (buf, "You are shielded...upkeep 2-6.\n\r");
else
sprintf (buf, "You are shielded...upkeep 1-3.\n\r");
send_to_char (buf, ch);
}
if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
{
if (ch->beast == 0)
sprintf (buf, "You are in the shadowplane...no upkeep.\n\r");
else if (ch->beast == 100)
sprintf (buf, "You are in the shadowplane...no upkeep.\n\r");
else
sprintf (buf, "You are in the shadowplane...no upkeep.\n\r");
send_to_char (buf, ch);
}
if (IS_VAMPAFF (ch, VAM_FANGS))
{
if (ch->beast == 0)
sprintf (buf, "You have your fangs out...no upkeep.\n\r");
else if (ch->beast == 100)
sprintf (buf, "You have your fangs out...upkeep 2.\n\r");
else
sprintf (buf, "You have your fangs out...upkeep 1.\n\r");
send_to_char (buf, ch);
}
if (IS_VAMPAFF (ch, VAM_CLAWS))
{
if (ch->beast == 0)
sprintf (buf, "You have your claws out...no upkeep.\n\r");
else if (ch->beast == 100)
sprintf (buf, "You have your claws out...upkeep 2-6.\n\r");
else
sprintf (buf, "You have your claws out...upkeep 1-3.\n\r");
send_to_char (buf, ch);
}
if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
{
if (ch->beast == 0)
sprintf (buf, "You have nightsight...no upkeep.\n\r");
else if (ch->beast == 100)
sprintf (buf, "You have nightsight...upkeep 2.\n\r");
else
sprintf (buf, "You have nightsight...upkeep 1.\n\r");
send_to_char (buf, ch);
}
if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
{
if (ch->beast == 0)
sprintf (buf, "You have shadowsight...no upkeep.\n\r");
else if (ch->beast == 100)
sprintf (buf, "You are shadowsight...upkeep 2-6.\n\r");
else
sprintf (buf, "You are shadowsight...upkeep 1-3.\n\r");
send_to_char (buf, ch);
}
if (IS_SET (ch->act, PLR_HOLYLIGHT))
{
if (ch->beast == 0)
sprintf (buf, "You have truesight...no upkeep.\n\r");
else if (ch->beast == 100)
sprintf (buf, "You have truesight...upkeep 2-10.\n\r");
else
sprintf (buf, "You have truesight...upkeep 1-5.\n\r");
send_to_char (buf, ch);
}
if (IS_VAMPAFF (ch, VAM_CHANGED))
{
if (IS_POLYAFF (ch, POLY_BAT))
sprintf (buf2, "bat");
else if (IS_POLYAFF (ch, POLY_WOLF))
sprintf (buf2, "wolf");
else
sprintf (buf2, "mist");
if (ch->beast == 0)
sprintf (buf, "You have changed into %s form...no upkeep.\n\r",
buf2);
else if (ch->beast == 100)
sprintf (buf, "You have changed into %s form...upkeep 10-20.\n\r",
buf2);
else
sprintf (buf, "You have changed into %s form...upkeep 5-10.\n\r",
buf2);
send_to_char (buf, ch);
}
if (IS_POLYAFF (ch, POLY_SERPENT))
{
if (ch->beast == 0)
sprintf (buf, "You are in serpent form...no upkeep.\n\r");
else if (ch->beast == 100)
sprintf (buf, "You are in serpent form...upkeep 6-8.\n\r");
else
sprintf (buf, "You are in serpent form...upkeep 1-3.\n\r");
send_to_char (buf, ch);
}
if (IS_POLYAFF (ch, POLY_ZULO))
send_to_char ("You are in Zuloform.\n\r", ch);
if (IS_EXTRA (ch, EXTRA_DRAGON))
send_to_char ("You are a huge dragon.\n\r", ch);
if (IS_EXTRA (ch, EXTRA_AWE))
send_to_char ("You are awe inspiring.\n\r", ch);
if (IS_AFFECTED (ch, AFF_STEELSHIELD))
send_to_char ("Your majesty is up.\n\r", ch);
if (IS_SET (ch->newbits, NEW_MONKFLAME))
send_to_char ("Your hands and weapon are engulfed in flames.\n\r",
ch);
if (IS_EXTRA (ch, EXTRA_PLASMA))
send_to_char ("You are in plasmaform.\n\r", ch);
if (get_disc(ch, VAM_PROT) > 8)
send_to_char ("Your flesh is as hard as marble.\n\r", ch);
if (ch->pcdata->stats[UNI_RAGE] > 0)
send_to_char ("You are in frenzy.\n\r", ch);
if (IS_SET (ch->act, PLR_WIZINVIS))
send_to_char ("You are blended with the Shade.\n\r", ch);
if (IS_EXTRA (ch, EXTRA_POTENCY))
send_to_char ("Your blood is more potent then usual.\n\r", ch);
if (IS_VAMPAFF (ch, VAM_HEAD))
send_to_char ("You have the head of a lion.\n\r", ch);
if (IS_VAMPAFF (ch, VAM_TAIL))
send_to_char ("A long tail protrudes from your backside.\n\r", ch);
if (IS_VAMPAFF (ch, VAM_EXOSKELETON))
send_to_char ("Your body is covered by a bony exoskeleton.\n\r", ch);
if (IS_VAMPAFF (ch, VAM_HORNS))
send_to_char ("Large horns protrude from your head.\n\r", ch);
if (IS_VAMPAFF (ch, VAM_WINGS))
send_to_char ("Large wings protrude from your back.\n\r", ch);
}
else
{
do_rand_typo (ch);
return;
}
send_to_char
("--------------------------------------------------------------------------------\n\r",
ch);
return;
}
void do_vclan (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *gch;
char clan[MSL];
one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
sprintf (buf, "The Kindred:\n\r");
send_to_char (buf, ch);
send_to_char
("[ Name ] [ Clan ] [ Hits % ] [ Mana % ] [ Move % ] [ Exp ] [Blood]\n\r",
ch);
for (gch = char_list; gch != NULL; gch = gch->next)
{
if (IS_NPC (gch))
continue;
if (!IS_CLASS (gch, CLASS_VAMPIRE))
continue;
if (IS_IMMORTAL (gch) && !can_see (ch, gch))
continue;
if (gch->clannum > 0)
sprintf(clan, "%s", nclans_table[gch->clannum].name);
else if (gch->pcdata->stats[UNI_GEN] == 1)
sprintf(clan,"All");
else
sprintf(clan,"Caitiff");
sprintf (buf,
"[%-16s] [%-17s] [%-7d%3d] [%-7d%3d] [%-7d%3d] [%10lli] [ %3d ]\n\r",
capitalize (gch->name),clan,
gch->hit, (gch->hit * 100 / gch->max_hit),
gch->mana, (gch->mana * 100 / gch->max_mana),
gch->move, (gch->move * 100 / gch->max_move),
gch->exp, gch->pcdata->condition[COND_THIRST]);
send_to_char (buf, ch);
}
return;
}
void do_tribe (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *gch;
char clan[MSL];
one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF))
{
do_rand_typo (ch);
return;
}
if (!str_cmp(ch->clan, "Black Spiral Dancers"))
{
send_to_char("You need no tribe, foul spawn of the wyrm.\n\r",ch);
return;
}
stc ("The Garou:\n\r", ch);
send_to_char
("[ Name ] [ Tribe ] [ Hits % ] [ Mana % ] [ Move % ] [ Exp ]\n\r",
ch);
for (gch = char_list; gch != NULL; gch = gch->next)
{
if (IS_NPC (gch))
continue;
if (!IS_CLASS (gch, CLASS_WEREWOLF))
continue;
if ( !str_cmp(gch->clan,"Black Spiral Dancers")) continue;
if (IS_IMMORTAL (gch) && !can_see (ch, gch))
continue;
if (gch->clannum > 0)
sprintf(clan, "%s", nclans_table[gch->clannum].name);
else if (gch->pcdata->stats[UNI_GEN] == 1)
sprintf(clan,"All");
else
sprintf(clan,"None");
sprintf (buf,
"[%-16s] [%-17s] [%-7d%3d] [%-7d%3d] [%-7d%3d] [%10lli]\n\r",
capitalize (gch->name),clan,
gch->hit, (gch->hit * 100 / gch->max_hit),
gch->mana, (gch->mana * 100 / gch->max_mana),
gch->move, (gch->move * 100 / gch->max_move), gch->exp);
send_to_char (buf, ch);
}
return;
}
void do_werewolf (CHAR_DATA * ch, char *argument)
{
char buf[MAX_INPUT_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *vch;
CHAR_DATA *vch_next;
int number_hit = 0;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF))
return;
if (IS_SET (ch->special, SPC_WOLFMAN))
return;
SET_BIT (ch->special, SPC_WOLFMAN);
ch->beast_timer = 15;
send_to_char ("You throw back your head and howl with rage!\n\r", ch);
act ("$n throws back $s head and howls with rage!.", ch, NULL, NULL,
TO_ROOM);
send_to_char ("Coarse dark hair sprouts from your body.\n\r", ch);
act ("Coarse dark hair sprouts from $n's body.", ch, NULL, NULL, TO_ROOM);
if (!IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
{
send_to_char ("Your eyes start glowing red.\n\r", ch);
act ("$n's eyes start glowing red.", ch, NULL, NULL, TO_ROOM);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
}
if (!IS_VAMPAFF (ch, VAM_FANGS))
{
send_to_char ("A pair of long fangs extend from your mouth.\n\r", ch);
act ("A pair of long fangs extend from $n's mouth.", ch, NULL, NULL,
TO_ROOM);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
}
if (!IS_VAMPAFF (ch, VAM_CLAWS))
{
send_to_char ("Razor sharp talons extend from your fingers.\n\r", ch);
act ("Razor sharp talons extend from $n's fingers.", ch, NULL, NULL,
TO_ROOM);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
}
SET_BIT (ch->affected_by, AFF_POLYMORPH);
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
sprintf (buf, "%s the huge werewolf", ch->name);
free_string (ch->morph);
ch->morph = str_dup (buf);
ch->pcdata->stats[UNI_RAGE] += 75;
if (ch->pcdata->powers[WPOWER_WOLF] > 3)
ch->pcdata->stats[UNI_RAGE] += 100;
if (ch->pcdata->stats[UNI_RAGE] > 300)
ch->pcdata->stats[UNI_RAGE] = 300;
for (vch = char_list; vch != NULL; vch = vch_next)
{
vch_next = vch->next;
if (vch->in_room == NULL)
continue;
if (ch == vch)
{
act ("You throw back your head and howl with rage!", ch, NULL, NULL,
TO_CHAR);
continue;
}
if (!IS_NPC (vch) && vch->pcdata->chobj != NULL)
continue;
if (!IS_NPC (vch))
{
if (vch->in_room == ch->in_room)
act ("$n throws back $s head and howls with rage!", ch, NULL, vch,
TO_VICT);
else if (vch->in_room->area == ch->in_room->area)
send_to_char ("You hear a fearsome howl close by!\n\r", vch);
else if (!CAN_PK (vch))
continue;
}
if (vch->in_room == ch->in_room && can_see (ch, vch))
{
number_hit++;
if (number_hit > 15) continue;
multi_hit (ch, vch, TYPE_UNDEFINED);
if (vch == NULL || vch->position <= POS_STUNNED)
continue;
multi_hit (ch, vch, TYPE_UNDEFINED);
if (vch == NULL || vch->position <= POS_STUNNED)
continue;
multi_hit (ch, vch, TYPE_UNDEFINED);
}
}
return;
}
void do_unwerewolf (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF))
return;
if (!IS_SET (ch->special, SPC_WOLFMAN))
return;
REMOVE_BIT (ch->special, SPC_WOLFMAN);
REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
free_string (ch->morph);
ch->morph = str_dup ("");
if (IS_VAMPAFF (ch, VAM_CLAWS))
{
send_to_char ("Your talons slide back into your fingers.\n\r", ch);
act ("$n's talons slide back into $s fingers.", ch, NULL, NULL,
TO_ROOM);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
}
if (IS_VAMPAFF (ch, VAM_FANGS))
{
send_to_char ("Your fangs slide back into your mouth.\n\r", ch);
act ("$n's fangs slide back into $s mouth.", ch, NULL, NULL, TO_ROOM);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
}
if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
{
send_to_char ("The red glow in your eyes fades.\n\r", ch);
act ("The red glow in $n's eyes fades.", ch, NULL, NULL, TO_ROOM);
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
}
send_to_char ("Your coarse hair shrinks back into your body.\n\r", ch);
act ("$n's coarse hair shrinks back into $s body.", ch, NULL, NULL,
TO_ROOM);
ch->pcdata->stats[UNI_RAGE] -= 75;
while (ch->pcdata->stats[UNI_RAGE] > 100) ch->pcdata->stats[UNI_RAGE] -= 75;
if (ch->pcdata->stats[UNI_RAGE] < 0)
ch->pcdata->stats[UNI_RAGE] = 0;
return;
}
void do_favour (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_WEREWOLF))
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char ("Syntax is: favour <target> <favour>\n\r", ch);
if (ch->pcdata->stats[UNI_GEN] == 2)
{
if (IS_CLASS (ch, CLASS_WEREWOLF))
send_to_char
("Favours you can grant: Induct Outcast Sire Shaman.\n\r", ch);
else
send_to_char
("Favours you can grant: Induct Outcast Sire Prince.\n\r", ch);
}
else if (IS_SET (ch->special, SPC_PRINCE))
send_to_char ("Favours you can grant: Induct Outcast Sire.\n\r", ch);
else
send_to_char ("None.\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg1)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (IS_NPC (victim))
{
send_to_char ("Not on NPC's.\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char ("Not on yourself!\n\r", ch);
return;
}
if (ch->class != victim->class)
{
send_to_char ("You cannot do that, fool!\n\r", ch);
return;
}
if (str_cmp (victim->clan, ch->clan) && str_cmp (arg2, "induct"))
{
send_to_char
("You can only grant your favour to someone in your clan.\n\r", ch);
return;
}
if (!str_cmp (arg2, "sire"))
{
if (ch->pcdata->stats[UNI_GEN] != 2
&& !IS_SET (ch->special, SPC_PRINCE))
{
send_to_char ("You are unable to grant this sort of favour.\n\r",
ch);
return;
}
if (IS_SET (victim->special, SPC_SIRE))
{
if (IS_CLASS (ch, CLASS_WEREWOLF))
{
act ("You remove $N's permission to claw a pup!", ch, NULL,
victim, TO_CHAR);
act ("$n has removed $N's permission to claw a pup!", ch, NULL,
victim, TO_NOTVICT);
act ("$n has remove your permission to claw a pup!", ch, NULL,
victim, TO_VICT);
}
else
{
act ("You remove $N's permission to sire a childe!", ch, NULL,
victim, TO_CHAR);
act ("$n has removed $N's permission to sire a childe!", ch, NULL,
victim, TO_NOTVICT);
act ("$n has remove your permission to sire a childe!", ch, NULL,
victim, TO_VICT);
}
REMOVE_BIT (victim->special, SPC_SIRE);
return;
}
if (IS_CLASS (ch, CLASS_WEREWOLF))
{
act ("You grant $N permission to claw a pup!", ch, NULL, victim,
TO_CHAR);
act ("$n has granted $N permission to claw a pup!", ch, NULL, victim,
TO_NOTVICT);
act ("$n has granted you permission to claw a pup!", ch, NULL,
victim, TO_VICT);
}
else
{
act ("You grant $N permission to sire a childe!", ch, NULL, victim,
TO_CHAR);
act ("$n has granted $N permission to sire a childe!", ch, NULL,
victim, TO_NOTVICT);
act ("$n has granted you permission to sire a childe!", ch, NULL,
victim, TO_VICT);
}
SET_BIT (victim->special, SPC_SIRE);
return;
}
else if (!str_cmp (arg2, "prince") && IS_CLASS (ch, CLASS_VAMPIRE))
{
if (ch->pcdata->stats[UNI_GEN] != 2)
{
send_to_char ("You are unable to grant this sort of favour.\n\r",
ch);
return;
}
if (IS_SET (victim->special, SPC_PRINCE))
{
act ("You remove $N's Prince status!", ch, NULL, victim, TO_CHAR);
act ("$n has removed $N's Prince status!", ch, NULL, victim,
TO_NOTVICT);
act ("$n has removed your Prince status!", ch, NULL, victim,
TO_VICT);
REMOVE_BIT (victim->special, SPC_PRINCE);
return;
}
act ("You grant $N Prince status!", ch, NULL, victim, TO_CHAR);
act ("$n has granted $N Prince status!", ch, NULL, victim, TO_NOTVICT);
act ("$n has granted you Prince status!", ch, NULL, victim, TO_VICT);
SET_BIT (victim->special, SPC_PRINCE);
return;
}
else if (!str_cmp (arg2, "shaman") && IS_CLASS (ch, CLASS_WEREWOLF))
{
if (ch->pcdata->stats[UNI_GEN] != 2)
{
send_to_char ("You are unable to grant this sort of favour.\n\r",
ch);
return;
}
if (IS_SET (victim->special, SPC_PRINCE))
{
act ("You remove $N's Shaman status!", ch, NULL, victim, TO_CHAR);
act ("$n has removed $N's Shaman status!", ch, NULL, victim,
TO_NOTVICT);
act ("$n has removed your Shaman status!", ch, NULL, victim,
TO_VICT);
REMOVE_BIT (victim->special, SPC_PRINCE);
return;
}
act ("You grant $N Shaman status!", ch, NULL, victim, TO_CHAR);
act ("$n has granted $N Shaman status!", ch, NULL, victim, TO_NOTVICT);
act ("$n has granted you Shaman status!", ch, NULL, victim, TO_VICT);
SET_BIT (victim->special, SPC_PRINCE);
return;
}
else if (!str_cmp (arg2, "induct") && victim->pcdata->stats[UNI_GEN] > 2 &&
ch->pcdata->stats[UNI_GEN] == 2 && strlen (victim->clan) < 2)
{
if (IS_SET (victim->special, SPC_ANARCH))
{
send_to_char ("You cannot induct an Anarch!\n\r", ch);
return;
}
if (!IS_IMMUNE (victim, IMM_VAMPIRE))
{
send_to_char ("You cannot induct an unwilling person.\n\r", ch);
return;
}
if (ch->pcdata->stats[UNI_GEN] >= victim->pcdata->stats[UNI_GEN])
{
if (IS_CLASS (ch, CLASS_WEREWOLF))
send_to_char
("You can only induct those of weaker heritage than yourself.\n\r",
ch);
else
send_to_char
("You can only induct those of higher generation than yourself.\n\r",
ch);
return;
}
if (IS_CLASS (ch, CLASS_WEREWOLF))
{
act ("You induct $N into your tribe!", ch, NULL, victim, TO_CHAR);
act ("$n inducts $N into $s tribe!", ch, NULL, victim, TO_NOTVICT);
act ("$n inducts you into $s tribe!", ch, NULL, victim, TO_VICT);
}
else
{
act ("You induct $N into your clan!", ch, NULL, victim, TO_CHAR);
act ("$n inducts $N into $s clan!", ch, NULL, victim, TO_NOTVICT);
act ("$n inducts you into $s clan!", ch, NULL, victim, TO_VICT);
}
free_string (victim->clan);
victim->clan = str_dup (ch->clan);
return;
}
else if (!str_cmp (arg2, "outcast"))
{
if (ch->pcdata->stats[UNI_GEN] != 2
&& !IS_SET (ch->special, SPC_PRINCE))
{
send_to_char ("You are unable to grant this sort of favour.\n\r",
ch);
return;
}
if (IS_SET (victim->special, SPC_PRINCE)
&& ch->pcdata->stats[UNI_GEN] != 2)
{
if (IS_CLASS (ch, CLASS_WEREWOLF))
send_to_char ("You cannot outcast another Shaman.\n\r", ch);
else
send_to_char ("You cannot outcast another Prince.\n\r", ch);
return;
}
if (ch->pcdata->stats[UNI_GEN] >= victim->pcdata->stats[UNI_GEN])
{
if (IS_CLASS (ch, CLASS_WEREWOLF))
send_to_char
("You can only outcast those of weaker heritage than yourself.\n\r",
ch);
else
send_to_char
("You can only outcast those of higher generation than yourself.\n\r",
ch);
return;
}
if (IS_CLASS (ch, CLASS_WEREWOLF))
{
act ("You outcast $N from your tribe!", ch, NULL, victim, TO_CHAR);
act ("$n outcasts $N from $s tribe!", ch, NULL, victim, TO_NOTVICT);
act ("$n outcasts you from $s tribe!", ch, NULL, victim, TO_VICT);
}
else
{
act ("You outcast $N from your clan!", ch, NULL, victim, TO_CHAR);
act ("$n outcasts $N from $s clan!", ch, NULL, victim, TO_NOTVICT);
act ("$n outcasts you from $s clan!", ch, NULL, victim, TO_VICT);
}
free_string (victim->clan);
victim->clan = str_dup ("");
REMOVE_BIT (victim->special, SPC_SIRE);
REMOVE_BIT (victim->special, SPC_PRINCE);
return;
}
else
send_to_char ("You are unable to grant that sort of favour.\n\r", ch);
return;
}
void do_ghoul (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
CHAR_DATA *familiar;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE))
{
do_rand_typo (ch);
return;
}
if (!IS_VAMPAFF (ch, VAM_DOMINATE))
{
send_to_char ("You are not trained in the Dominate discipline.\n\r",
ch);
return;
}
if ((familiar = ch->pcdata->familiar) != NULL)
{
sprintf (buf, "You break your hold over %s.\n\r",
familiar->short_descr);
send_to_char (buf, ch);
familiar->wizard = NULL;
ch->pcdata->familiar = NULL;
return;
}
if (arg[0] == '\0')
{
send_to_char ("What do you wish to make your ghoul?\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 ("Become your own ghoul?\n\r", ch);
return;
}
if (!IS_NPC (victim))
{
send_to_char ("Not on players.\n\r", ch);
return;
}
if (victim->wizard != NULL)
{
send_to_char ("You are unable to make them a ghoul.\n\r", ch);
return;
}
if (victim->level > (ch->spl[RED_MAGIC] * 0.25))
{
send_to_char ("They are too powerful.\n\r", ch);
return;
}
if (ch->pcdata->condition[COND_THIRST] < 50)
{
send_to_char ("You have insufficient blood.\n\r", ch);
return;
}
ch->pcdata->condition[COND_THIRST] -= 50;
ch->pcdata->familiar = victim;
victim->wizard = ch;
act ("You cut open your wrist and feed $N some blood.", ch, NULL, victim,
TO_CHAR);
act ("$n cuts open $s wrist and feeds you some blood.", ch, NULL, victim,
TO_VICT);
act ("$n cuts open $s wrist and feeds $N some blood.", ch, NULL, victim,
TO_NOTVICT);
return;
}
void do_familiar (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
CHAR_DATA *familiar;
char arg[MAX_INPUT_LENGTH];
one_argument (argument, arg);
return;
if (arg[0] == '\0')
{
send_to_char ("What do you wish to make your familiar?\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 ("Become your own familiar?\n\r", ch);
return;
}
if (!IS_NPC (victim))
{
send_to_char ("Not on players.\n\r", ch);
return;
}
if ((familiar = ch->pcdata->familiar) != NULL)
familiar->wizard = NULL;
ch->pcdata->familiar = victim;
victim->wizard = ch;
send_to_char ("Ok.\n\r", ch);
return;
}
void do_fcommand (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_VAMPIRE) && ch->level < LEVEL_APPRENTICE)
{
if (!IS_CLASS (ch, CLASS_DEMON) && !IS_CLASS (ch, CLASS_FAE)
&& !IS_CLASS (ch, CLASS_WRAITH))
{
send_to_char ("Huh?\n\r", ch);
return;
}
}
if ((victim = ch->pcdata->familiar) == NULL)
{
if (IS_CLASS (ch, CLASS_VAMPIRE))
send_to_char ("Huh?\n\r", ch);
else if (ch->level >= LEVEL_APPRENTICE)
send_to_char ("But you don't have a familiar!\n\r", ch);
else
send_to_char ("But you don't have an eye spy!\n\r", ch);
return;
}
if (argument[0] == '\0')
{
if (ch->level >= LEVEL_APPRENTICE)
send_to_char ("What do you wish to make your familiar do?\n\r", ch);
else
send_to_char ("What do you wish to make your eye spy do?\n\r", ch);
return;
}
if (is_in (argument, "|kill*kick*"))
return;
interpret (victim, argument);
if (is_in (argument, "|kick*"))
WAIT_STATE (ch, 8);
return;
}
void do_vanish (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_VAMPIRE)
&& !IS_CLASS (ch, CLASS_HIGHLANDER))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_HIGHLANDER))
{
if (!IS_DEMPOWER (ch, HPOWER_VANISH))
{
stc ("You have not gained the power of vanish.\n\r", ch);
return;
}
}
if (IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[RAGABASH] < 1)
{
send_to_char ("You must obtain level one Ragabash to use Vanish.\n\r",
ch);
return;
}
if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBFU) < 1)
{
send_to_char ("you need level 1 in obfuscate first.\n\r", ch);
return;
}
if (IS_SET (ch->act, PLR_WIZINVIS))
{
REMOVE_BIT (ch->act, PLR_WIZINVIS);
send_to_char ("You slowly fade into existance.\n\r", ch);
act ("$n slowly fades into existance.", ch, NULL, NULL, TO_ROOM);
}
else
{
send_to_char ("You slowly fade out of existance.\n\r", ch);
act ("$n slowly fades out of existance.", ch, NULL, NULL, TO_ROOM);
SET_BIT (ch->act, PLR_WIZINVIS);
}
return;
}
void do_flex (CHAR_DATA * ch, char *argument)
{
act ("You flex your bulging muscles.", ch, NULL, NULL, TO_CHAR);
act ("$n flexes $s bulging muscles.", ch, NULL, NULL, TO_ROOM);
if (IS_NPC (ch))
return;
if (IS_EXTRA (ch, TIED_UP) && (dice(1,100) < 95 ) )
{
act ("The ropes restraining you snap.", ch, NULL, NULL, TO_CHAR);
act ("The ropes restraining $n snap.", ch, NULL, NULL, TO_ROOM);
REMOVE_BIT (ch->extra, TIED_UP);
}
if ( (dice(1,100) < 85 ) )
{
if (is_affected (ch, gsn_web) )
{
act ("The webbing entrapping $n breaks away.", ch, NULL, NULL, TO_ROOM);
send_to_char ("The webbing entrapping you breaks away.\n\r", ch);
affect_strip (ch, gsn_web);
}
if (IS_AFFECTED (ch, AFF_WEBBED))
{
act ("The webbing entrapping $n breaks away.", ch, NULL, NULL, TO_ROOM);
send_to_char ("The webbing entrapping you breaks away.\n\r", ch);
REMOVE_BIT (ch->affected_by, AFF_WEBBED);
}
}
if ( (dice(1,100) < 75 ) )
{
if (IS_SET (ch->mflags, MAGE_EMBRACED2))
{
act ("The earth surrounding $n starts to crack.", ch, NULL, NULL,
TO_ROOM);
stc ("The earth surrounding you starts to crack.\n\r", ch);
REMOVE_BIT (ch->mflags, MAGE_EMBRACED2);
SET_BIT (ch->mflags, MAGE_EMBRACED1);
}
else if (IS_SET (ch->mflags, MAGE_EMBRACED1))
{
act ("The earth surrounding $n crumbles to dust.", ch, NULL, NULL,
TO_ROOM);
stc ("The earth surrounding you crumbles to dust.\n\r", ch);
REMOVE_BIT (ch->mflags, MAGE_EMBRACED1);
}
}
if ( (dice(1,100) < 85 ) )
{
if (is_affected (ch, gsn_entrails))
{
act ("The entrails entrapping $n fall to the ground.", ch, NULL, NULL,
TO_ROOM);
send_to_char ("The entrails entrapping you fall to the ground.\n\r",
ch);
affect_strip (ch, gsn_entrails);
}
if (IS_SET (ch->affected_by, AFF_ENTRAILS))
{
act ("The entrails entrapping $n fall to the ground.", ch, NULL, NULL,
TO_ROOM);
send_to_char ("The entrails entrapping you fall to the ground.\n\r",
ch);
REMOVE_BIT (ch->affected_by, AFF_ENTRAILS);
}
}
if ( (dice(1,100) < 85 ) )
{
if ( IS_SET( ch->flag2, AFF2_TENDRILS ) )
{
act( "You shatter the bonds of darkness restraining you.\n\r", ch, NULL, NULL, TO_CHAR );
act( "$n shatters the bonds of darkness restraining $m.\n\r", ch, NULL, NULL, TO_ROOM );
REMOVE_BIT ( ch->flag2, AFF2_TENDRILS );
}
}
WAIT_STATE (ch, 12);
return;
}
void do_rage (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!is_garou (ch))
return;
if (ch->beast_timer > 0)
{
char buf[MSL];
sprintf(buf,"You cannot beast for another %d ticks.\n\r",ch->beast_timer);
stc(buf,ch);
return;
}
if (!IS_SET (ch->special, SPC_WOLFMAN))
{
send_to_char ("You start snarling angrilly.\n\r", ch);
act ("$n starts snarling angrilly.", ch, NULL, NULL, TO_ROOM);
ch->pcdata->stats[UNI_RAGE] += number_range (10, 20);
if (ch->pcdata->stats[UNI_RAGE] >= 100)
do_werewolf (ch, "");
WAIT_STATE (ch, 12);
return;
}
send_to_char ("But you are already in a rage!\n\r", ch);
return;
}
void do_calm (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->beast < 1)
{
if (ch->pcdata->stats[UNI_RAGE] < 1)
{
send_to_char ("Your beast doesn't control your actions.\n\r", ch);
return;
}
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->stats[UNI_RAGE] = 0;
if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
do_nightsight (ch, "");
if (IS_VAMPAFF (ch, VAM_FANGS))
do_fangs (ch, "");
if (IS_VAMPAFF (ch, VAM_CLAWS))
do_claws (ch, "");
WAIT_STATE (ch, 12);
return;
}
if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->stats[UNI_RAGE] > 0)
{
send_to_char ("You control you actions and calm down.\n\r", ch);
ch->pcdata->stats[UNI_RAGE] = 0;
return;
}
else if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->stats[UNI_RAGE] == 0)
{
send_to_char ("You are not in the state of michi.\n\r", ch);
return;
}
if (IS_SET (ch->special, SPC_WOLFMAN))
{
send_to_char ("You take a deep breath and calm yourself.\n\r", ch);
act ("$n takes a deep breath and tries to calm $mself.", ch, NULL, NULL,
TO_ROOM);
if (ch->gifts[CHILDREN] > 0)
ch->pcdata->stats[UNI_RAGE] = 0;
else
ch->pcdata->stats[UNI_RAGE] -= number_range (10, 20);
if (ch->pcdata->stats[UNI_RAGE] < 100)
do_unwerewolf (ch, "");
WAIT_STATE (ch, 12);
return;
}
send_to_char ("But you are not in crinos form!\n\r", ch);
return;
}
void do_web (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_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_DROW)
&& !IS_CLASS (ch, CLASS_NINJA))
{
do_rand_typo (ch);
return;
}
if (IS_CLASS (ch, CLASS_DROW)
&& !IS_SET (ch->pcdata->powers[1], DPOWER_WEB))
{
send_to_char ("You don't have that power yet.\n\r", ch);
return;
}
if (IS_CLASS (ch, CLASS_NINJA) && (ch->pcdata->powers[NPOWER_CHIKYU] < 7))
{
stc ("You need to get the Chikyu principle to 7 first\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 cannot web yourself.\n\r", ch);
return;
}
if (IS_AFFECTED (victim, AFF_ETHEREAL))
{
send_to_char ("You cannot web an ethereal person.\n\r", ch);
return;
}
if ((sn = skill_lookup ("web")) < 0)
return;
spelltype = skill_table[sn].target;
level = ch->spl[spelltype] * 0.25;
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
WAIT_STATE (ch, 12);
return;
}
void do_birth (CHAR_DATA * ch, char *argument)
{
char buf2[MAX_STRING_LENGTH];
if (IS_NPC (ch))
return;
if (!IS_EXTRA (ch, EXTRA_PREGNANT))
{
send_to_char ("But you are not even pregnant!\n\r", ch);
return;
}
if (!IS_EXTRA (ch, EXTRA_LABOUR))
{
send_to_char ("You're not ready to give birth yet.\n\r", ch);
return;
}
if (argument[0] == '\0')
{
if (ch->pcdata->genes[4] == SEX_MALE)
send_to_char ("What do you wish to name your little boy?\n\r", ch);
else if (ch->pcdata->genes[4] == SEX_FEMALE)
send_to_char ("What do you wish to name your little girl?\n\r", ch);
else
send_to_char ("What do you wish to name your baby it?\n\r", ch);
return;
}
if (!check_parse_name (argument))
{
send_to_char ("Thats an illegal name.\n\r", ch);
return;
}
if (char_exists (FALSE, argument))
{
send_to_char ("That player already exists.\n\r", ch);
return;
}
strcpy (buf2, ch->pcdata->cparents);
strcat (buf2, " ");
strcat (buf2, argument);
if (!birth_ok (ch, buf2))
{
send_to_char ("Bug - please inform KaVir.\n\r", ch);
return;
}
argument[0] = UPPER (argument[0]);
birth_write (ch, argument);
ch->pcdata->genes[9] += 1;
REMOVE_BIT (ch->extra, EXTRA_PREGNANT);
REMOVE_BIT (ch->extra, EXTRA_LABOUR);
save_char_obj (ch);
return;
}
bool birth_ok (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char mum[MAX_INPUT_LENGTH];
char dad[MAX_INPUT_LENGTH];
char child[MAX_INPUT_LENGTH];
argument = one_argument (argument, mum);
argument = one_argument (argument, dad);
argument = one_argument (argument, child);
if (dad[0] == '\0')
{
strcpy (dad, "An Unknown Party");
}
if (child[0] == '\0')
{
send_to_char ("You are unable to give birth - please inform KaVir.\n\r",
ch);
return FALSE;
}
dad[0] = UPPER (dad[0]);
if (!str_cmp (dad, "Kavir"))
strcpy (dad, "KaVir");
child[0] = UPPER (child[0]);
if (ch->pcdata->genes[4] == SEX_MALE)
{
send_to_char ("You give birth to a little boy!\n\r", ch);
sprintf (buf, "%s has given birth to %s's son, named %s!", ch->name,
dad, child);
do_info (ch, buf);
return TRUE;
}
else if (ch->pcdata->genes[4] == SEX_FEMALE)
{
send_to_char ("You give birth to a little girl!\n\r", ch);
sprintf (buf, "%s has given birth to %s's daughter, named %s!",
ch->name, dad, child);
do_info (ch, buf);
return TRUE;
}
return FALSE;
}
bool char_exists (bool backup, char *argument)
{
FILE *fp;
char buf[MAX_STRING_LENGTH];
bool found = FALSE;
fclose (fpReserve);
sprintf (buf, "%s%s", PLAYER_DIR, capitalize (argument));
if ((fp = fopen (buf, "r")) != NULL)
{
found = TRUE;
fclose (fp);
}
fpReserve = fopen (NULL_FILE, "r");
return found;
}
void birth_write (CHAR_DATA * ch, char *argument)
{
FILE *fp;
char buf[MAX_STRING_LENGTH];
char *strtime;
strtime = new_date (current_time);
//strtime[strlen (strtime) - 1] = '\0';
sprintf (buf, "%s%s", PLAYER_DIR, capitalize (argument));
if ((fp = fopen (buf, "w")) != NULL)
{
fprintf (fp, "#PLAYER\n");
fprintf (fp, "Name %s~\n", capitalize (argument));
fprintf (fp, "ShortDescr ~\n");
fprintf (fp, "LongDescr ~\n");
fprintf (fp, "Description ~\n");
fprintf (fp, "Lord ~\n");
fprintf (fp, "Clan ~\n");
fprintf (fp, "Morph ~\n");
fprintf (fp, "Createtime %s~\n", str_dup (strtime));
fprintf (fp, "Lasttime ~\n");
fprintf (fp, "Lasthost ~\n");
fprintf (fp, "Poweraction ~\n");
fprintf (fp, "Powertype ~\n");
fprintf (fp, "Prompt ~\n");
fprintf (fp, "Cprompt ~\n");
fprintf (fp, "Sex %d\n", ch->pcdata->genes[4]);
fprintf (fp, "Race 0\n");
fprintf (fp, "Immune %d\n", ch->pcdata->genes[3]);
fprintf (fp, "Polyaff 0\n");
fprintf (fp, "Itemaffect 0\n");
fprintf (fp, "Form 32767\n");
fprintf (fp, "Beast 15\n");
fprintf (fp, "Spectype 0\n");
fprintf (fp, "Specpower 0\n");
fprintf (fp, "Home 3001\n");
fprintf (fp, "Level 2\n");
fprintf (fp, "Trust 0\n");
fprintf (fp, "Played 0\n");
fprintf (fp, "Room 3054\n");
fprintf (fp, "PkPdMkMd 0 0 5 0\n");
fprintf (fp, "Weapons 0 0 0 0 0 0 0 0 0 0 0 0 0\n");
fprintf (fp, "Spells 4 4 4 4 4\n");
fprintf (fp, "Combat 0 0 0 0 0 0 0 0\n");
fprintf (fp, "Stance 0 0 0 0 0 0 0 0 0 0 0 0\n");
fprintf (fp, "Locationhp 0 0 0 0 0 0 0\n");
fprintf (fp, "HpManaMove %d %d %d %d %d %d\n",
ch->pcdata->genes[0], ch->pcdata->genes[0],
ch->pcdata->genes[1], ch->pcdata->genes[1],
ch->pcdata->genes[2], ch->pcdata->genes[2]);
fprintf (fp, "Gold 0\n");
fprintf (fp, "Exp 0\n");
fprintf (fp, "Act 1600\n");
fprintf (fp, "Extra 32768\n");
fprintf (fp, "AffectedBy 0\n");
fprintf (fp, "Position 7\n");
fprintf (fp, "Practice 0\n");
fprintf (fp, "SavingThrow 0\n");
fprintf (fp, "Alignment 0\n");
fprintf (fp, "Hitroll 0\n");
fprintf (fp, "Damroll 0\n");
fprintf (fp, "Armor 100\n");
fprintf (fp, "Wimpy 0\n");
fprintf (fp, "Deaf 0\n");
fprintf (fp, "Password %s~\n", ch->pcdata->pwd);
fprintf (fp, "Bamfin ~\n");
fprintf (fp, "Bamfout ~\n");
fprintf (fp, "Title the mortal~\n");
fprintf (fp, "Conception ~\n");
fprintf (fp, "Parents %s~\n", ch->pcdata->cparents);
fprintf (fp, "Cparents ~\n");
fprintf (fp, "AttrPerm %d %d %d %d %d\n",
ch->pcdata->perm_str,
ch->pcdata->perm_int,
ch->pcdata->perm_wis,
ch->pcdata->perm_dex, ch->pcdata->perm_con);
fprintf (fp, "AttrMod 0 0 0 0 0\n");
fprintf (fp, "Quest 0\n");
fprintf (fp, "Rank 0\n");
fprintf (fp, "Stage 0 0 0\n");
fprintf (fp, "Disc 0 0 0 0 0 0 0 0 0 0 0\n");
fprintf (fp, "Genes 0 0 0 0 0 0 0 0 0 0\n");
fprintf (fp, "Power 0 0\n");
fprintf (fp, "FakeCon 0 0 0 0 0 0 0 0\n");
fprintf (fp, "Condition 0 48 48\n");
fprintf (fp, "End\n\n");
fprintf (fp, "#END\n");
fclose (fp);
}
return;
}
void do_teach (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_CLASS (ch, CLASS_MAGE))
{
do_rand_typo (ch);
return;
}
if (ch->level == LEVEL_APPRENTICE)
{
send_to_char ("You don't know enough to teach another.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Teach whom?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (IS_NPC (victim))
{
send_to_char ("Not on NPC's.\n\r", ch);
return;
}
if (IS_IMMORTAL (victim))
{
send_to_char ("Not on Immortals's.\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char ("You cannot teach yourself.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_MAGE))
{
send_to_char ("They are already a mage.\n\r", ch);
return;
}
if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
{
send_to_char ("You can only teach avatars.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_VAMPIRE)
|| IS_SET (victim->pcdata->stats[UNI_AFF], VAM_MORTAL))
{
send_to_char ("You are unable to teach vampires!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_MONK))
{
send_to_char ("You are unable to teach monks.\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_NINJA))
{
send_to_char ("You are unable to teach ninjas\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_DROW))
{
send_to_char ("Not on a drow!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_WEREWOLF))
{
send_to_char ("You are unable to teach werewolves!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_DEMON)
|| IS_SET (victim->special, SPC_CHAMPION))
{
send_to_char ("You are unable to teach demons!\n\r", ch);
return;
}
if (IS_CLASS (victim, CLASS_HIGHLANDER))
{
send_to_char ("You are unable to teach highlanders.\n\r", ch);
return;
}
if (!IS_IMMUNE (victim, IMM_VAMPIRE))
{
send_to_char ("You cannot teach an unwilling person.\n\r", ch);
return;
}
if (ch->exp < 1000000)
{
send_to_char
("You cannot afford the 1000000 exp required to teach them.\n\r",
ch);
return;
}
if (victim->exp < 1000000)
{
send_to_char
("They cannot afford the 1000000 exp required to learn from you.\n\r",
ch);
return;
}
if (victim->spl[0] < 150 || victim->spl[1] < 150 || victim->spl[2] < 150
|| victim->spl[3] < 150 || victim->spl[4] < 150)
{
send_to_char
("They need atleast 150 in all spells to become a disciple.\n\r",
ch);
send_to_char
("You need atleast 150 in all spells to become a disciple.\n\r",
victim);
return;
}
ch->exp -= 1000000;
victim->exp -= 1000000;
act ("You teach $N the basics of magic.", ch, NULL, victim, TO_CHAR);
act ("$n teaches $N the basics of magic.", ch, NULL, victim, TO_NOTVICT);
act ("$n teaches you the basics of magic.", ch, NULL, victim, TO_VICT);
victim->level = LEVEL_APPRENTICE;
victim->trust = LEVEL_APPRENTICE;
send_to_char ("You are now an apprentice.\n\r", victim);
free_string (victim->lord);
victim->lord = str_dup (ch->name);
victim->pcdata->powers[MPOWER_RUNE0] = ch->pcdata->powers[MPOWER_RUNE0];
victim->class = CLASS_MAGE;
save_char_obj (ch);
save_char_obj (victim);
return;
}
void do_gaia (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->powers[WPOWER_GAIA] < 1)
{
send_to_char ("You have not learned the Gaia protection totem.\n\r",
ch);
return;
}
if (ch->position == POS_FIGHTING)
{
send_to_char ("Not while fighting!\n\r", ch);
return;
}
/* Remove gaia in handler.c */
if (IS_AFFECTED (ch, AFF_SAFE))
{
REMOVE_BIT (ch->affected_by, AFF_SAFE);
send_to_char ("Gaia's protection disappears.\n\r", ch);
}
else
{
send_to_char ("You feel safe under Gaia's protection\n\r", ch);
SET_BIT (ch->affected_by, AFF_SAFE);
}
return;
}
void do_klaive (CHAR_DATA * ch, char *argument)
{
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
int vnum = 0;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WEREWOLF))
{
do_rand_typo (ch);
return;
}
/* Practice is the amount of primal you have */
if (ch->practice < 60)
{
send_to_char ("You need 60 primal to make a klaive.\n\r", ch);
return;
}
else if (ch->pcdata->quest < 100)
{
send_to_char ("You need 100 quest points to make a klaive.\n\r", ch);
return;
}
else
(vnum = 29696);
if (vnum == 0 || (pObjIndex = get_obj_index (vnum)) == NULL)
{
send_to_char ("Missing object, please inform KaVir.\n\r", ch);
return;
}
ch->practice -= 60;
ch->pcdata->quest -= 100;
obj = create_object (pObjIndex, 50);
free_string (obj->questowner);
obj->questowner = str_dup (ch->name);
SET_BIT (obj->spectype, SITEM_WOLF);
obj_to_char (obj, ch);
if (ch->pcdata->stats[UNI_RAGE] > 0)
{
act ("$p appears in your claws in a great explosion.", ch, obj, NULL,
TO_CHAR);
act ("$p appears in $n's claws in a great explosion.", ch, obj, NULL,
TO_ROOM);
}
else
{
act ("$p appears in your hands in a great explosion.", ch, obj, NULL,
TO_CHAR);
act ("$p appears in $n's hands in a great explosion.", ch, obj, NULL,
TO_ROOM);
}
return;
}
void do_mitsukeru (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
ROOM_INDEX_DATA *chroom;
ROOM_INDEX_DATA *victimroom;
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_NINJA) || ch->pcdata->powers[NPOWER_SORA] < 1)
{
do_rand_typo (ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Scry on whom?\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
chroom = ch->in_room;
victimroom = victim->in_room;
char_from_room (ch);
char_to_room (ch, victimroom);
if (IS_AFFECTED (ch, AFF_SHADOWPLANE)
&& (!IS_AFFECTED (victim, AFF_SHADOWPLANE)))
{
REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
do_look (ch, "auto");
SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
}
else if (!IS_AFFECTED (ch, AFF_SHADOWPLANE)
&& (IS_AFFECTED (victim, AFF_SHADOWPLANE)))
{
SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
do_look (ch, "auto");
REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
}
else
do_look (ch, "auto");
char_from_room (ch);
char_to_room (ch, chroom);
ch->fight_timer = 10;
return;
}
void do_koryou (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
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_CLASS (ch, CLASS_NINJA) || ch->pcdata->powers[NPOWER_SORA] < 2)
{
do_rand_typo (ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Read the aura on what?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
if ((obj = get_obj_carry (ch, arg)) == NULL)
{
send_to_char ("Read the aura on what?\n\r", ch);
return;
}
act ("$n examines $p intently.", ch, obj, NULL, TO_ROOM);
spell_identify (skill_lookup ("identify"), ch->level, ch, obj);
return;
}
if (!IS_NPC (victim) && (IS_IMMUNE (victim, IMM_SHIELDED)
|| (IS_CLASS (victim, CLASS_DROW)
&& IS_SET (victim->pcdata->powers[1],
DPOWER_DROWSHIELD)))
&& !IS_ITEMAFF (ch, ITEMA_VISION))
{
send_to_char ("You are unable to read their aura.\n\r", ch);
return;
}
act ("$n examines $N intently.", ch, NULL, victim, TO_NOTVICT);
act ("$n examines you intently.", ch, NULL, victim, TO_VICT);
if (IS_NPC (victim))
sprintf (buf, "%s is an NPC.\n\r", victim->short_descr);
else
{
if (victim->level == 12)
sprintf (buf, "%s is an Implementor.\n\r", victim->name);
else if (victim->level == 11)
sprintf (buf, "%s is a High Judge.\n\r", victim->name);
else if (victim->level == 10)
sprintf (buf, "%s is a Judge.\n\r", victim->name);
else if (victim->level == 9)
sprintf (buf, "%s is an Enforcer.\n\r", victim->name);
else if (victim->level == 8)
sprintf (buf, "%s is a Quest Maker.\n\r", victim->name);
else if (victim->level == 7)
sprintf (buf, "%s is a Builder.\n\r", victim->name);
else if (victim->level >= 3)
sprintf (buf, "%s is an Avatar.\n\r", victim->name);
else
sprintf (buf, "%s is a Mortal.\n\r", victim->name);
}
send_to_char (buf, ch);
if (!IS_NPC (victim))
{
sprintf (buf, "Str:%d, Int:%d, Wis:%d, Dex:%d, Con:%d.\n\r",
get_curr_str (victim), get_curr_int (victim),
get_curr_wis (victim), get_curr_dex (victim),
get_curr_con (victim));
send_to_char (buf, ch);
}
sprintf (buf, "Hp:%d/%d, Mana:%d/%d, Move:%d/%d.\n\r", victim->hit,
victim->max_hit, victim->mana, victim->max_mana, victim->move,
victim->max_move);
send_to_char (buf, ch);
if (!IS_NPC (victim))
sprintf (buf, "Hitroll:%d, Damroll:%d, AC:%d.\n\r",
char_hitroll (victim), char_damroll (victim),
char_ac (victim));
else
sprintf (buf, "AC:%d.\n\r", char_ac (victim));
send_to_char (buf, ch);
if (!IS_NPC (victim))
{
sprintf (buf, "Status:%d, ", victim->race);
send_to_char (buf, ch);
if (IS_CLASS (victim, CLASS_VAMPIRE))
{
sprintf (buf, "Blood:%d, ", victim->pcdata->condition[COND_THIRST]);
send_to_char (buf, ch);
}
}
sprintf (buf, "Alignment:%d.\n\r", victim->alignment);
send_to_char (buf, ch);
if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_PREGNANT))
act ("$N is pregnant.", ch, NULL, victim, TO_CHAR);
return;
}
void do_confusion (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
if (IS_NPC (ch))
return;
if (!WORN_ARTIFACT (ch, ARTI_EMPERORS_BLADE))
{
if (IS_CLASS (ch, CLASS_DROW))
{
do_confuse(ch,argument);
return;
}
do_rand_typo (ch);
return;
}
if ((victim = get_char_room (ch, argument)) == NULL)
{
if (ch->fighting == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
else
victim = ch->fighting;
}
if (is_safe(ch, victim)) return;
if (ch->mana < 10000)
{
send_to_char ("You need 10000 mana to throw your opponent into confusion.\n\r", ch);
return;
}
act ("$n attempts to bewilder you.", ch, NULL, victim, TO_VICT);
act ("You attempt to bewilder $N.", ch, NULL, victim, TO_CHAR);
act ("$n attempts to bewilder $N.", ch, NULL, victim, TO_NOTVICT);
ch->mana -= 10000;
if (victim->confusion > 0)
{ stc("They are bewildered already!\n\r",ch); return; }
send_to_char ("You start to feel a bit confused!\n\r", victim);
act ("$n is confused!", victim, NULL,
NULL, TO_ROOM);
victim->confusion = 60;
WAIT_STATE (ch, skill_table[gsn_kick].beats * 2);
return;
}