/*************************************************************************** * 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 <interp.h> #include <tables.h> #include <power.h> #include <fight.h> extern void show_spirit_rise args((CHAR_DATA *ch)); extern int find_path args(( int in_room_vnum, int out_room_vnum, CHAR_DATA *ch, int depth, int in_zone )); extern bool check_dumbshit args( (char *command) ); extern void make_spirit args((CHAR_DATA *victim)); void power_witherlimb(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { OBJ_DATA *obj; int critical = number_range(1,4); act( "A look of concentration crosses $n's face.", ch, NULL, NULL, TO_ROOM ); WAIT_STATE( ch, 12 ); if ( is_safe(ch, victim) ) { act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } if (IS_SWWF(ch) && number_percent() > 2 * get_breed(ch,BREED_METIS)) { send_to_char("Nothing happens.\n\r",ch); act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } if (IS_VAMPIRE(ch) && number_percent() > 2 * get_disc(ch,DISC_THANATOSIS)) { send_to_char("Nothing happens.\n\r",ch); act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } if (IS_MAGE(ch) && number_percent() > 2 * has_sphere(ch,SPHERE_LIFE)) { send_to_char("Nothing happens.\n\r",ch); act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } if (IS_NPC(victim) && victim->level > 100) { send_to_char("They resist your attempt.\n\r",ch); return; } if (critical == 1) { if (IS_ARM_L(victim,LOST_ARM)) { send_to_char( "Nothing happens.\n\r", ch ); act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } SET_BIT(victim->loc_hp[2],LOST_ARM); if (IS_BLEEDING(victim,BLEEDING_HAND_L)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_L); send_to_char("Your left arm withers up and falls off!\n\r",victim); act("$n's left arm withers up and falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"arm"); if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM)) { if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_HOLD )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_WRIST_L )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_FINGER_L )) != NULL) take_item(victim,obj); act("$n just used Wither Limb on you.",ch,NULL,victim,TO_VICT); if (IS_NPC(victim)) do_kill(victim,ch->name->str); return; } else if (critical == 2) { if (IS_ARM_R(victim,LOST_ARM)) { send_to_char( "Nothing happens.\n\r", ch ); act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } SET_BIT(victim->loc_hp[3],LOST_ARM); if (IS_BLEEDING(victim,BLEEDING_HAND_R)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_HAND_R); send_to_char("Your right arm withers up and falls off!\n\r",victim); act("$n's right arm withers up and falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"arm"); if (IS_ARM_L(victim,LOST_ARM) && IS_ARM_R(victim,LOST_ARM)) { if ((obj = get_eq_char( victim, WEAR_ARMS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_WIELD )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_HANDS )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_WRIST_R )) != NULL) take_item(victim,obj); if ((obj = get_eq_char( victim, WEAR_FINGER_R )) != NULL) take_item(victim,obj); act("$n just used Wither Limb on you.",ch,NULL,victim,TO_VICT); if (IS_NPC(victim)) do_kill(victim,ch->name->str); return; } else if (critical == 3) { if (IS_LEG_L(victim,LOST_LEG)) { send_to_char( "Nothing happens.\n\r", ch ); act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } SET_BIT(victim->loc_hp[4],LOST_LEG); if (IS_BLEEDING(victim,BLEEDING_FOOT_L)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_L); send_to_char("Your left leg withers up and falls off!\n\r",victim); act("$n's left leg withers up and falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"leg"); if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG)) { if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL) take_item(victim,obj); act("$n just used Wither Limb on you.",ch,NULL,victim,TO_VICT); if (IS_NPC(victim)) do_kill(victim,ch->name->str); return; } else if (critical == 4) { if (IS_LEG_R(victim,LOST_LEG)) { send_to_char( "Nothing happens.\n\r", ch ); act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } SET_BIT(victim->loc_hp[5],LOST_LEG); if (IS_BLEEDING(victim,BLEEDING_FOOT_R)) REMOVE_BIT(victim->loc_hp[6],BLEEDING_FOOT_R); send_to_char("Your right leg withers up and falls off!\n\r",victim); act("$n's right leg withers up and falls off!",victim,NULL,NULL,TO_ROOM); make_part(victim,"leg"); if (IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG)) { if ((obj = get_eq_char( victim, WEAR_LEGS )) != NULL) take_item(victim,obj); } if ((obj = get_eq_char( victim, WEAR_FEET )) != NULL) take_item(victim,obj); act("$n just used Wither Limb on you.",ch,NULL,victim,TO_VICT); if (IS_NPC(victim)) do_kill(victim,ch->name->str); return; } send_to_char("Nothing happens.\n\r",ch); act("$n just failed to use Wither Limb on you.",ch,NULL,victim,TO_VICT); return; } void power_mother(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (ch == victim) { send_to_char( "You cannot use this power upon yourself.\n\r", ch ); return; } if (victim->hit < 10 || ch->hit < 10) { send_to_char("You feel this would be a bad time to touch them.\n\r",ch); return; } if (victim->loc_hp[6] > 0) { int sn = skill_lookup( "clot" ); act( "You lay your hands upon $N.", ch, NULL, victim, TO_CHAR ); act( "$n's lays $s hands upon $N.", ch, NULL, victim, TO_NOTVICT ); act( "$n's lays $s hands upon you.", ch, NULL, victim, TO_VICT ); (*skill_table[sn].spell_fun) (sn,ch->level,ch,victim); } else { if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] + victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5]) != 0) { act( "You lay your hands upon $N.", ch, NULL, victim, TO_CHAR ); act( "$n's lays $s hands upon $N.", ch, NULL, victim, TO_NOTVICT ); act( "$n's lays $s hands upon you.", ch, NULL, victim, TO_VICT ); reg_mend(victim); } else if (victim->hit < victim->max_hit) { if (IS_SWWF(ch)) victim->hit += number_range(100,(get_auspice(ch, AUSPICE_THEURGE) * 1000 + get_tribe(ch, TRIBE_SHADOW_LORDS) * 1000) / 2); if (IS_MAGE(ch)) victim->hit += number_range(100,1000 * has_sphere(ch,SPHERE_LIFE)); act( "You lay your hands upon $N.", ch, NULL, victim, TO_CHAR ); act( "$n's lays $s hands upon $N.", ch, NULL, victim, TO_NOTVICT ); act( "$n's lays $s hands upon you.", ch, NULL, victim, TO_VICT ); update_pos(victim); if (victim->hit >= victim->max_hit) { victim->hit = victim->max_hit; send_to_char("You have been completely healed!\n\r",victim); act("$n's wounds have been completely healed!",victim,NULL,NULL,TO_ROOM); } else { send_to_char("Your wounds begin to heal!\n\r",victim); act("$n's wounds begin to heal!",victim,NULL,NULL,TO_ROOM); } } else { send_to_char("They don't require any healing.\n\r",ch); return; } } act("$n just used Mother's Touch on you.",ch,NULL,victim,TO_VICT); WAIT_STATE( ch, 24 ); return; } void power_clap(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int trdamage = 0; SPHERE_DATA *paf; if (ch->pcdata->obeah > 0){ char buf[MSL]; sprintf(buf,"you cannot use this power for another %d minute(s)\n\r",ch->pcdata->obeah); send_to_char(buf,ch); } send_to_char( "You clap your hands together.\n\r", ch ); act("$n claps $s hands together.",ch,NULL,NULL,TO_ROOM); if (IS_SWWF(ch)) trdamage = get_tribe(ch, TRIBE_SHADOW_LORDS) * number_range(5,10); if (IS_MAGE(ch)) trdamage = has_sphere(ch, SPHERE_FORCES) * number_range(5,10); if (ch->fighting != NULL) { send_to_char("Not while fighting.\n\r",ch); return; } //If there fighting make a check for it... willpower if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(1,25)) { send_to_char("You resist somone's attempt to use clap on you.\n\r",victim); return; } send_to_char("The room reverberates with a huge roll of thunder!\n\r",victim); send_to_char("You clutch your head in agony as your eardrums seem to explode!\n\r",victim); act("$n clutches $s head in agony!",victim,NULL,NULL,TO_ROOM); act("$n just used Clap of Thunder on you.",ch,NULL,victim,TO_VICT); damage(ch,victim,trdamage,TYPE_BLAST); if (!IS_NPC(victim) && !IS_MAGE(victim) && IS_SET(victim->act, PLR_WIZINVIS)) { REMOVE_BIT(victim->act, PLR_WIZINVIS); victim->invis_level = 0; send_to_char( "You slowly fade into existance.\n\r", victim ); act("$n slowly fades into existance.",victim,NULL,NULL,TO_ROOM); } if (!IS_NPC(victim) && IS_MAGE(victim) && IS_SET(victim->act, PLR_WIZINVIS)) { paf = find_spaffect(victim,PLR_WIZINVIS); sphere_remove(victim,paf); send_to_char( "You slowly fade into existance.\n\r", victim ); act("$n slowly fades into existance.",victim,NULL,NULL,TO_ROOM); } update_pos(victim); victim->position = POS_STUNNED; send_to_char("You fall to the ground, stunned!\n\r",ch); act("$n falls to the ground, stunned!",victim,NULL,NULL,TO_ROOM); if (!IS_NPC(victim)) ch->pcdata->obeah = 5; return; } void power_fleshcraft(CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if (IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "Not while polymorphed.\n\r", ch ); return; } if ( ch != victim) { if (!IS_NPC(victim)) { send_to_char( "Not on Players's.\n\r", ch ); return; } } if ( victim->level > 90 ) { send_to_char( "You can only fleshcraft level 90 mobs and lower..\n\r", ch ); return; } if ( ch == victim ) { if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "You already look like yourself!\n\r", ch ); return; } act("Your form shimmers and transforms into $N.",ch,NULL,victim,TO_CHAR); act("$N's form shimmers and transforms into %n.",ch,NULL,victim,TO_ROOM); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_DISGUISED); ch->morph = g_string_assign(ch->morph,""); return; } if (IS_VAMPAFF(ch,VAM_DISGUISED)) { act("Your form shimmers and transforms into a clone of $N.",ch,NULL,victim,TO_CHAR); act("$n's form shimmers and transforms into a clone of $N.",ch,NULL,victim,TO_NOTVICT); act("$N's form shimmers and transforms into a clone of you!",ch,NULL,victim,TO_VICT); ch->morph = g_string_assign(ch->morph,victim->short_descr->str); return; } act("Your form shimmers and transforms into a clone of $N.",ch,NULL,victim,TO_CHAR); act("$n's form shimmers and transforms into a clone of $N.",ch,NULL,victim,TO_NOTVICT); act("$n's form shimmers and transforms into a clone of you!",ch,NULL,victim,TO_VICT); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_DISGUISED); ch->morph = g_string_assign(ch->morph,victim->short_descr->str); WAIT_STATE( ch, 24 ); return; } void power_scream(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { //char buf[MAX_INPUT_LENGTH]; int tr_damage = 0; if (IS_SWWF(ch)) tr_damage = get_tribe(ch,TRIBE_GET_OF_FENRIS) * 100; if (IS_CLASS(ch,CLASS_VAMPIRE) ) tr_damage = get_disc(ch,DISC_MELPOMINEE) * 10; if ( victim == ch ) { send_to_char( "You scream loudly at yourself!\n\r", ch ); act("$n screams loudly at $mself!",ch,NULL,NULL,TO_ROOM); return; } else { act("You scream loudly at $N!",ch,NULL,victim,TO_CHAR); act("$n screams loudly at you!",ch,NULL,victim,TO_VICT); act("$n screams loudly at $N!",ch,NULL,victim,TO_NOTVICT); } if (IS_CLASS(ch,CLASS_TESTVAMP)) tr_damage = get_disc(ch,DISC_MELPOMINEE) * number_range(100,200); if (IS_SWWF(ch)) tr_damage = get_tribe(ch,TRIBE_GET_OF_FENRIS) * number_range(100,200); send_to_char("You clutch your head in agony as your eardrums seem to explode!\n\r",victim); act("$n clutches $s head in agony!",victim,NULL,NULL,TO_ROOM); damage(ch,victim,tr_damage,TYPE_BLAST); if (number_range(1,30) == 1) { victim->position = POS_STUNNED; send_to_char("You fall to the ground, stunned!\n\r",victim); act("$n falls to the ground, stunned!",victim,NULL,NULL,TO_ROOM); update_pos(victim); } return; } void power_truesight(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_CLASS(ch, CLASS_MAGE)) { if (IS_SET(ch->act,PLR_HOLYLIGHT) ) return; af.spell_number = mage_affect_slot("TrueSight"); af.type = TYPE_SPHERE_ACT; af.duration = 10 * has_sphere(ch,SPHERE_CORRESPONDENCE); af.bitvector = PLR_HOLYLIGHT; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("TrueSight")].on_msg, ch ); return; } if ( IS_SET(ch->act, PLR_HOLYLIGHT) ) { REMOVE_BIT(ch->act, PLR_HOLYLIGHT); send_to_char( "Your senses return to normal.\n\r", ch ); } else { SET_BIT(ch->act, PLR_HOLYLIGHT); send_to_char( "Your senses increase to incredible proportions.\n\r", ch ); } return; } void power_beckon(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *tvic; one_argument( argument, arg ); if (arg[0] == '\0') { send_to_char("Please select the type of animal you which to summon.\n\r",ch); send_to_char("Choose from: Horse, Frog, Raven, Cat, Dog, Yak.\n\r",ch); return; } if (ch->pcdata->followers > 4) { send_to_char("Nothing happens.\n\r",ch); return; } strcpy(buf, "$N trots into the room." ); if (!str_cmp(arg,"stallion") || !str_cmp(arg,"horse") || !str_cmp(arg,"mount")) { ch->pcdata->followers++; tvic=create_mobile( get_mob_index( MOB_VNUM_MOUNT ) ); tvic->level = 50; tvic->armor = -500; tvic->hitroll = 50; tvic->damroll = 50; tvic->hit = 5000; tvic->max_hit = 5000; tvic->name = g_string_assign(tvic->name,"mount black horse stallion"); sprintf(buf,"%s's black stallion",ch->name->str); tvic->short_descr = g_string_assign(tvic->short_descr,buf); tvic->long_descr = g_string_assign(tvic->long_descr,"A beautiful black stallion stands here.\n\r"); strcpy(buf, "$N trots into the room." ); } else if (!str_cmp(arg,"frog")) { ch->pcdata->followers++; tvic=create_mobile( get_mob_index( MOB_VNUM_FROG ) ); strcpy(buf, "$N hops into the room." ); } else if (!str_cmp(arg,"raven")) { ch->pcdata->followers++; tvic=create_mobile( get_mob_index( MOB_VNUM_RAVEN ) ); strcpy(buf, "$N flies into the room." ); } else if (!str_cmp(arg,"dog")) { ch->pcdata->followers++; tvic=create_mobile( get_mob_index( MOB_VNUM_DOG ) ); } else if (!str_cmp(arg,"cat")) { ch->pcdata->followers++; tvic=create_mobile( get_mob_index( MOB_VNUM_CAT ) ); } else if (!str_cmp(arg,"molerat")) { ch->pcdata->followers++; tvic=create_mobile( get_mob_index( MOB_VNUM_MOLERAT ) ); } else if (!str_cmp(arg,"yak")) { ch->pcdata->followers++; tvic=create_mobile( get_mob_index( MOB_VNUM_YAK ) ); } else { send_to_char("Please select the type of animal you which to summon.\n\r",ch); send_to_char("Choose from: Horse, Frog, Raven, Cat, Dog, Yak.\n\r",ch); return; } tvic->lord = g_string_assign(tvic->lord,ch->name->str); char_to_room( tvic, ch->in_room ); send_to_char("You whistle loudly.\n\r",ch); act( "$n whistles loudly.", ch, NULL, tvic, TO_ROOM ); act( buf, ch, NULL, tvic, TO_CHAR ); act( buf, ch, NULL, tvic, TO_ROOM ); return; } void power_mask(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_IMMORTAL(victim) && victim != ch ) { send_to_char( "You can only mask avatars or lower.\n\r", ch ); return; } if ( ch == victim ) { if (!IS_AFFECTED(ch,AFF_POLYMORPH) && !IS_VAMPAFF(ch,VAM_DISGUISED)) { send_to_char( "You already look like yourself!\n\r", ch ); return; } act("Your form shimmers and transforms into $N.",ch,NULL,victim,TO_CHAR); act("$n's form shimmers and transforms into $N.",ch,NULL,victim,TO_ROOM); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_DISGUISED); ch->morph = g_string_assign(ch->morph,""); return; } if (IS_VAMPAFF(ch,VAM_DISGUISED)) { act("Your form shimmers and transforms into a clone of $N.",ch,NULL,victim,TO_CHAR); act("$n's form shimmers and transforms into a clone of $N.",ch,NULL,victim,TO_NOTVICT); act("$n's form shimmers and transforms into a clone of you!",ch,NULL,victim,TO_VICT); ch->morph = g_string_assign(ch->morph,victim->name->str); return; } act("Your form shimmers and transforms into a clone of $N.",ch,NULL,victim,TO_CHAR); act("$n's form shimmers and transforms into a clone of $N.",ch,NULL,victim,TO_NOTVICT); act("$n's form shimmers and transforms into a clone of you!",ch,NULL,victim,TO_VICT); SET_BIT(ch->affected_by, AFF_POLYMORPH); SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_DISGUISED); ch->morph = g_string_assign(ch->morph,victim->name->str); return; } void power_formillusion(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { CHAR_DATA *original,*tvic; char arg [MAX_INPUT_LENGTH]; if (ch->pcdata->followers > 4) { send_to_char("Nothing happens.\n\r",ch); return; } if ( ( original = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( original->level > 200 ) { send_to_char( "Nothing happens.\n\r", ch ); return; } ch->pcdata->followers++; tvic=create_mobile( get_mob_index( MOB_VNUM_CLONE ) ); char_to_room(tvic,get_room_index(ROOM_VNUM_DISCONNECTION)); tvic->lord = g_string_assign(tvic->lord,ch->name->str); tvic->name = g_string_assign(tvic->name,original->name->str); if (IS_NPC(original)) tvic->short_descr = g_string_assign(tvic->short_descr,original->short_descr->str); else tvic->short_descr = g_string_assign(tvic->short_descr,original->name->str); if (IS_NPC(original)) original->long_descr = g_string_assign(original->long_descr,original->name->str); else tvic->long_descr = g_string_assign(tvic->long_descr,""); if (original->creature == CLASS_TESTVAMP) tvic->creature = CLASS_TESTVAMP; tvic->alignment = original->alignment; if (original->description->len > 1) { tvic->description = g_string_assign(tvic->description,original->description->str); } SET_BIT(tvic->act, ACT_NOPARTS); SET_BIT(tvic->added, ADDED_ILLUSION); if (IS_NPC(original)) tvic->level = original->level; else tvic->level = 50; tvic->hit = original->hit; tvic->max_hit = original->max_hit; tvic->mana = original->mana; tvic->max_mana = original->max_mana; tvic->move = original->move; tvic->max_move = original->max_move; tvic->hitroll = char_hitroll(original); tvic->damroll = char_damroll(original); tvic->armor = char_ac(original); char_from_room(tvic); char_to_room(tvic,original->in_room); send_to_char("A mirror image of you shimmers into existance.\n\r",original); act("A mirror image of $n appears in the room.",original,NULL,NULL,TO_ROOM); return; } void power_cloneobject(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { OBJ_DATA *obj; OBJ_DATA *obj2; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( ( obj = get_obj_carry( ch, arg ) ) == NULL ) { send_to_char( "You are not carrying that object.\n\r", ch ); return; } if (obj->questmaker->len > 1) { send_to_char( "You are unable to clone that object.\n\r", ch ); return; } if (IS_SET(obj->extra_flags, ITEM_VANISH)) { send_to_char( "You are unable to make illusions of illusions!\n\r", ch ); return; } if (IS_SET(obj->quest, QUEST_RELIC) || IS_SET(obj->quest, QUEST_ARTIFACT)) { send_to_char( "You are unable to clone that type of object.\n\r", ch ); return; } if (obj->questowner->len > 1) { send_to_char( "You are unable to clone a claimed item.\n\r", ch ); return; } if ( ch->carry_number + 1 > can_carry_n( ch ) ) { send_to_char( "You cannot carry any more objects.\n\r", ch ); return; } if ( ch->carry_weight + get_obj_weight( obj ) > can_carry_w( ch ) ) { send_to_char( "You cannot carry that much weight.\n\r", ch ); return; } if (IS_CLASS(ch, CLASS_VAMPIRE)) ch->pcdata->condition[COND_THIRST] -= 20; if (( obj2 = create_object( obj->pIndexData, obj->level )) != NULL ) { SET_BIT(obj2->extra_flags, ITEM_VANISH); obj2->timer = (get_disc(ch,DISC_CHIMERSTRY) * 5); obj2->cost = 0; switch (obj2->item_type) { default: obj2->value[0] = obj->value[0]; obj2->value[1] = obj->value[1]; obj2->value[2] = obj->value[2]; obj2->value[3] = obj->value[3]; break; case ITEM_WAND: case ITEM_STAFF: case ITEM_SCROLL: case ITEM_POTION: case ITEM_PILL: obj2->value[0] = 0; obj2->value[1] = 0; obj2->value[2] = 0; obj2->value[3] = 0; break; } obj_to_char(obj2, ch); act("An exact duplicate of $p appears in your hands.",ch,obj,NULL,TO_CHAR); act("An exact duplicate of $p appears in $n's hands.",ch,obj,NULL,TO_ROOM); } else send_to_char( "Bug - please inote Spiral or Dominion.\n\r", ch ); return; } void power_web(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { int sn; int level; int spelltype; if ( ( sn = skill_lookup( "web" ) ) < 0 ) return; spelltype = skill_table[sn].target; level = (int)((double)ch->spl[spelltype] * 0.25); (*skill_table[sn].spell_fun) ( sn, level, ch, victim ); return; } void power_readaura(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { OBJ_DATA *obj; char arg [MAX_INPUT_LENGTH]; char buf [MAX_INPUT_LENGTH]; char buf2 [MAX_INPUT_LENGTH]; sh_int count; one_argument(argument,arg); if ( victim == NULL ) { if ( ( obj = get_obj_carry( ch, arg ) ) == NULL ) { send_to_char( "Read the aura on what?\n\r", ch ); return; } act("$n examines $p intently.",ch,obj,NULL,TO_ROOM); spell_identify( skill_lookup( "identify" ), ch->level, ch, obj ); return; } if (!IS_NPC(victim) && IS_IMMUNE(victim,IMM_SHIELDED) && !IS_ITEMAFF(ch, ITEMA_VISION)) { send_to_char("You are unable to read their aura.\n\r",ch); return; } if (!IS_NPC(victim) && IS_SET(victim->sphere_spaffect,AFSPHERE_SHIELD) && !IS_ITEMAFF(ch, ITEMA_VISION)) { send_to_char("You are unable to read their aura.\n\r",ch); return; } act("$n examines $N intently.",ch,NULL,victim,TO_NOTVICT); act("$n examines you intently.",ch,NULL,victim,TO_VICT); if (IS_NPC(victim)) sprintf(buf, "%s is an NPC.\n\r",victim->short_descr->str); else { if (victim->level == 12) sprintf(buf, "%s is an Implementor.\n\r", victim->name->str); else if (victim->level == 11) sprintf(buf, "%s is a High Judge.\n\r", victim->name->str); else if (victim->level == 10) sprintf(buf, "%s is a Judge.\n\r", victim->name->str); else if (victim->level == 9 ) sprintf(buf, "%s is an Enforcer.\n\r", victim->name->str); else if (victim->level == 8 ) sprintf(buf, "%s is a Quest Maker.\n\r", victim->name->str); else if (victim->level == 7 ) sprintf(buf, "%s is a Builder.\n\r", victim->name->str); else if (victim->level >= 3 ) sprintf(buf, "%s is an Avatar.\n\r", victim->name->str); else sprintf(buf, "%s is a Mortal.\n\r", PERS(victim,ch)); } send_to_char(buf,ch); if (!IS_NPC(victim)) { sprintf(buf,"Str:%d, Int:%d, Wis:%d, Dex:%d, Con:%d.\n\r",get_curr_str(victim),get_curr_int(victim),get_curr_wis(victim),get_curr_dex(victim),get_curr_con(victim)); send_to_char(buf,ch); } sprintf(buf,"Hp:%d/%d, Mana:%d/%d, Move:%d/%d.\n\r",victim->hit,victim->max_hit,victim->mana,victim->max_mana,victim->move,victim->max_move); send_to_char(buf,ch); if (!IS_NPC(victim)) sprintf(buf,"Hitroll:%d, Damroll:%d, AC:%d.\n\r",char_hitroll(victim),char_damroll(victim),char_ac(victim)); else sprintf(buf,"AC:%d.\n\r",char_ac(victim)); send_to_char(buf,ch); if (!IS_NPC(victim)) { sprintf(buf,"Status:%d, ",victim->race); send_to_char(buf,ch); if (IS_CLASS(victim, CLASS_VAMPIRE)) { sprintf(buf,"Blood:%d, ",victim->pcdata->condition[COND_THIRST]); send_to_char(buf,ch); } } sprintf(buf,"Alignment:%d.\n\r",victim->alignment); send_to_char(buf,ch); if (!IS_NPC(victim) && IS_EXTRA(victim, EXTRA_PREGNANT)) act("$N is pregnant.",ch,NULL,victim,TO_CHAR); if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_VAMPIRE)) { send_to_char("Disciplines:",ch); for ( count = 0 ; count < MAX_DISC ; count++ ) { if ( get_disc(victim,count) > 0 ) { sprintf(buf2, " %s %d ", discipline_table[count].name, get_disc(victim,count)); strcat(buf, buf2); } } /*buf[strlen(buf)] = '.'; hack off the final comma, replace it with a period. */ send_to_char(buf,ch); send_to_char("\n\r",ch); } return; } void power_beastwithin(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_NPC(victim)) { send_to_char("But they have no beast to call forth!\n\r",ch); return; } if (!IS_SWWF(victim) && !IS_CLASS(victim,CLASS_VAMPIRE) && !IS_CLASS(victim,CLASS_WEREWOLF)) { send_to_char("But they have no beast to call forth!\n\r",ch); return; } if (IS_SWWF(victim) && ((victim->pcdata->rage_points * 100 / get_max_rage(victim)) > 50)) { send_to_char("Their beast is already controlling them.\n\r",ch); return; } if ( (IS_CLASS(victim,CLASS_WEREWOLF) && victim->pcdata->stats[UNI_RAGE] > 90)) { if (ch == victim) send_to_char("Your beast is already controlling you.\n\r",ch); else send_to_char("Their beast is already controlling them.\n\r",ch); return; } if ( (IS_CLASS(victim,CLASS_VAMPIRE) && victim->pcdata->stats[UNI_RAGE] > 90)) { if (ch == victim) send_to_char("Your beast is already controlling you.\n\r",ch); else send_to_char("Their beast is already controlling them.\n\r",ch); return; } if ( IS_CLASS(victim,CLASS_WEREWOLF) && (victim->pcdata->stats[UNI_RAGE] < 5 || (IS_CLASS(victim, CLASS_VAMPIRE) && get_disc(victim,DISC_ANIMALISM) > 6)) ) { if (ch == victim) send_to_char("You have too much control over your beast to use Beast Within.\n\r",ch); else send_to_char("They have too much control over their beast to use Beast Within on.\n\r",ch); return; } if (victim->pcdata->willpower >= number_range(10,30)) { send_to_char("You failed.\n\r",ch); return; } if (IS_CLASS(victim,CLASS_VAMPIRE) && get_disc(victim,DISC_PROTEAN) > 0 && !IS_VAMPAFF(victim, VAM_NIGHTSIGHT) ) power_nightsight(victim,victim,""); if (IS_CLASS(victim,CLASS_VAMPIRE) && !IS_VAMPAFF(victim, VAM_FANGS)) power_fangs(victim,victim,""); if (IS_CLASS(victim,CLASS_VAMPIRE) && get_disc(victim,DISC_PROTEAN) > 1 && !IS_VAMPAFF(victim, VAM_CLAWS) ) power_claws(victim,victim,""); if (IS_CLASS(victim,CLASS_WEREWOLF)) { victim->pcdata->stats[UNI_RAGE] = number_range(150,200); do_werewolf(victim,""); } else if (IS_CLASS(victim,CLASS_VAMPIRE)) { if (victim->beast > 0) do_beastlike(victim,""); send_to_char("You bare yours fangs and growl as your inner beast consumes you.\n\r",victim); act("$n bares $s fangs and growls as $s inner beast consumes $m.",victim,NULL,NULL,TO_ROOM); victim->pcdata->stats[UNI_RAGE] += number_range(10,20); } else if (IS_SWWF(victim)) victim->pcdata->rage_points += number_range(50,100); return; } void power_moon_bridge(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; } bool can_becommanded(CHAR_DATA *ch, CHAR_DATA *victim, char *action){ if (!check_dumbshit(action)) { send_to_char( "I think not.\n\r", ch ); return FALSE; } if (!can_see(victim,ch)) { if (!IS_SET(ch->act,PLR_HOLYLIGHT)) { send_to_char( "You are unable to make eye contact with them.\n\r", ch ); return FALSE; } } if (IS_NPC(victim) && victim->level > 50){ send_to_char("They resist your charms.\n\r",ch); return FALSE; } if (!IS_NPC(victim) && IS_SET(victim->pcdata->comm, COMM_MIND_BLOCK)) return FALSE; if (IS_IMMORTAL(victim)) return FALSE; if (victim->position == POS_FIGHTING){ send_to_char("They are too busy to listen to you.\n\r",ch); return FALSE; } if (ch->fighting != NULL) { send_to_char("Not while fighting!\n\r",ch); return FALSE; } if (is_inpref(action,"|quit*escape*dissolve*greet*meet*garou*vampire*mage*trait*throw*token*zuluform*serpentis*change*mist*essence*train*rem*del*cons*drop*gift*claim*consent*meet*greet*propose*vampi*ma*maj*sid*side*reca*/*ha*hav*")) { send_to_char( "I think not.\n\r", ch ); return FALSE; } if (!IS_NPC(victim) && strlen(victim->pcdata->conding) > 2 && !str_cmp(victim->pcdata->conding,ch->name->str)) { act("Your Boss Wouldn't like that.",victim,NULL,ch,TO_CHAR); act("$n shakes of $N's suggestion as thier boss wouldn't like it.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your suggestion with thier willpower.",victim,NULL,ch,TO_VICT); return FALSE; } if (!IS_SET(victim->sphere_spaffect,AFSPHERE_TAINTED) && !IS_ADDED(victim, ADDED_LOYAL)) { if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(1,30)) { act("You shake off $N's suggestion with your willpower.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's suggestion with thier willpower.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your suggestion with thier willpower.",victim,NULL,ch,TO_VICT); return FALSE; } } return TRUE; } void command_victim(CHAR_DATA *ch, CHAR_DATA *victim, char *action){ char buf[MAX_STRING_LENGTH]; if (IS_NPC(victim)) sprintf( buf, "I think %s wants to %s", victim->short_descr->str, action ); else if (!IS_NPC(victim) && IS_AFFECTED(victim, AFF_POLYMORPH)) sprintf( buf, "I think %s wants to %s", victim->morph->str, action ); else sprintf( buf, "I think %s wants to %s", victim->name->str, action ); do_say(ch,buf); WAIT_STATE(ch,24); act("You blink in confusion.",victim,NULL,NULL,TO_CHAR); act("$n blinks in confusion.",victim,NULL,NULL,TO_ROOM); strcpy(buf,"Yes, you're right, I do..."); do_say(victim,buf); if (IS_NPC(victim)) SET_BIT(victim->act, ACT_COMMANDED); interpret( victim, action ); if (IS_NPC(victim)) REMOVE_BIT(victim->act, ACT_COMMANDED); } void power_command(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char action[MAX_INPUT_LENGTH]; smash_quote(argument); if ( argument[0] == '\0' ) { send_to_char( "Command whom to do what?\n\r", ch ); return; } one_argument(argument,action); if (!can_becommanded(ch,victim,action)) return; command_victim(ch,victim,argument); return; } void power_condition(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_NPC(victim) && IS_SET(victim->pcdata->comm, COMM_MIND_BLOCK)) return; if (!can_see(victim,ch)) { if (!IS_SET(ch->act,PLR_HOLYLIGHT) && IS_CLASS(ch,CLASS_VAMPIRE) && get_disc(ch,DISC_DOMINATE) < 6) { send_to_char( "You are unable to make eye contact with them.\n\r", ch ); return; } } act("You stare deeply into $N's eyes.",ch,NULL,victim,TO_CHAR); act("$n stares deeply into $N's eyes.",ch,NULL,victim,TO_NOTVICT); act("$n stares deeply into your eyes.",ch,NULL,victim,TO_VICT); if (strlen(victim->pcdata->conding) > 2 && !str_cmp(victim->pcdata->conding,ch->name->str)) { victim->pcdata->conding = g_strdup( "" ); REMOVE_BIT(victim->added, ADDED_LOYAL); act("You remove $N's conditioning.",ch,NULL,victim,TO_CHAR); act("$n removes your conditioning.",ch,NULL,victim,TO_VICT); return; } if (!IS_NPC(victim) && IS_CLASS(victim,CLASS_VAMPIRE) && victim->pcdata->stats[UNI_GEN] < ch->pcdata->stats[UNI_GEN]) { act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT); act("$s mind is too strong to overcome.",victim,NULL,ch,TO_VICT); return; } if (!IS_NPC(victim) && ((victim->pcdata->willpower >= number_range(2,30) && IS_ADDED(victim, ADDED_LOYAL)) || victim->pcdata->willpower >= number_range(5,30)) && strlen(victim->pcdata->conding) > 1) { act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT); return; } if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(1,20)) { act("You shake off $N's attempt to Condition you.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's attempt to Condition $m.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt to Condition $m.",victim,NULL,ch,TO_VICT); return; } if (strlen(victim->pcdata->conding) > 1) { victim->pcdata->conding = g_strdup( "" ); REMOVE_BIT(victim->added, ADDED_LOYAL); act("You remove $N's conditioning.",ch,NULL,victim,TO_CHAR); act("$n removes your conditioning.",ch,NULL,victim,TO_VICT); return; } victim->pcdata->conding = g_strdup( ch->name->str ); REMOVE_BIT(victim->added, ADDED_LOYAL); act("You condition $N's mind.",ch,NULL,victim,TO_CHAR); act("$n conditions your mind.",ch,NULL,victim,TO_VICT); return; } void power_serenity(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if ( ch->fighting != NULL ) { send_to_char("Not when your fighting someone!\n\r",ch); } // //Need to find a better wolfman then = PLR_WOLFMAN :P if (IS_NPC(victim)) { send_to_char("They have no beast to suppress!\n\r",ch); return; } if (!IS_CLASS(victim,CLASS_VAMPIRE) && !IS_CLASS(victim, CLASS_WEREWOLF) && !IS_SWWF(victim)) { send_to_char("They have no beast to suppress!\n\r",ch); return; } if ((IS_CLASS(victim,CLASS_VAMPIRE) || IS_CLASS(victim,CLASS_WEREWOLF)) && victim->pcdata->stats[UNI_RAGE] < 1 ) { if (ch == victim) send_to_char("But your beast is not controlling you.\n\r",ch); else send_to_char("But their beast is not controlling them.\n\r",ch); return; } if ( IS_CLASS(ch,CLASS_VAMPIRE) && get_disc(victim,DISC_ANIMALISM) > 7 ) { if (ch == victim) send_to_char("You have too much control over your beast to use Song of Serenity.\n\r",ch); else send_to_char("They have too much control over their beast to use Song of Serenity on.\n\r",ch); return; } if ( IS_ITEMAFF(victim, ITEMA_RAGER) ) { send_to_char("You failed.\n\r",ch); return; } if (victim->pcdata->willpower > number_range(10,30)) { send_to_char("You failed.\n\r",ch); return; } send_to_char("You take a deep breath and force back your inner beast.\n\r",victim); act("$n takes a deep breath and forces back $s inner beast.",victim,NULL,NULL,TO_ROOM); if (IS_CLASS(victim,CLASS_VAMPIRE) || IS_CLASS(victim,CLASS_WEREWOLF)) victim->pcdata->stats[UNI_RAGE] -= 10; return; } void power_confuse(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (IS_SET(victim->added,ADDED_CONFUSE) ) return; SET_BIT(victim->added, ADDED_CONFUSE); if (IS_CLASS(ch,CLASS_VAMPIRE)) { act("$N looks a little confused?",ch,NULL,victim,TO_ROOM); act("$N looks a little confused?",ch,NULL,victim,TO_CHAR); act("You look a little confused?",ch,NULL,victim,TO_VICT); } else { act("$N looks a little confused from the madness.",ch,NULL,victim,TO_ROOM); act("$N looks a little confused from the madness.",ch,NULL,victim,TO_CHAR); act("You look a little confused from madness.",ch,NULL,victim,TO_VICT); } return; } void power_scry(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { ROOM_INDEX_DATA *chroom; ROOM_INDEX_DATA *victimroom; if (!knows_char(ch,victim)) { send_to_char( "They aren't here.\n\r", ch ); return; } if (!IS_NPC(victim) && IS_IMMUNE(victim,IMM_SHIELDED) && !IS_ITEMAFF(ch, ITEMA_VISION)) { send_to_char("You are unable to locate them.\n\r",ch); return; } if (!IS_NPC(victim) && get_tribe(victim,TRIBE_SHADOW_LORDS) > 0 ) { send_to_char("They have a aura of confidence around them. You cannot breach it.\n\r",ch); return; } if (!IS_NPC(victim) && IS_SET(victim->sphere_spaffect,AFSPHERE_SHIELD) && !IS_ITEMAFF(ch, ITEMA_VISION)) { send_to_char("You are unable to locate them.\n\r",ch); return; } chroom = ch->in_room; victimroom = victim->in_room; char_from_room(ch); char_to_room(ch,victimroom); do_look(ch,"auto"); char_from_room(ch); char_to_room(ch,chroom); return; } void power_insane(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_SET(victim->added,ADDED_INSANE) ) { send_to_char("They are already insane enough!\n\r",ch); return; } af.spell_number = mage_affect_slot("Insane"); af.type = TYPE_SPHERE_ADDED; af.duration = get_disc(ch,DISC_DEMENTATION); af.bitvector = ADDED_INSANE; sphere_to_char( victim, &af ); send_to_char( mage_affect_table[mage_affect_slot("Insane")].on_msg, ch ); WAIT_STATE( ch, 24 ); act("$N starts to blabber about a small rabbit and drool madly.",ch,NULL,victim,TO_ROOM); act("Everything becomes clear to you, all the people around you are insane.",ch,NULL,victim,TO_VICT); return; } void power_spirit_sight(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_CLASS(ch,CLASS_MAGE)) { if (IS_SET(ch->sight, SIGHT_SPIRIT)) return; af.spell_number = mage_affect_slot("Spiritsight"); af.type = TYPE_SIGHT; af.duration = 10 * has_sphere(ch,SPHERE_SPIRIT); af.bitvector = SIGHT_SPIRIT; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Spiritsight")].on_msg, ch ); return; } /** * FIXME: must remove the full spaffect not just the bit.. */ if (IS_SET(ch->sight,SIGHT_SPIRIT) ) { send_to_char("You can no longer see between planes.\n\r",ch); REMOVE_BIT(ch->sight, SIGHT_SPIRIT); return; } send_to_char("You can now see the spirit planes.\n\r",ch); SET_BIT(ch->sight, SIGHT_SPIRIT); return; } void power_haunt(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_SET(victim->added,ADDED_HAUNT) ) { send_to_char("Several hundred more ghosts can't make them any more haunted.\n\r",ch); return; } if (IS_SWWF(ch)) send_to_char("You start to dreamspeak in to thier dreams and start haunting them!\n\r",ch); af.spell_number = mage_affect_slot("Haunt"); af.type = TYPE_SPHERE_ADDED; af.duration = get_disc(ch,DISC_DEMENTATION); af.bitvector = ADDED_HAUNT; sphere_to_char( victim, &af ); if (IS_CLASS(ch,CLASS_VAMPIRE)) send_to_char( mage_affect_table[mage_affect_slot("Haunt")].on_msg, ch ); act("$N starts to look around like they see something you don't.",ch,NULL,victim,TO_ROOM); act("You start to feel haunted.",ch,NULL,victim,TO_VICT); return; } void power_summon_spirit(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { CHAR_DATA *familiar; familiar = create_mobile(get_mob_index(MOB_VNUM_RESTLESS_SPIRIT)); familiar->level = ch->level / 10; familiar->max_hit = ch->max_hit / 10; familiar->mana = ch->mana / 10; show_spirit_rise(ch); familiar->plane = PLANE_SPIRIT; SET_BIT(familiar->mob_con, MOBCON_NICE_SPIRIT); char_to_room(familiar,ch->in_room); ch->pcdata->familiar = familiar; familiar->wizard = ch; if ( !IS_NPC(victim) ) { send_to_char( "Not on players.\n\r", ch ); return; } act("Your summons worked as you look through $N's eyes.",ch,NULL,victim,TO_CHAR); return; } void power_shadowplane( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { OBJ_DATA *obj; SPHERE_DATA af; char arg[MSL]; 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_SHADOW) return; af.spell_number = mage_affect_slot("Shadowplane"); af.type = TYPE_PLANE; af.duration = 10 * has_sphere(ch,SPHERE_SPIRIT); af.bitvector = PLANE_SHADOW; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Shadowplane")].on_msg, ch ); send_to_char("You fade into the plane of shadows.\n\r",ch); act("The shadows flicker and swallow up $n.",ch,NULL,NULL,TO_ROOM); do_look(ch,"auto"); shift_obj_plane(ch); return; } if ( arg[0] == '\0' ) { if (ch->plane == PLANE_NORMAL) { send_to_char("You fade into the plane of shadows.\n\r",ch); act("The shadows flicker and swallow up $n.",ch,NULL,NULL,TO_ROOM); ch->plane = PLANE_SHADOW; do_look(ch,"auto"); shift_obj_plane(ch); return; } ch->plane = PLANE_NORMAL; send_to_char("You fade back into the real world.\n\r",ch); act("The shadows flicker and $n fades into existance.",ch,NULL,NULL,TO_ROOM); do_look(ch,"auto"); shift_obj_plane(ch); return; } if ( ( obj = get_obj_here( ch, arg ) ) == NULL ) { send_to_char( "What do you wish to toss into the shadow plane?\n\r", ch ); return; } return; } void power_vanish( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { SPHERE_DATA af; if (IS_CLASS(ch,CLASS_MAGE)) { if (IS_SET(ch->act, PLR_WIZINVIS)) { send_to_char("You are already Vanished!\n\r",ch); return; } af.spell_number = mage_affect_slot("Vanish"); af.type = TYPE_SPHERE_ACT; af.duration = 10 * has_sphere(ch,SPHERE_CORRESPONDENCE); af.bitvector = PLR_WIZINVIS; ch->invis_level = ch->level; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Vanish")].on_msg, ch ); return; } if ( IS_SET(ch->act, PLR_WIZINVIS) ) { if ( ch->pk_timer > 3 ) { send_to_char("Not with a combat timer greater then 3!\n\r",ch); return; } 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_zombie(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { OBJ_DATA *obj; /* * Look for a corpse perferably on the ground.. and a npc */ for (obj = ch->in_room->contents; obj != NULL; obj = obj->next_content){ if (obj->item_type == ITEM_CORPSE_NPC) create_zombie(obj); } send_to_char("Corpse not found!\n\r",ch); return; } void power_steal_soul(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char arg[MSL]; one_argument(argument,arg); if ((victim = get_char_room(ch,arg)) == NULL){ send_to_char("There not here.\n\r",ch); return; } if (IS_NPC(ch)) return; if (!IS_NPC(victim)){ send_to_char("Not on players.\n\r",ch); return; } if (victim->level > 100){ send_to_char("They resist your powers.\n\r",ch); return; } if (number_range(1,100) > 75){ send_to_char("They resist your powers.\n\r",ch); return; } make_spirit(victim); ch->pcdata->familiar = victim; victim->wizard = ch; SET_BIT(victim->act,ACT_SENTINEL); do_say(victim,"As you command."); raw_kill(victim); send_to_char("OK\n\r",ch); return; } void power_compel(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { char action[MAX_INPUT_LENGTH]; smash_quote(argument); if ( argument[0] == '\0' ) { send_to_char( "Command whom to do what?\n\r", ch ); return; } one_argument(argument,action); if (!IS_SET(victim->affected_by,AFF_GHOST) && victim->plane != PLANE_SPIRIT){ send_to_char("You can only compel spirits, Wraiths or Ghosts.\n\r",ch); return; } if (!can_becommanded(ch,victim,action)) return; command_victim(ch,victim,argument); return; } /* * Real tricky power, I need to check for the object on person, on floor or on other person * then we get to figure out how long it's stopped for */ void power_freeze_object(CHAR_DATA *ch, CHAR_DATA *victim, char *argument){ char arg[MSL]; char arg2[MSL]; OBJ_DATA *obj = NULL; argument = one_argument(argument,arg); argument = one_argument(argument,arg2); if (arg[0] == '\0'){ send_to_char("Syntax: freezeobj (object) (Victim - Optional)\n\r",ch); return; } if (arg2[0] == '\0'){ obj = get_obj_carry(ch,arg); if ( obj == NULL) obj = get_obj_list(ch,arg,ch->in_room->contents); if (obj == NULL){ send_to_char("No object by that name found!\n\r",ch); return; } } if ((victim = get_char_room(ch,arg2)) == NULL){ send_to_char("No one here by that name.\n\r",ch); return; } if (obj == NULL) obj = get_eq_char(victim,WEAR_WIELD); if (obj == NULL) obj = get_obj_carry(victim,arg); if (obj == NULL){ send_to_char("They do not carry that object!\n\r",ch); return; } /* * Ok we pretty much found our object by here.. * set a timer on it and freeze it. */ if (obj->timer > 0) obj->timer += get_disc(ch,DISC_TEMPORIS) * number_range(1,4); else obj->timer = get_disc(ch,DISC_TEMPORIS) * number_range(1,4); SET_BIT(obj->extra_flags,ITEM_FROZEN); return; } void power_ridewyld(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { CHAR_DATA *familiar; if ( ( familiar = ch->pcdata->familiar ) != NULL ) { send_to_char( "Nothing happens.\n\r", ch ); return; } if ( !IS_NPC(victim) ) { send_to_char( "Not on players.\n\r", ch ); return; } if ( ( familiar = victim->wizard ) != NULL ) { send_to_char( "Nothing happens.\n\r", ch ); return; } switch ( victim->pIndexData->vnum ) { default: send_to_char( "Nothing happens.\n\r", ch ); return; case MOB_VNUM_FROG: case MOB_VNUM_RAVEN: case MOB_VNUM_CAT: case MOB_VNUM_DOG: case MOB_VNUM_EYE: case MOB_VNUM_MOLERAT: case MOB_VNUM_YAK: break; } act("You merge your spirit with that of $N.",ch,NULL,victim,TO_CHAR); ch->pcdata->familiar = victim; victim->wizard = ch; return; } void power_haunting(CHAR_DATA *ch, CHAR_DATA *victim, char *argument){ CHAR_DATA *spirit; char arg[MSL]; argument = one_argument(argument,arg); if ((spirit = get_char_room(ch,arg)) == NULL) { send_to_char("There not here.",ch); return; } if (spirit->plane != PLANE_SPIRIT){ send_to_char("They are not on the Spirit Plane.\n\r",ch); return; } /* * Run a check of willpower for the Spirit to be summoned * if it's a mob run a chance check vs level */ if (IS_NPC(spirit)){ if (spirit->level < number_range(1,50)){ send_to_char("You have failed.\n\r",ch); return; } } else{ if (ch->pcdata->willpower > number_range(1,40)){ send_to_char("You have failed.\n\r",ch); return; } } if (IS_NPC(spirit)) { spirit->hit = spirit->max_hit; spirit->mana = spirit->max_mana; spirit->move = spirit->max_move; SET_BIT(victim->affected_by, AFF_GHOST); } spirit->plane = PLANE_NORMAL; act("$N appears right in front of you!",ch,NULL,spirit,TO_CHAR); act("You appear in front of $n as they have summoned you.",ch,NULL,spirit,TO_VICT); act("$N appears out of nowhere in front of $n!",ch,NULL,spirit,TO_NOTVICT); return; } void power_hags_wrinkles(CHAR_DATA *ch,CHAR_DATA *victim, char *argument){ if (IS_SET(ch->extra,EXTRA_HAGS)){ send_to_char("Your skin tightens up removing the hags wrinkles.\n\r",ch); REMOVE_BIT(ch->extra, EXTRA_HAGS); } else{ send_to_char("Your skin loosens up revealing the hags wrinkles.\n\r",ch); SET_BIT(ch->extra,EXTRA_HAGS); } return; }