#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" #include "interp.h" #include "magic.h" #include "recycle.h" void spell_cocoon (int sn, int level, CHAR_DATA * ch, void *vo, int target) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if (IS_AFFECTED (victim, AFF_COCOON)) { if (victim == ch) send_to_char ("You already have a Cocoon.\n\r", ch); else act ("$N already has a Cocoon.", ch, NULL, victim, TO_CHAR); return; } af.where = TO_AFFECTS; af.type = sn; af.level = level; af.duration = level; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_COCOON; affect_to_char (victim, &af); act ("$n's body is surrounded by a thick, opaque epidermis.", victim, NULL, NULL, TO_ROOM); send_to_char ("Your body is surrounded by a thick, opaque epidermis.\n\r", victim); return; } /* energy spells */ void spell_etheral_fist( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 12 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_ENERGY ) ) dam /= 2; act("A fist of black, otherworldly ether rams into $N, leaving $M looking stunned!" ,ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_ENERGY,TRUE); return; } void spell_spectral_furor( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 8 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_ENERGY ) ) dam /= 2; act("The fabric of the cosmos strains in fury about $N!", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_ENERGY,TRUE); return; } void spell_disruption( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 9 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_ENERGY ) ) dam /= 2; act("A weird energy encompasses $N, causing you to question $S continued existence.", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_ENERGY,TRUE); return; } void spell_sonic_resonance( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 7 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_ENERGY ) ) dam /= 2; act("A cylinder of kinetic energy enshrouds $N causing $S to resonate.", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_ENERGY,TRUE); WAIT_STATE( victim, skill_table[sn].beats ); return; } /* mental */ void spell_mind_wrack( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 7 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_MENTAL ) ) dam /= 2; act("$n stares intently at $N, causing $N to seem very lethargic.", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_MENTAL,TRUE); return; } void spell_mind_wrench( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 9 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_MENTAL ) ) dam /= 2; act("$n stares intently at $N, causing $N to seem very hyperactive.", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_MENTAL,TRUE); return; } /* acid */ void spell_sulfurus_spray( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 7 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_ACID ) ) dam /= 2; act("A stinking spray of sulfurous liquid rains down on $N." , ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_ACID,TRUE); return; } void spell_caustic_font( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 9 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_ACID ) ) dam /= 2; act("A fountain of caustic liquid forms below $N. The smell of $S degenerating tissues is revolting! ", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_ACID,TRUE); return; } /* Electrical */ void spell_galvanic_whip( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 7 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_LIGHTNING ) ) dam /= 2; act("$n conjures a whip of ionized particles, which lashes ferociously at $N.", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_LIGHTNING,TRUE); return; } void spell_magnetic_trust( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 8 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_LIGHTNING ) ) dam /= 2; act("An unseen energy moves nearby, causing your hair to stand on end!", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_LIGHTNING,TRUE); return; } void spell_quantum_spike( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = dice( level, 9 ); dam *= (ch->spellpower * 4); if ( saves_spell( level, victim, DAM_LIGHTNING ) ) dam /= 2; act("$N seems to dissolve into tiny unconnected particles, then is painfully reassembled.", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_LIGHTNING,TRUE); return; } /* negative */ void spell_hand_of_undead( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; if ( saves_spell( level, victim,DAM_NEGATIVE) ) { send_to_char("You feel a momentary chill.\n\r",victim); return; } if ( (IS_NPC(victim) && IS_SET(victim->act,ACT_UNDEAD))) { send_to_char("Your victim is unaffected by hand of undead.\n\r",ch); return; } if ( victim->level <= 2 ) { dam = ch->hit + 1; } else { dam = dice( level, 10 ); dam *= (ch->spellpower * 4); victim->mana /= 2; victim->move /= 2; ch->hit += dam / 2; } send_to_char("You feel your life slipping away!\n\r",victim); act("$N is grasped by an incomprehensible hand of undead!", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_NEGATIVE,TRUE); return; } void spell_precision( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; AFFECT_DATA af; if ( IS_AFFECTED ( victim, AFF_PRECISION ) ) { if ( victim == ch ) send_to_char("You are already affected.\n\r", ch); else act("$N is already affected.",ch,NULL,victim,TO_CHAR); return; } af.where = TO_AFFECTS; af.type = sn; af.level = level; af.duration = level*4; af.location = APPLY_HITROLL; af.modifier = victim->hitroll; af.bitvector = AFF_PRECISION; affect_to_char( victim, &af ); send_to_char("You feel more lethal!\n\r", victim); if ( ch != victim ) act("$N looks more lethal.",ch,NULL,victim,TO_CHAR); return; } /* holy */ void spell_wrath_of_god( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { CHAR_DATA *victim = (CHAR_DATA *) vo; int dam; dam = number_range(2500,4500); dam *= (ch->spellpower * 4); send_to_char("You feel your life slipping away!\n\r",victim); act("$N is grasped by an incomprehensible hand of undead!", ch,NULL,victim,TO_NOTVICT); damage( ch, victim, dam, sn,DAM_HOLY,TRUE); return; } // Templar void spell_knightshield( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { OBJ_DATA *item; char buf [MAX_STRING_LENGTH]; int hitroll = 0; int damroll = 0; int armor = 0; item = create_object( get_obj_index( OBJ_VNUM_KNIGHTSHIELD ), 1 ); free_string(item->name); sprintf(buf,"Templar Shield of %s",god_table[ch->god].name); item->name = str_dup(buf); free_string(item->short_descr); sprintf(buf,"Templar Shield of %s",god_table[ch->god].name); item->short_descr = str_dup(buf); free_string(item->description); sprintf(buf,"Templar Shield of %s",god_table[ch->god].name); item->description = str_dup(buf); // SET_BIT( item->item_type, ITEM_ARMOR ); item->item_type = ITEM_ARMOR; SET_BIT( item->wear_flags, ITEM_TAKE ); SET_BIT( item->wear_flags, ITEM_WEAR_SHIELD ); SET_BIT( item->extra_flags, ITEM_MAGIC); SET_BIT( item->extra_flags, ITEM_GLOW); item->value[0] = 200; // pierce item->value[1] = 200; // bash item->value[2] = 200; // slash item->value[3] = 200; // magic item->level = ch->level; item->condition = 100; item->weight = 10; if (ch->level <= 50) hitroll = 50; else hitroll = ch->level; if (ch->level <= 50) damroll = 50; else damroll = ch->level; armor = number_range(-200,-300); add_affect( item, APPLY_HITROLL, hitroll ); add_affect( item, APPLY_DAMROLL, damroll ); obj_to_char(item,ch); act("$p fades into existance in your hand.", ch, item, NULL, TO_CHAR); act("$p fades into existance in $n's hand.", ch, item, NULL, TO_ROOM); return; } // Templar void spell_godsword( int sn, int level, CHAR_DATA *ch, void *vo, int target ) { OBJ_DATA *item; char buf [MAX_STRING_LENGTH]; int hitroll = 0; int damroll = 0; int armor = 0; item = create_object( get_obj_index( OBJ_VNUM_KNIGHTSWORD ), 1 ); free_string(item->name); sprintf(buf,"Templar Broad-Sword of %s",god_table[ch->god].name); item->name = str_dup(buf); free_string(item->short_descr); sprintf(buf,"Templar Broad-Sword of %s",god_table[ch->god].name); item->short_descr = str_dup(buf); free_string(item->description); sprintf(buf,"Templar Broad-Sword of %s",god_table[ch->god].name); item->description = str_dup(buf); item->item_type = ITEM_WEAPON; SET_BIT( item->wear_flags, ITEM_TAKE ); SET_BIT( item->wear_flags, ITEM_WIELD ); SET_BIT( item->extra_flags, ITEM_MAGIC); SET_BIT( item->extra_flags, ITEM_GLOW); item->value[1] = 20; // bash item->value[2] = 20; // slash item->value[3] = WEAPON_SWORD; SET_BIT(item->value[4], WEAPON_FLAMING); item->level = ch->level; item->condition = 100; item->weight = 10; if (ch->level <= 50) hitroll = 50; else hitroll = ch->level; if (ch->level <= 50) damroll = 50; else damroll = ch->level; armor = number_range(-200,-300); add_affect( item, APPLY_HITROLL, hitroll ); add_affect( item, APPLY_DAMROLL, damroll ); obj_to_char(item,ch); act("$p fades into existance in your hand.", ch, item, NULL, TO_CHAR); act("$p fades into existance in $n's hand.", ch, item, NULL, TO_ROOM); return; } void spell_repair( int sn, int level, CHAR_DATA *ch, void *vo , int target ) { OBJ_DATA *obj; OBJ_DATA *obj_next; bool found = FALSE; for ( obj = ch->carrying; obj != NULL; obj = obj_next ) { obj_next = obj->next_content; if ( obj->condition < 100 && can_see_obj( ch, obj ) ) { found = TRUE; obj->condition = 100; act("$p magically repairs itself.",ch,obj,NULL,TO_CHAR); act("$p magically repairs itself.",ch,obj,NULL,TO_ROOM); } } if ( !found ) { send_to_char( "None of your equipment needs repairing.\n\r", ch ); return; } return; } /* Siphon Life spell for warlocks/voodans by Dusk */ void spell_siphon_life( int sn, int level, CHAR_DATA *ch, void *vo,int target ) { AFFECT_DATA af; CHAR_DATA *victim = (CHAR_DATA *) vo; int dam, mod, pbonus, fbonus, dbonus; // if ( ( ch->fighting == NULL ) // && ( !IS_NPC( ch ) ) /*Focus Level version is hella bugged! -Fesdor pbonus = ( !IS_NPC( ch ) && !IS_NPC( victim ) ? focus_level(ch->pcdata->focus[MAGIC_POWER]) - focus_level(victim->pcdata->focus[MAGIC_POWER]) : 0 ); fbonus = ( !IS_NPC( ch ) ? ch->pcdata->focus[MAGIC_ABILITY] : 0 ); dbonus = ( !IS_NPC( victim ) ? victim->pcdata->focus[MAGIC_DEFENSE] : 0 ); fbonus = ( ( fbonus - dbonus < 0 ) ? 0 : fbonus ); pbonus = ( pbonus < 0 ? -1 : pbonus / 2 ); pbonus = ( pbonus > 5 ? 5 : pbonus ); mod = ( ( ch->level + get_curr_stat( ch , STAT_INT ) + fbonus ) - ( victim->saving_throw * -1 + get_curr_stat( victim , STAT_WIS ) ) ); */ pbonus = 0; fbonus = 0; dbonus = 0; mod = number_range(get_curr_stat(ch,STAT_WIS)*4,get_curr_stat(ch,STAT_WIS)*5)-(ch->saving_throw - victim->saving_throw); dam = ch->level + get_curr_stat( ch, STAT_INT ) * 8 - victim->saving_throw * -1; dam *= (ch->spellpower * 4); // dam = ( check_sorcery( ch, sn ) ? sorcery_dam2(dam*1.15) : dam ); if ( victim == ch ) { send_to_char("{wYou can't siphon your own life!{x\n\r",ch); return; } if ( is_affected( victim , gsn_siphon ) || is_affected( ch , gsn_siphon) ) { send_to_char("{mYou draw on your siphoned link to gain more life!{x\n\r",ch); send_to_char("{RYou feel your lifeforce fading fast as it is being drawn on!{x\n\r",victim); victim->hit -= dam; ch->hit += dam; } else { af.where = TO_AFFECTS; af.type = gsn_siphon; af.level = ch->level; af.duration = number_range(1,4); af.location = APPLY_REGEN; af.modifier = mod; af.bitvector = 0; affect_to_char(ch, &af); af.modifier = mod * -1; affect_to_char(victim, &af); send_to_char("{RYou feel your life being siphoned away!{x\n\r",victim); send_to_char("{mYou feel your life being restored by your siphon!{x\n\r",ch); } damage( ch, victim, dam, sn,DAM_HARM,TRUE); return; } /* End of Siphon Life Spell by Dusk */ /* Siphon Energy Spell by Dusk */ void spell_siphon_energy( int sn, int level, CHAR_DATA *ch, void *vo,int target ) { AFFECT_DATA af; CHAR_DATA *victim = (CHAR_DATA *) vo; int dam, mod, pbonus, fbonus, dbonus; // if ( ( ch->fighting == NULL ) // && ( !IS_NPC( ch ) ) /*Same problem as siphon life -Fesdor pbonus = ( !IS_NPC( ch ) && !IS_NPC( victim ) ? focus_level(ch->pcdata->focus[MAGIC_POWER]) - focus_level(victim->pcdata->focus[MAGIC_POWER]) : 0 ); fbonus = ( !IS_NPC( ch ) ? ch->pcdata->focus[MAGIC_ABILITY] : 0 ); dbonus = ( !IS_NPC( victim ) ? victim->pcdata->focus[MAGIC_DEFENSE] : 0 ); fbonus = ( ( fbonus - dbonus < 0 ) ? 0 : fbonus ); pbonus = ( pbonus < 0 ? -1 : pbonus / 2 ); pbonus = ( pbonus > 5 ? 5 : pbonus ); */ pbonus = 0; fbonus = 0; dbonus = 0; mod = number_range(get_curr_stat(ch,STAT_WIS)*4,get_curr_stat(ch,STAT_WIS)*5)-(ch->saving_throw - victim->saving_throw); mod /= 2; /* Line above replaces this: mod = ( ( ch->level + get_curr_stat( ch , STAT_INT ) + fbonus ) - ( victim->saving_throw * -1 + get_curr_stat( victim , STAT_WIS ) ) ); */ dam = ch->level + get_curr_stat( ch, STAT_INT ) * 8 - victim->saving_throw * -1; dam *= (ch->spellpower * 4); // dam = ( check_sorcery( ch, sn ) ? sorcery_dam2(dam*1.15) : dam ); if ( victim == ch ) { send_to_char("{wYou can't siphon your own energy!{x\n\r",ch); return; } if ( is_affected( victim , gsn_siphon ) || is_affected( ch , gsn_siphon) ) { send_to_char("{mYou draw on your siphoned link to gain more energy!{x\n\r",ch); send_to_char("{RYou feel your energy supply fading fast as it is being drawn on!{x\n\r",victim); victim->mana -= dam; if ( victim-> mana < 0 ) victim->mana = 0; else ch->mana += dam; } else { af.where = TO_AFFECTS; af.type = gsn_siphon; af.level = ch->level; af.duration = number_range(1,4); af.location = APPLY_MANA_REGEN; af.modifier = mod; af.bitvector = 0; affect_to_char(ch, &af); af.modifier = mod * -1; affect_to_char(victim, &af); send_to_char("{RYou feel your energy being siphoned away!{x\n\r",victim); send_to_char("{mYou feel your energy being restored by your siphon!{x\n\r",ch); } damage( ch, victim, dam, sn,DAM_HARM,TRUE); return; }