/*************************************************************************** * 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. * * * * Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David * * Love, Guilherme 'Willie' Arnold, and Mitchell Tse. * * * * In order to use any part of this Envy Diku Mud, you must comply with * * the original Diku license in 'license.doc', the Merc license in * * 'license.txt', as well as the Envy license in 'license.nvy'. * * 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. * ***************************************************************************/ /*$Id: magic4.c,v 1.36 2005/03/23 19:18:22 ahsile Exp $*/ #if defined( macintosh ) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" int spell_aura_of_anti_magic( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_AURA_ANTI_MAGIC ) ) { affect_strip(victim, sn); if(skill_table[sn].msg_off) { send_to_char(C_DEFAULT, skill_table[sn].msg_off, victim ); send_to_char(C_DEFAULT, "\n\r", victim ); } act(C_DEFAULT, skill_table[sn].msg_off_room, victim, NULL, NULL, TO_NOTVICT); victim->shields -= 1; return SKPELL_NO_DAMAGE; } if ( !IS_SHIELDABLE( victim ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = -1; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_AURA_ANTI_MAGIC; affect_to_char3( victim, &af); victim->shields += 1; send_to_char(AT_PINK, "Your body is surrounded by an aura of anti-magic.\n\r", victim ); act(AT_PINK, "$n's body is surrounded by an aura of anti-magic.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_holy_protection( int sn, int level, CHAR_DATA *ch, void *vo) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_HOLY_PROTECTION ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = number_fuzzy(level / 10); af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_HOLY_PROTECTION; affect_to_char3( victim, &af); send_to_char(AT_WHITE, "You feel protected by the Gods.\n\r", victim ); return SKPELL_NO_DAMAGE; } int spell_soul_bind( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; OBJ_DATA *soulgem; if ( !IS_NPC(victim) || saves_spell( level, victim ) || IS_SET(victim->act, ACT_UNDEAD ) ) { send_to_char(AT_BLUE, "You failed.\n\r", ch); return SKPELL_MISSED; } if(IS_SIMM(victim, IMM_CHARM)) return SKPELL_MISSED; soulgem = create_object( get_obj_index( OBJ_VNUM_SOULGEM ), 0 ); soulgem->ac_vnum = victim->pIndexData->vnum; soulgem->level = ch->level; soulgem->timer = ch->level / 4; soulgem->cost = victim->level * 10; soulgem->ac_charge[0] = soulgem->ac_charge[1] = 1; obj_to_char( soulgem, ch); act(AT_BLUE, "You tear out $Ns soul, binding it to form a Soul Gem.", ch, NULL, victim, TO_CHAR); act(AT_BLUE, "$n tears out $Ns soul, binding it to form a Soul Gem.", ch, NULL, victim, TO_ROOM); act(AT_BLUE, "$N screams in agony as it slowly dissipates into nothingness!", ch, NULL, victim, TO_CHAR); act(AT_BLUE, "$N screams in agony as it slowly dissipates into nothingness!", ch, NULL, victim, TO_ROOM); act(AT_WHITE, "Your Soul is stolen by $n!", ch, NULL, victim, TO_VICT); if( IS_NPC( victim ) ) extract_char(victim, TRUE ); else extract_char( victim, FALSE ); return SKPELL_NO_DAMAGE; } int spell_blood_gout( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; if( saves_spell( level, victim ) ) return SKPELL_MISSED; dam = dice( 4, level ); if( ( ch->bp + dam ) > ( ch->max_bp ) ) ch->bp = ch->max_bp; else ch->bp += dam; // damage( ch, victim, dam, sn ); return dam; } int spell_bloodshield( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_BLOODSHIELD ) ) { affect_strip(victim, sn); if(skill_table[sn].msg_off) { send_to_char(C_DEFAULT, skill_table[sn].msg_off, victim ); send_to_char(C_DEFAULT, "\n\r", victim ); } act(C_DEFAULT, skill_table[sn].msg_off_room, victim, NULL, NULL, TO_NOTVICT); victim->shields -= 1; return SKPELL_NO_DAMAGE; } if ( !IS_SHIELDABLE( victim ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = -1; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_BLOODSHIELD; affect_to_char3( victim, &af ); victim->shields += 1; send_to_char(AT_BLOOD, "Your body is surrounded by swirling blood.\n\r", victim ); act(AT_BLOOD, "$n's body is surrounded by swirling blood.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_mother_natures_blessing( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( victim->position == POS_FIGHTING || is_affected( victim, sn ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = 40 + level; af.location = APPLY_DAMROLL; af.modifier = level / 5; af.bitvector = 0; affect_to_char( victim, &af ); af.location = APPLY_HITROLL; af.modifier = level / 5; affect_to_char( victim, &af ); send_to_char(AT_BLUE, "You pray to the gods of Nature.\n\r", ch ); send_to_char(AT_BLUE, "You feel the touch of Nature itself.\n\r", victim ); return SKPELL_NO_DAMAGE; } int spell_bark_skin( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( is_affected( ch, sn ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = level; af.location = APPLY_AC; af.modifier = -level/2; af.bitvector = 0; affect_to_char( victim, &af ); send_to_char(AT_GREY, "Your skin is covered in protective bark.\n\r", victim ); act(AT_GREY, "$n's skin becomes covered with protective bark.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_bend_light( int sn, int level, CHAR_DATA *ch, void *vo ) { AFFECT_DATA af; CHAR_DATA *victim = (CHAR_DATA *) vo; int SkNum; int yesno = FALSE; SkNum=skill_lookup("blindfold"); if (is_affected( victim, SkNum) || saves_spell( level, victim ) ) { affect_strip( victim, SkNum); send_to_char(AT_BLUE, "Your blindfold has been removed.\n\r", victim); send_to_char(AT_BLUE, "Your victim is no longer blindfolded.\n\r", ch); yesno = TRUE; } SkNum=skill_lookup("true sight"); if ( is_affected( victim, SkNum) || saves_spell( level, victim ) ) { affect_strip( victim, SkNum); send_to_char(AT_BLUE, "Your sight becomes untrue.\n\r", victim ); send_to_char(AT_BLUE, "Your victim's sight is no longer true.\n\r", ch); yesno = TRUE; } SkNum=skill_lookup("detect invis"); if ( is_affected( victim, SkNum) || saves_spell( level, victim ) ) { affect_strip( victim, SkNum); send_to_char(AT_BLUE, "You no longer see the invisible.\n\r", victim ); send_to_char(AT_BLUE, "Your victim can no longer see the invisible.\n\r", ch); yesno = TRUE; } SkNum=skill_lookup("detect hidden"); if ( is_affected( victim, SkNum) || saves_spell( level, victim ) ) { affect_strip( victim, SkNum); send_to_char(AT_BLUE, "You no longer can detect the hidden.\n\r", victim ); send_to_char(AT_BLUE, "Your victim can no longer detect the hidden.\n\r", ch); yesno = TRUE; } if (IS_AFFECTED3(victim,AFF_BEND_LIGHT) || saves_spell(level,victim)) { send_to_char(AT_BLUE, "You have failed in blinding your victim.\n\r", ch); return SKPELL_MISSED; } else { af.type = sn; af.level = level; af.duration = level / 25; af.location = APPLY_HITROLL; af.modifier = -(level/4); af.bitvector = AFF_BEND_LIGHT; affect_to_char3( victim, &af ); af.location = APPLY_DAMROLL; af.modifier = -(level/4); affect_to_char3( victim, &af ); send_to_char(AT_BLUE, "You have blinded your victim.\n\r", ch ); send_to_char(AT_BLUE, "You have become blinded!\n\r", victim ); } if ( ch != victim && yesno ) { send_to_char(C_DEFAULT, "Darkness overcomes you as the light bends around you.\n\r", victim); send_to_char(AT_WHITE, "The illusion of darkness is successful!\n\r", ch ); act(AT_GREY, "The illusion of darkness envelops $N !\n\r", victim, NULL, victim, TO_ROOM); } return SKPELL_NO_DAMAGE; } int spell_cloud_of_healing( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_CLOUD_OF_HEALING) ) return SKPELL_MISSED; af.type = sn; af.level = ch->level; af.duration = number_fuzzy(ch->level/4); af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_CLOUD_OF_HEALING; affect_to_char3(victim, &af); send_to_char(AT_BLUE, "A small cloud hovers over your head.\n\r",ch); act(AT_BLUE, "$n has a small cloud hovering over their head.", victim, NULL, NULL, TO_ROOM); return SKPELL_NO_DAMAGE; } int spell_earthblast( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int count; int chance; int chance2; count = 1; chance = 100; if (!IS_NPC(victim ) ) { while ((chance > 25) && (victim->hit > 0)) { chance2 = number_range(2,10); act(AT_ORANGE, "The earth ERRUPTS under $n.\n\r",victim,NULL, NULL,TO_ROOM); damage(ch, victim, ch->level*chance2, sn); count = count + 1; chance = number_range(1,100/count); } } if (IS_NPC(victim ) ) { while ((chance > 15) && (victim->hit > 0)) { chance2 = number_range(2,20); act(AT_ORANGE, "The earth ERRUPTS under $n.\n\r",victim,NULL, NULL,TO_ROOM); damage(ch, victim, ch->level*chance2, sn); count = count + 1; chance = number_range(1,100/count); } } return SKPELL_NO_DAMAGE; } int spell_tale_of_terror( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_TALE_OF_TERROR) ) return SKPELL_MISSED; af.type = sn; af.level = ch->level; af.duration = number_fuzzy(ch->level/33); af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_TALE_OF_TERROR; affect_to_char3(victim, &af); send_to_char(AT_BLUE, "The horror story instills fear into you.\n\r", victim); act(AT_BLUE, "$n looks a little frightened.", victim, NULL,NULL, TO_ROOM); return SKPELL_NO_DAMAGE; } int spell_power_leak( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_POWER_LEAK) ) return SKPELL_MISSED; af.type = sn; af.level = ch->level; af.duration = number_fuzzy(ch->level/5); af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_POWER_LEAK; affect_to_char3(victim, &af); send_to_char(AT_CYAN, "You feel a tap on your resources.\n\r",victim); act(AT_CYAN, "$n face pales.", victim,NULL,NULL,TO_ROOM); return SKPELL_NO_DAMAGE; } void do_multiburst( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; int mana; int sn = 0; int mana2; int sn2 = 0; int WAIT1; int WAIT2; int WAIT_FINAL; int mana_final; int intreq = 0; int intreq1 = 0; int intreq2 = 0; int intreq3 = 0; char arg1 [ MAX_INPUT_LENGTH ]; char arg2 [ MAX_INPUT_LENGTH ]; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( ( !IS_NPC( ch ) && ((ch->level < skill_table[skill_lookup("multiburst")].skill_level[ch->class] ) && (ch->level < skill_table[skill_lookup("multiburst")].skill_level[ch->multied])))) { send_to_char(C_DEFAULT, "You'd better leave the spellcasting to the spellcasters.\n\r", ch ); return; } if ( IS_NPC( ch ) ) return; if (arg2[0] == '\0' ) { send_to_char(C_DEFAULT, "Multiburst requires 2 spells.\n\r", ch ); return; } /* Design a checkalign(), set do_cast do_quickburst and this */ if ( !IS_NPC( ch ) ) if ( ( sn = skill_lookup( arg1 ) ) < 0 || ((ch->level < skill_table[sn].skill_level[ch->class]) && (ch->level < skill_table[sn].skill_level[ch->multied]) )) { send_to_char(AT_BLUE, "You can't do that.\n\r", ch ); return; } if (!skill_table[sn].is_spell) { send_to_char(AT_WHITE, "Casting a skill? Try using it...\n\r", ch); return; } if ( !IS_NPC( ch ) ) if ( ( sn2 = skill_lookup( arg2 ) ) < 0 || ((ch->level < skill_table[sn2].skill_level[ch->class]) && (ch->level < skill_table[sn2].skill_level[ch->multied]) )) { send_to_char(AT_BLUE, "You can't do that.\n\r", ch ); return; } if (!skill_table[sn2].is_spell) { send_to_char(AT_WHITE, "Casting a skill? Try using it...", ch); return; } if ( !IS_NPC( ch ) ) if ( ch->class == CLASS_BARBARIAN || ch->multied == CLASS_BARBARIAN ) { if ( skill_table[sn].skill_level[ch->class] > 60 && skill_table[sn].skill_level[ch->multied] > 60 ) { send_to_char(C_DEFAULT, "Barbarians can not cast magic of such high level.\n\r", ch); return; } } if ( !IS_NPC( ch ) ) if ( ch->class == CLASS_BARBARIAN || ch->multied == CLASS_BARBARIAN ) { if ( skill_table[sn2].skill_level[ch->class] > 60 && skill_table[sn2].skill_level[ch->multied] > 60 ) { send_to_char(C_DEFAULT, "Barbarians can not cast magic of such high level.\n\r", ch ); return; } } if ( !IS_NPC( ch ) ) if ( ( ch->race == 10 && IS_EVIL( ch ) ) || ( ch->race == 10 && IS_NEUTRAL( ch ) ) || ( ch->race == 15 && IS_GOOD( ch ) ) || ( ch->race == 15 && IS_NEUTRAL( ch ) ) || ( ch->class == CLASS_CLERIC && IS_EVIL( ch ) ) || ( ch->multied == CLASS_CLERIC && IS_EVIL( ch ) ) || ( ch->class == CLASS_PALADIN && IS_EVIL( ch ) ) || ( ch->multied == CLASS_PALADIN && IS_EVIL( ch ) ) || ( ch->class == CLASS_ANTI_PALADIN && IS_GOOD( ch ) ) || ( ch->multied == CLASS_ANTI_PALADIN && IS_GOOD( ch ) ) || ( ch->class == CLASS_DARKPRIEST && IS_GOOD( ch ) ) || ( ch->multied == CLASS_DARKPRIEST && IS_GOOD( ch ) ) ) { send_to_char(AT_BLUE, "You can not cast when you are that alignment.\n\r", ch); return; } if ( !ch->fighting ) { send_to_char(C_DEFAULT, "You aren't fighting anyone.\n\r", ch ); return; } if( IS_AFFECTED2( ch, AFF_SLIT ) ) { send_to_char(AT_BLOOD, "Your throat is slit, you can not cast.\n\r", ch ); return; } if( IS_STUNNED( ch, STUN_MAGIC ) ) { send_to_char(AT_LBLUE, "You're too stunned to cast spells.\n\r", ch ); return; } if ( ch->position < skill_table[sn].minimum_position ) { send_to_char(AT_BLUE, "You can't concentrate enough.\n\r", ch ); return; } if ( ch->position < skill_table[sn2].minimum_position ) { send_to_char(AT_BLUE, "You can't concentrate enough.\n\r", ch ); return; } if ( skill_table[sn].target == TAR_GROUP_OFFENSIVE || skill_table[sn].target == TAR_GROUP_DEFENSIVE || skill_table[sn].target == TAR_GROUP_IGNORE || skill_table[sn].target == TAR_GROUP_OBJ || skill_table[sn].target == TAR_GROUP_ALL ) { send_to_char(AT_BLUE, "You can't multiburst group spells!\n\r", ch); return; } if ( skill_table[sn2].target == TAR_GROUP_OFFENSIVE || skill_table[sn2].target == TAR_GROUP_DEFENSIVE || skill_table[sn2].target == TAR_GROUP_IGNORE || skill_table[sn2].target == TAR_GROUP_OBJ || skill_table[sn2].target == TAR_GROUP_ALL ) { send_to_char(AT_BLUE, "You can't multiburst group spells!\n\r", ch); return; } mana = 0; if ( !IS_NPC( ch ) && ch->level >= skill_table[sn].skill_level[ch->multied] ) { mana = MANA_COST_MULTI( ch, sn ); intreq1 = ( skill_table[sn].skill_level[ch->multied] / 2 ) - 5; if( intreq1 >= 40 ) { intreq1 = 40; } } if ( !IS_NPC( ch ) && ch->level >= skill_table[sn].skill_level[ch->class] ) { mana = MANA_COST( ch, sn ); intreq2 = ( skill_table[sn].skill_level[ch->class] / 2 ) - 5; if( intreq2 >= 40 ) { intreq2 = 40; } } intreq = UMIN( intreq1, intreq2 ); mana2 = 0; if ( !IS_NPC( ch ) && ch->level >= skill_table[sn2].skill_level[ch->multied] ) { mana2= MANA_COST_MULTI( ch, sn2 ); intreq1 = ( skill_table[sn2].skill_level[ch->multied] / 2 ) - 5; if( intreq1 >= 40 ) { intreq1 = 40; } } if ( !IS_NPC( ch ) && ch->level >= skill_table[sn2].skill_level[ch->class] ) { mana2 = MANA_COST( ch, sn2 ); intreq2 = ( skill_table[sn2].skill_level[ch->class] / 2 ) - 5; if( intreq2 >= 40 ) { intreq2 = 40; } } intreq3 = UMIN( intreq1, intreq2 ); intreq = UMAX( intreq, intreq3 ); mana_final = ( mana + mana2 ) * 3 / 4; if ( ch->class == CLASS_VAMPIRE || ch->class == CLASS_ANTI_PALADIN ) { mana_final /= 4; } if(ch->class != CLASS_CLERIC && ch->class != CLASS_DARKPRIEST ) { if( get_curr_int( ch ) < intreq ) { send_to_char(AT_BLUE, "You do not have the required intelligence.\n\r", ch ); return; } } if(ch->class == CLASS_CLERIC || ch->class == CLASS_DARKPRIEST) { if( get_curr_wis( ch ) < intreq ) { send_to_char(AT_BLUE, "You do not have the required wisdom.\n\r", ch ); return; } } victim = ch->fighting; update_skpell( ch, skill_lookup("multiburst"), 0 ); /* Make sure the spell is offensive, and NOT area-affecting */ /* Make sure the other spell is too */ WAIT1 = ( skill_table[sn].beats ); WAIT2 = ( skill_table[sn2].beats ); WAIT_FINAL = ( WAIT1 + WAIT2 ) * 3 / 4; WAIT_STATE( ch, WAIT_FINAL); mana = mana_final; if ( ( ch->class != CLASS_VAMPIRE ) && ( ch->class != CLASS_ANTI_PALADIN ) && ( ch->mana < mana ) ) { send_to_char(AT_BLUE, "You don't have enough mana.\n\r", ch ); return; } else if ( ( ch->bp < mana ) && (( ch->class == CLASS_VAMPIRE )||( ch->class == CLASS_ANTI_PALADIN))) { send_to_char(AT_RED, "You are to starved to cast, you must feed.\n\r", ch ); return; } if ( IS_SET( ch->in_room->room_flags, ROOM_NO_MAGIC ) ) { send_to_char(AT_BLUE, "You failed.\n\r", ch ); return; } if ( number_percent( ) > ( ch->pcdata->learned[sn] / 10 ) || ( number_percent( ) > ch->pcdata->learned[skill_lookup("multiburst")] / 10 ) ) { send_to_char(AT_BLUE, "You lost your concentration.\n\r", ch ); if (( ch->class != CLASS_VAMPIRE )&&( ch->class != CLASS_ANTI_PALADIN)) ch->mana -= mana / 2; else ch->bp -= mana / 2; if( ch->pcdata->learned[sn] <= 750 ) update_skpell( ch, sn, 0 ); } else { int dmg = 0; int dmg2 = 0; if (( ch->class != CLASS_VAMPIRE )&&(ch->class != CLASS_ANTI_PALADIN)) ch->mana -= mana; else ch->bp -= mana; if ( ( IS_AFFECTED2( ch, AFF_CONFUSED ) ) && number_percent( ) < 10 ) { act(AT_YELLOW, "$n looks around confused at what's going on.", ch, NULL, NULL, TO_ROOM ); send_to_char( AT_YELLOW, "You become confused and botch the spell.\n\r", ch ); return; } if (ch->pcdata->learned[skill_lookup("psionic casting")]) update_skpell(ch, skill_lookup("psionic casting"), 0); send_to_char( AT_BLUE, "You release a burst of energy!\n\r", ch ); act( AT_BLUE, "$n releases a burst of energy.", ch, NULL, NULL, TO_ROOM); if (skill_table[sn].target== TAR_CHAR_SELF) { dmg = (*skill_table[sn].spell_fun) (sn, URANGE( 1, ch->level, LEVEL_DEMIGOD), ch, ch); if (dmg > SKPELL_NO_DAMAGE) { damage( ch, ch, dmg, sn ); } } else { dmg = (*skill_table[sn].spell_fun) ( sn, URANGE( 1, ch->level, LEVEL_DEMIGOD ), ch, victim ); if (dmg > SKPELL_NO_DAMAGE) { damage( ch, victim, dmg, sn ); } } if (dmg >= SKPELL_NO_DAMAGE) update_skpell( ch, sn, 0 ); if (skill_table[sn2].target== TAR_CHAR_SELF) { dmg2 = (*skill_table[sn2].spell_fun) (sn2, URANGE( 1, ch->level, LEVEL_DEMIGOD), ch, ch); if (dmg2 > SKPELL_NO_DAMAGE) { damage( ch, victim, dmg2, sn2 ); } } else { dmg2 = (*skill_table[sn2].spell_fun) ( sn2, URANGE( 1, ch->level, LEVEL_DEMIGOD ), ch, victim ); if (dmg2 > SKPELL_NO_DAMAGE) { damage( ch, victim, dmg2, sn2 ); } } if (dmg2 >= SKPELL_NO_DAMAGE) update_skpell( ch, sn2, 0 ); } } int spell_unholy_sword_spell( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( victim->position == POS_FIGHTING || is_affected( victim, sn ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = number_fuzzy( (int)(level * 1.5) ); af.modifier = number_fuzzy( (int)(level * 5) ); af.location = APPLY_HIT; af.bitvector = 0; affect_to_char( victim, &af ); send_to_char( AT_RED, "Your unholy weapon glows with a black light.\n\r", ch ); act(AT_RED, "$n's unholy weapon glows with a black light.", ch, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_holy_sword_spell( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( victim->position == POS_FIGHTING || is_affected( victim, sn ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = number_fuzzy( (int)(level * 1.5) ); af.modifier = number_fuzzy( (int)(level * 5) ); af.location = APPLY_HIT; af.bitvector = 0; affect_to_char( victim, &af ); send_to_char( AT_YELLOW, "Your holy weapon glows with a bright light.\n\r", ch ); act(AT_RED, "$n's holy weapon glows with a bright light.", ch, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_unholysword( int sn, int level, CHAR_DATA *ch, void *vo ) { OBJ_DATA *obj = (OBJ_DATA *) vo; AFFECT_DATA *paf; if ( obj->item_type != ITEM_WEAPON || IS_OBJ_STAT( obj, ITEM_MAGIC ) || obj->affected ) { send_to_char(AT_BLUE, "That item cannot be consecrated.\n\r", ch ); return SKPELL_MISSED; } paf = new_affect(); paf->type = sn; paf->duration = -1; paf->location = APPLY_HITROLL; paf->modifier = 16 + (level >= 18) + (level >= 25) + (level >= 40) + (level >= 60) +(level >= 90); paf->bitvector = 0; paf->next = obj->affected; obj->affected = paf; paf = new_affect(); paf->type = sn; paf->duration = -1; paf->location = APPLY_DAMROLL; paf->modifier = 16 + (level >= 18) + (level >= 25) + (level >= 45) + (level >= 65) +(level >= 90);; paf->bitvector = 0; paf->next = obj->affected; obj->affected = paf; paf = new_affect(); paf->type = sn; paf->duration = -1; paf->location = APPLY_HIT; paf->modifier = 90 + ( (level >=18) * 10) + ( (level >=25) * 10) + ( (level >= 45) * 10) + ( (level >= 65) * 10) + ( ( level >= 85) * 10 ) ;; paf->bitvector = 0; paf->next = obj->affected; obj->affected = paf; obj->ac_type = 5; obj->ac_spell = skill_table[skill_lookup("unholy enchantment")].name; obj->ac_charge[0] = 1; obj->ac_charge[1] = 1; if ( IS_GOOD( ch ) ) { SET_BIT( obj->extra_flags, ITEM_ANTI_EVIL); act(AT_YELLOW, "$p glows.", ch, obj, NULL, TO_CHAR ); } else if ( IS_EVIL( ch ) ) { SET_BIT( obj->extra_flags, ITEM_ANTI_GOOD ); act(AT_RED, "$p glows", ch, obj, NULL, TO_CHAR ); } else { SET_BIT( obj->extra_flags, ITEM_ANTI_EVIL ); SET_BIT( obj->extra_flags, ITEM_ANTI_GOOD ); act(AT_WHITE, "$p glows.", ch, obj, NULL, TO_CHAR ); } if( ch->multied == CLASS_MAGE || ch->class == CLASS_MAGE ) { SET_BIT( obj->extra_flags3, ITEM_PRO_MAGE ); } if( ch->multied == CLASS_CLERIC || ch->class == CLASS_CLERIC ) { SET_BIT( obj->extra_flags3, ITEM_PRO_CLERIC ); } if( ch->multied == CLASS_THIEF || ch->class == CLASS_THIEF ) { SET_BIT( obj->extra_flags3, ITEM_PRO_THIEF ); } if( ch->multied == CLASS_WARRIOR || ch->class == CLASS_WARRIOR ) { SET_BIT( obj->extra_flags3, ITEM_PRO_WARRIOR ); } if( ch->multied == CLASS_PSIONICIST || ch->class == CLASS_PSIONICIST ) { SET_BIT( obj->extra_flags3, ITEM_PRO_PSI ); } if( ch->multied == CLASS_DRUID || ch->class == CLASS_DRUID ) { SET_BIT( obj->extra_flags3, ITEM_PRO_DRUID ); } if( ch->multied == CLASS_RANGER || ch->class == CLASS_RANGER ) { SET_BIT( obj->extra_flags3, ITEM_PRO_RANGER ); } if( ch->multied == CLASS_PALADIN || ch->class == CLASS_PALADIN ) { SET_BIT( obj->extra_flags3, ITEM_PRO_PALADIN ); } if( ch->multied == CLASS_BARD || ch->class == CLASS_BARD ) { SET_BIT( obj->extra_flags3, ITEM_PRO_BARD ); } if( ch->multied == CLASS_VAMPIRE || ch->class == CLASS_VAMPIRE ) { SET_BIT( obj->extra_flags3, ITEM_PRO_VAMP ); } if( ch->multied == CLASS_WEREWOLF || ch->class == CLASS_WEREWOLF ) { SET_BIT( obj->extra_flags3, ITEM_PRO_WEREWOLF ); } if( ch->multied == CLASS_ANTI_PALADIN || ch->class == CLASS_ANTI_PALADIN ) { SET_BIT( obj->extra_flags3, ITEM_PRO_ANTIPAL ); } if( ch->multied == CLASS_ASSASSIN || ch->class == CLASS_ASSASSIN ) { SET_BIT( obj->extra_flags3, ITEM_PRO_ASSASSIN ); } if( ch->multied == CLASS_MONK || ch->class == CLASS_MONK ) { SET_BIT( obj->extra_flags3, ITEM_PRO_MONK ); } if( ch->multied == CLASS_BARBARIAN || ch->class == CLASS_BARBARIAN ) { SET_BIT( obj->extra_flags3, ITEM_PRO_BARBARIAN ); } if( ch->multied == CLASS_ILLUSIONIST || ch->class == CLASS_ILLUSIONIST ) { SET_BIT( obj->extra_flags3, ITEM_PRO_ILLUSIONIST ); } if( ch->multied == CLASS_NECROMANCER || ch->class == CLASS_NECROMANCER ) { SET_BIT( obj->extra_flags3, ITEM_PRO_NECROMANCER ); } if( ch->multied == CLASS_DEMONOLOGIST || ch->class == CLASS_DEMONOLOGIST ) { SET_BIT( obj->extra_flags3, ITEM_PRO_DEMONOLOGIST ); } if( ch->multied == CLASS_SHAMAN || ch->class == CLASS_SHAMAN ) { SET_BIT( obj->extra_flags3, ITEM_PRO_SHAMAN ); } if( ch->multied == CLASS_DARKPRIEST || ch->class == CLASS_DARKPRIEST ) { SET_BIT( obj->extra_flags3, ITEM_PRO_DARKPRIEST ); } send_to_char(AT_BLUE, "Ok.\n\r", ch ); return SKPELL_NO_DAMAGE; } int spell_daggers_of_pain( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; static const int dam_each [ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260 }; int dam; level = UMIN( level, sizeof( dam_each ) / sizeof( dam_each[0] ) - 1 ); level = UMAX( 0, level ); dam = number_range( dam_each[level], dam_each[level] * 7 ); if ( saves_spell( level, victim ) ) dam /= 2; //damage( ch, victim, dam, sn ); return dam; } int spell_spectral_armor( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( is_affected( victim, sn ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = level / 2 + 30; af.location = APPLY_AC; af.modifier = -50; af.bitvector = 0; affect_to_char( victim, &af ); if ( ch != victim ) send_to_char(AT_BLUE, "Ok.\n\r", ch ); send_to_char(AT_BLUE, "You feel spectral forces protecting you.\n\r", victim ); return SKPELL_NO_DAMAGE; } int spell_wisp_of_protection( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( is_affected( victim, sn ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = 8 + level; af.location = APPLY_AC; af.modifier = ( level / 2 ) * -1; af.bitvector = 0; affect_to_char( victim, &af ); send_to_char(AT_BLUE, "You are surrounded by a wisp of protection.\n\r", victim ); act(AT_BLUE, "$n is surrounded by a wisp of protection.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_breathe_water( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_GILLS ) ) return SKPELL_MISSED; af.type = sn; af.duration = 2 * level / 3 ; af.location = APPLY_NONE; af.modifier = 0; af.level = ch->level; af.bitvector = AFF_GILLS; affect_to_char3( victim, &af ); send_to_char( AT_BLUE, "You can now breathe underwater.\n\r", victim ); act( AT_BLUE, "$n can now breathe underwater.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_mark( int sn, int level, CHAR_DATA *ch, void *vo ) { OBJ_DATA *obj = (OBJ_DATA *) vo; if ( obj->item_type != ITEM_RUNE || IS_OBJ_STAT( obj, ITEM_MAGIC ) ) { send_to_char(AT_BLUE, "That item cannot be marked.\n\r", ch ); return SKPELL_MISSED; } if ( !IS_SET( ch->in_room->area->area_flags, AREA_PRESENT ) ) { send_to_char(C_DEFAULT, "Sorry, you can not recall while in the future or past.\n\r", ch ); return SKPELL_MISSED; } if( IS_SET( ch->in_room->room_flags, ROOM_NO_ASTRAL_IN ) || IS_SET( ch->in_room->room_flags, ROOM_NO_ASTRAL_OUT ) || IS_SET( ch->in_room->area->area_flags, AREA_PROTOTYPE ) ) { send_to_char(C_DEFAULT, "Sorry, you can not mark here.\n\r", ch ); return SKPELL_MISSED; } obj->value[0] = ch->in_room->vnum; SET_BIT( obj->extra_flags, ITEM_MAGIC); send_to_char(AT_BLUE, "Ok.\n\r", ch ); return SKPELL_NO_DAMAGE; } int spell_rune_recall( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim; ROOM_INDEX_DATA *location; char buf [ MAX_STRING_LENGTH ]; int place; char name[ MAX_STRING_LENGTH ]; OBJ_DATA *obj = (OBJ_DATA *) vo; if ( obj->item_type != ITEM_RUNE ) { send_to_char( C_DEFAULT, "That is not a rune.\n\r", ch ); return SKPELL_MISSED; } if ( !IS_OBJ_STAT( obj, ITEM_MAGIC ) ) { send_to_char( C_DEFAULT, "That rune is not marked.\n\r", ch ); return SKPELL_MISSED; } place = obj->value[0]; if ( !( location = get_room_index( place ) ) ) { send_to_char(C_DEFAULT, "You are completely lost.\n\r", ch ); return SKPELL_MISSED; } act(C_DEFAULT, "$n prays for transportation!", ch, NULL, NULL, TO_ROOM ); if ( ch->in_room == location ) return SKPELL_MISSED; if ( IS_AFFECTED( ch, AFF_CURSE ) || IS_SET( ch->in_room->room_flags, ROOM_NO_RECALL ) ) { act(C_DEFAULT, "The Gods have forsaken you.", ch, NULL, name, TO_CHAR ); return SKPELL_MISSED; } if ( IS_SET(location->room_flags, ROOM_SAFE) && ch->pkill && (ch->combat_timer > 0)) { send_to_char(AT_RED, "Your blood is too hot to recall there!", ch); return SKPELL_MISSED; } if ( ( victim = ch->fighting ) ) { int lose; if ( number_bits( 1 ) == 0 ) { WAIT_STATE( ch, 4 ); lose = ( ch->desc ) ? 50 : 100; gain_exp( ch, 0 - lose ); sprintf( buf, "You failed! You lose %d exps.\n\r", lose ); send_to_char(C_DEFAULT, buf, ch ); return SKPELL_MISSED; } lose = ( ch->desc ) ? 100 : 200; gain_exp( ch, 0 - lose ); sprintf( buf, "You recall from combat! You lose %d exps.\n\r", lose ); send_to_char(C_DEFAULT, buf, ch ); stop_fighting( ch, TRUE ); } act(C_DEFAULT, "$n disappears.", ch, NULL, NULL, TO_ROOM ); char_from_room( ch ); char_to_room( ch, location ); act(C_DEFAULT, "$n appears in the room.", ch, NULL, NULL, TO_ROOM ); do_look( ch, "auto" ); return SKPELL_NO_DAMAGE; } int spell_nagaroms_curse( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_NAGAROMS_CURSE ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = number_fuzzy( level ); af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_NAGAROMS_CURSE; affect_to_char3( victim, &af ); send_to_char(AT_BLUE, "You feel the wrath of Nagarom!\n\r", victim ); act(AT_BLUE, "$n's suffers from Nagaroms Curse.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_prayer( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_PRAYER ) ) return SKPELL_MISSED; af.duration = ch->level / 3; af.level = ch->level; af.type = sn; af.bitvector = AFF_PRAYER; af.location = APPLY_HIT; af.modifier = number_range( ch->level, ch->level * 5 ); affect_to_char3(ch, &af); af.location = APPLY_MANA; af.modifier = number_range( ch->level / 2, ch->level ); if (( ch->class == 9 )||( ch->class == 11 )) { af.location = APPLY_BP; af.modifier /= 4; } affect_to_char3( ch, &af ); af.location = APPLY_INT; af.modifier = ((ch->level - 1) / 50) + 1; affect_to_char3( ch, &af ); af.location = APPLY_DEX; af.modifier = ((ch->level - 1) / 50) + 1; affect_to_char3( ch, &af ); send_to_char( AT_BLUE, "The Gods place their blessings upon you.\n\r", ch); send_to_char( AT_GREY, "You fall to the ground, unconscious.\n\r", ch ); act( AT_GREY, "$n falls to the ground, unconscious.", ch, NULL, NULL, TO_ROOM ); STUN_CHAR( ch, 4, STUN_COMMAND ); return SKPELL_NO_DAMAGE; } int spell_lullaby( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED( victim, AFF_SLEEP ) || level < victim->level || ( saves_spell(level + IS_SRES(victim, RES_MAGIC) ? -5 : 0, victim) && !(get_trust( ch ) > 100) ) ) { send_to_char(AT_BLUE, "You failed.\n\r", ch ); return SKPELL_MISSED; } if(IS_SIMM(victim, IMM_MAGIC)) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = 4 + level; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_SLEEP; affect_join( victim, &af ); if ( IS_AWAKE( victim ) ) { send_to_char(AT_BLUE, "You feel very sleepy ..... zzzzzz.\n\r", victim ); if ( victim->position == POS_FIGHTING ) stop_fighting( victim, TRUE ); do_sleep( victim, "" ); } return SKPELL_NO_DAMAGE; } int spell_randomshield( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED3( victim, AFF_RANDOMSHIELD ) ) { affect_strip(victim, sn); if(skill_table[sn].msg_off) { send_to_char(C_DEFAULT, skill_table[sn].msg_off, victim ); send_to_char(C_DEFAULT, "\n\r", victim ); } act(C_DEFAULT, skill_table[sn].msg_off_room, victim, NULL, NULL, TO_NOTVICT); victim->shields -= 1; return SKPELL_NO_DAMAGE; } if ( !IS_SHIELDABLE( victim ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = -1; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_RANDOMSHIELD; affect_to_char3( victim, &af ); victim->shields += 1; send_to_char(AT_GREY, "You bring forth a plethora of random illusions.\n\r", victim); act(AT_GREY, "$n's body is surrounded by a plethora of random illusions.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_sonic_blast( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; static const int dam_each [ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260 }; int dam; level = UMIN( level, sizeof( dam_each ) / sizeof( dam_each[0] ) - 1 ); level = UMAX( 0, level ); dam = number_range( dam_each[level], dam_each[level] * 6 ); if ( saves_spell( level, victim ) ) dam /= 2; //damage( ch, victim, dam, sn ); return dam; } int spell_sonic_boom( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; static const int dam_each [ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260 }; int dam; level = UMIN( level, sizeof( dam_each ) / sizeof( dam_each[0] ) - 1 ); level = UMAX( 0, level ); dam = number_range( dam_each[level] * 3, dam_each[level] * 10 ); if ( saves_spell( level, victim ) ) dam /= 2; //damage( ch, victim, dam, sn ); return dam; } int spell_hellfire( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; static const int dam_each [ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, 440, 445, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550 }; int dam; level = UMIN( level, sizeof( dam_each ) / sizeof( dam_each[0] ) - 1 ); level = UMAX( 0, level ); dam = number_range( dam_each[level] / 2, dam_each[level] * 5 ); if ( saves_spell( level, victim ) ) dam /= 2; //damage( ch, victim, dam, sn ); return dam; } int spell_resurrection( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; if( IS_NPC( victim ) ) { send_to_char(C_DEFAULT, "You can not resurrect a non-player character.\n\r", ch ); return SKPELL_MISSED; } if( IS_NPC( ch ) || ( ( IS_EVIL( ch ) && ( IS_EVIL( victim ) || IS_NEUTRAL( victim ) ) ) || ( IS_GOOD( ch ) && ( IS_GOOD( victim ) || IS_NEUTRAL( victim ) ) ) ) ) { if( victim->position != POS_GHOST ) { send_to_char( C_DEFAULT, "That character is not dead!\n\r", ch ); return SKPELL_MISSED; } victim->position = POS_STANDING; update_pos( victim ); send_to_char(AT_GREY, "You leave the ethereal plane and become whole once again.\n\r", victim); act(AT_GREY, "$n's leaves the etheral plane and becomes whole once again.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } else { send_to_char(C_DEFAULT, "You can not resurrect someone of that alignment.\n\r", ch ); return SKPELL_MISSED; } } int spell_earthshield( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED4( victim, AFF_EARTHSHIELD ) ) { affect_strip(victim, sn); if(skill_table[sn].msg_off) { send_to_char(C_DEFAULT, skill_table[sn].msg_off, victim ); send_to_char(C_DEFAULT, "\n\r", victim ); } act(C_DEFAULT, skill_table[sn].msg_off_room, victim, NULL, NULL, TO_NOTVICT); victim->shields -= 1; return SKPELL_NO_DAMAGE; } if ( !IS_SHIELDABLE( victim ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = -1; af.location = APPLY_DAM_WIND; if( ( ( ch->level / 2 ) -10 ) <= 0 ) { af.modifier = 0; } else { af.modifier = (ch->level/2)-10; } af.bitvector = AFF_EARTHSHIELD; affect_to_char4( victim, &af ); victim->shields += 1; send_to_char(AT_ORANGE, "Your body is surrounded by an earthen shield.\n\r", victim ); act(AT_ORANGE, "$n's body is surrounded by an earthen shield.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_leaf_shield( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED4( victim, AFF_LEAF_SHIELD ) ) { affect_strip(victim, sn); if(skill_table[sn].msg_off) { send_to_char(C_DEFAULT, skill_table[sn].msg_off, victim ); send_to_char(C_DEFAULT, "\n\r", victim ); } act(C_DEFAULT, skill_table[sn].msg_off_room, victim, NULL, NULL, TO_NOTVICT); victim->shields -= 1; return SKPELL_NO_DAMAGE; } if ( !IS_SHIELDABLE( victim ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = -1; af.location = APPLY_DAM_EARTH; if( ( ( ch->level / 2 ) -20 ) <= 0 ) { af.modifier = 0; } else { af.modifier = (ch->level/2)-20; } af.bitvector = AFF_LEAF_SHIELD; affect_to_char4( victim, &af ); victim->shields += 1; send_to_char(AT_DGREEN, "Your body is surrounded by swirling leaves.\n\r", victim ); act(AT_DGREEN, "$n's body is surrounded by swirling leaves.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_leaf_strike( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; static const int dam_each [ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260 }; int dam; level = UMIN( level, sizeof( dam_each ) / sizeof( dam_each[0] ) - 1 ); level = UMAX( 0, level ); dam = number_range( dam_each[level] / 2, dam_each[level] * 7 ); if ( saves_spell( level, victim ) ) dam /= 2; //damage( ch, victim, dam, sn ); return dam; } int spell_shards_of_glass( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; static const int dam_each [ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, 440, 445, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550 }; int dam; level = UMIN( level, sizeof( dam_each ) / sizeof( dam_each[0] ) - 1 ); level = UMAX( 0, level ); dam = number_range( dam_each[level], dam_each[level] * 5 ); if ( saves_spell( level, victim ) ) dam /= 2; //damage( ch, victim, dam, sn ); return dam; } int spell_circle_of_love( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *vch; AFFECT_DATA af; for ( vch = char_list; vch; vch = vch->next ) { if ( vch->deleted || !vch->in_room ) continue; if ( vch->in_room == ch->in_room && vch->position != POS_GHOST ) { if ( !is_affected(vch, sn)) { af.type = sn; af.level = level; af.duration = level /3; af.location = APPLY_HITROLL; af.modifier = number_fuzzy( level / 4 ); af.bitvector = 0; affect_to_char( vch, &af ); af.location = APPLY_DAMROLL; af.modifier = number_fuzzy( level / 3 ); affect_to_char( vch, &af ); af.location = APPLY_SAVING_SPELL; af.modifier = ( number_fuzzy( level / 2 ) * -1 ); affect_to_char( vch, &af ); send_to_char(AT_RED, "Your body has been energized by the Circle of Love.\n\r", vch); } continue; } } return SKPELL_NO_DAMAGE; } int spell_luck_shield( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED4( victim, AFF_LUCK_SHIELD ) ) { affect_strip(victim, sn); if(skill_table[sn].msg_off) { send_to_char(C_DEFAULT, skill_table[sn].msg_off, victim ); send_to_char(C_DEFAULT, "\n\r", victim ); } act(C_DEFAULT, skill_table[sn].msg_off_room, victim, NULL, NULL, TO_NOTVICT); victim->shields -= 1; return SKPELL_NO_DAMAGE; } if ( ! IS_SHIELDABLE( victim ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = 5; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_LUCK_SHIELD; affect_to_char4( victim, &af ); victim->shields += 1; send_to_char(AT_BLUE, "Your soul is infused with the luck of the gods.\n\r", victim ); act(AT_BLUE, "$n's souls is infused with the luck of the gods.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_tongues( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED4( victim, AFF_TONGUES ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = number_fuzzy( level ) + 10; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_TONGUES; affect_to_char4( victim, &af ); send_to_char(AT_BLUE, "You feel enchanted with the knowledge of language.\n\r", victim ); act(AT_BLUE, "$n has been enchanted with the knowledge of language.", victim, NULL, NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_liquid_skin( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED4( victim, AFF_LIQUID_SKIN ) ) { affect_strip(victim, sn); if(skill_table[sn].msg_off) { send_to_char(C_DEFAULT, skill_table[sn].msg_off, victim ); send_to_char(C_DEFAULT, "\n\r", victim ); } act(C_DEFAULT, skill_table[sn].msg_off_room, victim, NULL, NULL, TO_NOTVICT); victim->shields -= 1; return SKPELL_NO_DAMAGE; } if ( !IS_SHIELDABLE( victim ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = -1; af.location = APPLY_DAM_FIRE; af.modifier = 75; af.bitvector = AFF_LIQUID_SKIN; affect_to_char4( victim, &af ); victim->shields += 1; send_to_char(AT_DBLUE, "Your skin suddenly turns liquid.\n\r", victim ); act(AT_DBLUE, "$n's skin suddenly turns liquid.", victim, NULL,NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_spiritual_hammer( int sn, int level, CHAR_DATA *ch, void *vo ) { OBJ_DATA *blade; int duration; if(ch->summon_timer > 0) { send_to_char(AT_BLUE, "You cast the spell, but nothing appears.\n\r", ch); return SKPELL_MISSED; } duration = level/5; blade = create_object( get_obj_index( OBJ_VNUM_SPIRITUAL_HAMMER ), ch->level ); blade->timer = duration; act(AT_BLUE, "A spiritual hammer appears in the sky and descends into your hands.", ch, NULL, NULL, TO_CHAR ); act(AT_BLUE, "A spiritual hammer appears in the sky and descends into $n's hands.", ch, NULL, NULL, TO_ROOM ); obj_to_char( blade, ch ); if(ch->mana < level * 2 && ((ch->class != CLASS_VAMPIRE) || (ch->class != CLASS_ANTI_PALADIN ))) { act(AT_RED, "You don't have enough mana to call the hammer!", ch, NULL, NULL, TO_CHAR); return SKPELL_MISSED; } if(ch->bp < level / 2 && ((ch->class == CLASS_VAMPIRE) || (ch->class == CLASS_ANTI_PALADIN))) { act(AT_BLOOD, "You don't have enough blood to call the hammer!", ch, NULL, NULL, TO_CHAR); return SKPELL_MISSED; } if((ch->class != CLASS_VAMPIRE) || (ch->class != CLASS_ANTI_PALADIN)) ch->mana -= level * 4; else ch->bp -= level * 2; ch->summon_timer = 50; return SKPELL_NO_DAMAGE; } int spell_angelic_aura( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED4( victim, AFF_ANGELIC_AURA ) ) { affect_strip(victim, sn); if(skill_table[sn].msg_off) { send_to_char(C_DEFAULT, skill_table[sn].msg_off, victim ); send_to_char(C_DEFAULT, "\n\r", victim ); } act(C_DEFAULT, skill_table[sn].msg_off_room, victim, NULL, NULL, TO_NOTVICT); victim->shields -= 1; return SKPELL_NO_DAMAGE; } if ( !IS_SHIELDABLE( victim ) ) return SKPELL_MISSED; af.type = sn; af.level = level; af.duration = -1; af.location = APPLY_DAM_UNHOLY; af.modifier = 75; af.bitvector = AFF_ANGELIC_AURA; affect_to_char4( victim, &af ); victim->shields += 1; send_to_char(AT_YELLOW, "Your body sprouts a pair of ethereal wings.\n\r", victim ); act(AT_YELLOW, "$n's body sprouts a pair of ethereal wings.", victim, NULL,NULL, TO_ROOM ); return SKPELL_NO_DAMAGE; } int spell_waterspike( int sn, int level, CHAR_DATA *ch, void *vo ) { CHAR_DATA *victim = (CHAR_DATA *) vo; static const int dam_each [ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260 }; int dam; level = UMIN( level, sizeof( dam_each ) / sizeof( dam_each[0] ) - 1 ); level = UMAX( 0, level ); dam = number_range( dam_each[level] / 2, dam_each[level] * 8 ); if ( saves_spell( level, victim ) ) dam /= 2; //damage( ch, victim, dam, sn ); return dam; }