/*************************************************************************** * 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; }