/*************************************************************************** * 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 int sphere_lookup args((char * sphere)); extern bool create_foci args((CHAR_DATA *ch, OBJ_DATA *obj, int want_sphere)); bool check_time_sence(CHAR_DATA *victim){ if (get_disc(victim,DISC_TEMPORIS) > 0 ) return TRUE; if (has_sphere(victim, SPHERE_TIME) > 4) return TRUE; return FALSE; } void power_heal(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { if (victim->hit >= victim->max_hit) return; victim->hit += ( number_range(100,175) * (has_sphere(ch,SPHERE_LIFE))); // if (victim->hit >= victim->max_hit) // victim->hit = victim->max_hit; act("You can feel your life force heal $N.", ch, NULL, victim, TO_CHAR); act("Energy flows from $n to $n.", ch, NULL, victim, TO_NOTVICT); act("You feel more alive.", ch, NULL, victim, TO_VICT); return; } void power_life_shield(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_LIFE_SHIELD) ) return; af.spell_number = mage_affect_slot("Life Shield"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_LIFE); af.bitvector = AFSPHERE_LIFE_SHIELD; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Life Shield")].on_msg, ch ); return; } void power_mregen(CHAR_DATA *ch, CHAR_DATA *victim, char *argument) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_REGEN) ) return; af.spell_number = mage_affect_slot("Regen"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_LIFE); af.bitvector = AFSPHERE_REGEN; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Regen")].on_msg, ch ); return; } void power_entropy_shield( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_ENTROPY_SHIELD) ) return; af.spell_number = mage_affect_slot("Entropy Shield"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_ENTROPY); af.bitvector = AFSPHERE_ENTROPY_SHIELD; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Entropy Shield")].on_msg, ch ); return; } void power_force_shield( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_FORCES_SHIELD) ) return; af.spell_number = mage_affect_slot("Force Shield"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_FORCES); af.bitvector = AFSPHERE_FORCES_SHIELD; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Force Shield")].on_msg, ch ); return; } void power_mind_shield( CHAR_DATA *ch,CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_MIND_SHIELD) ) return; af.spell_number = mage_affect_slot("Mind Shield"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_MIND); af.bitvector = AFSPHERE_MIND_SHIELD; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Mind Shield")].on_msg, ch ); return; } void power_prime_shield( CHAR_DATA *ch,CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_PRIME_SHIELD) ) return; af.spell_number = mage_affect_slot("Prime Shield"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_PRIME); af.bitvector = AFSPHERE_PRIME_SHIELD; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Prime Shield")].on_msg, ch ); return; } void power_spirit_shield( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_SPIRIT_SHIELD) ) return; af.spell_number = mage_affect_slot("Spirit Shield"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_SPIRIT); af.bitvector = AFSPHERE_SPIRIT_SHIELD; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Spirit Shield")].on_msg, ch ); return; } void power_create_foci( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { char arg1 [MAX_INPUT_LENGTH]; char buf [MAX_INPUT_LENGTH]; OBJ_DATA *obj = NULL; int want_sphere; argument = one_argument( argument, arg1); if ( arg1[0] == '\0' ) { send_to_char("Avalible shperes:\n\r",ch); send_to_char("Correspondence,Entropy,Forces,Mind,Matter,\n\r",ch); send_to_char("Prime,Spirit,Life, and Time\n\r",ch); return; } if (( want_sphere = sphere_lookup(arg1)) == 666 ) { send_to_char("Available spheres:\n\r",ch); send_to_char("Correspondence, Entropy, Forces, Mind, Matter,\n\r",ch); send_to_char("Prime, Spirit, Life, and Time\n\r",ch); return; } if ( has_sphere(ch,want_sphere) < 1 ) { send_to_char("You are not trained in that sphere.\n\r",ch); return; } if ( ( obj = get_obj_carry( ch, "foci" ) ) != NULL ) { create_foci(ch,obj,want_sphere); return; } if ( ( obj = get_obj_wear( ch, "foci" ) ) != NULL ) { create_foci(ch,obj,want_sphere); return; } if ((obj = create_object(get_obj_index(OBJ_VNUM_FOCI),ch->level)) == NULL) { send_to_char( "Error in Create Foci! Tell a Admin it's missing!.\n\r", ch); return; } else { obj->sphere[0] = 0; obj->sphere[1] = 0; obj->sphere[2] = 0; obj->sphere[3] = 0; obj->sphere[4] = 0; obj->sphere[5] = 0; obj->sphere[6] = 0; obj->sphere[7] = 0; obj->sphere[8] = 0; } if (create_foci(ch,obj,want_sphere)) { sprintf(buf,"%s foci",ch->name->str); obj->name = g_string_assign(obj->name,buf); if (IS_NPC(ch)) sprintf(buf,"the foci of %s",ch->short_descr->str); else sprintf(buf,"the foci of %s",ch->name->str); buf[0] = UPPER(buf[0]); obj->short_descr = g_string_assign(obj->short_descr,buf); if (IS_NPC(ch)) sprintf(buf,"A mage's foci is here. %s might need it later.",ch->short_descr->str); else sprintf(buf,"A mage's foci is here. %s might need it later.",ch->name->str); buf[0] = UPPER(buf[0]); obj->description = g_string_assign(obj->description,buf); obj->questmaker = g_string_assign(obj->questmaker,ch->name->str); if (!IS_NPC(ch)) { obj->questowner = g_string_assign(obj->questowner,ch->name->str); } obj_to_char(obj,ch); act("$p fades into existance in your hand.", ch, obj, NULL, TO_CHAR); act("$p fades into existance in $n's hand.", ch, obj, NULL, TO_ROOM); return; } send_to_char("Foci, Denied!\n\r",ch); } void power_charged_bolt( CHAR_DATA *ch,CHAR_DATA *victim, char *argument ) { int sn; int DAMAGE_MOD = 4; bool Passed = FALSE; if ( ( sn = skill_lookup( "call lightning" ) ) < 0) { send_to_char("Whoops error in the code.. please report to Spiral/Dominion.\n\r",ch); return; } if (!IS_NPC(victim)) { if (IS_IMMMERIT(victim, IMM_MERIT_LIGHTNING)) DAMAGE_MOD = 2; if (IS_IMMFLAW(victim, IMM_FLAW_LIGHTNING)) DAMAGE_MOD = 8; } if (IS_NPC(victim)) { if (IS_SET(victim->mob_con, MOBCON_RESLIGHT)) DAMAGE_MOD = 2; else DAMAGE_MOD = 4; } if (has_sphere(ch,SPHERE_FORCES) >= 1) { Passed = TRUE; if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,50)) Passed = FALSE; if (Passed) damage( ch, victim, (850 * has_sphere(ch,SPHERE_FORCES)) * DAMAGE_MOD, sn ); } if (has_sphere(ch,SPHERE_FORCES) >= 4) { Passed = TRUE; if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,50)) Passed = FALSE; if (Passed) damage( ch, victim, (850 * has_sphere(ch,SPHERE_FORCES)) * DAMAGE_MOD, sn ); } if (has_sphere(ch,SPHERE_FORCES) >= 6) { Passed = TRUE; if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,50)) Passed = FALSE; if (Passed) damage( ch, victim, (850 * has_sphere(ch,SPHERE_FORCES)) * DAMAGE_MOD, sn ); } set_attack_flag(ch,victim); act("You grin with a evil smile as your body charges a bolt and hits $N dead on.", ch, NULL, victim, TO_CHAR); act("$N dances in pain as $n hits them with a charged bolt of lighting.", ch, NULL, victim, TO_NOTVICT); act("You feel like fried chicken after $n's bolt nails you dead on.", ch, NULL, victim, TO_VICT); if (ch->mana > 5000) ch->mana -= number_range(100,3000); return; } void power_alter_flow( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { int sn; int DAMAGE_MOD =4; bool Passed; if ( ( sn = skill_lookup( "energy drain" ) ) < 0) { send_to_char("Whoops error in the code.. please report to Spiral or Dominion.\n\r",ch); return; } if (!IS_NPC(victim)) { if (IS_IMMMERIT(victim, IMM_MERIT_DRAIN)) DAMAGE_MOD = 2; if (IS_IMMFLAW(victim, IMM_FLAW_DRAIN)) DAMAGE_MOD = 8; } if (IS_NPC(victim)) DAMAGE_MOD = 4; Passed = TRUE; if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,50)) Passed = FALSE; if (Passed) { damage( ch, victim, (1000 * has_sphere(ch,SPHERE_PRIME) * DAMAGE_MOD )* number_range(3,10), sn ); damage( ch, victim, (1000 * has_sphere(ch,SPHERE_PRIME) * DAMAGE_MOD )* number_range(3,10), sn ); } act("You raise your hand and energy surges forth and hits $N dead on.", ch, NULL, victim, TO_CHAR); act("$N whinces in pain as $n hits them with a flow of energy." , ch, NULL, victim, TO_NOTVICT); act("You feel energy flow out of your body as $n's blast hits you.", ch , NULL, victim, TO_VICT); if (ch->mana > 5000) ch->mana -= number_range(100,3000); return; } void power_mana_shield( CHAR_DATA *ch,CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_MANA_SHIELD) ) return; af.spell_number = mage_affect_slot("Mana Shield"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_MIND); af.bitvector = AFSPHERE_MANA_SHIELD; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Mana Shield")].on_msg, ch ); return; } void power_pathos( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { char buf [MAX_INPUT_LENGTH]; char buf2 [MAX_INPUT_LENGTH]; sh_int count,lcount = 0; 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); ch->mana -= 250; 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); ch->mana -= 250; 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", victim->name->str); } 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)) { str_cpy(buf2,""); str_cpy(buf,""); 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)); if (strcmp(buf2,"")) { lcount += 1; if ( lcount >= 3 ) { strcat(buf," "); strcat(buf, buf2); strcat(buf, "\n\r"); send_to_char(buf, ch); lcount = 0; str_cpy(buf, ""); } else { if ( lcount > 1 ) strcat(buf," "); 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_location( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { ROOM_INDEX_DATA *chroom; ROOM_INDEX_DATA *victimroom; if (!has_planesight(ch,victim)){ send_to_char("You are unable to locate them.\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) && 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; } if (!IS_NPC(victim) && get_tribe(victim, TRIBE_SHADOW_LORDS) > 0 ) { 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_travel( 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( "Your spell has fizzled.\n\r", ch ); return; } send_to_char("You think of a different place.\n\r",ch); char_from_room( ch ); char_to_room( ch, victim->in_room ); act( "$n appears in front of $N.", ch, NULL, victim, TO_ROOM ); act( "$N appears in front of you.", ch, NULL, victim, TO_VICT ); do_look( ch,"auto"); return; } void power_speed_time( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_SPEED_TIME) ) return; af.spell_number = mage_affect_slot("Speedtime"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 3 * has_sphere(ch,SPHERE_TIME); af.bitvector = AFSPHERE_SPEED_TIME; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Speedtime")].on_msg, ch ); return; } void power_dispel( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA *paf,*paf_next; for (paf = ch->sphere_affected; paf != NULL; paf = paf_next) { paf_next = paf->next; if (!str_cmp(argument,mage_affect_table[paf->spell_number].spell_name)) { /* * Quick check for plane shift.. */ sphere_remove(ch,paf); if (paf->type == TYPE_PLANE) shift_obj_plane(ch); send_to_char("You slide back in time to remove your spell affect.\n\r",ch); return; } } send_to_char("You are not affected by that affect. \n\r",ch); } void power_rip( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { int chance = 20; CHAR_DATA *mount; ROOM_INDEX_DATA *pRoomIndex; int to_room; if (IS_NPC(victim) || check_time_sence(victim)) { chance = 10; } if ( victim->in_room == NULL || IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL) || is_tempsafe(ch) || IS_SET(victim->in_room->room_flags, ROOM_NO_TELEPORT) || ( !IS_NPC(ch) && victim->fighting != NULL ) || victim == ch || number_percent() > chance ) { send_to_char( "Your spell has fizzled.\n\r", ch ); return; } for ( ; ; ) { to_room = number_range( 0, 65535 ); pRoomIndex = get_room_index( to_room ); if ( pRoomIndex != NULL ) if ( !IS_SET(pRoomIndex->room_flags, ROOM_PRIVATE) && !IS_SET(pRoomIndex->room_flags, ROOM_SOLITARY) && !IS_SET(pRoomIndex->room_flags, ROOM_NO_TELEPORT) && ( !(strstr(pRoomIndex->area->builders, "Unlinked"))) && to_room != 30008 && to_room != 30002 && to_room != 2 && to_room != 1 && to_room != 1200) break; } act( "$n tears a hole in the air, and $N is ripped into another time and space..", ch, NULL, victim, TO_ROOM ); act( "You tear a hole in the air, and $N is ripped into another time and space..", ch, NULL, victim, TO_CHAR ); act( "$n tears a hole in the air, and you are ripped into another time and space..", ch, NULL, victim, TO_VICT ); char_from_room( victim ); char_to_room( victim, pRoomIndex ); act( "$n slowly fades into existence.", victim, NULL, NULL, TO_ROOM ); do_look( victim, "auto" ); if ( (mount = ch->mount) == NULL ) return; char_from_room( mount ); char_to_room( mount, ch->in_room ); do_look( mount, "auto" ); return; } void power_flames( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { char arg [MAX_INPUT_LENGTH]; SPHERE_DATA af; argument = one_argument( argument, arg ); if (IS_SET(victim->sphere_spaffect,ADDED_FLAMES_PURE) ) return; af.spell_number = mage_affect_slot("Flames of Purification"); af.type = TYPE_SPHERE_ADDED; af.duration = 2 * has_sphere(ch,SPHERE_PRIME); af.bitvector = ADDED_FLAMES_PURE; sphere_to_char( victim, &af ); send_to_char( mage_affect_table[mage_affect_slot("Flames of Purification")].on_msg, victim ); act( "$N whinces as flames engulf his body.", ch, NULL, victim, TO_ROOM ); act( "$N whinces as flames engulf his body.", ch, NULL, victim, TO_CHAR ); return; } void power_mist( CHAR_DATA *ch, CHAR_DATA *victim, char *argument ) { char buf [MAX_STRING_LENGTH]; SPHERE_DATA af; if (IS_AFFECTED(ch, AFF_POLYMORPH)) { send_to_char( "You can only turn in to mist from human form.\n\r", ch ); return; } if (ch->stance[0] != -1) do_stance(ch,""); if (ch->mounted == IS_RIDING) do_dismount(ch,""); ch->pcdata->condition[COND_THIRST] -= number_range(40,50); act( "You transform into mist form.", ch, NULL, NULL, TO_CHAR ); act( "$n transforms into a white mist.", ch, NULL, NULL, TO_ROOM ); if (IS_EXTRA(ch, TIED_UP)) { act("The ropes binding you fall through your ethereal form.",ch,NULL,NULL,TO_CHAR); act("The ropes binding $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM); REMOVE_BIT(ch->extra, TIED_UP); REMOVE_BIT(ch->extra, GAGGED); REMOVE_BIT(ch->extra, BLINDFOLDED); } if (is_affected(ch, gsn_web)) { act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM); send_to_char("The webbing entrapping you falls through your ethereal form.\n\r",ch); affect_strip(ch, gsn_web); } clear_stats(ch); SET_BIT(ch->pcdata->powers[WOLF_POLYAFF], POLY_MIST); SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CHANGED); SET_BIT(ch->affected_by, AFF_POLYMORPH); ch->plane = PLANE_ETHEREAL; shift_obj_plane(ch); sprintf(buf, "%s the white mist", ch->name->str); ch->morph = g_string_assign(ch->morph,buf); if (IS_SET(ch->sphere_spaffect,ADDED_POLY_MIST) ) return; af.spell_number = mage_affect_slot("Mist Poly"); af.type = TYPE_SPHERE_ADDED; af.duration = 10 * has_sphere(ch,SPHERE_MATTER); af.bitvector = ADDED_POLY_MIST; sphere_to_char( ch, &af ); strip_player(ch); return; } void power_taintmind( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(victim->sphere_spaffect,AFSPHERE_TAINTED) ) return; if (!IS_NPC(victim) && (victim->pcdata->willpower >= number_range(2,30))) { act("You shake off $N's mind powers.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's mind powers.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt.",victim,NULL,ch,TO_VICT); return; } af.spell_number = mage_affect_slot("Tainted"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 10 * has_sphere(ch,SPHERE_MIND); af.bitvector = AFSPHERE_TAINTED; sphere_to_char( victim, &af ); send_to_char( mage_affect_table[mage_affect_slot("Tainted")].on_msg, victim ); send_to_char("There now tainted...\n\r",ch); return; } void power_falsepride( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(victim->sphere_spaffect,AFSPHERE_FALSE_PRIDE) ) return; af.spell_number = mage_affect_slot("False Pride"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = has_sphere(ch,SPHERE_SPIRIT); af.bitvector = AFSPHERE_FALSE_PRIDE; sphere_to_char( victim, &af ); send_to_char( mage_affect_table[mage_affect_slot("False Pride")].on_msg, victim ); send_to_char("The have a false sence of pride now.\n\r",ch); return; } void power_darksight( CHAR_DATA *ch,CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sight,SIGHT_NIGHTSIGHT) ) return; af.spell_number = mage_affect_slot("Night Sight"); af.type = TYPE_SPHERE_SPAFFECT; 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("Night Sight")].on_msg, ch ); return; } void power_squarecircle( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(ch->sphere_spaffect,AFSPHERE_SQUARE_CIRCLE) ) return; af.spell_number = mage_affect_slot("Square Circle"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 3 * has_sphere(ch,SPHERE_ENTROPY); af.bitvector = AFSPHERE_SQUARE_CIRCLE; sphere_to_char( ch, &af ); send_to_char( mage_affect_table[mage_affect_slot("Square Circle")].on_msg, ch ); return; } void power_confusemind( CHAR_DATA *ch,CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_SET(victim->added, ADDED_CONFUSE) ) return; if (!IS_NPC(victim) && (victim->pcdata->willpower >= number_range(2,30))) { act("You shake off $N's mind powers.",victim,NULL,ch,TO_CHAR); act("$n shakes off $N's mind powers.",victim,NULL,ch,TO_NOTVICT); act("$n shakes off your attempt.",victim,NULL,ch,TO_VICT); return; } af.spell_number = mage_affect_slot("Confuse Mind"); af.type = TYPE_SPHERE_ADDED; af.duration = has_sphere(ch,SPHERE_MIND)/3; af.bitvector = ADDED_CONFUSE; sphere_to_char( victim, &af ); send_to_char( mage_affect_table[mage_affect_slot("Confuse Mind")].on_msg, victim ); send_to_char("There mind has confusion...\n\r",ch); return; } void power_slow_time( CHAR_DATA *ch, CHAR_DATA *victim, char * argument ) { SPHERE_DATA af; if (IS_NPC(victim)) { send_to_char( "Your spell has fizzled.\n\r", ch ); return; } if (check_time_sence(victim)){ send_to_char("Your timing has no affect.\n\r",ch); return; } if (!IS_NPC(victim) && victim->pcdata->willpower >= number_range(10,50)) { send_to_char( "Your spell has fizzled.\n\r", ch ); return; } if (victim->level < 3 ) { send_to_char("Go pick on someone your own size!\n\r",ch); send_to_char( "Your spell has fizzled.\n\r", ch ); return; } if (IS_SET(victim->sphere_spaffect,AFSPHERE_SLOW_TIME) ) return; af.spell_number = mage_affect_slot("Slowtime"); af.type = TYPE_SPHERE_SPAFFECT; af.duration = 2 * has_sphere(ch,SPHERE_TIME); af.bitvector = AFSPHERE_SLOW_TIME; sphere_to_char( victim, &af ); send_to_char( mage_affect_table[mage_affect_slot("Slowtime")].on_msg, victim ); act( "You lag the hell out of $N", ch, NULL, victim, TO_CHAR ); return; }