rm6/
rm6/clans/
rm6/councils/
rm6/deity/
rm6/doc/mudprogs/
rm6/exchange/
rm6/gods/
rm6/homes/
rm6/nations/
rm6/player/
rm6/player/a/
rm6/src/RCS/
rm6/src/dmalloc/
rm6/src/dmalloc/bin/
rm6/src/dmalloc/include/
rm6/src/dmalloc/lib/
rm6/src/scripts/
rm6/src/utils/
/****************************************************************************
 * ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh,    *
 * Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith.             *
 * ResortMud Version 5.0b programed By Badastaz and Garinan
 * ------------------------------------------------------------------------ *
 * Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain,   *
 * Ohio.    ALL RIGHTS RESERVED    See /doc/RMLicense.txt for more details. *
 ****************************************************************************/

#include	"mud.h"

/* from magic.c */
void failed_casting( struct skill_type *skill, CHAR_DATA * ch, CHAR_DATA * victim, OBJ_DATA * obj );

ch_ret spell_familiar( int sn, int level, CHAR_DATA * ch, void *vo )
{
   MOB_INDEX_DATA *pMobIndex;
   CHAR_DATA *mount;
   SKILLTYPE *skill = get_skilltype( sn );

   if( ch->pcdata->pet != NULL )
   {
      send_to_char( "You already have a companion.\r\n", ch );
      failed_casting( skill, ch, NULL, NULL );
      return rSPELL_FAILED;
   }
   if( ch->position == POS_FIGHTING )
   {
      send_to_char( "You can't study the ritual while in combat!\r\n", ch );
      failed_casting( skill, ch, NULL, NULL );
      return rSPELL_FAILED;
   }

   if( ( pMobIndex = get_mob_index( MOB_VNUM_FAMILIAR ) ) == NULL )
   {
      send_to_char( "The familiar mob doesn't exist.\r\n", ch );
      return rSPELL_FAILED;
   }
   /*
    * can't cast the spell in these sectors 
    */
   if( ch->in_room->sector_type == SECT_INSIDE
       || ch->in_room->sector_type == SECT_WATER_SWIM
       || ch->in_room->sector_type == SECT_WATER_NOSWIM || ch->in_room->sector_type == SECT_AIR )
   {
      send_to_char( "There is not enough magical energy here.\r\n", ch );
      failed_casting( skill, ch, NULL, NULL );
      return rSPELL_FAILED;
   }

   mount = create_mobile( pMobIndex );

   mount->level = number_fuzzy( ( ch->level + ch->mod_cha ) / 2 );   // charisma bonus added by G
   mount->mana = mount->max_mana = 0;
   mount->hit = mount->max_hit = number_fuzzy( ( ch->max_hit / 2 ) + ch->mod_cha );
   mount->armor = number_fuzzy( ch->armor - 10 );
   mount->hitroll = number_fuzzy( ch->level / 30 );
   mount->damroll = number_fuzzy( ch->level / 30 );

   /*
    * free up the old mob names 
    */
   STRFREE( mount->description );
   STRFREE( mount->name );
   STRFREE( mount->short_descr );
   STRFREE( mount->long_descr );

   /*
    * terrain 
    */
   switch ( ch->in_room->sector_type )
   {
      case ( SECT_CITY ): /* rat */
      case ( SECT_FIELD ):
         mount->description =
            str_dup( "You see a large furry rat.  Long whiskers hang down from it's nose.\r\n"
                     "You can feel the dirt and disease crawling off this beast.\r\n" );
         mount->short_descr = str_dup( "large rat" );
         mount->long_descr = str_dup( "A large furry rodent is here.\r\n" );
         mount->name = str_dup( "familiar rat" );
         xSET_BIT( mount->attacks, DAM_BITE );
         break;
      case ( SECT_FOREST ):  /* falcon */
      case ( SECT_HILLS ):
         mount->description =
            str_dup( "You see a large falcon.  Golden brown feathers frame powerful\r\n"
                     "wings.  Long talons grasp at nothingness in vain attempts at\r\n"
                     "getting some rabbit or rodent for dinner.\r\n" );
         mount->short_descr = str_dup( "large falcon" );
         mount->long_descr = str_dup( "A large falcon screams here.\r\n" );
         mount->name = str_dup( "familiar falcon" );
         xSET_BIT( mount->attacks, DAM_CLAW );
         break;
      case ( SECT_MOUNTAIN ):   /* mountain lion */
         mount->description =
            str_dup( "You see a very large mountain lion.  One wrong look and it could\r\n"
                     "have your head lying at your feet.  You should think better than\r\n"
                     "cross this beast especial if you have a weapon in your hand.\r\n" );
         mount->short_descr = str_dup( "large mountain lion" );
         mount->long_descr = str_dup( "A large mountain lion claws the ground here.\r\n" );
         mount->name = str_dup( "familiar mountain lion" );
         xSET_BIT( mount->attacks, DAM_BITE );
         break;
      case ( SECT_DESERT ):  /* sandworm */
         mount->description =
            str_dup( "You see a large white sandworm wiggling in the light.\r\n"
                     "A red spot on one end makes you guess it is a mouth.\r\n"
                     "A loud moan comes from the direction of that red spot.\r\n" );
         mount->short_descr = str_dup( "sandworm" );
         mount->long_descr = str_dup( "A white sandworm wiggles on the ground here.\r\n" );
         mount->name = str_dup( "familiar sandworm" );
         xSET_BIT( mount->attacks, DAM_SUCTION );
         break;
   }
   /*
    * player seen stuff here 
    */
   do_sit( ch, "" );
   char_to_room( mount, ch->in_room );
   act( AT_MAGIC, "You begin to chant and call to a $N!.", ch, NULL, mount, TO_CHAR );
   act( AT_MAGIC, "$n begins to chant and calls to a $N!", ch, NULL, mount, TO_ROOM );
   WAIT_STATE( ch, 2 * PULSE_MOBILE );
   add_follower( mount, ch );
   mount->leader = ch;
   ch->pcdata->pet = mount;
   do_stand( ch, "" );

   xSET_BIT( mount->act, ACT_PET );
   xSET_BIT( mount->affected_by, AFF_CHARM );
   ch->move -= ( mount->level / 2 );   /* physically draining lose of move */
   return rNONE;
}