/***************************************************************************
* 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. *
***************************************************************************/
/**********************************************************
*************** S U N D E R M U D *** 2 . 0 **************
**********************************************************
* The unique portions of the SunderMud code as well as *
* the integration efforts for code from other sources is *
* based primarily on the efforts of: *
* *
* Lotherius <aelfwyne@operamail.com> (Alvin W. Brinson) *
* and many others, see "help sundermud" in the mud. *
**********************************************************/
#include "everything.h"
#include "magic.h"
/* Command procedures */
DECLARE_DO_FUN(do_emote);
/*
* The kludgy global is for spells who want more stuff from command line.
*/
extern char *target_name;
/*
* Spell functions.
*/
/* Thanks to CthulhuMud for summon familiar */
void spell_summon_familiar ( int sn, int level, CHAR_DATA * ch, void *vo )
{
CHAR_DATA *mob;
int mob_num;
int i, number, type, bonus;
/* No previous pet... */
if( ch->pet != NULL )
{
send_to_char( "You already have a pet.\n\r", ch );
return;
}
/* Create the mob... */
mob = create_mobile ( get_mob_index(MOB_VNUM_FAMILIAR) );
mob->level = ch->level -4;
mob->max_hit = mob->level * 8 +
number_range ( mob->level * mob->level / 4, mob->level * mob->level );
mob->max_hit *= .9;
mob->hit = mob->max_hit;
mob->max_mana = 100 + dice ( mob->level, 10 );
mob->mana = mob->max_mana;
// No armor if not wearing armor
// If, perchance, armor is wanted, this function would need rewritten
// for the new AC system.
// for ( i = 0; i < 3; i++ )
// mob->armor[i] = interpolate ( mob->level, 100, -100 );
// mob->armor[3] = interpolate ( mob->level, 100, 0 );
//
number = (mob->level / 15)+1;
type = (number * 3) + ( (mob->level - ( (number-1)*10 ))/3 );
bonus = 0;
mob->damage[DICE_NUMBER] = number;
mob->damage[DICE_TYPE] = type;
mob->damage[DICE_BONUS] = bonus;
for ( i = 0; i < MAX_STATS; i++ )
mob->perm_stat[i] = 11 + mob->level / 4;
/* Work out what sort of familier they get... */
mob_num = dice(1, 4) + 2;
if (IS_EVIL(ch))
{
mob_num -= 2;
}
else if (IS_GOOD(ch))
{
mob_num += 2;
}
/* 1 in 128 chance of getting a raw one... */
if (number_bits(8) == 0)
{
mob_num = -1;
}
/* Taylor description and names... */
switch (mob_num)
{
default:
break;
case 1:
free_string(mob->name);
free_string(mob->short_descr);
free_string(mob->long_descr);
free_string(mob->description);
mob->name = str_dup("homunlcus disgusting green");
mob->short_descr = str_dup("a disgusting green homunlcus");
mob->long_descr = str_dup("A disgusting green homunlcus\n");
mob->description = str_dup("It looks like the stories about the revolting things these abominations are\n made from are true. Yuk!\n");
mob->sex = SEX_NEUTRAL;
mob->race=15;
mob->alignment = -1000;
break;
case 2:
free_string(mob->name);
free_string(mob->short_descr);
free_string(mob->long_descr);
free_string(mob->description);
mob->name = str_dup("imp short red");
mob->short_descr = str_dup("a short red imp");
mob->long_descr = str_dup("A short, red imp\n");
mob->description = str_dup("He gives you a nasty look!\n");
mob->sex = SEX_MALE;
mob->race=20;
mob->alignment = -750;
SET_BIT (mob->affected_by, AFF_FLYING );
break;
case 3:
free_string(mob->name);
free_string(mob->short_descr);
free_string(mob->long_descr);
free_string(mob->description);
mob->name = str_dup("python long");
mob->short_descr = str_dup("a long python");
mob->long_descr = str_dup("A long python\n");
mob->description = str_dup("It seems quite friendly.\n");
mob->sex = SEX_NEUTRAL;
mob->race=27;
mob->alignment = -300;
break;
case 4:
free_string(mob->name);
free_string(mob->short_descr);
free_string(mob->long_descr);
free_string(mob->description);
mob->name = str_dup("toad grey");
mob->short_descr = str_dup("a grey toad");
mob->long_descr = str_dup("A grey toad\n");
mob->description = str_dup("He is covered in ugly warts.\n");
mob->sex = SEX_MALE ;
mob->race=21;
mob->alignment = -100;
break;
case 5:
free_string(mob->name);
free_string(mob->short_descr);
free_string(mob->long_descr);
free_string(mob->description);
mob->name = str_dup("parrot green");
mob->short_descr = str_dup("a green parrot");
mob->long_descr = str_dup("A green parrot\n");
mob->description = str_dup("He looks like he belonged to a sailor.\n");
mob->sex = SEX_MALE;
mob->race=28;
mob->alignment = 100;
SET_BIT ( mob->affected_by, AFF_FLYING );
break;
case 6:
free_string(mob->name);
free_string(mob->short_descr);
free_string(mob->long_descr);
free_string(mob->description);
mob->name = str_dup("cat black");
mob->short_descr = str_dup("a black cat");
mob->long_descr = str_dup("A black cat\n");
mob->description = str_dup("She looks quite refined.\n");
mob->sex = SEX_FEMALE;
mob->race=12;
mob->alignment = 300;
break;
case 7:
free_string(mob->name);
free_string(mob->short_descr);
free_string(mob->long_descr);
free_string(mob->description);
mob->name = str_dup("bird blue beautiful");
mob->short_descr = str_dup("a blue bird");
mob->long_descr = str_dup("A beautiful blue bird\n");
mob->description = str_dup("She looks very happy (and somewhat like a chicken)!\n");
mob->sex = SEX_FEMALE;
mob->race=28;
mob->alignment = 750;
SET_BIT ( mob->affected_by, AFF_FLYING );
break;
case 8:
free_string(mob->name);
free_string(mob->short_descr);
free_string(mob->long_descr);
free_string(mob->description);
mob->name = str_dup("cherub cute");
mob->short_descr = str_dup("a cute cherub");
mob->long_descr = str_dup("A cute cherub\n");
mob->description = str_dup("He looks very beautiful, and has little wings on his back.\n");
mob->sex = SEX_MALE;
mob->race=2;
mob->alignment = 1000;
SET_BIT ( mob->affected_by, AFF_FLYING );
break;
}
/* Deliver the familier */
char_to_room( mob, ch->in_room );
act( "$N steps out of the shadows...", ch, NULL, mob, TO_ROOM );
act( "$N steps out of the shadows...", ch, NULL, mob, TO_CHAR );
/* Enslave the familier... */
SET_BIT ( mob->affected_by, AFF_CHARM);
SET_BIT(mob->act, ACT_FOLLOWER);
add_follower( mob, ch );
mob->leader = ch;
mob->master = ch;
ch->pet = mob;
/* For a little flavor... */
do_emote( mob, "looks at you expectantly." );
return;
}
void spell_meteor ( int sn, int level, CHAR_DATA * ch,
void *vo )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int dam;
dam = (spell_calc(ch, sn) + spell_calc(ch, sn) ) /2;
check_damage_obj ( victim, NULL, 5, DAM_OTHER );
damage ( ch, victim, dam, sn, DAM_OTHER, TRUE );
return;
}
void spell_boil ( int sn, int level, CHAR_DATA * ch, void *vo )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int dam;
dam = (spell_calc(ch, sn) + spell_calc(ch, sn) ) /2;
if ( saves_spell ( level, victim ) )
dam /= 2;
check_damage_obj ( victim, NULL, 1, DAM_FIRE );
damage ( ch, victim, dam, sn, DAM_FIRE, TRUE );
return;
}
void spell_dehydrate ( int sn, int level, CHAR_DATA * ch, void *vo )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int dam;
dam = (spell_calc(ch, sn) + spell_calc(ch, sn) ) /2;
if ( saves_spell ( level, victim ) )
dam /= 2;
if (!IS_NPC(victim) )
ch->pcdata->condition[COND_THIRST] = 0;
sound ("magic9.wav", victim);
if ( victim != ch)
sound ("magic9.wav", ch);
damage ( ch, victim, dam, sn, DAM_NEGATIVE, TRUE );
return;
}
void spell_meteor_shower ( int sn, int level, CHAR_DATA * ch, void *vo )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int dam;
int count;
int i;
count = ch->level/10;
if (count < 1)
count = 1;
for (i = 0; i < count ; i++)
{
dam = spell_calc (ch, sn);
check_damage_obj ( victim, NULL, 1, DAM_OTHER );
damage ( ch, victim, dam, sn, DAM_OTHER, TRUE );
}
return;
}