#include "include.h" int spellcraft_dam args( ( int num, int dice) ); bool check_spellcraft args( (CHAR_DATA *ch, int sn) ); char *target_name; void spell_transcendence(int sn, int level, CHAR_DATA *ch, void *vo, int target) { AFFECT_DATA af; if (cabal_down(ch,CABAL_COVEN)) return; if (is_affected(ch,sn)) return; if (IS_NPC(ch)) return; init_affect(&af); af.type = sn; af.aftype = AFT_SPELL; af.duration = 24; af.modifier = ch->max_mana / 2; af.bitvector = 0; af.where = TO_AFFECTS; af.location = APPLY_HIT; affect_to_char(ch, &af); af.location = APPLY_MANA; af.modifier = ch->max_hit / 2; affect_to_char(ch, &af); send_to_char("You focus as your mind and body become one.\n\r", ch ); return; } void spell_mana_rip(int sn, int level, CHAR_DATA *ch, void *vo, int target) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; if (cabal_down(ch,CABAL_COVEN)) return; if (victim == ch) { send_to_char("You can't drain your mind with your mind.\n\r", ch ); return; } if (IS_NPC(victim)) { dam = number_range(100,150); act("$n narrows $s eyes at $N and drains their mind mercilessly.",ch,0,victim,TO_NOTVICT); act("$n narrows $s eyes at you and drains your mind mercilessly.",ch,0,victim,TO_VICT); act("You lash out at $N with your mind and drain their energy.",ch,0,victim, TO_CHAR); damage_old(ch,victim,dam,sn,DAM_MENTAL,TRUE); return; } dam = number_range(50,60); if (saves_spell(level,victim,DAM_MENTAL)) { act("$n shivers slightly but isn't drained.",victim,0,0,TO_ROOM); damage_old(ch,victim,dam,sn,DAM_MENTAL,TRUE); return; } act("$n narrows $s eyes at $N and drains their mind mercilessly.",ch,0,victim,TO_NOTVICT); act("$n narrows $s eyes at you and drains your mind mercilessly.",ch,0,victim,TO_VICT); act("You lash out at $N with your mind and drain their energy.",ch,0,victim, TO_CHAR); damage_old(ch,victim,dam,sn,DAM_MENTAL,TRUE); if ( (victim->mana > victim->max_mana) || (victim->mana > dam) ) { victim->mana -= dam; ch->mana += dam; }else{ act("$N's mind has been completely drained.",ch,0,victim, TO_CHAR); } return; } void spell_rift(int sn, int level,CHAR_DATA *ch,void *vo, int target) { CHAR_DATA *victim; CHAR_DATA *group; CHAR_DATA *arrival; CHAR_DATA *g_next; ROOM_INDEX_DATA *VENUEPORT; CHAR_DATA *last_to_venue; int numb; char buf[MAX_STRING_LENGTH]; if (cabal_down(ch,CABAL_COVEN)) return; last_to_venue = ch; victim = get_char_world( ch, target_name ); if ( victim == NULL || victim == ch || victim->in_room == NULL || !can_see_room(ch,victim->in_room) || (victim->in_room->cabal != 0 && victim->in_room->cabal != CABAL_COVEN) || ch->in_room->guild != 0 || victim->in_room->guild != 0 || (IS_NPC(victim) && IS_SET(victim->imm_flags,IMM_SUMMON)) || IS_SET(victim->in_room->room_flags, ROOM_SAFE) || IS_SET(victim->in_room->room_flags, ROOM_PRIVATE) || IS_SET(victim->in_room->room_flags, ROOM_SOLITARY) || victim->level >= level + 9 || (saves_spell( level, victim,DAM_OTHER) ) || (!IS_NPC(victim) && !can_pk(ch,victim) && IS_SET(victim->act,PLR_NOSUMMON))) { send_to_char( "You failed.\n\r", ch ); return; } if (victim->in_room == ch->in_room) { send_to_char("You are standing right next to them.\n\r",ch); return; } VENUEPORT = get_room_index(ROOM_VNUM_VENUEPORT); numb = 1; for (group = ch->in_room->people; group != NULL; group = g_next) { g_next = group->next_in_room; if (!is_same_group(group,ch) || (group->fighting != NULL) ) continue; if (group == ch ) continue; numb++; affect_strip(group,gsn_ambush); sprintf(buf, "%s drains energy from the vortex and violently creates a rift.\n\r", ch->name ); send_to_char( buf, group ); sprintf(buf, "%s vanishes into the rift.\n\r", ch->name ); send_to_char( buf, group ); sprintf(buf, "You follow %s into the rift.\n\r", ch->name); send_to_char( buf, group ); send_to_char("\n\r",group); char_from_room(group); char_to_room(group,victim->in_room); act("$n steps out of the rift!",group,NULL,NULL,TO_ROOM); char_from_room(group); char_to_room(group, VENUEPORT); last_to_venue = group; if (is_affected(group,gsn_earthfade)) { affect_strip(group, gsn_earthfade); } } act("A dark rift opens up!",ch,NULL,NULL,TO_ROOM); act("$n steps into the rift and is gone.",ch,NULL,NULL,TO_ROOM); send_to_char("You drain energy from the vortex and violently create a rift.\n\r", ch ); send_to_char("You enter into the rift.\n\r", ch ); send_to_char("\n\r",ch); char_from_room(ch); char_to_room(ch,victim->in_room); act("A dark rift opens up.",ch,NULL,NULL,TO_ROOM); act("$n steps out of the rift!",ch,NULL,NULL,TO_ROOM); if (last_to_venue == ch) { do_look(ch,"auto"); return; } for (arrival = last_to_venue->in_room->people; arrival != NULL; arrival = g_next) { g_next = arrival->next_in_room; if (arrival == ch) continue; if ((is_same_group(arrival,ch)) && (arrival != ch) ) { char_from_room(arrival); char_to_room(arrival,ch->in_room); } } for (arrival = ch->in_room->people; arrival != NULL; arrival = arrival->next_in_room) { do_look(arrival,"auto"); if (--numb == 0) break; } return; } void spell_shifting_colors(int sn, int level, CHAR_DATA *ch, void *vo, int target) { CHAR_DATA *victim = (CHAR_DATA *) vo; OBJ_DATA *obj, *obj_next; int dam; if (cabal_down(ch,CABAL_COVEN)) return; if (check_spellcraft(ch,sn)) dam = spellcraft_dam( level, 9 ); else dam = dice( level, 9 ); act("$n streams forth a brilliant beam of light at $N.", ch,0,victim, TO_NOTVICT); act("$n streams forth a brilliant beam of light at you.", ch,0,victim,TO_VICT); act("You focus a stream of brilliant light at $N.", ch,0,victim, TO_CHAR); switch(number_range(1,6) ) { case 1: act("A blazing beam of white light strikes $N.",ch,0,victim, TO_NOTVICT); act("A blazing beam of white light strikes you.",ch,0,victim, TO_VICT); act("A blazing beam of white light strikes $N.",ch,0,victim, TO_CHAR); damage_old(ch,victim,dam,sn,DAM_LIGHT,TRUE); if (number_percent() < 2 * level); spell_blindness(gsn_blindness,level,ch,(void *) victim,TARGET_CHAR); break; case 2: act("An illuminating violet light strikes $N.",ch,0,victim, TO_NOTVICT); act("An illuminating violet light strikes you.",ch,0,victim, TO_VICT); act("An illuminating violet light strikes $N.",ch,0,victim, TO_CHAR); damage_old(ch,victim,dam,sn,DAM_FIRE,TRUE); if (!IS_AFFECTED(victim,AFF_BLIND) && !saves_spell(level / 4 + dam / 20, victim,DAM_FIRE)) { AFFECT_DATA af; act("$n eyes are seared by the violet light!",victim,NULL,NULL,TO_ROOM); act("Your eyes are seared by the violet light...you can't see a thing!", victim,NULL,NULL,TO_CHAR); init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SPELL; af.type = skill_lookup("shifting colors"); af.level = level; af.duration = number_range(0,level/10); af.location = APPLY_HITROLL; af.modifier = -4; af.bitvector = AFF_BLIND; affect_to_char(victim,&af); } for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; fire_effect(obj,level,dam,TARGET_OBJ); } break; case 3: act("A massive beam of pure red light strikes $N.",ch,0,victim, TO_NOTVICT); act("A massive beam of pure red light strikes you.",ch,0,victim, TO_VICT); act("A massive beam of pure red light strikes $N.",ch,0,victim, TO_CHAR); damage_old(ch,victim,dam,sn,DAM_MENTAL,TRUE); if (number_percent() > 25) { act("$N is knocked to the ground by the blast!",ch,NULL,victim,TO_ROOM); send_to_char("You are knocked to the ground by the blast!\n\r",victim); WAIT_STATE(victim, PULSE_VIOLENCE * 2); } break; case 4: act("A cold beam of blue light strikes $N.",ch,0,victim, TO_NOTVICT); act("A cold beam of blue light strikes you.",ch,0,victim, TO_VICT); act("A cold beam of blue light strikes $N.",ch,0,victim, TO_CHAR); damage_old(ch,victim,dam,sn,DAM_COLD,TRUE); for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; cold_effect(obj,level,dam,TARGET_OBJ); } break; case 5: act("A blazing beam of green light strikes $N.",ch,0,victim, TO_NOTVICT); act("A blazing beam of green light strikes you.",ch,0,victim, TO_VICT); act("A blazing beam of green light strikes $N.",ch,0,victim, TO_CHAR); damage_old(ch,victim,dam,sn,DAM_LIGHTNING,TRUE); if (saves_spell(level,victim,DAM_LIGHTNING)) { shock_effect(victim,level/2,dam/4,TARGET_CHAR); } break; case 6: act("A dark beam of black light strikes $N.",ch,0,victim, TO_NOTVICT); act("A dark beam of black light strikes you.",ch,0,victim, TO_VICT); act("A dark beam of black light strikes $N.",ch,0,victim, TO_CHAR); damage_old(ch,victim,dam,sn,DAM_NEGATIVE,TRUE); if (!IS_AFFECTED(victim,gsn_curse) && !saves_spell(level / 4 + dam / 20, victim,DAM_NEGATIVE)) { AFFECT_DATA af; act("$n is consumed by the dark beam of light!",victim,NULL,NULL,TO_ROOM); act("You are consumed by the dark beam of light and feel uncomfortable!", victim,NULL,NULL,TO_CHAR); init_affect(&af); af.where = TO_AFFECTS; af.aftype = AFT_SPELL; af.type = skill_lookup("shifting colors"); af.level = level; af.duration = number_range(0,level/8); af.location = APPLY_HITROLL; af.modifier = -ch->level / 8; af.bitvector = AFF_CURSE; affect_to_char(victim,&af); af.location = APPLY_SAVES; af.modifier = ch->level / 8; } break; } act("The beam of light flashes and fades.", ch,0,NULL, TO_ROOM); send_to_char("The beam of light flashes and fades.\n\r", ch ); return; }