/*************************************************************************** * 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. * ***************************************************************************/ #include <glib.h> #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <merc.h> #include <tables.h> #include <power.h> #include <interp.h> /* Local functions */ char * gift_breed_name args( ( int gift_no ) ); char * gift_auspice_name args( ( int gift_no ) ); char * gift_tribe_name args( ( int gift_no ) ); /*External Bookmark */ bool check_dumbshit args( (char *command) ); extern void extend_extra args( (CHAR_DATA *ch) ); extern bool can_becommanded args((CHAR_DATA *ch, CHAR_DATA *victim, char *action)); extern void set_fighting args( ( CHAR_DATA *ch, CHAR_DATA *victim ) ); extern void command_victim args((CHAR_DATA *ch, CHAR_DATA *victim, char *action)); void power_animal(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_ADDED(ch,ADDED_ANIMAL_MASTER) ) { send_to_char("You are no longer so attractive to animals.\n\r",ch); REMOVE_BIT(ch->added, ADDED_ANIMAL_MASTER); return; } send_to_char("You make yourself attractive to animals.\n\r",ch); SET_BIT(ch->added, ADDED_ANIMAL_MASTER); return; } void power_fleshbond(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { CHAR_DATA *lvic; OBJ_DATA *obj; OBJ_DATA *obj_next; int mob_vnum; mob_vnum = ch->pcdata->absorb[ABS_MOB_VNUM]; if (mob_vnum > 0) { if ( ( lvic = create_mobile( get_mob_index( mob_vnum ) ) ) == NULL ) { send_to_char("Bug - Please Inform Spiral or Dominion.\n\r",ch); return; } if ( ( ( ch->hit - ch->pcdata->absorb[ABS_MOB_HP] ) < 1 ) || ( ( ch->max_hit - ch->pcdata->absorb[ABS_MOB_MAX_HP]) < 1 ) ) { send_to_char("You would be unable to survive the removal of the Flesh Bonded creature.\n\r",ch); return; } ch->hit -= ch->pcdata->absorb[ABS_MOB_HP]; ch->max_hit -= ch->pcdata->absorb[ABS_MOB_MAX_HP]; lvic->hit = ch->pcdata->absorb[ABS_MOB_HP]; lvic->max_hit = ch->pcdata->absorb[ABS_MOB_MAX_HP]; ch->pcdata->absorb[ABS_MOB_VNUM] = 0; ch->pcdata->absorb[ABS_MOB_HP] = 0; ch->pcdata->absorb[ABS_MOB_MAX_HP] = 0; char_to_room(lvic,ch->in_room); act("You pull $N out of your body.",ch,NULL,lvic,TO_CHAR); act("$n pulls $N out of $s body.",ch,NULL,lvic,TO_ROOM); return; } if ((lvic=get_char_room(ch,argument))==NULL) { send_to_char("There not here. Umm try again.\n\r",ch); return; } if ( !IS_NPC(lvic) ) { send_to_char( "Not on players.\n\r", ch ); return; } if (!IS_SET(lvic->act,ACT_ANIMAL)) { send_to_char("You can't absorb them!",ch); return; } if (lvic->level > 50) { send_to_char("You failed.\n\r",ch); return; } if (IS_SET(lvic->act, ACT_AGGRESSIVE)) { send_to_char("You can't seem to get them to play nice.\n\r",ch); return; } act("You absorb $N into your body.",ch,NULL,lvic,TO_CHAR); act("$n absorbs $N into $s body.",ch,NULL,lvic,TO_NOTVICT); act("$n absorbs you into $s body.",ch,NULL,lvic,TO_VICT); for ( obj = lvic->carrying; obj != NULL; obj = obj_next ) { obj_next = obj->next_content; obj_from_char(obj); obj_to_room(obj,lvic->in_room); act("$p falls to the ground.",lvic,obj,NULL,TO_ROOM); } while ( lvic->affected ) affect_remove( lvic, lvic->affected ); ch->pcdata->absorb[ABS_MOB_VNUM] = lvic->pIndexData->vnum; ch->pcdata->absorb[ABS_MOB_HP] = lvic->hit; ch->pcdata->absorb[ABS_MOB_MAX_HP] = lvic->max_hit; ch->hit += lvic->hit; ch->max_hit += lvic->max_hit; extract_char(lvic, TRUE); return; } void power_persuasion(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_EXTRA(ch,EXTRA_AWE) ) { send_to_char("You are no longer so persuasive.\n\r",ch); act("$n no longer appears so persuasive.", ch, NULL, NULL, TO_ROOM); REMOVE_BIT(ch->extra, EXTRA_AWE); return; } send_to_char("Your are now persuasive.\n\r",ch); act("$n suddenly appears very persuasive.", ch, NULL, NULL, TO_ROOM); SET_BIT(ch->extra, EXTRA_AWE); return; } void power_staredown(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int sn; int level; int spelltype; if ( IS_AFFECTED(victim, AFF_FEAR) ) { send_to_char( "They are already pretty scared.\n\r", ch ); return; } act("You lock eyes with $N.",ch,NULL,victim,TO_CHAR); act("$n locks eyes with $N.",ch,NULL,victim,TO_NOTVICT); act("$n locks eyes with you.",ch,NULL,victim,TO_VICT); if ( IS_SET(victim->added, ADDED_COURAGE) ) { send_to_char( "They are far too brave to be scared so easily.\n\r", ch ); act("$n just failed to use Staredown on you.",ch,NULL,victim,TO_VICT); return; } if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,30)) { send_to_char( "Your Staredown has no effect on them.\n\r", ch ); act("$n just failed to use Staredown on you.",ch,NULL,victim,TO_VICT); return; } ch->pcdata->rage_points -= 30; if ( ( sn = skill_lookup( "fear" ) ) < 0 ) return; spelltype = skill_table[sn].target; level = get_breed(ch,BREED_HOMID) * 10; (*skill_table[sn].spell_fun) ( sn, level, ch, victim ); WAIT_STATE( ch, 12 ); act("$n just used Staredown on you.",ch,NULL,victim,TO_VICT); return; } void power_reshape_object(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { OBJ_DATA *obj; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf [MAX_STRING_LENGTH]; char endchar[15]; smash_tilde( argument ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' || arg2[0] == '\0' || argument[0] == '\0' ) { send_to_char( "Syntax: Reshape <object> rename <short description>\n\r", ch ); send_to_char( "Syntax: Reshape <object> keyword <extra keyword/s>\n\r", ch ); send_to_char( "Syntax: Reshape <object> flags <glow/hum>\n\r", ch ); return; } if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL ) { send_to_char( "You are not carrying that object.\n\r", ch ); return; } if (obj->item_type == ITEM_QUEST || obj->item_type == ITEM_AMMO || obj->item_type == ITEM_EGG || obj->item_type == ITEM_VOODOO || obj->item_type == ITEM_MONEY || obj->item_type == ITEM_TREASURE || obj->item_type == ITEM_TOOL || obj->item_type == ITEM_SYMBOL || obj->item_type == ITEM_PAGE || IS_SET(obj->quest, QUEST_ARTIFACT)) { send_to_char( "You cannot quest-change that item.\n\r", ch ); return; } if (!IS_IMMORTAL(ch) && (obj->questowner == NULL || str_cmp(ch->name->str,obj->questowner->str))) { send_to_char("You can only change an item you own.\n\r", ch); return; } if ( !str_cmp( arg2, "keyword" ) || !str_cmp( arg2, "keywords" ) ) { if (IS_SET(obj->quest, QUEST_RELIC)) { send_to_char("Not on a relic.\n\r",ch); return; } if (strlen(argument) < 3) { send_to_char("Keywords should be at least 3 characters long.\n\r",ch); return; } str_cpy(argument,capitalize(argument)); argument[0] = LOWER(argument[0]); endchar[0] = (argument[strlen(argument)-1]); endchar[1] = '\0'; if (!str_cmp(endchar,".")) argument[strlen(argument)-1] = '\0'; str_cpy(buf,obj->name->str); if (strlen(buf) > 80) { send_to_char("You cannot fit any more keywords on this object.\n\r",ch); return; } strcat(buf," "); strcat(buf,argument); obj->name = g_string_assign(obj->name,buf); send_to_char("Ok.\n\r",ch); obj->questmaker = g_string_assign(obj->questmaker,ch->name->str); return; } if ( !str_cmp( arg2, "flags" ) ) { if (!str_cmp(argument,"glow")) { if (IS_SET(obj->extra_flags, ITEM_GLOW)) REMOVE_BIT(obj->extra_flags, ITEM_GLOW); else SET_BIT(obj->extra_flags, ITEM_GLOW); } else if (!str_cmp(argument,"hum")) { if (IS_SET(obj->extra_flags, ITEM_HUM)) REMOVE_BIT(obj->extra_flags, ITEM_HUM); else SET_BIT(obj->extra_flags, ITEM_HUM); } else { send_to_char( "Syntax: Reshape <object> flags <glow/hum>\n\r", ch ); return; } send_to_char("Ok.\n\r",ch); obj->questmaker = g_string_assign(obj->questmaker,ch->name->str); return; } send_to_char( "Syntax: Reshape <object> keyword <extra keyword/s>\n\r", ch ); send_to_char( "Syntax: Reshape <object> flags <glow/hum>\n\r", ch ); return; } void power_disquiet(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_NPC(victim)) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if (IS_SET(victim->sphere_spaffect,AFSPHERE_MIND_SHIELD) ){ send_to_char("They have a shield blocking thier mind.\n\r",ch); send_to_char("Your mental shield blocks a disquiet attempt.\n\r",victim); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); if (IS_SET(victim->added, ADDED_CALM)) { send_to_char("You no longer feel so apathetic.\n\r",victim); REMOVE_BIT(victim->added, ADDED_CALM); WAIT_STATE( ch, 12 ); return; } if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(1,20) && ch != victim) { send_to_char("They resist you.\n\r",ch); act("$n just failed to use Disquiet on you.",ch,NULL,victim,TO_VICT); return; } act("$n just used Disquiet on you.",ch,NULL,victim,TO_VICT); if (IS_ADDED(victim, ADDED_ANGER)) { send_to_char("You no longer feel so angry.\n\r",victim); act("$n regains $s temper.",victim,NULL,NULL,TO_ROOM); REMOVE_BIT(victim->added, ADDED_ANGER); WAIT_STATE( ch, 12 ); return; } send_to_char("You suddenly feel very apathetic!\n\r",victim); act("$n yawns and looks around with a bored expression.",victim,NULL,NULL,TO_ROOM); SET_BIT(victim->added, ADDED_CALM); WAIT_STATE( ch, 12 ); return; } void power_spgift(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,ADDED_GIFTSPRIG) ) return; af.spell_number = mage_affect_slot("giftofspriggan"); af.type = TYPE_SPHERE_ADDED; af.duration = 2 * get_tribe(ch,TRIBE_FIANNA); af.bitvector = ADDED_GIFTSPRIG; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("giftofspriggan")].on_msg, ch ); act("$n howls with rage as thier body grows even bigger!",ch,NULL,NULL,TO_ROOM); send_to_char("You feel the Gift of the Spriggan as your body grows!\n\r",ch); return; } void power_icy(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (ch->fighting != NULL) { send_to_char("Not while fighting.\n\r",ch); return; } if (IS_ITEMAFF(ch,ITEMA_PEACE) ) { send_to_char("You stop using the Icy Chill of Despair.\n\r",ch); act("$n no longer seems so scary.", ch, NULL, NULL, TO_ROOM); REMOVE_BIT(ch->itemaffect, ITEMA_PEACE); return; } send_to_char("Your start using the Icy Chill of Despair.\n\r",ch); act("$n suddenly appears really scary.", ch, NULL, NULL, TO_ROOM); SET_BIT(ch->itemaffect, ITEMA_PEACE); return; } void power_bsong(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char arg[MSL]; argument = one_argument(argument,arg); if (IS_SWWF(ch) && ch->pcdata->rage_points < 300) { send_to_char("You must have at least 300 Rage to use this command.\n\r",ch ); return; } if (arg[0] == '0') { send_to_char("You must use fight or flight with this command.\n\r",ch); return; } if (IS_ADDED(ch,ADDED_FRENZY)) { send_to_char("You already in frenzy..\n\r",ch); return; } //enter the FRENZY!!! send_to_char("You start to howl as your world turns {RRED{x\n\r",ch); //if not crinos make it so... if (ch->pcdata->wwf_shape != SHAPE_CRINOS ) { shape_shift(ch,SHAPE_CRINOS); } SET_BIT(ch->added, ADDED_FRENZY); //fight or flight... if (!str_cmp(arg,"fight")) ch->pcdata->frenzy_action = FRENZY_FIGHT; else if (!str_cmp(arg,"flight")) ch->pcdata->frenzy_action = FRENZY_FLIGHT; ch->pcdata->rage_points = get_max_rage(ch); return; } void power_paralyzing(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { act("You stare deeply into $N's eyes.",ch,NULL,victim,TO_CHAR); act("$n stares deeply into $N's eyes.",ch,NULL,victim,TO_NOTVICT); act("$n stares deeply into your eyes.",ch,NULL,victim,TO_VICT); act("You stare back into $N's eyes.",victim,NULL,ch,TO_CHAR); act("$n stares back into $N's eyes.",victim,NULL,ch,TO_NOTVICT); act("$n stares back into your eyes.",victim,NULL,ch,TO_VICT); send_to_char( "You paralyze them with your stare!\n\r", ch ); send_to_char( "You are momentarily paralyzed!\n\r", victim ); WAIT_STATE( ch, 24 ); WAIT_STATE( victim, 24 ); return; } void power_spwrath(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_NPC(victim)) { send_to_char("Sorry players only.\n\r",ch); return; } if (victim->pcdata->willpower >= number_range(1,30)) { send_to_char("They resist your wrath!\n\r",ch); return; } act("You give them a taste of Spiral's Wrath!.",ch,NULL,victim,TO_CHAR); act("$n gives you a taste of Spiral's WRATH!",ch,NULL,victim,TO_VICT); act("$n shows $N about Spiral's wrath!.",ch,NULL,victim,TO_NOTVICT); do_flee(victim,""); WAIT_STATE(ch,24); WAIT_STATE(victim,24); return; } void power_mindblock(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_SET(ch->pcdata->comm,COMM_MIND_BLOCK) ) { REMOVE_BIT(ch->pcdata->comm,COMM_MIND_BLOCK); send_to_char("You are no longer blocking your mind.\n\r",ch); return; } SET_BIT(ch->pcdata->comm, COMM_MIND_BLOCK); send_to_char("You Start to block your mind!\n\r",ch); return; } void power_obedience(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char action[MAX_INPUT_LENGTH]; smash_quote(argument); one_argument(argument,action); if (IS_NPC(victim)){ send_to_char("Only on players.\n\r",ch); return; } if (!can_becommanded(ch,victim,action)) return; if (IS_SWWF(victim) && victim->pcdata->renown > ch->pcdata->renown){ send_to_char("You cannot command a high ranked garou.\n\r",ch); return; } command_victim(ch,victim,argument); return; } void power_dazzle(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (victim->position != POS_FIGHTING && victim->hit < victim->max_hit) { send_to_char( "Nothing happens.\n\r", ch ); act("$n just failed to use Dazzle on you.",ch,NULL,victim,TO_VICT); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("You cover your eyes as you are dazzled!\n\r",victim); act("$n covers $s eyes, looking dazzled!",victim,NULL,NULL,TO_ROOM); act("$n just used Dazzle on you.",ch,NULL,victim,TO_VICT); stop_fighting(victim,TRUE); update_pos(victim); if (victim->position > POS_STUNNED) victim->position = POS_STUNNED; if (IS_NPC(victim)) do_kill(victim,ch->name->str); WAIT_STATE( ch, 24 ); return; } void power_hice(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int dam; dam = number_range(1000,4000); damage( ch, victim, dam, 0 ); send_to_char("You find it very hard to breath as your heart starts to freeze.\n\r",victim); send_to_char("You grin to see thier heart turn to ice.\n\r",ch); act("$N makes a dancing movement as they freeze $n's heart.",ch,NULL,victim,TO_NOTVICT); WAIT_STATE(ch,24); WAIT_STATE(victim, 12); if (victim == NULL || victim->position == POS_DEAD) return; update_pos(victim); return; } void power_halosun(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_ITEMAFF(ch,ITEMA_SUNSHIELD) ) { send_to_char("Your Halo of the Sun gradually fades away.\n\r",ch); act("$n's Halo of the Sun gradually fades away.", ch, NULL, NULL, TO_ROOM); REMOVE_BIT(ch->itemaffect, ITEMA_SUNSHIELD); return; } send_to_char("You are surrounded by a halo of sunlight!\n\r",ch); act("$n is surrounded by a halo of sunlight!", ch, NULL, NULL, TO_ROOM); SET_BIT(ch->itemaffect, ITEMA_SUNSHIELD); return; } void power_wall(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { OBJ_DATA *obj; EXIT_DATA *pexit; ROOM_INDEX_DATA *location; ROOM_INDEX_DATA *to_room; char arg [MAX_INPUT_LENGTH]; char buf [MAX_INPUT_LENGTH]; int duration = number_range(15,30); int direction, rev; one_argument( argument, arg ); if ( arg[0] == '\0') { send_to_char( "Which direction do you wish to make the wall?\n\r", ch ); return; } if (!str_cmp(arg,"north") || !str_cmp(arg,"n")) {direction = DIR_NORTH; rev = DIR_SOUTH;} else if (!str_cmp(arg,"south") || !str_cmp(arg,"s")) {direction = DIR_SOUTH; rev = DIR_NORTH;} else if (!str_cmp(arg,"east") || !str_cmp(arg,"e")) {direction = DIR_EAST; rev = DIR_WEST;} else if (!str_cmp(arg,"west") || !str_cmp(arg,"w")) {direction = DIR_WEST; rev = DIR_EAST;} else if (!str_cmp(arg,"up") || !str_cmp(arg,"u")) {direction = DIR_UP; rev = DIR_DOWN;} else if (!str_cmp(arg,"down") || !str_cmp(arg,"d")) {direction = DIR_DOWN; rev = DIR_UP;} else { send_to_char( "Select direction: North, South, East, West, Up or Down.\n\r", ch ); return; } switch (direction) { default: str_cpy(arg,"north"); break; case DIR_NORTH: str_cpy(arg,"north"); break; case DIR_SOUTH: str_cpy(arg,"south"); break; case DIR_EAST: str_cpy(arg,"east"); break; case DIR_WEST: str_cpy(arg,"west"); break; case DIR_UP: str_cpy(arg,"up"); break; case DIR_DOWN: str_cpy(arg,"down"); break; } if ( ( pexit = ch->in_room->exit[direction] ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ( location = ch->in_room ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ( to_room = pexit->to_room ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_SET(pexit->exit_info, EX_WALL_WATER) || IS_SET(pexit->exit_info, EX_WALL_GRANITE) || IS_SET(pexit->exit_info, EX_WALL_FLAME)) { send_to_char("There is already a wall blocking that exit.\n\r",ch); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->item_type = ITEM_WALL; obj->value[0] = direction; obj->timer = duration; obj->name = g_string_assign(obj->name,"wall flowing water"); obj->short_descr = g_string_assign(obj->short_descr,"a wall of flowing water"); sprintf(buf,"A wall of flowing water blocks your exit %s.",arg); obj->description = g_string_assign(obj->description,buf); obj_to_room( obj, ch->in_room ); SET_BIT(pexit->exit_info, EX_WALL_WATER); if (direction == DIR_UP) sprintf(buf,"Water pours from the ground and forms a wall above you."); else if (direction == DIR_DOWN) sprintf(buf,"Water pours from the ground and forms a wall below you."); else sprintf(buf,"Water pours from the ground and forms a wall to the %s.",arg); act( buf, ch, NULL, NULL, TO_CHAR ); act( buf, ch, NULL, NULL, TO_ROOM ); WAIT_STATE(ch,12); if (location == to_room) return; char_from_room(ch); char_to_room(ch, to_room); if ( ( pexit = ch->in_room->exit[rev] ) == NULL ) return; if (IS_SET(pexit->exit_info, EX_WALL_WATER) || IS_SET(pexit->exit_info, EX_WALL_GRANITE) || IS_SET(pexit->exit_info, EX_WALL_FLAME)) return; switch (rev) { default: str_cpy(arg,"north"); break; case DIR_NORTH: str_cpy(arg,"north"); break; case DIR_SOUTH: str_cpy(arg,"south"); break; case DIR_EAST: str_cpy(arg,"east"); break; case DIR_WEST: str_cpy(arg,"west"); break; case DIR_UP: str_cpy(arg,"up"); break; case DIR_DOWN: str_cpy(arg,"down"); break; } obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->item_type = ITEM_WALL; obj->value[0] = rev; obj->timer = duration; obj->name = g_string_assign(obj->name,"wall flowing water"); obj->short_descr = g_string_assign(obj->short_descr,"a wall of flowing water"); sprintf(buf,"A wall of flowing water blocks your exit %s.",arg); obj->description = g_string_assign(obj->description,buf); obj_to_room( obj, ch->in_room ); SET_BIT(pexit->exit_info, EX_WALL_WATER); if (rev == DIR_UP) sprintf(buf,"Water pours from the ground and forms a wall above you."); else if (rev == DIR_DOWN) sprintf(buf,"Water pours from the ground and forms a wall below you."); else sprintf(buf,"Water pours from the ground and forms a wall to the %s.",arg); act( buf, ch, NULL, NULL, TO_ROOM ); char_from_room(ch); char_to_room(ch, location); return; } void power_burrow( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { if ( ch->fighting != NULL) { send_to_char("Not while fighting.\n\r",ch); return; } if ( victim == ch || victim->in_room == NULL || IS_NPC(victim) // || IS_NPC(victim) -dc || IS_SET(ch->in_room->room_flags, ROOM_PRIVATE) || IS_SET(ch->in_room->room_flags, ROOM_SOLITARY) || IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || IS_SET(victim->in_room->room_flags, ROOM_PRIVATE) || IS_SET(victim->in_room->room_flags, ROOM_SOLITARY) || IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL) || victim->in_room->vnum == 1 || (ch->clan != victim->clan) || ch->sect != victim->sect || victim->in_room->vnum == 2 || victim->in_room->vnum == 1200 || (ch->pk_timer > 0 && is_tempsafe(ch)) || ( strstr(victim->in_room->area->builders, "Unlinked" ) ) || victim->in_room->vnum == ch->in_room->vnum) { send_to_char( "You failed.\n\r", ch ); return; } send_to_char("You burrow in the ground and jump out of the ground in front of your packmate.\n\r",ch); char_from_room( ch ); char_to_room( ch, victim->in_room ); do_look( ch,"auto"); act( "$n jumps from the ground in front of $N.", ch, NULL, victim, TO_ROOM ); act( "$N jumps up from the ground in front of you.", ch, NULL, victim, TO_VICT ); return; } void power_pounce( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { int number_rip; if (IS_NPC(victim)) { send_to_char("You can't rip a mobiles throat out!\n\r",ch); return; } number_rip = number_range(1,100); if (number_rip < ( 10 * ch->pcdata->powers[WPOWER_RAT])) { send_to_char("You rip your vitim's throat out with brutal force!\n\r",ch); act("With a quick slash of $n's wrist you neck starts to bleed all over your legs.",ch,NULL,victim,TO_VICT); if (!IS_BODY(victim,CUT_THROAT)) SET_BIT(victim->loc_hp[1],CUT_THROAT); if (!IS_BLEEDING(victim,BLEEDING_THROAT)) SET_BIT(victim->loc_hp[6],BLEEDING_THROAT); act("$n's blow slices open $N's carotid artery, spraying blood everywhere.", ch, NULL, victim, TO_NOTVICT); make_part(victim,"blood"); if (ch->fighting == NULL) set_fighting(ch,victim); multi_hit(ch,victim,TYPE_UNDEFINED); } return; } void power_moongate( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { if ( victim == ch || victim->in_room == NULL || IS_NPC(ch) || victim->level > 50 || (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON) ) || IS_SET(ch->in_room->room_flags, ROOM_PRIVATE) || IS_SET(ch->in_room->room_flags, ROOM_SOLITARY) || IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || IS_SET(victim->in_room->room_flags, ROOM_PRIVATE) || IS_SET(victim->in_room->room_flags, ROOM_SOLITARY) || IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL) || victim->in_room->vnum == 1 || victim->in_room->vnum == 2 || victim->in_room->vnum == 1200 || (ch->pk_timer > 0 && is_tempsafe(ch)) || ( strstr(victim->in_room->area->builders, "Unlinked" ) ) || victim->in_room->vnum == ch->in_room->vnum) { send_to_char( "You failed.\n\r", ch ); return; } send_to_char("You pray to the moon and start to walk.\n\r",ch); char_from_room( ch ); char_to_room( ch, victim->in_room ); do_look( ch,"auto"); act( "In a flash $n appears in front of $N.", ch, NULL, victim, TO_NOTVICT ); act( "In a flash $n appears in front of you.", ch, NULL, victim, TO_VICT ); return; } void power_luna( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { if ( IS_SET(ch->act,PLR_MARBLEFLESH)) { REMOVE_BIT(ch->act,PLR_MARBLEFLESH); send_to_char("The white moonlight that surrounded your body disappears.\n\r",ch); } else { SET_BIT(ch->act,PLR_MARBLEFLESH); send_to_char("As you pray to Luna a white moonlight surrounds your body!\n\r",ch); } } void power_mirror( CHAR_DATA *ch, CHAR_DATA *victim, char *arguments ) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *lvic; lvic=create_mobile( get_mob_index( MOB_VNUM_GUARDIAN ) ); lvic->level = ch->level; lvic->hit = ch->hit / 4; lvic->max_hit = ch->max_hit / 4; lvic->hitroll = 0; lvic->damroll = 0; lvic->armor = 100 - (ch->level*7); lvic->dead_time = 140; lvic->name = g_string_assign(lvic->name,ch->name->str); lvic->short_descr = g_string_assign(lvic->short_descr,ch->name->str); sprintf(buf,"%s is here.\n\r",ch->name->str); lvic->long_descr = g_string_assign(lvic->long_descr,buf); SET_BIT(lvic->act, ACT_DEAD); send_to_char( "You spawn a mirror image of your self and find out you look good!.\n\r",ch ); act( "$n grins evily as you notice $N is grinning at you too.", ch, NULL, lvic, TO_ROOM ); char_to_room( lvic, ch->in_room ); return; } void power_spriggan( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { if (!str_cmp(argument,"enlarge")) { if (IS_ADDED(ch,ADDED_ENLARGE)) { send_to_char("You can't grow past your current size.\n\r",ch); return; } if (IS_ADDED(ch,ADDED_SHRINK)) { REMOVE_BIT(ch->added,ADDED_SHRINK); send_to_char("You increase your size about 3 feet.\n\r",ch); } else { SET_BIT(ch->added,ADDED_ENLARGE); send_to_char("You increase your size about 3 feet.\n\r",ch); } } if (!str_cmp(argument,"shrink")) { if (IS_ADDED(ch,ADDED_SHRINK)) { send_to_char("You try to shrink you self to a pubic hair and fail.\n\r",ch); return; } if (IS_ADDED(ch,ADDED_ENLARGE)) { REMOVE_BIT(ch->added,ADDED_ENLARGE); send_to_char("You shrink about 3 feet in size.\n\r",ch); } else { SET_BIT(ch->added,ADDED_SHRINK); send_to_char("You shrink about 3 feet in size.\n\r",ch); } } } void power_calm( CHAR_DATA *ch, CHAR_DATA *vicitm, char *argument ) { 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)) power_nightsight(ch,ch,""); if (IS_VAMPAFF(ch, VAM_FANGS)) power_fangs(ch,ch,""); if (IS_VAMPAFF(ch, VAM_CLAWS)) power_claws(ch,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); ch->pcdata->stats[UNI_RAGE] -= number_range(10,20); if (ch->pcdata->stats[UNI_RAGE] < 100) do_unwerewolf(ch,""); return; } send_to_char("But you are not in crinos form!\n\r",ch); return; } void power_rage( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { if (IS_CLASS(ch, CLASS_VAMPIRE)) { if ( ch->pcdata->stats[UNI_RAGE] >= 25 + (get_disc(ch,DISC_POTENCE) * 10) ) { send_to_char("Your beast is already controlling you.\n\r",ch); return; } if (!IS_VAMPAFF(ch, VAM_NIGHTSIGHT)) power_nightsight(ch,ch,""); if (!IS_VAMPAFF(ch, VAM_FANGS)) power_fangs(ch,ch,""); if (!IS_VAMPAFF(ch, VAM_CLAWS)) power_claws(ch,ch,""); send_to_char("You bare yours fangs and growl as your inner beast consumes you.\n\r",ch); act("$n bares $s fangs and growls as $s inner beast consumes $m.",ch,NULL,NULL,TO_ROOM); ch->pcdata->stats[UNI_RAGE] += number_range(10,20); if (ch->beast > 0) do_beastlike(ch,""); WAIT_STATE(ch,12); 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 power_shield( CHAR_DATA *ch,CHAR_DATA *victim, char *argument ) { SPHERE_DATA af; if(IS_CLASS(ch, CLASS_MAGE)) { if (IS_SET(ch->sphere_spaffect,AFSPHERE_SHIELD) ) return; af.spell_number = mage_affect_slot("Shield"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_ENTROPY); af.bitvector = AFSPHERE_SHIELD; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Shield")].on_msg, ch ); return; } if (!IS_IMMUNE(ch,IMM_SHIELDED) ) { send_to_char("You shield your aura from those around you.\n\r",ch); SET_BIT(ch->immune, IMM_SHIELDED); return; } send_to_char("You stop shielding your aura.\n\r",ch); REMOVE_BIT(ch->immune, IMM_SHIELDED); return; } void power_spiritplane( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { OBJ_DATA *obj; SPHERE_DATA af; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if (ch->fighting != NULL) { send_to_char("Not while fighting.\n\r",ch); return; } if(IS_CLASS(ch,CLASS_MAGE)) { if (ch->plane == PLANE_SPIRIT) return; af.spell_number = mage_affect_slot("Spiritplane"); af.type = TYPE_PLANE; af.duration = 10 * has_sphere(ch,SPHERE_SPIRIT); sphere_to_char( ch, &af ); ch->plane = PLANE_SPIRIT; shift_obj_plane(ch); send_to_char( mage_affect_table[mage_affect_slot("Spiritplane")].on_msg, ch ); send_to_char("You fade into the plane of spirits and wraiths.\n\r",ch); act("$n flicker's from your view.",ch,NULL,NULL,TO_ROOM); do_look(ch,"auto"); return; } if ( arg[0] == '\0' ) { if (ch->plane == PLANE_NORMAL) { send_to_char("You fade into the plane of spirits and wraiths.\n\r",ch); act("$n flicker's from your view.",ch,NULL,NULL,TO_ROOM); ch->plane = PLANE_SPIRIT; shift_obj_plane(ch); do_look(ch,"auto"); return; } ch->plane = PLANE_NORMAL; shift_obj_plane(ch); send_to_char("You fade back into the real world.\n\r",ch); act("A spirit flickers 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 spirit plane?\n\r", ch ); return; } if (obj->plane == PLANE_SPIRIT){ obj->plane = PLANE_NORMAL; send_to_char( "You toss it to the ground and it vanishes.\n\r", ch ); } else if (obj->plane == PLANE_NORMAL){ obj->plane = PLANE_SPIRIT; send_to_char( "The object has become a shade lighter.\n\r", ch ); } shift_obj_plane(ch); return; } void power_flex( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { int sn; 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) ) { 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 (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); REMOVE_BIT(ch->affected_by, AFF_WEBBED); if ( ( sn = skill_lookup( "arms" ) ) > 0 ) affect_strip(ch, sn); if ( ( sn = skill_lookup( "web" ) ) > 0 ) affect_strip(ch, sn); } 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 ( ( sn = skill_lookup( "arms" ) ) > 0 ) affect_strip(ch, sn); if ( ( sn = skill_lookup( "web" ) ) > 0 ) affect_strip(ch, sn); } return; } void power_nightsight( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { SPHERE_DATA af; if (IS_CLASS(ch,CLASS_MAGE)) { if (IS_SET(ch->sight,SIGHT_NIGHTSIGHT)) return; af.spell_number = mage_affect_slot("NightSight"); af.type = TYPE_SIGHT; af.duration = 10 * has_sphere(ch,SPHERE_CORRESPONDENCE); af.bitvector = SIGHT_NIGHTSIGHT; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("NightSight")].on_msg, 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 power_moonbeam( CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int dam; int ST = ch->pcdata->powers[WPOWER_SPHINX]; if ( weather_info[ch->in_room->sector_type].sunlight != SUN_DARK ) { send_to_char("The night has not fallen yet to use this gift.\n\r",ch); return; } if ( ch->mana < 255 ) { send_to_char("You don't have enough mana!\n\r",ch); return; } if ( ch->fighting == NULL ) set_fighting(ch,victim); ch->mana -= 500; ch->hit -= number_range(20,250); set_attack_flag(ch,victim); dam = number_range( 1000, ST * 1000); damage( ch, victim, dam, TYPE_LIGHT ); act("$n's moon beam hits $N dead on!",ch,NULL,victim,TO_NOTVICT); act("You hit $N with a powerful moon beam.",ch,NULL,victim,TO_CHAR); act("You get hit by $n's moon beam!",ch,NULL,victim,TO_VICT); } DECLARE_DO_FUN(do_say); DECLARE_DO_FUN(do_open); extern int find_path args(( int in_room_vnum, int out_room_vnum, CHAR_DATA *ch, int depth, int in_zone )); void power_hunt( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { char buf[MAX_STRING_LENGTH]; GString *buf2; int direction; bool fArea; if( ch->move > 5 ) ch->move -= 5; else { send_to_char( "You're too exhausted to hunt anyone!\n\r", ch ); return; } /* only imps can hunt to different areas */ fArea = ( get_trust(ch) < MAX_LEVEL ); if (!IS_NPC(victim) && IS_SWWF(victim) && get_auspice(victim,AUSPICE_RAGABASH) > 1) { send_to_char("You failed.\n\r",ch); return; } if( ch->in_room == victim->in_room ) { act( "$N is here!", ch, NULL, victim, TO_CHAR ); return; } act( "$n carefully sniffs the air.", ch, NULL, NULL, TO_ROOM ); WAIT_STATE( ch, 12 ); direction = find_path( ch->in_room->vnum, victim->in_room->vnum, ch, -40000, fArea ); if( direction == -1 ) { act( "You couldn't find a path to $N from here.", ch, NULL, victim, TO_CHAR ); return; } if( direction < 0 || direction > 5 ) { send_to_char( "Hmm... Something seems to be wrong.\n\r", ch ); return; } /* * Display the results of the search. */ sprintf( buf, "$N is %s from here.", dir_name[direction] ); buf2 = g_string_new(""); mxpconv(buf2,buf,ch); act( buf2->str, ch, NULL, victim, TO_CHAR ); g_string_free(buf2,TRUE); return; } void power_lightning(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { DESCRIPTOR_DATA *d; int dam, hp; GSList *desc_list; if ( ch->in_room->sector_type == SECT_INSIDE || !IS_OUTSIDE(ch) ) { send_to_char("You can only control the weather outside.\n\r",ch); return; } if (weather_info[ch->in_room->sector_type].sky != SKY_LIGHTNING && weather_info[ch->in_room->sector_type].sky != SKY_RAINING ) act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next(desc_list) ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( d->connected != CON_PLAYING ) continue; if ( (victim = d->character) == NULL ) continue; if ( IS_NPC(victim) ) continue; if ( victim->in_room == NULL ) continue; if ( victim->in_room->sector_type == SECT_INSIDE ) continue; if ( victim->in_room != ch->in_room ) continue; send_to_char( "Lightning flashes in the sky.\n\r", ch ); } send_to_char( "A stream of lightning arcs down from the sky.\n\r", ch ); act("A stream of lightning arcs down from the sky.", ch, NULL, NULL, TO_ROOM); dam = number_range(500,1000); hp = victim->hit; damage( ch, victim, dam, 0 ); WAIT_STATE(ch,6); if (victim == NULL || victim->position == POS_DEAD) return; if (!IS_NPC(victim) && IS_IMMMERIT(victim, IMM_MERIT_LIGHTNING) ) victim->hit = hp; update_pos(victim); return; } void power_rain(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { DESCRIPTOR_DATA *d; CHAR_DATA *lvic; GSList *desc_list; if (ch->in_room == NULL) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ch->in_room->sector_type == SECT_INSIDE || !IS_OUTSIDE(ch) ) { send_to_char("You can only control the weather outside.\n\r",ch); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); if (weather_info[ch->in_room->sector_type].sky == SKY_RAINING) { send_to_char("You banish the rain.\n\r",ch); weather_info[ch->in_room->sector_type].sky = SKY_CLOUDY; for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next(desc_list) ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( d->connected != CON_PLAYING ) continue; if ( (lvic = d->character) == NULL ) continue; if ( IS_NPC(lvic) ) continue; if ( lvic->in_room == NULL ) continue; if ( ch == lvic ) continue; if ( lvic->in_room->sector_type == SECT_INSIDE ) continue; if ( ch->in_room == lvic->in_room ) act("$n holds up his arms and the rain stops.", ch, NULL, lvic, TO_VICT); else send_to_char("It stops raining.\n\r", lvic); } } else { send_to_char("You summon a heavy shower of rain.\n\r",ch); weather_info[ch->in_room->sector_type].sky = SKY_RAINING; for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next(desc_list) ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( d->connected != CON_PLAYING ) continue; if ( (lvic = d->character) == NULL ) continue; if ( IS_NPC(lvic) ) continue; if ( lvic->in_room == NULL ) continue; if ( ch == lvic ) continue; if ( lvic->in_room->sector_type == SECT_INSIDE ) continue; if ( ch->in_room == lvic->in_room ) act("$n holds up his arms and calls forth a heavy shower of rain.", ch, NULL, lvic, TO_VICT); else send_to_char("It starts to rain heavily.\n\r", lvic); } } return; } void power_eclipse(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { DESCRIPTOR_DATA *d; CHAR_DATA *lvic; GSList *desc_list; if (ch->in_room == NULL) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ch->in_room->sector_type == SECT_INSIDE || !IS_OUTSIDE(ch) ) { send_to_char("You can only control the weather outside.\n\r",ch); return; } if ( weather_info[ch->in_room->sector_type].sunlight != SUN_DARK && weather_info[ch->in_room->sector_type].sunlight != SUN_LIGHT) { send_to_char("You can only do this when the sun's high in the sky, or to end a already eclipse.",ch); return; } if ( weather_info[ch->in_room->sector_type].sunlight != SUN_DARK && time_info.hour > 18) { send_to_char("You can only do this when the sun's high in the sky, or to end a already eclipse.",ch); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); if (weather_info[ch->in_room->sector_type].sunlight == SUN_DARK && time_info.hour < 18) { send_to_char("You end the eclipse.\n\r",ch); weather_info[ch->in_room->sector_type].sunlight = SUN_LIGHT; for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next(desc_list) ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( d->connected != CON_PLAYING ) continue; if ( (lvic = d->character) == NULL ) continue; if ( IS_NPC(lvic) ) continue; if ( lvic->in_room == NULL ) continue; if ( ch == lvic ) continue; if ( lvic->in_room->sector_type == SECT_INSIDE ) continue; if ( ch->in_room == lvic->in_room ) act("$n holds up his arms and the sun emerges from behind the moon.", ch, NULL, lvic, TO_VICT); else send_to_char("The sun emerges from behind the moon.\n\r", lvic); } } else { send_to_char("You create an eclipse.\n\r",ch); weather_info[ch->in_room->sector_type].sunlight = SUN_DARK; for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next(desc_list) ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( d->connected != CON_PLAYING ) continue; if ( (lvic = d->character) == NULL ) continue; if ( IS_NPC(lvic) ) continue; if ( lvic->in_room == NULL ) continue; if ( ch == lvic ) continue; if ( lvic->in_room->sector_type == SECT_INSIDE ) continue; if ( ch->in_room == lvic->in_room ) act("$n holds up his arms and calls forth an eclipse of the sun.", ch, NULL, lvic, TO_VICT); else send_to_char("The sun is eclipsed by the moon.\n\r", lvic); } } return; } void power_lunaavenger(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_SET(ch->added,ADDED_LUNAAVENGER) ) return; af.spell_number = mage_affect_slot("lunasavenger"); af.type = TYPE_SPHERE_ADDED; af.duration = 2 * get_tribe(ch,TRIBE_SILVER_FANGS); af.bitvector = ADDED_LUNAAVENGER; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("lunasavenger")].on_msg, ch ); act("An erie aura starts to surround $n as thier bode turns to pure silver!",ch,NULL,NULL,TO_ROOM); send_to_char("You feel the avenger aura start to take affect!\n\r",ch); return; } void power_shroudnight(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char buf [MAX_INPUT_LENGTH]; AFFECT_DATA paf; if (ch->in_room == NULL) { send_to_char("Nothing happens.\n\r",ch); return; } if (ch->silent_time > 0) { if (ch->silent_time > 1) sprintf(buf,"You cannot call upon the Shroud of Night for another %d seconds.\n\r",ch->silent_time); else sprintf(buf,"You cannot call upon the Shroud of Night for another 1 second.\n\r"); send_to_char(buf,ch); return; } if ( IS_RAFFECTED(ch->in_room, ROOM_AFF_DARK )) { send_to_char("You cannot darken this room anymore.\n\r",ch); return; } send_to_char("You call forth the Shroud of Night to darken the room!\n\r", ch); act("A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); act("The room is filled with darkness!",ch,NULL,NULL,TO_ROOM); paf.duration = 5; paf.bitvector = ROOM_AFF_DARK; affect_to_room( ch->in_room, &paf ); act( "All light fades into a complete darkness.", ch, NULL, NULL, TO_ROOM ); act( "All light fades into a complete darkness.", ch, NULL, NULL, TO_CHAR ); ch->silent_time = 10; return; } void power_camouflage(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_AFFECTED(ch, AFF_HIDE)) { REMOVE_BIT(ch->affected_by,AFF_HIDE); send_to_char( "You stop camouflaging yourself.\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); if (!IS_AFFECTED(ch, AFF_HIDE)) { act("$n seems to blend into the shadows.",ch,NULL,NULL,TO_ROOM); send_to_char("You Camouflage yourself.\n\r",ch); SET_BIT(ch->affected_by, AFF_HIDE); } WAIT_STATE( ch, 12 ); return; } void power_invisibilty(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if ( IS_SET(ch->act, PLR_WIZINVIS) ) { REMOVE_BIT(ch->act, PLR_WIZINVIS); ch->invis_level = 0; send_to_char( "You slowly fade into existance.\n\r", ch ); act("$n slowly fades into existance.",ch,NULL,NULL,TO_ROOM); } else { ch->invis_level = ch->level; 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 power_true_fear(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { AFFECT_DATA af; int sn; int level = 0; if ( IS_AFFECTED(victim, AFF_FEAR) ) { send_to_char( "They are already pretty scared.\n\r", ch ); act("$n just failed to use True Fear on you.",ch,NULL,victim,TO_VICT); return; } if ( IS_ADDED(victim, ADDED_COURAGE) ) { send_to_char( "They are far too brave to be scared so easily.\n\r", ch ); act("$n just failed to use True Fear on you.",ch,NULL,victim,TO_VICT); return; } if (IS_SWWF(ch)) level = get_auspice(ch,AUSPICE_AHROUN) * 10; if (IS_MAGE(ch)) level = has_sphere(ch,SPHERE_ENTROPY) * 10; if ( saves_spell( level, victim ) && victim->position >= POS_FIGHTING ) { act("$E ignores you.",ch,NULL,victim,TO_CHAR); act("You ignore $m.",ch,NULL,victim,TO_VICT); act("$N ignores $n.",ch,NULL,victim,TO_NOTVICT); act("$n just failed to use True Fear on you.",ch,NULL,victim,TO_VICT); return; } send_to_char("You scream in utter terror!\n\r",victim); act("$n screams in utter terror!",victim,NULL,NULL,TO_ROOM); act("$n just used True Fear on you.",ch,NULL,victim,TO_VICT); if ( ( sn = skill_lookup( "fear" ) ) < 0 ) { send_to_char( "Bug - please inform Spiral.\n\r", ch ); return; } if ( is_affected( victim, sn ) ) return; af.type = sn; af.location = APPLY_HITROLL; af.modifier = 0; af.duration = number_range(1,2); af.bitvector = AFF_FEAR; affect_to_char( victim, &af ); af.location = APPLY_DAMROLL; af.modifier = 0; affect_to_char( victim, &af ); WAIT_STATE( ch, 12 ); return; } void power_blur(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if ( IS_SET(ch->act, PLR_WIZINVIS) ) { REMOVE_BIT(ch->act, PLR_WIZINVIS); ch->invis_level = 0; send_to_char( "You slowly fade into existance.\n\r", ch ); act("$n slowly fades into existance.",ch,NULL,NULL,TO_ROOM); } else { ch->invis_level = ch->level; 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 power_hand(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_ADDED(ch,ADDED_HAND_FLAME) ) { send_to_char("The flames around your hands are extinguished.\n\r",ch); act("The flames around $n's hands die away.", ch, NULL, NULL, TO_ROOM); REMOVE_BIT(ch->added, ADDED_HAND_FLAME); return; } send_to_char("Your hands erupts into flames.\n\r",ch); act("$n's hands erupts into flames.",ch,NULL,NULL,TO_ROOM); SET_BIT(ch->added, ADDED_HAND_FLAME); return; } void power_tail(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int dam; int stance; WAIT_STATE( ch, 4 ); dam = number_range(10,20); dam += char_damroll(ch); if (dam == 0) dam = 1; if ( !IS_AWAKE(victim) ) dam *= 2; dam = dam + (dam * (int)((double)ch->wpn[0] * 0.01)); stance = ch->stance[0]; if ( IS_STANCE(ch, STANCE_NORMAL) ) dam = (int)((double)dam * 1.25); else dam = dambonus(ch,victim,dam,stance); if ( dam <= 0 ) dam = 1; damage( ch, victim, dam, gsn_tail ); return; } void power_fetishdoll(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { OBJ_DATA *obj; char buf [MAX_INPUT_LENGTH]; char part1 [MAX_INPUT_LENGTH]; char part2 [MAX_INPUT_LENGTH]; int worn; if ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL ) { if ( ( obj = get_eq_char( ch, WEAR_HOLD ) ) == NULL ) { send_to_char( "You are not holding any body parts.\n\r", ch ); return; } else worn = WEAR_HOLD; } else worn = WEAR_WIELD; if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if (obj->value[2] == 12) sprintf(part1,"head %s",victim->name->str); else if (obj->value[2] == 13) sprintf(part1,"heart %s",victim->name->str); else if (obj->value[2] == 14) sprintf(part1,"arm %s",victim->name->str); else if (obj->value[2] == 15) sprintf(part1,"leg %s",victim->name->str); else if (obj->value[2] == 30004) sprintf(part1,"entrails %s",victim->name->str); else if (obj->value[2] == 30005) sprintf(part1,"brain %s",victim->name->str); else if (obj->value[2] == 30006) sprintf(part1,"eye eyeball %s",victim->name->str); else if (obj->value[2] == 30012) sprintf(part1,"face %s",victim->name->str); else if (obj->value[2] == 30013) sprintf(part1,"windpipe %s",victim->name->str); else if (obj->value[2] == 30014) sprintf(part1,"cracked head %s",victim->name->str); else if (obj->value[2] == 30025) sprintf(part1,"ear %s",victim->name->str); else if (obj->value[2] == 30026) sprintf(part1,"nose %s",victim->name->str); else if (obj->value[2] == 30027) sprintf(part1,"tooth %s",victim->name->str); else if (obj->value[2] == 30028) sprintf(part1,"tongue %s",victim->name->str); else if (obj->value[2] == 30029) sprintf(part1,"hand %s",victim->name->str); else if (obj->value[2] == 30030) sprintf(part1,"foot %s",victim->name->str); else if (obj->value[2] == 30031) sprintf(part1,"thumb %s",victim->name->str); else if (obj->value[2] == 30032) sprintf(part1,"index finger %s",victim->name->str); else if (obj->value[2] == 30033) sprintf(part1,"middle finger %s",victim->name->str); else if (obj->value[2] == 30034) sprintf(part1,"ring finger %s",victim->name->str); else if (obj->value[2] == 30035) sprintf(part1,"little finger %s",victim->name->str); else if (obj->value[2] == 30036) sprintf(part1,"toe %s",victim->name->str); else { sprintf(buf,"%s isn't a part of %s!\n\r",obj->name->str,victim->name->str); send_to_char( buf, ch ); return; } sprintf(part2,obj->name->str); if ( str_cmp(part1,part2) ) { sprintf(buf,"But you are holding %s, not %s!\n\r",obj->short_descr->str,victim->name->str); send_to_char( buf, ch ); return; } act("$p vanishes from your hand in a puff of smoke.", ch, obj, NULL, TO_CHAR); act("$p vanishes from $n's hand in a puff of smoke.", ch, obj, NULL, TO_ROOM); obj_from_char(obj); extract_obj(obj); obj = create_object( get_obj_index( OBJ_VNUM_VOODOO_DOLL ), 0 ); sprintf(buf,"%s voodoo doll",victim->name->str); obj->name = g_string_assign(obj->name,buf); sprintf(buf,"a voodoo doll of %s",victim->name->str); obj->short_descr = g_string_assign(obj->short_descr,buf); sprintf(buf,"A voodoo doll of %s lies here.",victim->name->str); obj->description = g_string_assign(obj->description,buf); obj_to_char(obj,ch); equip_char(ch,obj,worn); act("$p appears in your hand.", ch, obj, NULL, TO_CHAR); act("$p appears in $n's hand.", ch, obj, NULL, TO_ROOM); return; } void power_fbite(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int TALON_DAMAGE = 0; act("You try to bite $N!.",ch,NULL,victim,TO_CHAR); TALON_DAMAGE = number_range(100,500) * get_tribe(ch,TRIBE_GET_OF_FENRIS) * 10; damage(ch,victim,TALON_DAMAGE,TYPE_BITE); return; } void power_howlban(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_NPC(victim)) { send_to_char("Sorry players only.\n\r",ch); return; } if (victim->pcdata->willpower >= number_range(1,30)) { send_to_char("They resist your howl!\n\r",ch); return; } act("You pull back your head and howl at $N.",ch,NULL,victim,TO_CHAR); act("$n pull's back thier head and howls towards you!",ch,NULL,victim,TO_VICT); act("$n pulls back thier head and howls at $N.",ch,NULL,victim,TO_NOTVICT); do_flee(victim,""); WAIT_STATE(ch,24); WAIT_STATE(victim,24); return; } void power_brage(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,ADDED_BRAGE) ) return; af.spell_number = mage_affect_slot("Bacchantes' Rage"); af.type = TYPE_SPHERE_ADDED; af.duration = 2 * get_tribe(ch,TRIBE_BLACK_FURIES); af.bitvector = ADDED_BRAGE; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Bacchantes' Rage")].on_msg, ch ); act("$n howls with rage!",ch,NULL,NULL,TO_ROOM); send_to_char("You feel Bacchantes' Rage!\n\r",ch); return; } void power_lflame(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_ADDED(ch,ADDED_HAND_FLAME) ) { send_to_char("The flames around your body are extinguished.\n\r",ch); act("The flames around $n's body dies away.", ch, NULL, NULL, TO_ROOM); REMOVE_BIT(ch->added, ADDED_HAND_FLAME); return; } send_to_char("Your body erupts into flames.\n\r",ch); act("$n's body erupts into flames.",ch,NULL,NULL,TO_ROOM); SET_BIT(ch->added, ADDED_HAND_FLAME); return; } void power_wyld(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { DESCRIPTOR_DATA *d; CHAR_DATA *vch; CHAR_DATA *vfight; GSList *desc_list; char buf [MAX_STRING_LENGTH]; if ( (vfight = ch->fighting) == NULL && ch->hit > 100 ) { send_to_char("You can only call for assistance in times of great need.\n\r",ch); return; } for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next(desc_list) ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( d->connected != CON_PLAYING ) continue; if ( (vch = d->character) == NULL ) continue; if ( vch->in_room == NULL) continue; if ( vch == ch ) act("You call for assistance!", ch, NULL, argument, TO_CHAR); if (ch != vch && (IS_SWWF(vch) || IS_IMMORTAL(vch))) { if (victim != NULL) { sprintf(buf,"CALL OF THE WYLD:[$n is under attack by %s at %s]", IS_NPC(vfight) ? vfight->short_descr->str : vfight->name->str,ch->in_room->name); act(buf,ch,NULL,vch, TO_VICT); } else if (ch->hit < 1) { sprintf(buf,"CALL OF THE WYLD:[$n is badly wounded at %s]", ch->in_room->name); act(buf,ch,NULL,vch, TO_VICT); } else { sprintf(buf,"CALL OF THE WYLD:[$n needs assistance at %s]", ch->in_room->name); act(buf,ch,NULL,vch, TO_VICT); } } } return; } void power_bodywrack(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int damage; damage = number_range(500,1000); act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); send_to_char("You scream in agony as your body seems to be torn apart!\n\r",victim); act("$n doubles over and screams in agony!",victim,NULL,NULL,TO_ROOM); act("$n just used Body Wrack on you.",ch,NULL,victim,TO_VICT); victim->hit -= damage; WAIT_STATE( ch, 12 ); return; } void power_aeolus(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { AFFECT_DATA paf; if (ch->in_room == NULL) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ch->in_room->sector_type == SECT_INSIDE ) { send_to_char("You can only use this power outside.\n\r",ch); return; } if (ch->in_room->vnum == 3001) { send_to_char("Degrade the sacred Temple of Midgaard??.\n\r",ch); return; } if ( ch->silent_time != 0 ) { send_to_char("You can't aeolus this room at this time.\n\r",ch); return; } if ( IS_RAFFECTED(ch->in_room, ROOM_AFF_AEOLUS )) { send_to_char("You cann't aeolus this room anymore.\n\r",ch); return; } paf.duration = 5; paf.bitvector = ROOM_AFF_AEOLUS; affect_to_room( ch->in_room, &paf ); act( "From no where a thick blanket of fog fills the room blocking out all light!.", ch, NULL, NULL, TO_ROOM ); act( "From no where a thick blanket of fog fills the room blocking out all light!.", ch, NULL, NULL, TO_CHAR ); ch->silent_time = 10; return; } void power_wallgranite(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { OBJ_DATA *obj; EXIT_DATA *pexit; ROOM_INDEX_DATA *location; ROOM_INDEX_DATA *to_room; char arg [MAX_INPUT_LENGTH]; char buf [MAX_INPUT_LENGTH]; int duration = number_range(15,30); int direction, rev; one_argument( argument, arg ); if (IS_NPC(ch)) return; if ( arg[0] == '\0') { send_to_char( "Which direction do you wish to make the wall?\n\r", ch ); return; } if (!str_cmp(arg,"north") || !str_cmp(arg,"n")) {direction = DIR_NORTH; rev = DIR_SOUTH;} else if (!str_cmp(arg,"south") || !str_cmp(arg,"s")) {direction = DIR_SOUTH; rev = DIR_NORTH;} else if (!str_cmp(arg,"east") || !str_cmp(arg,"e")) {direction = DIR_EAST; rev = DIR_WEST;} else if (!str_cmp(arg,"west") || !str_cmp(arg,"w")) {direction = DIR_WEST; rev = DIR_EAST;} else if (!str_cmp(arg,"up") || !str_cmp(arg,"u")) {direction = DIR_UP; rev = DIR_DOWN;} else if (!str_cmp(arg,"down") || !str_cmp(arg,"d")) {direction = DIR_DOWN; rev = DIR_UP;} else { send_to_char( "Select direction: North, South, East, West, Up or Down.\n\r", ch ); return; } switch (direction) { default: str_cpy(arg,"north"); break; case DIR_NORTH: str_cpy(arg,"north"); break; case DIR_SOUTH: str_cpy(arg,"south"); break; case DIR_EAST: str_cpy(arg,"east"); break; case DIR_WEST: str_cpy(arg,"west"); break; case DIR_UP: str_cpy(arg,"up"); break; case DIR_DOWN: str_cpy(arg,"down"); break; } if ( ( pexit = ch->in_room->exit[direction] ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ( location = ch->in_room ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ( to_room = pexit->to_room ) == NULL ) { send_to_char("Nothing happens.\n\r",ch); return; } if (IS_SET(pexit->exit_info, EX_WALL_WATER) || IS_SET(pexit->exit_info, EX_WALL_GRANITE) || IS_SET(pexit->exit_info, EX_WALL_FLAME)) { send_to_char("There is already a wall blocking that exit.\n\r",ch); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->item_type = ITEM_WALL; obj->value[0] = direction; obj->timer = duration; obj->name = g_string_assign(obj->name,"wall stone granite"); obj->short_descr = g_string_assign(obj->short_descr,"a wall of granite"); sprintf(buf,"A wall of solid granite blocks your exit %s.",arg); obj->description = g_string_assign(obj->description,buf); obj_to_room( obj, ch->in_room ); SET_BIT(pexit->exit_info, EX_WALL_GRANITE); if (direction == DIR_UP) sprintf(buf,"Stone erupts from the ground and forms a wall above you."); else if (direction == DIR_DOWN) sprintf(buf,"Stone erupts from the ground and forms a wall below you."); else sprintf(buf,"Stone erupts from the ground and forms a wall to the %s.",arg); act( buf, ch, NULL, NULL, TO_CHAR ); act( buf, ch, NULL, NULL, TO_ROOM ); WAIT_STATE(ch,12); if (location == to_room) return; char_from_room(ch); char_to_room(ch, to_room); if ( ( pexit = ch->in_room->exit[rev] ) == NULL ) return; if (IS_SET(pexit->exit_info, EX_WALL_WATER) || IS_SET(pexit->exit_info, EX_WALL_GRANITE) || IS_SET(pexit->exit_info, EX_WALL_FLAME)) return; switch (rev) { default: str_cpy(arg,"north"); break; case DIR_NORTH: str_cpy(arg,"north"); break; case DIR_SOUTH: str_cpy(arg,"south"); break; case DIR_EAST: str_cpy(arg,"east"); break; case DIR_WEST: str_cpy(arg,"west"); break; case DIR_UP: str_cpy(arg,"up"); break; case DIR_DOWN: str_cpy(arg,"down"); break; } obj = create_object( get_obj_index( OBJ_VNUM_PORTAL ), 0 ); obj->item_type = ITEM_WALL; obj->value[0] = rev; obj->timer = duration; obj->name = g_string_assign(obj->name,"wall stone granite"); obj->short_descr = g_string_assign(obj->short_descr,"a wall of granite"); sprintf(buf,"A wall of solid granite blocks your exit %s.",arg); obj->description = g_string_assign(obj->description,buf); obj_to_room( obj, ch->in_room ); SET_BIT(pexit->exit_info, EX_WALL_GRANITE); if (rev == DIR_UP) sprintf(buf,"Stone erupts from the ground and forms a wall above you."); else if (rev == DIR_DOWN) sprintf(buf,"Stone erupts from the ground and forms a wall below you."); else sprintf(buf,"Stone erupts from the ground and forms a wall to the %s.",arg); act( buf, ch, NULL, NULL, TO_ROOM ); char_from_room(ch); char_to_room(ch, location); return; } void power_gorgon(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_NPC(victim)) { send_to_char("Try this on other players!.\n\r",ch); return; } if (ch->fighting != NULL || victim->fighting != NULL) { send_to_char("You or your target must be standing still.\n\r",ch); return; } //check for willpower roll! if (victim->pcdata->willpower >= number_range(5, 30)) { send_to_char("They resist it.\n\r",ch); WAIT_STATE(ch,24); return; } act("You lock eyes on to $N and petrify them.",ch,NULL,victim,TO_CHAR); act("$n lock's eyes on to you.. You sorta feel like stone!.",ch,NULL,victim,TO_VICT); act("$n locks eyes with $n.",ch,NULL,victim,TO_NOTVICT); WAIT_STATE(ch,24); WAIT_STATE(victim, 50); return; } void power_mass_summons(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { CHAR_DATA *lvic; CHAR_DATA *mount; int count = 0; if ( ch->in_room == NULL ) { send_to_char( "Bug - Please inform Spiral or Dominion.\n\r", ch ); return; } act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); for ( lvic = char_list; lvic != NULL; lvic = lvic->next ) { if (count >= 5) return; if ( !IS_NPC(lvic) || lvic->in_room == NULL || lvic->in_room == ch->in_room) continue; switch ( lvic->pIndexData->vnum ) { default: continue; case 30006: case 30007: case 30008: case 30009: case 30010: case 30013: case 30014: break; } count++; act( "$n disappears suddenly.", lvic, NULL, NULL, TO_ROOM ); char_from_room( lvic ); char_to_room( lvic, ch->in_room ); do_look( lvic, "auto" ); WAIT_STATE( ch, 12 ); if ( (mount = lvic->mount) != NULL ) { act( "$n arrives suddenly on $N.", mount, NULL, lvic, TO_NOTVICT ); act( "$N has summoned you!", mount, NULL, ch, TO_CHAR ); } else act( "$n arrives suddenly.", lvic, NULL, NULL, TO_ROOM ); } if (count < 1) send_to_char("Nothing happens.\n\r",ch); return; } void power_rollover(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char action[MAX_INPUT_LENGTH]; one_argument(argument,action); if (!IS_NPC(victim)) { send_to_char("Npc's only.\n\r",ch); return; } if (is_inpref(action,"|quit*garou*dissolve*vampire*mage*token*greet*escape*trait*zuluform*throw*serpentis*change*mist*essence*train*rem*del*cons*drop*gift*claim*consent*propose*vampi*ma *maj*sid *side *reca*/*ha *hav*")) { send_to_char( "I think not.\n\r", ch ); return; } if (victim->level > 50) { send_to_char("Nope.\n\r",ch); return; } if ( !check_dumbshit(action)) { send_to_char("You can't forthem to do that!\n\r",ch); return; } if ( IS_IMMORTAL(victim) ) { send_to_char( "I think not...\n\r", ch ); return; } interpret(victim,action); return; } void power_wtalon(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int TALON_DAMAGE = 0; act("$n grins as their finger nails get longer and then finally shoots at you.",ch,NULL,victim,TO_VICT); act("You level your fingers at $N and shoot your talons at them.",ch,NULL,victim,TO_CHAR); act("$n grins as thier finger nails gets longer and then shoots at $N.",ch,NULL,victim,TO_NOTVICT); TALON_DAMAGE = number_range(100,500) * get_tribe(ch,TRIBE_BLACK_FURIES) * 10; damage(ch,victim,TALON_DAMAGE,TYPE_WTALON); return; } void power_porcupine(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_SWWF(ch) && ch->pcdata->wwf_shape != SHAPE_CRINOS) { send_to_char("You must be in crinos to activate this gift.\n\r",ch); return; } if (IS_SWWF(ch) && IS_ADDED(ch,ADDED_BRISTLES) ) { send_to_char("Your long quill-like spines retract into your body.\n\r",ch); act("$n's long quill-like spines retract into your body.", ch, NULL, NULL, TO_ROOM); REMOVE_BIT(ch->added, ADDED_BRISTLES); return; } if (IS_MAGE(ch)) { if (IS_SET(ch->added, ADDED_BRISTLES) ) return; af.spell_number = mage_affect_slot("Porcupine"); af.type = TYPE_SPHERE_ADDED; af.duration = 10 * has_sphere(ch,SPHERE_MATTER); af.bitvector = ADDED_BRISTLES; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Porcupine")].on_msg, ch ); ch->paradox[0] += gain_paradox(ch); return; } if (IS_SWWF(ch)) SET_BIT(ch->added, ADDED_BRISTLES); send_to_char("Long quill-like spines extend from your body.\n\r",ch); act("Long quill-like spines extend from $n's body.", ch, NULL, NULL, TO_ROOM); return; } void power_shadowsight(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_SET(ch->sight,SIGHT_SHADOW) ) { send_to_char("You can no longer see the shadowplane.\n\r",ch); REMOVE_BIT(ch->sight, SIGHT_SHADOW); return; } send_to_char("You can now see the shadowplane.\n\r",ch); SET_BIT(ch->sight, SIGHT_SHADOW); return; } void power_call_duty(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *lvic; one_argument( argument, arg ); if (ch->pcdata->followers > 4) { send_to_char("Nothing happens.\n\r",ch); return; } ch->pcdata->followers++; lvic=create_mobile( get_mob_index( MOB_VNUM_CDSPIRIT ) ); strcpy(buf, "$N fades into the room." ); lvic->lord = g_string_assign(lvic->lord,ch->name->str); char_to_room( lvic, ch->in_room ); send_to_char("You whistle loudly.\n\r",ch); act( "$n whistles loudly.", ch, NULL, lvic, TO_ROOM ); act( buf, ch, NULL, lvic, TO_CHAR ); act( buf, ch, NULL, lvic, TO_ROOM ); return; } void power_ftouch(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { act("You suddenly find your self on your behind as $n touches you.",ch,NULL,victim,TO_VICT); act("You touch $N and send them falling on thier behind.",ch,NULL,victim,TO_CHAR); act("$n touches $N and puts $M on thier behind!",ch,NULL,victim,TO_NOTVICT); stop_fighting(ch,TRUE); victim->position = POS_RESTING; update_pos(victim); return; } void power_spburrow(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (ch->fighting != NULL) { send_to_char("Your fighting!\n\r",ch); return; } if ( ch->pk_timer > 0 ) { send_to_char("You can't burrow while still frenzied from last combat.\n\r",ch); return; } if ( ch->plane == PLANE_EARTH) { ch->plane = PLANE_NORMAL; send_to_char("You burrow up out of the ground.\n\r",ch); act("$n burrows up out of the ground.", ch, NULL, NULL, TO_ROOM); shift_obj_plane(ch); return; } send_to_char("You burrow down into the ground.\n\r",ch); act("$n burrows down into the ground.", ch, NULL, NULL, TO_ROOM); ch->plane = PLANE_NORMAL; shift_obj_plane(ch); return; } void power_attune( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *vic; DESCRIPTOR_DATA *d; bool found; GSList *desc_list = descriptor_list; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Players near you:\n\r", ch ); found = FALSE; while ( desc_list != NULL ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( d->connected == CON_PLAYING && ( vic = d->character ) != NULL && !IS_NPC(vic) && vic->pcdata->willpower > number_range(1,10) && vic->in_room != NULL && vic->in_room->area == ch->in_room->area && vic->pcdata->chobj == NULL && can_see( ch, victim ) ) { found = TRUE; sprintf( buf, "%-28s %s\n\r", vic->name->str, vic->in_room->name ); send_to_char( buf, ch ); } desc_list = g_slist_next(desc_list); } g_slist_free(desc_list); if ( !found ) send_to_char( "None\n\r", ch ); } else { found = FALSE; for ( vic = char_list; vic != NULL; vic = vic->next ) { if ( vic->in_room != NULL && !IS_NPC(vic) && vic->in_room->area == ch->in_room->area && !IS_AFFECTED(vic, AFF_HIDE) && vic->pcdata->willpower > number_range(1,10) && !IS_AFFECTED(vic, AFF_SNEAK) && can_see( ch, vic ) && is_name( arg, vic->name->str ) ) { found = TRUE; sprintf( buf, "%-28s %s\n\r", PERS(vic, ch), vic->in_room->name ); send_to_char( buf, ch ); break; } } if ( !found ) act( "You didn't find any $T.", ch, NULL, arg, TO_CHAR ); } return; }