/*************************************************************************** * 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. * * * * Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley * * * * 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. * * * * _/ _/_/_/ _/ _/ _/ ACK! MUD is modified * * _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code * * _/ _/ _/ _/_/ _/ (c)Stephen Zepp 1998 * * _/_/_/_/ _/ _/ _/ Version #: 4.3 * * _/ _/ _/_/_/ _/ _/ _/ * * * * http://ackmud.nuc.net/ * * zenithar@ackmud.nuc.net * * 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 <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "globals.h" #ifndef DEC_MAGIC_H #include "magic.h" #endif extern bool deathmatch; /* * This file should contain: * o Adept Spells * o additional remort spells */ bool spell_fireblast( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; int dam; if( obj == NULL ) { dam = ( get_psuedo_level( ch ) / 2 ) + dice( ( get_psuedo_level( ch ) / 6 + ADEPT_LEVEL( ch ) / 2 ), 10 ) + dice( ( get_psuedo_level( ch ) / 6 + ADEPT_LEVEL( ch ) / 2 ), 10 ); act( "@@gA blast of @@efire@@g flies from $n's hands!@@N", ch, NULL, NULL, TO_ROOM ); send_to_char( "@@gA blast of @@efire@@g flies from your hands!@@N\n\r", ch ); } else { dam = dice( level / 4, 15 ); act( "@@gA blast of @@efire@@g flies from $p!@@N", ch, obj, NULL, TO_ROOM ); act( "@@gA blast of @@efire@@g flies from $p!@@N", ch, obj, NULL, TO_CHAR ); } if( saves_spell( level, victim ) ) dam /= 2; act( "@@g$n is struck by the blast of @@efire@@g!!@@N", victim, NULL, NULL, TO_ROOM ); send_to_char( "@@gYou are struck by the @@efire @@gblast!!@@N\n\r", victim ); sp_damage( obj, ch, victim, dam, REALM_FIRE, sn, TRUE ); return TRUE; } bool spell_shockstorm( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; int dam; if( obj == NULL ) { dam = ( get_psuedo_level( ch ) / 2 ) + dice( ( get_psuedo_level( ch ) / 5 + ADEPT_LEVEL( ch ) / 2 ), 10 ) + dice( ( get_psuedo_level( ch ) / 5 + ADEPT_LEVEL( ch ) / 2 ), 10 ); act( "@@gA storm of @@lsparks@@g flies from $n's hands!@@N", ch, NULL, NULL, TO_ROOM ); send_to_char( "@@gA storm of @@lsparks@@g flies from your hands!@@N\n\r", ch ); } else { dam = dice( level / 4, 20 ); act( "@@gA storm of @@lsparks@@g flies from $p!@@N", ch, obj, NULL, TO_ROOM ); act( "@@gA storm of @@lsparks@@g flies from $p!@@N", ch, obj, NULL, TO_CHAR ); } if( saves_spell( level, victim ) ) dam /= 2; act( "@@g$n is struck by the storm of @@lsparks@@g!!@@N", victim, NULL, NULL, TO_ROOM ); send_to_char( "@@gYou are struck by the storm of @@lsparks@@g!!@@N\n\r", victim ); sp_damage( obj, ch, victim, dam, REALM_SHOCK, sn, TRUE ); return TRUE; } bool spell_cone_cold( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; int dam; if( obj == NULL ) { dam = ( get_psuedo_level( ch ) / 2 ) + dice( ( get_psuedo_level( ch ) / 5 + ADEPT_LEVEL( ch ) / 2 ), 10 ) + dice( ( get_psuedo_level( ch ) / 5 + ADEPT_LEVEL( ch ) / 2 ), 10 ); act( "@@gA cone of @@acold@@g bursts forth from $n's hands!@@N", ch, NULL, NULL, TO_ROOM ); send_to_char( "@@gA cone of @@acold@@g bursts forth from your hands!@@N\n\r", ch ); } else { dam = dice( level / 4, 20 ); act( "@@gA cone of @@acold@@g bursts forth from $p!@@N", ch, obj, NULL, TO_ROOM ); act( "@@gA cone of @@acold@@g bursts forth from $p!@@N", ch, obj, NULL, TO_CHAR ); } if( saves_spell( level, victim ) ) dam /= 2; act( "@@g$n is struck by the cone of @@acold@@g!!@@N", victim, NULL, NULL, TO_ROOM ); send_to_char( "@@gYou are struck by the cone of @@acold@@g!!@@N\n\r", victim ); sp_damage( obj, ch, victim, dam, REALM_COLD, sn, TRUE ); return TRUE; } bool spell_holy_wrath( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; int dam; if( obj == NULL ) { dam = ( get_psuedo_level( ch ) / 2 ) + dice( ( get_psuedo_level( ch ) / 4 + ADEPT_LEVEL( ch ) ), 12 ) + dice( ( get_psuedo_level( ch ) / 4 + ADEPT_LEVEL( ch ) ), 12 ); act( "@@gA coruscating sphere of @@ylight@@g bursts forth from $n's hands!@@N", ch, NULL, NULL, TO_ROOM ); send_to_char( "@@gA coruscating sphere of @@ylight@@g bursts forth from your hands!@@N\n\r", ch ); } else { dam = dice( level / 5, 20 ); act( "@@gA coruscating sphere of @@ylight@@g bursts forth from $p!@@N", ch, obj, NULL, TO_ROOM ); act( "@@gA coruscating sphere of @@ylight@@g bursts forth from $p!@@N", ch, obj, NULL, TO_CHAR ); } if( saves_spell( level, victim ) ) dam /= 2; act( "@@g$n is struck by the coruscating sphere of @@ylight@@g!!@@N", victim, NULL, NULL, TO_ROOM ); send_to_char( "@@gYou are struck by the coruscating sphere of @@ylight@@g!!@@N\n\r", victim ); sp_damage( obj, ch, victim, dam, REALM_HOLY, sn, TRUE ); return TRUE; } bool spell_wraith_touch( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; int dam; float drain_mod = 1.0; if( obj == NULL ) { dam = ( get_psuedo_level( ch ) / 3 ) + dice( ( get_psuedo_level( ch ) / 6 + ADEPT_LEVEL( ch ) ), 8 ) + dice( ( get_psuedo_level( ch ) / 6 + ADEPT_LEVEL( ch ) ), 8 ); act( "@@RA @@dwraithlike hand @@Rleaps forth from $n!@@N", ch, NULL, NULL, TO_ROOM ); send_to_char( "@@RA @@dwraithlike hand @@Rleaps forth from your hands!@@N\n\r", ch ); } else { dam = dice( level / 5, 20 ); act( "@@RA @@dwraithlike hand @@Rleaps forth from $p!@@N", ch, obj, NULL, TO_ROOM ); act( "@@RA @@dwraithlike hand @@Rleaps forth from $p!@@N", ch, obj, NULL, TO_CHAR ); } if( saves_spell( level, victim ) ) dam /= 2; act( "@@R$n is struck by the @@dwraithlike hand @@R!!@@N", victim, NULL, NULL, TO_ROOM ); send_to_char( "@@RYou are struck by a @@dwraithlike hand @@R!!@@N\n\r", victim ); drain_mod = get_psuedo_level( ch ) * dam / 130; if( sp_damage( obj, ch, victim, dam, REALM_DRAIN | NO_REFLECT | NO_ABSORB, sn, TRUE ) ) ch->hit = UMIN( ch->max_hit, ( ch->hit + drain_mod ) ); return TRUE; } bool spell_thought_vise( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; int dam; if( obj == NULL ) { dam = ( get_psuedo_level( ch ) / 2 ) + dice( ( get_psuedo_level( ch ) / 3 + ADEPT_LEVEL( ch ) ), 10 ) + dice( ( get_psuedo_level( ch ) / 3 + ADEPT_LEVEL( ch ) ), 10 ); act( "@@rA crushing weight brushes your mind, then is gone.@@N", ch, NULL, NULL, TO_ROOM ); send_to_char( "@@rYou clench your mind, crushing the thoughts of your foe.\n\r@@N", ch ); } else { dam = dice( level / 5, 20 ); act( "@@rA crushing weight fills your mind.@@N", ch, obj, NULL, TO_CHAR ); } if( saves_spell( level, victim ) ) dam /= 2; act( "@@rA crushing weight brushes your mind, then is gone.@@N", victim, NULL, NULL, TO_ROOM ); send_to_char( "@@rA crushing weight fills your mind.@@N", victim ); sp_damage( obj, ch, victim, dam, REALM_MIND | NO_REFLECT | NO_ABSORB, sn, FALSE ); return TRUE; } bool spell_black_curse( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA af; if( IS_AFFECTED( victim, AFF_CURSE ) ) { send_to_char( "They are already weakened!\n\r", ch ); return FALSE; } if( saves_spell( level, victim ) ) return TRUE; if( saves_spell( level, victim ) ) return TRUE; af.type = sn; af.duration = 2 * ( level / 8 ); af.location = APPLY_HITROLL; af.modifier = -1 * get_psuedo_level( ch ) / 12 * get_psuedo_level( victim ) / 10; af.bitvector = AFF_CURSE; affect_to_char( victim, &af ); af.location = APPLY_AC; af.modifier = 7 * get_psuedo_level( ch ) / 12 * get_psuedo_level( victim ) / 10; affect_to_char( victim, &af ); send_to_char( "@@RA Cloud of @@dDespair@@R washes over you.@@N\n\r", victim ); if( ch != victim ) send_to_char( "Ok.\n\r", ch ); return TRUE; } bool spell_cloak_misery( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { AFFECT_DATA af; if( is_affected( ch, sn ) ) return FALSE; af.type = sn; af.duration = get_psuedo_level( ch ) / 8; af.location = 0; af.modifier = 0; af.bitvector = 0; affect_to_char( ch, &af ); return TRUE; } bool spell_poison_quinine( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA af; if( is_affected( victim, sn ) ) { send_to_char( "They are already poisoned with quinine!\n\r", ch ); return FALSE; } if( saves_spell( level, victim ) ) if( saves_spell( level, victim ) ) return TRUE; af.type = sn; af.duration = 2 * ( level / 8 ); af.location = APPLY_HITROLL; af.modifier = -1 * get_psuedo_level( ch ) / 20 * get_psuedo_level( victim ) / 20; af.bitvector = AFF_POISON; affect_to_char( victim, &af ); af.location = APPLY_AC; af.modifier = 7 * get_psuedo_level( ch ) / 20 * get_psuedo_level( victim ) / 20; affect_to_char( victim, &af ); send_to_char( "@@You feel a dart pierce your neck.@@N\n\r", victim ); if( ch != victim ) send_to_char( "Ok.\n\r", ch ); return TRUE; } bool spell_poison_arsenic( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA af; if( is_affected( victim, sn ) ) { send_to_char( "They are already poisoned with arsenic!\n\r", ch ); return FALSE; } if( saves_spell( level, victim ) ) if( saves_spell( level, victim ) ) return TRUE; af.type = sn; af.duration = 2 * ( level / 8 ); af.location = APPLY_DAMROLL; af.modifier = -1 * get_psuedo_level( ch ) / 20 * get_psuedo_level( victim ) / 20; af.bitvector = AFF_POISON; affect_to_char( victim, &af ); af.location = APPLY_AC; af.modifier = 5 * get_psuedo_level( ch ) / 20 * get_psuedo_level( victim ) / 20; affect_to_char( victim, &af ); send_to_char( "@@You feel a dart pierce your neck.@@N\n\r", victim ); if( ch != victim ) send_to_char( "Ok.\n\r", ch ); return TRUE; } bool spell_sonic_blast( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA af; int dam; dam = dice( get_psuedo_level( ch ) / 2, 3 ) + dice( get_psuedo_level( ch ) / 2, 3 ); if( saves_spell( level, victim ) ) dam = dam * 2 / 3; if( sp_damage( obj, ch, victim, dam, REALM_SOUND | NO_REFLECT | NO_ABSORB, sn, TRUE ) ) { if( is_affected( ch, sn ) ) return TRUE; af.type = sn; af.duration = ( level / 20 ); af.location = APPLY_DAMROLL; af.modifier = -1 * get_psuedo_level( ch ) / 15 * get_psuedo_level( victim ) / 15; af.bitvector = AFF_BLASTED; affect_to_char( victim, &af ); af.type = sn; af.duration = ( level / 20 ); af.location = APPLY_HITROLL; af.modifier = -1 * get_psuedo_level( ch ) / 15 * get_psuedo_level( victim ) / 15; af.bitvector = AFF_BLASTED; affect_to_char( victim, &af ); } return TRUE; } bool spell_mystical_focus( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj ) { AFFECT_DATA af; if( is_affected( ch, sn ) ) return FALSE; af.type = sn; af.duration = 1 + (get_psuedo_level( ch ) / 7); af.location = 0; af.modifier = 0; af.bitvector = 0; affect_to_char( ch, &af ); return TRUE; }