/*************************************************************************** * 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. * ***************************************************************************/ #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" 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 (IS_SET(ch->special,SPC_PRINCE)) can_sire = TRUE; else if (IS_SET(ch->special,SPC_SIRE)) can_sire = TRUE; else if (ch->pcdata->stats[UNI_GEN] == 1 || ch->pcdata->stats[UNI_GEN] == 2) can_sire = TRUE; if (ch->pcdata->stats[UNI_GEN] > 4) can_sire = FALSE; if (!can_sire) { send_to_char("You are unable to spread your gift.\n\r",ch); return; } if (strlen(ch->clan) < 2 && ch->pcdata->stats[UNI_GEN] != 1 ) { send_to_char( "First you need to create a tribe.\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 (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_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)) { 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_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); } free_string(victim->clan); victim->clan=str_dup(ch->clan); victim->pcdata->stats[UNI_AFF] = 0; victim->pcdata->stats[UNI_CURRENT] = 0; victim->pcdata->stats[WOLF_AUSPICE] = time_info.lunar_day; save_char_obj(ch); save_char_obj(victim); return; } void do_totems( 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_WEREWOLF)) { send_to_char("Huh?\n\r",ch); return; } if (arg1[0] == '\0' && arg2[0] == '\0') { sprintf(buf,"Totems: Bear (%d), Lynx (%d), Boar (%d), Owl (%d), Spider (%d), Wolf (%d),\n\r Hawk (%d), Mantis (%d), Stag (%d).\n\r", ch->pcdata->powers[WPOWER_BEAR], ch->pcdata->powers[WPOWER_LYNX], ch->pcdata->powers[WPOWER_BOAR], ch->pcdata->powers[WPOWER_OWL], ch->pcdata->powers[WPOWER_SPIDER], ch->pcdata->powers[WPOWER_WOLF], ch->pcdata->powers[WPOWER_HAWK],ch->pcdata->powers[WPOWER_MANTIS], ch->pcdata->powers[WPOWER_STAG]); send_to_char(buf,ch); return; } if (arg2[0] == '\0') { if (!str_cmp(arg1,"bear")) { send_to_char("Bear: The totem of strength and aggression.\n\r",ch); if (ch->pcdata->powers[WPOWER_BEAR] < 1) send_to_char("You have none of the Bear totem powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_BEAR] > 0) send_to_char("FLEX: You strength is so great that no ropes can hold you.\n\r",ch); if (ch->pcdata->powers[WPOWER_BEAR] > 1) send_to_char("RAGE: You are able to build yourself up a rage at will.\n\r",ch); if (ch->pcdata->powers[WPOWER_BEAR] > 2) send_to_char("Steel claws: Your claws are so tough that they can parry weapons.\n\r",ch); if (ch->pcdata->powers[WPOWER_BEAR] > 3) send_to_char("Hibernation: Your wounds heal at amazing speeds when you sleep.\n\r",ch); return; } else if (!str_cmp(arg1,"boar")) { send_to_char("Boar: The totem of toughness and perserverance.\n\r",ch); if (ch->pcdata->powers[WPOWER_BOAR] < 1) send_to_char("You have none of the Boar totem powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_BOAR] > 0) send_to_char("Shatter: No door is sturdy enough to resist you.\n\r",ch); if (ch->pcdata->powers[WPOWER_BOAR] > 1) send_to_char("CHARGE: Your first blow in combat has a +50 damage bonus.\n\r",ch); if (ch->pcdata->powers[WPOWER_BOAR] > 2) send_to_char("Toughness: Your skin is extremely tough. You take half damage in combat.\n\r",ch); if (ch->pcdata->powers[WPOWER_BOAR] > 3) send_to_char("Immovability: You are able to shrug off blows that would knock out most people.\n\r",ch); if (ch->pcdata->powers[WPOWER_BOAR] > 4) send_to_char("Might of Fenris: You have the chance of dealing far more damage in combat.\n\r",ch); return; } else if (!str_cmp(arg1,"lynx")) { send_to_char("Lynx: The totem of speed and agility.\n\r",ch); if (ch->pcdata->powers[WPOWER_LYNX] < 1) send_to_char("You have none of the Lynx totem powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_LYNX] > 0) send_to_char("Light footed: You move so lightly that you leave no tracks behind you.\n\r",ch); if (ch->pcdata->powers[WPOWER_LYNX] > 1) send_to_char("Stalker: You are able hunt people with much greater speed than normal.\n\r",ch); if (ch->pcdata->powers[WPOWER_LYNX] > 2) send_to_char("Combat speed: You have an extra attack in combat.\n\r",ch); if (ch->pcdata->powers[WPOWER_LYNX] > 3) send_to_char("Lightning Claws: Yours claws parry blows with lightning fast speed.\n\r",ch); if (ch->pcdata->powers[WPOWER_LYNX] > 4) send_to_char("Combat Skill: You can gain an additional skill in unarmed combat.\n\r",ch); return; } else if (!str_cmp(arg1,"Owl")) { send_to_char("Owl: The totem of thought and spiritualism.\n\r",ch); if (ch->pcdata->powers[WPOWER_OWL] < 1) send_to_char("You have none of the Owl totem powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_OWL] > 0) send_to_char("VANISH: You are able to conceal yourself from all but the most perceptive.\n\r",ch); if (ch->pcdata->powers[WPOWER_OWL] > 1) send_to_char("SHIELD: You are able to shield your mind from scrying and aura-reading.\n\r",ch); if (ch->pcdata->powers[WPOWER_OWL] > 2) send_to_char("SHADOWPLANE: You are able to enter the shadow plane.\n\r",ch); if (ch->pcdata->powers[WPOWER_OWL] > 3) send_to_char("Magical Control: You are able to fully control your magic in crinos form.\n\r",ch); return; } else if (!str_cmp(arg1,"Spider")) { send_to_char("Spider: The totem of ambush and cunning.\n\r",ch); if (ch->pcdata->powers[WPOWER_SPIDER] < 1) send_to_char("You have none of the Spider totem powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_SPIDER] > 0) send_to_char("Poisonous bite: Your bite injects your opponents with a deadly venom.\n\r",ch); if (ch->pcdata->powers[WPOWER_SPIDER] > 1) send_to_char("WEB: You are able to shoot a web at your opponents to entrap them.\n\r",ch); if (ch->pcdata->powers[WPOWER_SPIDER] > 2) send_to_char("Immunity to poison: Poisons have no affect upon you.\n\r",ch); return; } else if (!str_cmp(arg1,"Wolf")) { send_to_char("Wolf: Controlling your innate wolf powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_WOLF] < 1) send_to_char("You have none of the Wolf totem powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_WOLF] > 0) send_to_char("CLAWS: You can extend or retract your claws at will.\n\r",ch); if (ch->pcdata->powers[WPOWER_WOLF] > 1) send_to_char("FANGS: You can extend or retract your fangs at will.\n\r",ch); if (ch->pcdata->powers[WPOWER_WOLF] > 2) send_to_char("CALM: You are able to repress your inner beast at will.\n\r",ch); if (ch->pcdata->powers[WPOWER_WOLF] > 3) send_to_char("Spirit of Fenris: You are able to enter rage faster than normal.\n\r",ch); return; } else if (!str_cmp(arg1,"Hawk")) { send_to_char("Hawk: The totem of vision and perception.\n\r",ch); if (ch->pcdata->powers[WPOWER_HAWK] < 1) send_to_char("You have none of the Wolf totem powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_HAWK] > 0) send_to_char("NIGHTSIGHT: You can see perfectly well in the dark.\n\r",ch); if (ch->pcdata->powers[WPOWER_HAWK] > 1) send_to_char("SHADOWSIGHT: You can see into the plane of shadows.\n\r",ch); if (ch->pcdata->powers[WPOWER_HAWK] > 2) send_to_char("TRUESIGHT: You have perfect vision.\n\r",ch); return; } else if (!str_cmp(arg1,"Mantis")) { send_to_char("Mantis: The totem of dexterity and reflexes.\n\r",ch); if (ch->pcdata->powers[WPOWER_MANTIS] < 1) send_to_char("You have none of the Mantis totem powers.\n\r",ch); if (ch->pcdata->powers[WPOWER_MANTIS] > 4) send_to_char("Incredibly fast attacks: Your opponents get -25 to parry and -50 to dodge.\n\r",ch); if (ch->pcdata->powers[WPOWER_MANTIS] > 3) send_to_char("Incredibly fast attacks: Your opponents get -20 to parry and -40 to dodge.\n\r",ch); else if (ch->pcdata->powers[WPOWER_MANTIS] > 2) send_to_char("Extremely fast attacks: Your opponents get -15 to parry and -30 to dodge.\n\r",ch); else if (ch->pcdata->powers[WPOWER_MANTIS] > 1) send_to_char("Very fast attacks: Your opponents get -10 to parry and -20 to dodge.\n\r",ch); else if (ch->pcdata->powers[WPOWER_MANTIS] > 0) send_to_char("Fast attacks: Your opponents get -5 to parry and -10 to dodge.\n\r",ch); return; } else if (!str_cmp(arg1, "Stag")) { send_to_char("Stag: The totem of grace and spirit.\r\n", ch); if (ch->pcdata->powers[WPOWER_STAG] < 1) send_to_char("You have none of the Stag totem powers.\r\n", ch); if (ch->pcdata->powers[WPOWER_STAG] > 0) send_to_char("GNOSIS: You regenerate incredibly fast when concentrating.\r\n", ch); if (ch->pcdata->powers[WPOWER_STAG] > 1) send_to_char("FETISH: You can create objects with spirits bound in them.\r\n", ch); if (ch->pcdata->powers[WPOWER_STAG] > 2) send_to_char("BRIDGE: You can create a moon bridge - the ability to travel to other Garou.\r\n", ch); return; } sprintf(buf,"Totems: Bear (%d), Lynx (%d), Boar (%d), Owl (%d), Spider (%d), Wolf (%d),\n\r Hawk (%d), Mantis (%d), Stag (%d).\n\r", ch->pcdata->powers[WPOWER_BEAR], ch->pcdata->powers[WPOWER_LYNX], ch->pcdata->powers[WPOWER_BOAR], ch->pcdata->powers[WPOWER_OWL], ch->pcdata->powers[WPOWER_SPIDER], ch->pcdata->powers[WPOWER_WOLF], ch->pcdata->powers[WPOWER_HAWK],ch->pcdata->powers[WPOWER_MANTIS], ch->pcdata->powers[WPOWER_STAG]); send_to_char(buf,ch); return; } if (!str_cmp(arg2,"improve")) { int improve; int cost; int max; if (!str_cmp(arg1,"bear" )) {improve = WPOWER_BEAR; max=4;} else if (!str_cmp(arg1,"boar" )) {improve = WPOWER_BOAR; max=5;} else if (!str_cmp(arg1,"lynx" )) {improve = WPOWER_LYNX; max=5;} else if (!str_cmp(arg1,"owl" )) {improve = WPOWER_OWL; max=4;} else if (!str_cmp(arg1,"spider" )) {improve = WPOWER_SPIDER; max=3;} else if (!str_cmp(arg1,"wolf" )) {improve = WPOWER_WOLF; max=4;} else if (!str_cmp(arg1,"hawk" )) {improve = WPOWER_HAWK; max=3;} else if (!str_cmp(arg1,"mantis" )) {improve = WPOWER_MANTIS; max=5;} else if (!str_cmp(arg1,"stag" )) {improve = WPOWER_STAG; max=3;} else { send_to_char("You can improve: Bear, Boar, Lynx, Owl, Spider, Wolf, Hawk, Mantis or Stag.\n\r",ch); return; } cost = (ch->pcdata->powers[improve]+1) * 10; arg1[0] = UPPER(arg1[0]); if ( ch->pcdata->powers[improve] >= max ) { sprintf(buf,"You have already gained all the powers of the %s totem.\n\r", arg1); send_to_char(buf,ch); return; } if ( cost > ch->practice ) { sprintf(buf,"It costs you %d primal to improve your %s totem.\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 totem.\n\r", arg1); send_to_char(buf,ch); } else send_to_char("To improve a totem, type: Totem <totem type> improve.\n\r",ch); return; } void do_tribe( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; char clan[MAX_INPUT_LENGTH]; CHAR_DATA *gch; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_WEREWOLF)) { send_to_char("Huh?\n\r",ch); return; } if ( strlen(ch->clan) > 16) { send_to_char("You need no tribe, foul spawn of the wyrm.\n\r",ch); return; } 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 ( strlen(gch->clan) > 16) continue; if ( gch->clan != NULL && strlen(gch->clan) > 1 ) sprintf(clan,gch->clan); else if ( gch->pcdata->stats[UNI_GEN] == 1 ) sprintf(clan,"All"); else sprintf(clan,"None"); { sprintf( buf, "[%-16s] [%-13s] [%-6d%3d] [%-6d%3d] [%-6d%3d] [%7d]\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_bloodline( CHAR_DATA *ch, char *argument ) { char gen1 [MAX_INPUT_LENGTH]; char gen2 [MAX_INPUT_LENGTH]; char gen3 [MAX_INPUT_LENGTH]; char gen4 [MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; char buf2 [MAX_STRING_LENGTH]; char auspice [MAX_STRING_LENGTH]; argument = one_argument( argument, gen1 ); argument = one_argument( argument, gen2 ); argument = one_argument( argument, gen3 ); argument = one_argument( argument, gen4 ); if (IS_NPC(ch)) return; if (gen1 != '\0') gen1[0] = UPPER(gen1[0]); if (gen2 != '\0') gen2[0] = UPPER(gen2[0]); if (gen3 != '\0') gen3[0] = UPPER(gen3[0]); if (gen4 != '\0') gen4[0] = UPPER(gen4[0]); switch ( moon_phase(ch->pcdata->stats[WOLF_AUSPICE]) ) { case PHASE_NEW: sprintf(auspice, "Ragabash"); break; case PHASE_CRESCENT: sprintf(auspice, "Theurge"); break; case PHASE_HALF: sprintf(auspice, "Philodox"); break; case PHASE_GIBBOUS: sprintf(auspice, "Galliard"); break; case PHASE_FULL: sprintf(auspice, "Ahroun"); break; default: sprintf(auspice, "Unkown auspice"); break; } 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,"I am the %s %s, I am a Ronin of no tribe.", auspice, ch->name); do_say(ch,buf); return; } strcpy(buf,"In the name of Gaia, I announce my Garou heritage."); do_say(ch,buf); if (ch->pcdata->stats[UNI_GEN] == 1) {do_say(ch, "I am the Chosen Champion of Gaia."); return;} else if (ch->pcdata->stats[UNI_GEN] == 2) sprintf(buf,"My name is %s, %s Chieftain of the %s tribe.", ch->name,auspice,ch->clan); else if (IS_SET(ch->special, SPC_PRINCE)) sprintf(buf,"My name is %s, %s Shaman of the %s tribe.", ch->name, auspice, ch->clan); else sprintf(buf,"My name is %s, %s of the %s tribe.", ch->name, auspice, ch->clan); do_say(ch, buf); strcpy(buf2, "I am the "); switch (ch->pcdata->stats[UNI_GEN]) { default: case 5: sprintf(buf2 + strlen(buf2), "pup of %s, ", gen4); case 4: sprintf(buf2 + strlen(buf2), "pup of %s, ", gen3); case 3: sprintf(buf2 + strlen(buf2), "pup of %s, ", gen2); case 2: sprintf(buf2 + strlen(buf2), "pup of %s, ", gen1); case 1: sprintf(buf2 + strlen(buf2), "Chosen Champion of Gaia."); } do_say(ch, buf2); 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; OBJ_DATA *obj; 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); 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); } if ((obj = get_eq_char(ch,WEAR_WIELD)) != NULL && !IS_SET(obj->spectype, SITEM_WOLFWEAPON)) { act("$p drops from your right hand.",ch,obj,NULL,TO_CHAR); act("$p drops from $n's right hand.",ch,obj,NULL,TO_ROOM); obj_from_char(obj); obj_to_char(obj, ch); } if ((obj = get_eq_char(ch,WEAR_HOLD)) != NULL && !IS_SET(obj->spectype, SITEM_WOLFWEAPON)) { act("$p drops from your left hand.",ch,obj,NULL,TO_CHAR); act("$p drops from $n's left hand.",ch,obj,NULL,TO_ROOM); obj_from_char(obj); obj_to_char(obj, ch); } SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_DISGUISED); sprintf(buf,"%s the werewolf",ch->name); free_string(ch->morph); ch->morph = str_dup(buf); ch->pcdata->stats[UNI_RAGE] += 25; 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; if (moon_phase(time_info.lunar_day) == moon_phase(ch->pcdata->stats[WOLF_AUSPICE]) ) ch->pcdata->stats[UNI_RAGE] = 350; 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 /* send_to_char("You hear a fearsome howl far off in the distance!\n\r", vch);*/ if (!CAN_PK(vch)) continue; } if ( vch->in_room == ch->in_room && can_see( ch, vch) ) { 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] -= 25; if (ch->pcdata->stats[UNI_RAGE] < 0) ch->pcdata->stats[UNI_RAGE] = 0; return; } void do_vanish( CHAR_DATA *ch, char *argument ) { if ( IS_NPC(ch) ) return; if (!IS_CLASS(ch, CLASS_WEREWOLF) || ch->pcdata->powers[WPOWER_OWL] < 1) { send_to_char("Huh?\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_web( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; int sn; int level; int spelltype; int cost = (number_range(200,400)); argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_WEREWOLF) || ch->pcdata->powers[WPOWER_SPIDER] < 2) { send_to_char("Huh?\n\r",ch); return; } if (ch->move < cost) { send_to_char("You're too fatigued to try and web someone.\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; } ch->move -= cost; 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_gnosis ( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_WEREWOLF)) { send_to_char("Huh?\r\n", ch); return; } if (ch->pcdata->powers[WPOWER_STAG] < 1) { send_to_char("Huh?\r\n", ch); return; } if (ch->position != POS_RESTING) { send_to_char("You cannot enter gnosis unless you are resting.\r\n", ch); return; } if (ch->pcdata->stats[UNI_RAGE] > 0) { send_to_char("You must be calm and at peace before entering the state of gnosis.\r\n", ch); return; } ch->position = POS_GNOSIS; act("You attune yourself to the spirit world and allow your body to regenerate.", ch, NULL, NULL, TO_CHAR); act("$n closes $s eyes and begins chanting in the Garou tongue.", ch, NULL, NULL, TO_ROOM); return; } void do_fetish( CHAR_DATA *ch, char *argument ) { OBJ_INDEX_DATA *pObjIndex; OBJ_DATA *obj; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int vnum = 0; int cost = 50; if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_WEREWOLF)) { send_to_char("Huh?\r\n", ch); } if (ch->pcdata->powers[WPOWER_STAG] < 2) { send_to_char("You must advance your Stag totem to level 2 to create fetish objects.\r\n", ch); return; } if (argument[0] == '\0') { send_to_char("You can make the following fetish objects:\r\nMoongem, Lesser Klaive, Greater Klaive.\r\n", ch); return; } argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (!str_cmp(arg1, "moongem")) { vnum = 29675; cost = 25; } else if (!str_cmp(arg1, "lesser") && !str_cmp(arg2, "klaive")) { vnum = 29691; cost = 60; } else if (!str_cmp(arg1, "greater") && !str_cmp(arg2, "klaive")) { vnum = 29676; cost = 100; } else { send_to_char("You can make the following fetish objects:\r\nMoongem, Lesser Klaive, Greater Klaive.\r\n", ch); return; } if (ch->practice < cost) { sprintf(buf, "It costs %d to create that fetish object.\r\n", cost); send_to_char(buf, ch); return; } if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL) { send_to_char("Missing object, please inform a god.\n\r",ch); return; } ch->practice -= cost; obj = create_object(pObjIndex, 50); free_string(obj->questmaker); obj->questmaker = str_dup(ch->name); obj_to_char(obj, ch); act("$p appears in your hands in a blast of moon light.",ch,obj,NULL,TO_CHAR); act("$p appears in $n's hands in a blast of moon light.",ch,obj,NULL,TO_ROOM); return; } void do_bridge (CHAR_DATA *ch, char *argument) { char arg[MAX_STRING_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj1; OBJ_DATA *obj2; if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_WEREWOLF)) { send_to_char("Huh?\r\n", ch); return; } if (ch->pcdata->powers[WPOWER_STAG] < 3) { send_to_char("You must advance your Stag totem to open a moonbridge.\r\n", ch); return; } one_argument(argument, arg); if (arg[0] == '\0') { send_to_char("Open a moonbridge to whom?\r\n", ch); return; } if ( ( victim = get_char_world( ch, arg ) ) == NULL ) { send_to_char( "They are nowhere to be found.\n\r", ch ); return; } if ( ch == victim) { send_to_char("That would be a short bridge wouldn't it?\r\n", ch); return; } if (victim->in_room == NULL) { send_to_char( "The moonbridge fails to open.\n\r", ch ); return; } if ( !IS_CLASS(victim, CLASS_WEREWOLF)) { send_to_char("You can only open a moonbridge to another Garou.\r\n", ch); return; } if ( ( obj1 = get_obj_carry( ch, "moongem" ) ) == NULL ) { send_to_char("A moongem is required to open a moonbridge.\r\n", ch); return; } if ( ( obj2 = get_obj_carry( victim, "moongem" ) ) == NULL ) { send_to_char("That Garou has no moongem.\r\n", ch); return; } if ( IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || IS_SET(victim->in_room->room_flags, ROOM_PRIVATE) || IS_SET(victim->in_room->room_flags, ROOM_SOLITARY) || IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL) || victim->in_room->vnum == ch->in_room->vnum) { send_to_char( "The moonbridge fails to open.\n\r", ch ); return; } if (victim->position == POS_FIGHTING) { send_to_char("The moonbridge fails to open.\r\n", ch); return; } if (number_range(1, 10) == 1) { send_to_char("Your moongem shines brightly then vanishes.\r\n", ch); extract_obj(obj1); } act("A moonbridge opens and swallows $n.", ch, NULL, NULL, TO_ROOM); act("A moonbridge opens above and swallows you.", ch, NULL, NULL, TO_CHAR); char_from_room(ch); char_to_room(ch, victim->in_room); act("$n steps out of a moonbridge.\r\n", ch, NULL, NULL, TO_ROOM); act("You step out of a moonbridge.\r\n", ch, NULL, NULL, TO_CHAR); do_look(ch, "auto"); return; } int moon_phase (int lunar_day) { switch (lunar_day) { case 1: case 2: case 26: case 27: case 28: return PHASE_NEW; case 3: case 4: case 5: case 24: case 25: return PHASE_CRESCENT; case 6: case 7: case 8: case 21: case 22: case 23: return PHASE_HALF; case 9: case 10: case 11: case 18: case 19: case 20: return PHASE_GIBBOUS; case 12: case 13: case 14: case 15: case 16: case 17: return PHASE_FULL; } return PHASE_FULL; }