/***************************************************************************
* 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. *
***************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1995 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@pacinfo.com) *
* Gabrielle Taylor (gtaylor@pacinfo.com) *
* Brian Moore (rom@rom.efn.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************/
/***************************************************************************
* ROT 1.4 is copyright 1996-1997 by Russ Walsh *
* By using this code, you have agreed to follow the terms of the *
* ROT license, in the file doc/rot.license *
***************************************************************************/
#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 "magic.h"
#include "tables.h"
#include "recycle.h"
extern char *target_name;
MAGIC ( spell_farsight )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( IS_AFFECTED ( victim, AFF_FARSIGHT ) )
{
if ( victim == ch )
send_to_char ( "Your eyes are already as good as they get.\n\r",
ch );
else
act ( "$N can see just fine.", 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_FARSIGHT;
affect_to_char ( victim, &af );
send_to_char ( "Your eyes jump into focus.\n\r", victim );
if ( ch != victim )
send_to_char ( "Ok.\n\r", ch );
return;
}
MAGIC ( spell_protection_voodoo )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( IS_AFFECTED ( victim, SHD_PROTECT_VOODOO ) )
{
return;
}
af.where = TO_SHIELDS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = SHD_PROTECT_VOODOO;
affect_to_char ( victim, &af );
return;
}
MAGIC ( spell_portal )
{
CHAR_DATA *victim;
OBJ_DATA *portal, *stone;
if ( ( victim = get_char_world ( ch, target_name ) ) == NULL ||
victim == ch || victim->in_room == NULL ||
!can_see_room ( ch, victim->in_room ) ||
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 ) ||
IS_SET ( victim->in_room->room_flags, ROOM_NO_RECALL ) ||
IS_SET ( ch->in_room->room_flags, ROOM_NO_RECALL )
// || (IS_NPC(victim) && is_gqmob(ch, victim->pIndexData->vnum) != -1)
|| victim->level >= level + 3 || ( !IS_NPC ( victim ) && victim->level >= LEVEL_ANCIENT ) /* NOT trust */
|| ( IS_NPC ( victim ) && IS_SET ( victim->imm_flags, IMM_SUMMON ) )
|| ( IS_NPC ( victim ) && saves_spell ( level, victim, DAM_NONE ) )
|| ( is_clan ( victim ) &&
( !is_same_clan ( ch, victim ) ||
clan_table[victim->clan].independent ) ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
if ( strstr ( victim->in_room->area->builders, "Unlinked" ) )
{
send_to_char ( "You can't gate to areas that aren't linked yet!\n\r",
ch );
return;
}
stone = get_eq_char ( ch, WEAR_HOLD );
if ( !IS_IMMORTAL ( ch ) &&
( stone == NULL || stone->item_type != ITEM_WARP_STONE ) )
{
send_to_char ( "You lack the proper component for this spell.\n\r",
ch );
return;
}
if ( stone != NULL && stone->item_type == ITEM_WARP_STONE )
{
act ( "You draw upon the power of $p.", ch, stone, NULL, TO_CHAR );
act ( "It flares brightly and vanishes!", ch, stone, NULL, TO_CHAR );
extract_obj ( stone );
}
portal = create_object ( get_obj_index ( OBJ_VNUM_PORTAL ), 0 );
portal->timer = 2 + level / 25;
portal->value[3] = victim->in_room->vnum;
obj_to_room ( portal, ch->in_room );
act ( "$p rises up from the ground.", ch, portal, NULL, TO_ROOM );
act ( "$p rises up before you.", ch, portal, NULL, TO_CHAR );
}
MAGIC ( spell_nexus )
{
CHAR_DATA *victim;
OBJ_DATA *portal, *stone;
ROOM_INDEX_DATA *to_room, *from_room;
from_room = ch->in_room;
if ( ( victim = get_char_world ( ch, target_name ) ) == NULL ||
victim == ch || ( to_room = victim->in_room ) == NULL ||
!can_see_room ( ch, to_room ) || !can_see_room ( ch, from_room ) ||
IS_SET ( to_room->room_flags, ROOM_SAFE ) ||
IS_SET ( from_room->room_flags, ROOM_SAFE ) ||
IS_SET ( to_room->room_flags, ROOM_PRIVATE ) ||
IS_SET ( to_room->room_flags, ROOM_SOLITARY ) ||
IS_SET ( to_room->room_flags, ROOM_NO_RECALL ) ||
IS_SET ( from_room->room_flags, ROOM_NO_RECALL )
// || (IS_NPC(victim) && is_gqmob(ch, victim->pIndexData->vnum) != -1)
|| victim->level >= level + 3 || ( !IS_NPC ( victim ) && victim->level >= LEVEL_ANCIENT ) /* NOT trust */
|| ( IS_NPC ( victim ) && IS_SET ( victim->imm_flags, IMM_SUMMON ) )
|| ( IS_NPC ( victim ) && saves_spell ( level, victim, DAM_NONE ) )
|| ( is_clan ( victim ) &&
( !is_same_clan ( ch, victim ) ||
clan_table[victim->clan].independent ) ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
if ( strstr ( victim->in_room->area->builders, "Unlinked" ) )
{
send_to_char ( "You can't gate to areas that aren't linked yet!\n\r",
ch );
return;
}
stone = get_eq_char ( ch, WEAR_HOLD );
if ( !IS_IMMORTAL ( ch ) &&
( stone == NULL || stone->item_type != ITEM_WARP_STONE ) )
{
send_to_char ( "You lack the proper component for this spell.\n\r",
ch );
return;
}
if ( stone != NULL && stone->item_type == ITEM_WARP_STONE )
{
act ( "You draw upon the power of $p.", ch, stone, NULL, TO_CHAR );
act ( "It flares brightly and vanishes!", ch, stone, NULL, TO_CHAR );
extract_obj ( stone );
}
/* portal one */
portal = create_object ( get_obj_index ( OBJ_VNUM_PORTAL ), 0 );
portal->timer = 1 + level / 10;
portal->value[3] = to_room->vnum;
obj_to_room ( portal, from_room );
act ( "$p rises up from the ground.", ch, portal, NULL, TO_ROOM );
act ( "$p rises up before you.", ch, portal, NULL, TO_CHAR );
/* no second portal if rooms are the same */
if ( to_room == from_room )
return;
/* portal two */
portal = create_object ( get_obj_index ( OBJ_VNUM_PORTAL ), 0 );
portal->timer = 1 + level / 10;
portal->value[3] = from_room->vnum;
obj_to_room ( portal, to_room );
if ( to_room->people != NULL )
{
act ( "$p rises up from the ground.", to_room->people, portal, NULL,
TO_ROOM );
act ( "$p rises up from the ground.", to_room->people, portal, NULL,
TO_CHAR );
}
}
MAGIC ( spell_empower )
{
OBJ_DATA *object;
char buf[MAX_STRING_LENGTH];
char *name;
int new_sn;
int mana;
int newmana;
int newtarget;
if ( ( new_sn = find_spell ( ch, target_name ) ) < 0 ||
( !IS_NPC ( ch ) &&
( ch->level < skill_table[new_sn].skill_level[ch->class] ||
ch->pcdata->learned[new_sn] == 0 ) ) )
{
send_to_char ( "What spell do you wish to bind?\n\r", ch );
return;
}
name = skill_table[new_sn].name;
if ( !str_cmp ( name, "empower" ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
newtarget = skill_table[new_sn].target;
if ( ch->level + 2 == skill_table[sn].skill_level[ch->class] )
mana = 50;
else
mana =
UMAX ( skill_table[sn].min_mana,
100 / ( 2 + ch->level -
skill_table[sn].skill_level[ch->class] ) );
if ( ch->level + 2 == skill_table[new_sn].skill_level[ch->class] )
newmana = 50;
else
newmana =
UMAX ( skill_table[new_sn].min_mana,
100 / ( 2 + ch->level -
skill_table[new_sn].skill_level[ch->class] ) );
if ( ( ch->mana - mana - newmana ) < 0 )
{
send_to_char ( "You do not have enough mana.\n\r", ch );
return;
}
ch->mana -= newmana;
if ( ( newtarget == TAR_CHAR_DEFENSIVE ) ||
( newtarget == TAR_CHAR_SELF ) )
{
object = create_object ( get_obj_index ( OBJ_VNUM_POTION ), 0 );
}
else
{
object = create_object ( get_obj_index ( OBJ_VNUM_SCROLL ), 0 );
}
object->value[0] = ch->level - 20;
object->value[1] = new_sn;
object->level = 1;
sprintf ( buf, "%s%s", object->short_descr, name );
free_string ( object->short_descr );
object->short_descr = str_dup ( buf );
if ( ( newtarget == TAR_CHAR_DEFENSIVE ) ||
( newtarget == TAR_CHAR_SELF ) )
{
sprintf ( buf, "$n has created a potion of %s!", name );
act ( buf, ch, object, NULL, TO_ROOM );
sprintf ( buf, "You create a potion of %s!\n\r", name );
send_to_char ( buf, ch );
}
else
{
sprintf ( buf, "$n has created a scroll of %s!", name );
act ( buf, ch, object, NULL, TO_ROOM );
sprintf ( buf, "You create a scroll of %s!\n\r", name );
send_to_char ( buf, ch );
}
obj_to_char ( object, ch );
return;
}
MAGIC ( spell_resurrect )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_STRING_LENGTH];
MOB_INDEX_DATA *pMobIndex;
OBJ_DATA *obj;
OBJ_DATA *cobj;
OBJ_DATA *obj_next;
CHAR_DATA *pet;
int length;
if ( ( obj = get_obj_here ( ch, "corpse" ) ) == NULL )
{
send_to_char ( "There's no corpse here.\n\r", ch );
return;
}
if ( ch->pet != NULL )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
pMobIndex = get_mob_index ( MOB_VNUM_CORPSE );
pet = create_mobile ( pMobIndex );
if ( !IS_SET ( pet->act, ACT_PET ) )
SET_BIT ( pet->act, ACT_PET );
if ( !IS_SET ( pet->affected_by, AFF_CHARM ) )
SET_BIT ( pet->affected_by, AFF_CHARM );
pet->comm = COMM_NOTELL | COMM_NOSHOUT | COMM_NOCHANNELS;
sprintf ( buf, "%s{GThe mark of %s is on it's forehead.{x.\n\r",
pet->description, ch->name );
free_string ( pet->description );
pet->description = str_dup ( buf );
free_string ( pet->short_descr );
pet->short_descr =
str_dup ( str_replace ( obj->short_descr, "corpse", "zombie" ) );
sprintf ( buf, "%s",
str_replace ( obj->description, "corpse", "zombie" ) );
length = strlen ( buf ) - 12;
strncpy ( arg, buf, length );
arg[length] = '\0';
sprintf ( buf, "%s standing here.\n\r", arg );
free_string ( pet->long_descr );
pet->long_descr = str_dup ( buf );
char_to_room ( pet, ch->in_room );
add_follower ( pet, ch );
pet->leader = ch;
ch->pet = pet;
pet->alignment = ch->alignment;
pet->level =
UMAX ( 1, UMIN ( 109, ( ( ch->level / 2 ) + ( obj->level / 2 ) ) ) );
pet->max_hit = pet->level * 15;
pet->hit = pet->max_hit;
pet->armor[0] = pet->level / 6;
pet->armor[1] = pet->level / 6;
pet->armor[2] = pet->level / 6;
pet->armor[3] = pet->level / 8;
for ( cobj = obj->contains; cobj != NULL; cobj = obj_next )
{
obj_next = cobj->next_content;
obj_from_obj ( cobj );
obj_to_room ( cobj, ch->in_room );
}
extract_obj ( obj );
sprintf ( buf, "%s stands up and starts following you.\n\r",
pet->short_descr );
send_to_char ( buf, ch );
sprintf ( buf, "%s stands up and starts following $n.",
pet->short_descr );
act ( buf, ch, NULL, NULL, TO_ROOM );
return;
}
MAGIC ( spell_conjure )
{
char buf[MAX_STRING_LENGTH];
MOB_INDEX_DATA *pMobIndex;
OBJ_DATA *stone;
CHAR_DATA *pet;
if ( IS_NPC ( ch ) )
return;
stone = get_eq_char ( ch, WEAR_HOLD );
if ( !IS_IMMORTAL ( ch ) &&
( stone == NULL || stone->item_type != ITEM_DEMON_STONE ) )
{
send_to_char ( "You lack the proper component for this spell.\n\r",
ch );
return;
}
if ( ch->pet != NULL )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
if ( stone != NULL && stone->item_type == ITEM_DEMON_STONE )
{
if ( stone->value[0] < 1 )
{
act ( "You draw upon the power of $p.", ch, stone, NULL,
TO_CHAR );
act ( "$n draws upon the power of $p.", ch, stone, NULL,
TO_ROOM );
act ( "It flares brightly and explodes into dust.", ch, stone,
NULL, TO_CHAR );
act ( "It flares brightly and explodes into dust.", ch, stone,
NULL, TO_ROOM );
extract_obj ( stone );
return;
}
}
pMobIndex = get_mob_index ( MOB_VNUM_DEMON );
pet = create_mobile ( pMobIndex );
if ( !IS_SET ( pet->act, ACT_PET ) )
SET_BIT ( pet->act, ACT_PET );
if ( !IS_SET ( pet->affected_by, AFF_CHARM ) )
SET_BIT ( pet->affected_by, AFF_CHARM );
pet->comm = COMM_NOTELL | COMM_NOSHOUT | COMM_NOCHANNELS;
sprintf ( buf, "%s{GThe mark of %s is on it's forehead.{x.\n\r",
pet->description, ch->name );
free_string ( pet->description );
pet->description = str_dup ( buf );
char_to_room ( pet, ch->in_room );
if ( stone != NULL && stone->item_type == ITEM_DEMON_STONE )
{
stone->value[0] = UMAX ( 0, stone->value[0] - 1 );
act ( "You draw upon the power of $p.", ch, stone, NULL, TO_CHAR );
act ( "$n draws upon the power of $p.", ch, stone, NULL, TO_ROOM );
act ( "It flares brightly and $N appears.", ch, stone, pet, TO_CHAR );
act ( "It flares brightly and $N appears.", ch, stone, pet, TO_ROOM );
}
else
{
act ( "$N suddenly appears in the room.", ch, NULL, pet, TO_CHAR );
act ( "$N suddenly appears in the room.", ch, NULL, pet, TO_ROOM );
}
add_follower ( pet, ch );
pet->leader = ch;
ch->pet = pet;
pet->alignment = ch->alignment;
pet->level = ch->level;
pet->max_hit = pet->level * 30;
pet->hit = pet->max_hit;
pet->armor[0] = pet->level / 2;
pet->armor[1] = pet->level / 2;
pet->armor[2] = pet->level / 2;
pet->armor[3] = pet->level / 3;
return;
}
MAGIC ( spell_animate )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_STRING_LENGTH];
MOB_INDEX_DATA *pMobIndex;
OBJ_DATA *obj = ( OBJ_DATA * ) vo;
CHAR_DATA *pet;
int length;
if ( ( obj->pIndexData->vnum > 17 ) || ( obj->pIndexData->vnum < 12 ) )
{
send_to_char ( "That's not a body part!\n\r", ch );
return;
}
pMobIndex = get_mob_index ( MOB_VNUM_ANIMATE );
pet = create_mobile ( pMobIndex );
SET_BIT ( pet->affected_by, AFF_CHARM );
pet->comm = COMM_NOTELL | COMM_NOSHOUT | COMM_NOCHANNELS;
sprintf ( buf, "%s{GIt's branded with the mark of %s.{x.\n\r",
obj->description, ch->name );
free_string ( pet->description );
pet->description = str_dup ( buf );
free_string ( pet->short_descr );
pet->short_descr = str_dup ( obj->short_descr );
free_string ( pet->name );
pet->name = str_dup ( obj->name );
sprintf ( buf, "%s", obj->description );
length = strlen ( buf ) - 12;
strncpy ( arg, buf, length );
arg[length] = '\0';
sprintf ( buf, "%s floating here.\n\r", arg );
free_string ( pet->long_descr );
pet->long_descr = str_dup ( buf );
char_to_room ( pet, ch->in_room );
add_follower ( pet, ch );
pet->leader = ch;
obj_from_char ( obj );
sprintf ( buf, "%s floats up and starts following you.\n\r",
pet->short_descr );
send_to_char ( buf, ch );
sprintf ( buf, "%s floats up and starts following $n.",
pet->short_descr );
act ( buf, ch, NULL, NULL, TO_ROOM );
return;
}
MAGIC ( spell_iceshield )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( IS_SHIELDED ( victim, SHD_ICE ) )
{
if ( victim == ch )
send_to_char
( "You are already surrounded by an {Cicy{x shield.\n\r",
ch );
else
act ( "$N is already surrounded by an {Cicy{x shield.", ch, NULL,
victim, TO_CHAR );
return;
}
if ( IS_NPC ( victim ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
/*
if ( (skill_table[sn].skill_level[victim->class] > LEVEL_ANCIENT)
&& (victim->level < LEVEL_IMMORTAL) )
{
send_to_char("You are surrounded by an {Cicy{x shield.\n\r", victim);
act("$n is surrounded by an {Cicy{x shield.",victim, NULL,NULL,TO_ROOM);
send_to_char("Your {Cicy{x shield quickly melts away.\n\r", victim);
act("$n's {Cicy{x shield quickly melts away.",victim, NULL,NULL,TO_ROOM);
return;
}
*/
af.where = TO_SHIELDS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = SHD_ICE;
affect_to_char ( victim, &af );
send_to_char ( "You are surrounded by an {Cicy{x shield.\n\r", victim );
act ( "$n is surrounded by an {Cicy{x shield.", victim, NULL, NULL,
TO_ROOM );
return;
}
MAGIC ( spell_fireshield )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( IS_SHIELDED ( victim, SHD_FIRE ) )
{
if ( victim == ch )
send_to_char
( "You are already surrounded by a {Rfirey{x shield.\r\n",
ch );
else
act ( "$N is already surrounded by a {Rfiery{x shield.", ch, NULL,
victim, TO_CHAR );
return;
}
if ( IS_NPC ( victim ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
/*
if ( (skill_table[sn].skill_level[victim->class] > LEVEL_ANCIENT)
&& (victim->level < LEVEL_IMMORTAL) )
{
send_to_char("You are surrounded by a {Rfiery{x shield.\n\r", victim);
act("$n is surrounded by a {Rfiery{x shield.",victim, NULL,NULL,TO_ROOM);
send_to_char("Your {Rfirey{x shield gutters out.\n\r", victim);
act("$n's {Rfirey{x shield gutters out.",victim, NULL,NULL,TO_ROOM);
return;
}
*/
af.where = TO_SHIELDS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = SHD_FIRE;
affect_to_char ( victim, &af );
send_to_char ( "You are surrounded by a {Rfiery{x shield.\n\r", victim );
act ( "$n is surrounded by a {Rfiery{x shield.", victim, NULL, NULL,
TO_ROOM );
return;
}
MAGIC ( spell_shockshield )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( IS_SHIELDED ( victim, SHD_SHOCK ) )
{
if ( victim == ch )
send_to_char
( "You are already surrounded in a {Bcrackling{x shield.\n\r",
ch );
else
act ( "$N is already surrounded by a {Bcrackling{x shield.", ch,
NULL, victim, TO_CHAR );
return;
}
if ( IS_NPC ( victim ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
/*
if ( (skill_table[sn].skill_level[victim->class] > LEVEL_ANCIENT)
&& (victim->level < LEVEL_IMMORTAL) )
{
send_to_char("You are surrounded by a {Bcrackling{x shield.\n\r", victim);
act("$n is surrounded by a {Bcrackling{x shield.",victim, NULL,NULL,TO_ROOM);
send_to_char("Your {Bcrackling{x shield sizzles and fades.\n\r", victim);
act("$n's {Bcrackling{x shield sizzles and fades.",victim, NULL,NULL,TO_ROOM);
return;
}
*/
af.where = TO_SHIELDS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = SHD_SHOCK;
affect_to_char ( victim, &af );
send_to_char ( "You are surrounded by a {Bcrackling{x field.\n\r",
victim );
act ( "$n is surrounded by a {Bcrackling{x shield.", victim, NULL, NULL,
TO_ROOM );
return;
}
MAGIC ( spell_acidshield )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( IS_SHIELDED ( victim, SHD_ACID ) )
{
if ( victim == ch )
send_to_char
( "You are already surrounded in an {GA{gcidic{x shield.\n\r",
ch );
else
act ( "$N is already surrounded by an {GA{gcidic{x shield.", ch,
NULL, victim, TO_CHAR );
return;
}
if ( IS_NPC ( victim ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
af.where = TO_SHIELDS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = SHD_ACID;
affect_to_char ( victim, &af );
send_to_char ( "You are surrounded by an {GA{gcidic{x field.\n\r",
victim );
act ( "$n is surrounded by an {GA{gcidic{x shield.", victim, NULL, NULL,
TO_ROOM );
return;
}
MAGIC ( spell_poisonshield )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( IS_SHIELDED ( victim, SHD_POISON ) )
{
if ( victim == ch )
send_to_char
( "You are already surrounded in a {MP{moisonous{x {CC{cl{Co{cu{Cd{x.\n\r",
ch );
else
act ( "$N is already surrounded by a {MP{moisonous{x {CC{cl{Co{cu{Cd{x.", ch, NULL, victim, TO_CHAR );
return;
}
if ( IS_NPC ( victim ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
af.where = TO_SHIELDS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = SHD_POISON;
affect_to_char ( victim, &af );
send_to_char
( "You are surrounded by a {MP{moisonous{x {CC{cl{Co{cu{Cd{x.\n\r",
victim );
act ( "$n is surrounded by a {MP{moisonous{x {CC{cl{Co{cu{Cd{x.", victim,
NULL, NULL, TO_ROOM );
return;
}
MAGIC ( spell_quest_pill )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
if ( IS_NPC ( victim ) )
return;
victim->qps++;
send_to_char ( "{YYou've gained a {RQuest Point{Y!{x\n\r", victim );
if ( ch != victim )
send_to_char ( "Ok.\n\r", ch );
return;
}
MAGIC ( spell_voodoo )
{
char name[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
OBJ_DATA *bpart;
OBJ_DATA *doll;
bpart = get_eq_char ( ch, WEAR_HOLD );
if ( ( bpart == NULL ) || ( bpart->pIndexData->vnum < 12 ) ||
( bpart->pIndexData->vnum > 17 ) )
{
send_to_char ( "You are not holding a body part.\n\r", ch );
return;
}
if ( bpart->value[4] == 0 )
{
send_to_char ( "This body part is from a mobile.\n\r", ch );
return;
}
one_argument ( bpart->name, name );
doll = create_object ( get_obj_index ( OBJ_VNUM_VOODOO ), 0 );
sprintf ( buf, doll->short_descr, name );
free_string ( doll->short_descr );
doll->short_descr = str_dup ( buf );
sprintf ( buf, doll->description, name );
free_string ( doll->description );
doll->description = str_dup ( buf );
sprintf ( buf, doll->name, name );
free_string ( doll->name );
doll->name = str_dup ( buf );
act ( "$p morphs into a voodoo doll", ch, bpart, NULL, TO_CHAR );
obj_from_char ( bpart );
obj_to_char ( doll, ch );
equip_char ( ch, doll, WEAR_HOLD );
act ( "$n has created $p!", ch, doll, NULL, TO_ROOM );
return;
}
MAGIC ( spell_fire_storm )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int dam;
dam = ch->level * 10 + dice ( 15, 30 );
if ( saves_spell ( level, victim, DAM_LIGHT ) )
dam /= 2;
else
spell_plague ( skill_lookup ( "plague" ), level, ch,
( void * ) victim, TARGET_CHAR );
damage ( ch, victim, dam, sn, DAM_FIRE, TRUE );
damage ( ch, victim, dam, sn, DAM_FIRE, TRUE );
damage ( ch, victim, dam, sn, DAM_FIRE, TRUE );
return;
}
MAGIC ( spell_dragon_skin )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( victim, sn ) )
{
if ( victim == ch )
send_to_char ( "Your skin is already hard as a dragons.\n\r",
ch );
else
act ( "$N's skin is already hard as a dragons.", ch, NULL, victim,
TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = -( 2 * level );
af.bitvector = 0;
affect_to_char ( victim, &af );
act ( "$n's skin is now hard as a dragons.", victim, NULL, NULL,
TO_ROOM );
send_to_char ( "Your skin is now hard as a dragons.\n\r", victim );
return;
}
MAGIC ( spell_vampire_blast )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int dam;
dam = dice ( level, 140 );
if ( saves_spell ( level, victim, DAM_ACID ) )
dam /= 1.5;
if ( dam > 1 && IS_SHIELDED ( victim, SHD_SANCTUARY ) )
dam /= 1.5;
damage ( ch, victim, dam, sn, DAM_ACID, TRUE );
return;
}
MAGIC ( spell_dragon_wisdom )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( victim, sn ) )
{
if ( victim == ch )
send_to_char ( "You are already as wise as a dragon!\n\r", ch );
else
act ( "$N can't get any wiser.", ch, NULL, victim, TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_WIS;
af.modifier = 1 + ( level >= 18 ) + ( level >= 25 ) + ( level >= 32 );
af.bitvector = 0;
affect_to_char ( victim, &af );
send_to_char ( "Your brain surges with heightened wisdom!\n\r", victim );
act ( "$n's brain surges with heightened wisdom.", victim, NULL, NULL,
TO_ROOM );
return;
}
MAGIC ( spell_briarshield )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( IS_SHIELDED ( victim, SHD_BRIAR ) )
{
if ( victim == ch )
send_to_char
( "You are already surrounded in a thorny shield.\n\r", ch );
else
act ( "$N is already surrounded by a thorny shield.", ch, NULL,
victim, TO_CHAR );
return;
}
if ( IS_NPC ( victim ) )
{
send_to_char ( "You failed.\n\r", ch );
return;
}
/*
if ( (skill_table[sn].skill_level[victim->class] > LEVEL_ANCIENT)
&& (victim->level < LEVEL_IMMORTAL) )
{
send_to_char("You are surrounded by a {Bcrackling{x shield.\n\r", victim);
act("$n is surrounded by a {Bcrackling{x shield.",victim, NULL,NULL,TO_ROOM);
send_to_char("Your {Bcrackling{x shield sizzles and fades.\n\r", victim);
act("$n's {Bcrackling{x shield sizzles and fades.",victim, NULL,NULL,TO_ROOM);
return;
}
*/
af.where = TO_SHIELDS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = SHD_BRIAR;
affect_to_char ( victim, &af );
send_to_char ( "You are surrounded by a thorny shield.\n\r", victim );
act ( "$n is surrounded by a thorny shield.", victim, NULL, NULL,
TO_ROOM );
return;
}
MAGIC ( spell_dark_gift )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( victim, sn ) )
{
if ( victim == ch )
send_to_char ( "You are already affected by the dark gift.\n\r",
ch );
else
act ( "$N is already gifted.", ch, NULL, victim, TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level / 1.5;
af.bitvector = 0;
af.location = APPLY_DAMROLL;
af.modifier = level / 3.5;
affect_to_char ( victim, &af );
af.location = APPLY_HITROLL;
af.modifier = level / 3.5;
affect_to_char ( victim, &af );
af.location = APPLY_AC;
af.modifier = -100 - level;
affect_to_char ( victim, &af );
send_to_char ( "You beg the dark powers to protect you.\n\r", victim );
if ( ch != victim )
act ( "$N is protected by the dark powers.", ch, NULL, victim,
TO_CHAR );
send_to_char ( "The dark powers take there toll on you.\n\r", ch );
ch->hit -= level * 3;
return;
}
MAGIC ( spell_camouflage )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( victim, sn ) )
{
if ( victim == ch )
send_to_char ( "You are already hidden.\n\r", ch );
else
act ( "$N is already hidden.", ch, NULL, victim, TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = ch->level / 6;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_SNEAK;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = ch->level / 6;
af.location = APPLY_AC;
af.modifier = 0 - ch->level;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = ch->level / 6;
af.location = APPLY_HITROLL;
af.modifier = ch->level / 7;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = ch->level / 6;
af.location = APPLY_DAMROLL;
af.modifier = ch->level / 7;
af.bitvector = 0;
affect_to_char ( victim, &af );
act ( "$n {&fa{7de{8s in{6to the {3ba{6ck{2gr{6ou{3nd.{x", victim, NULL,
NULL, TO_ROOM );
send_to_char ( "You {7fa{8de {6into t{3he b{6ack{3gro{6und.{x\n\r",
victim );
return;
}
MAGIC ( spell_divine_protection )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( victim, sn ) )
{
if ( victim == ch )
send_to_char ( "You are already protected.\n\r", ch );
else
act ( "$N is already protected.", ch, NULL, victim, TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level / 1.5;
af.bitvector = SHD_DIVINE_PROTECTION;
af.location = APPLY_DAMROLL;
af.modifier = level / 6;
affect_to_char ( victim, &af );
af.location = APPLY_HITROLL;
af.modifier = level / 6;
affect_to_char ( victim, &af );
af.location = APPLY_SAVES;
af.modifier = 0 - level / 8;
affect_to_char ( victim, &af );
af.location = APPLY_AC;
af.modifier = 0 - level / 1.5;
affect_to_char ( victim, &af );
send_to_char ( "The very essense of the gods protects you!\n\r", victim );
if ( ch != victim )
act ( "$N is protected by your gods.", ch, NULL, victim, TO_CHAR );
return;
}
MAGIC ( spell_superior_healing )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int bonus = 1000 + level + 600 + dice ( 1, 25 );
victim->hit = UMIN ( victim->hit + bonus, victim->max_hit );
update_pos ( victim );
send_to_char ( "A warm feeling fills your body.\n\r", victim );
if ( ch != victim )
send_to_char ( "Ok.\n\r", ch );
return;
}
MAGIC ( spell_master_healing )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int bonus = 1500 + level + 1500 + dice ( 1, 40 );
victim->hit = UMIN ( victim->hit + bonus, victim->max_hit );
update_pos ( victim );
send_to_char ( "A warm feeling fills your body.\n\r", victim );
if ( ch != victim )
send_to_char ( "Ok.\n\r", ch );
return;
}
MAGIC ( spell_anger )
/*1*/
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo; /*2a */
AFFECT_DATA af; /*2b */
if ( is_affected ( ch, sn ) ) /*3 */
{
if ( victim == ch )
send_to_char ( "You are already angry\n\r", ch ); /*4 */
else
act ( "$N is filled with anger.", ch, NULL, victim, TO_CHAR ); /*5 */
return;
}
af.where = TO_AFFECTS; /*6 */
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_DAMROLL;
af.modifier = level / 4.5;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_HITROLL;
af.modifier = level / 4.5;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = level * .8;
af.bitvector = 0;
affect_to_char ( victim, &af );
act ( "$n is filled with anger.", victim, NULL, NULL, TO_ROOM );
send_to_char ( "You are filled with anger.\n\r", ch );
return;
}
MAGIC ( spell_sate )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
victim->pcdata->condition[COND_HUNGER] = 24;
update_pos ( victim );
send_to_char ( "Your hunger is sated.\n\r", victim );
if ( ch != victim )
send_to_char ( "Ok.\n\r", ch );
return;
}
MAGIC ( spell_quench )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
victim->pcdata->condition[COND_THIRST] = 30;
update_pos ( victim );
send_to_char ( "Your thirst is quenched.\n\r", victim );
if ( ch != victim )
send_to_char ( "Ok.\n\r", ch );
return;
}
MAGIC ( spell_heroes_feast )
{
CHAR_DATA *gch;
int sate_num, quench_num;
sate_num = skill_lookup ( "sate" );
quench_num = skill_lookup ( "quench" );
for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room )
{
if ( ( IS_NPC ( ch ) && IS_NPC ( gch ) ) ||
( !IS_NPC ( ch ) && !IS_NPC ( gch ) ) )
{
spell_sate ( sate_num, level, ch, ( void * ) gch, TARGET_CHAR );
spell_quench ( quench_num, level, ch, ( void * ) gch,
TARGET_CHAR );
}
}
}
MAGIC ( spell_cry )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( ch, sn ) )
{
if ( victim == ch )
send_to_char ( "You are already crying.\n\r", ch );
else
act ( "$N is already crying.", ch, NULL, victim, TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_HITROLL;
af.modifier = 0 - ch->level / 20;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_DAMROLL;
af.modifier = 0 - ch->level / 20;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_DEX;
af.modifier = 0 - ch->level / 30;
af.bitvector = 0;
affect_to_char ( victim, &af );
act ( "$n begins to cry.", victim, NULL, NULL, TO_ROOM );
send_to_char ( "Your victim into tears.\n\r", ch );
return;
}
MAGIC ( spell_blind_rage )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( ch, sn ) )
{
if ( victim == ch )
send_to_char ( "You are allready in a blind {RR{ra{RG{re{x\n\r",
ch );
else
act ( "$N is allready in a blind {RR{ra{RG{re{x.", ch, NULL,
victim, TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_DAMROLL;
af.modifier = level * .75;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_HITROLL;
af.modifier = level * .75;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = level / .75;
af.bitvector = 0;
affect_to_char ( victim, &af );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_STR;
af.modifier = 1 + level / 25;
af.bitvector = 0;
affect_to_char ( victim, &af );
act ( "$n is filled with {RRAGE{x.", victim, NULL, NULL, TO_ROOM );
send_to_char ( "You are filled with {RRAGE{x.\n\r", ch );
return;
}
MAGIC ( spell_gods_armor )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( victim, sn ) )
{
if ( victim == ch )
send_to_char ( "You allready have armor like the gods.\n\r", ch );
else
act ( "$N allready has armor like the guards", ch, NULL, victim,
TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = 20;
af.modifier = 0 - level * 1.55;
af.location = APPLY_AC;
af.bitvector = 0;
affect_to_char ( victim, &af );
send_to_char ( "You feel the armor of the gods wrap around you.\n\r",
victim );
if ( ch != victim )
act ( "$N is now protected by the armor of the gods", ch, NULL,
victim, TO_CHAR );
return;
}
MAGIC ( spell_blade_bless )
{
OBJ_DATA *obj;
AFFECT_DATA af;
if ( target == TARGET_OBJ )
{
obj = ( OBJ_DATA * ) vo;
if ( IS_OBJ_STAT ( obj, ITEM_BLESS ) )
{
act ( "$p is already blessed.", ch, obj, NULL, TO_CHAR );
return;
}
if ( obj->item_type != ITEM_WEAPON )
{
send_to_char ( "That isn't a weapon.\n\r", ch );
return;
}
/* if (IS_OBJ_STAT(obj,ITEM_EVIL))
{
AFFECT_DATA *paf;
paf = affect_find(obj->affected,gsn_curse);
if (!saves_dispel(level,paf != NULL ? paf->level : obj->level,0))
{
if (paf != NULL)
affect_remove_obj(obj,paf);
act("$p glows soft gold.",ch,obj,NULL,TO_ALL);
REMOVE_BIT(obj->extra_flags,ITEM_EVIL);
return;
}
else
{
act("The evil of $p resists your blessings.",
ch,obj,NULL,TO_CHAR);
return;
}
} */
af.where = TO_OBJECT;
af.type = sn;
af.level = level;
af.duration = level;
af.bitvector = ITEM_BLESS;
af.location = APPLY_HITROLL;
af.modifier = level / 6;
affect_to_obj ( obj, &af );
af.location = APPLY_DAMROLL;
af.modifier = level / 6;
affect_to_obj ( obj, &af );
act ( "$p glows a brilliant gold!", ch, obj, NULL, TO_ALL );
return;
}
}
MAGIC ( spell_invigorate )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( ch, sn ) )
{
if ( victim == ch )
send_to_char ( "{WYou are allread invigorated! {x\n\r", ch );
else
act ( "$N is allready invigorated! ", ch, NULL, victim, TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = 6;
af.location = APPLY_HIT;
af.modifier = level * 10;
af.bitvector = 0;
affect_to_char ( victim, &af );
act ( "$n is invigorated!", victim, NULL, NULL, TO_ROOM );
/*send_to_char("You are invigorated!\n\r",ch); */
ch->hit = ch->max_hit;
return;
}
MAGIC ( spell_create_bed )
{
OBJ_DATA *bed;
bed = create_object ( get_obj_index ( OBJ_VNUM_BED ), 0 );
bed->value[3] = level; /*hp heal rate */
bed->value[4] = level; /*mana heal rate */
bed->timer = level / 5;
obj_to_room ( bed, ch->in_room );
act ( "$n begin to wave $s hands.\n\r"
"As $n does the wind starts to blow leafs around and a small cylone begins to form.\n\r"
"As the cyclone dies down a small bed of leafs is left on the ground.",
ch, bed, NULL, TO_ROOM );
act ( "You begin to wave your hands.\n\r"
"As you do the wind starts to blow leafs around and a small cylone begins to form.\n\r"
"As the cyclone dies down a small bed of leafs is left on the ground.",
ch, bed, NULL, TO_CHAR );
return;
}
MAGIC ( spell_immolation )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( victim, sn ) )
{
if ( victim == ch )
send_to_char
( "You have allready sacraficed your self to the {Rf{ri{Rr{re{Rs {xof {Rh{Ye{Rl{Yl{x!\n\r",
ch );
else
act ( "$N has allready sacraficed himself to the {Rf{ri{Rr{re{rs{x of {Rh{Ye{Rl{Yl{x!", ch, NULL, victim, TO_CHAR );
return;
}
af.where = TO_RESIST;
af.type = sn;
af.level = level;
af.duration = 4;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = RES_FIRE;
affect_to_char ( victim, &af );
af.location = APPLY_DAMROLL;
af.modifier = 4;
affect_to_char ( victim, &af );
act ( "$n is surrounded by the {Rf{ri{Rr{re{Rs{x of {Rh{Ye{Rl{Yl{x! ",
victim, NULL, NULL, TO_ROOM );
send_to_char
( "You become surrounded by the {Rf{ri{Rr{re{Rs{x of {Rh{Ye{Rl{Yl{x!\n\r",
victim );
send_to_char
( "The {Rf{ri{Rr{re{Rs{x of {Rh{Ye{Rl{Yl{x scar and maim your body\n\r",
ch );
ch->hit -= level * 4;
return;
}
MAGIC ( spell_concentration )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int bonus = 600 + level + 100 + dice ( 1, 15 );
victim->mana = UMIN ( victim->mana + bonus, victim->max_hit );
update_pos ( victim );
send_to_char ( "You feel the power of the magi flow within you.\n\r",
victim );
if ( ch != victim )
send_to_char ( "Ok.\n\r", ch );
send_to_char ( "You are fatigued from concentrating so hard.\n\r", ch );
ch->move -= level * 3;
return;
}
MAGIC ( spell_holy_mace )
{
OBJ_DATA *mace;
AFFECT_DATA *pAf;
/* Make the mace, and have it decay after time */
mace = create_object ( get_obj_index ( OBJ_VNUM_MACE ), 0 );
mace->timer = level / 3;
/* Add the hitroll based on level */
pAf = new_affect ( );
pAf->location = APPLY_HITROLL;
pAf->modifier = ( ch->level / 3 );
pAf->where = TO_OBJECT;
pAf->type = -1;
pAf->duration = -1;
pAf->bitvector = 0;
pAf->level = mace->level;
pAf->next = mace->affected;
mace->affected = pAf;
mace->level = level;
/* Now for the level based damage roll */
pAf = new_affect ( );
pAf->location = APPLY_DAMROLL;
pAf->modifier = ( ch->level / 3.5 );
pAf->where = TO_OBJECT;
pAf->type = -1;
pAf->duration = -1;
pAf->bitvector = 0;
pAf->level = mace->level;
pAf->next = mace->affected;
mace->affected = pAf;
mace->level = level;
/* Now for the Hitpoints of the weapon */
pAf = new_affect ( );
pAf->location = APPLY_HIT;
pAf->modifier = ch->level + 100;
pAf->where = TO_OBJECT;
pAf->type = -1;
pAf->duration = -1;
pAf->bitvector = 0;
pAf->level = mace->level;
pAf->next = mace->affected;
mace->affected = pAf;
mace->level = level;
/* Now for the weapons mana bonus */
pAf = new_affect ( );
pAf->location = APPLY_MANA;
pAf->modifier = ch->level * 1.5;
pAf->where = TO_OBJECT;
pAf->type = -1;
pAf->duration = -1;
pAf->bitvector = 0;
pAf->level = mace->level;
pAf->next = mace->affected;
mace->affected = pAf;
mace->level = level;
/* Now add the damage dice of the weapon */
mace->value[1] = ch->level / 12;
mace->value[2] = ch->level / 10;
obj_to_char ( mace, ch );
/* Now drain the caster of Hp and mana */
send_to_char ( "You attempt to form a holy mace.\n\r", ch );
send_to_char ( "You feel weak, perhaps you should rest.\n\r", ch );
act ( "$n constructs a divine weapon.", ch, mace, NULL, TO_ROOM );
ch->hit *= .75;
ch->move *= .50;
return;
}
MAGIC ( spell_summon_familiar )
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *gch;
CHAR_DATA *familiar;
AFFECT_DATA af;
int i;
if ( is_affected ( ch, sn ) )
{
send_to_char
( "You lack the power to summon another familiar right now.\n\r",
ch );
return;
}
send_to_char ( "You attempt to summon a familiar.\n\r", ch );
act ( "$n attempts to summon a demon.", ch, NULL, NULL, TO_ROOM );
for ( gch = char_list; gch != NULL; gch = gch->next )
{
if ( IS_NPC ( gch ) && IS_AFFECTED ( gch, AFF_CHARM ) &&
gch->master == ch && gch->pIndexData->vnum == MOB_VNUM_FAMILIAR )
{
send_to_char ( "Two familiars are more than you can control!\n\r",
ch );
return;
}
}
familiar = create_mobile ( get_mob_index ( MOB_VNUM_FAMILIAR ) );
for ( i = 0; i < MAX_STATS; i++ )
{
familiar->perm_stat[i] = ch->perm_stat[i];
}
/*
familiar->max_hit = IS_NPC(ch)? URANGE(ch->max_hit,1 * ch->max_hit,30000)
: URANGE(ch->pcdata->perm_hit,ch->hit,30000);
familiar->hit = familiar->max_hit;
*/
familiar->max_hit =
IS_NPC ( ch ) ? ch->max_hit : ch->pcdata->perm_hit / 2;
familiar->hit = familiar->max_hit;
familiar->max_mana =
IS_NPC ( ch ) ? ch->max_mana : ch->pcdata->perm_mana / 2;
familiar->mana = familiar->max_mana;
familiar->max_move = IS_NPC ( ch ) ? ch->max_move : ch->pcdata->perm_move;
familiar->move = familiar->move;
familiar->level = ch->level;
for ( i = 0; i < 3; i++ )
familiar->armor[i] = interpolate ( familiar->level, 100, -100 );
familiar->armor[3] = interpolate ( familiar->level, 100, 0 );
familiar->gold = 0;
familiar->timer = 0;
familiar->damage[DICE_NUMBER] = number_range ( level / 15, level / 10 );
familiar->damage[DICE_TYPE] = number_range ( level / 3, level / 2 );
familiar->damage[DICE_BONUS] = number_range ( level / 8, level / 6 );
sprintf ( buf, "%s's familiar", ch->name );
free_string ( familiar->short_descr );
familiar->short_descr = str_dup ( buf );
sprintf ( buf, "%s's familiar is here.\n\r", ch->name );
free_string ( familiar->long_descr );
familiar->long_descr = str_dup ( buf );
char_to_room ( familiar, ch->in_room );
send_to_char ( "A familiar arrives through a {Dd{bark{x portal!\n\r",
ch );
act ( "A familiar arrives through a {Dd{bark{x portal!", ch, NULL, NULL,
TO_ROOM );
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = 24;
af.bitvector = 0;
af.modifier = 0;
af.location = APPLY_NONE;
affect_to_char ( ch, &af );
send_to_char ( "You feel weak, perhaps you should rest.\n\r", ch );
ch->hit *= .75;
ch->move *= .50;
SET_BIT ( familiar->affected_by, AFF_CHARM );
familiar->master = familiar->leader = ch;
return;
}
MAGIC ( spell_vampiric_laceration )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if ( is_affected ( victim, sn ) )
{
if ( victim == ch )
send_to_char
( "You are allready at one with your vampiric side.\n\r",
ch );
else
act ( "$N is allready at one with thier vampiric side.", ch, NULL,
victim, TO_CHAR );
return;
}
af.where = TO_AFFECTS;
af.type = sn;
af.level = level;
af.duration = 7;
af.bitvector = AFF_WEAKEN;
af.location = APPLY_DAMROLL;
af.modifier = level / 10;
affect_to_char ( victim, &af );
af.location = APPLY_HITROLL;
af.modifier = level / 10;
affect_to_char ( victim, &af );
af.location = APPLY_SAVES;
af.modifier = 0 - level / 7;
affect_to_char ( victim, &af );
af.location = APPLY_AC;
af.modifier = 0 - level / 2;
affect_to_char ( victim, &af );
send_to_char ( "The very essense of evil flows though you!\n\r", victim );
if ( ch != victim )
act ( "$N", ch, NULL, victim, TO_CHAR );
return;
}
MAGIC ( spell_divine_fury )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int dam;
/*
if ( ( ch->fighting == NULL )
&& ( !IS_NPC( ch ) )
&& ( !IS_NPC( victim ) ) )
{
ch->attacker = TRUE;
victim->attacker = FALSE;
}*/
dam = dice ( level, 16 );
dam += level * 8;
if ( saves_spell ( level, victim, DAM_HOLY ) )
dam /= 2;
damage_old ( ch, victim, dam, sn, DAM_HOLY, TRUE );
return;
}