/* Cat spec from Ansalonmud.com - DSL
If you want to give credit, cool 
Include this in the bools in special.c

No warrantees etc, this is provided 'as is'
*/

/* In the defines add */
DECLARE_SPEC_FUN( spec_alleycat         );

/* In const struct  spec_type spec_table add */
    { "spec_alleycat",         spec_alleycat         },


bool spec_alleycat( CHAR_DATA *ch )
{
    CHAR_DATA *victim;
    CHAR_DATA *v_next;

    if ( ch->position != POS_STANDING )
      return FALSE;
	
    // Look for PREY
    for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
    {
	v_next = victim->next_in_room;

	if (is_safe (ch, victim) || (victim == ch))
	  continue;


	if ( !IS_NPC(victim)
	||   victim->level >= ch->level + 6
	||   number_bits( 4 ) != 0
	||   !can_see(ch,victim))
      continue;

    if (!is_name("rat", victim->name) 
       && !is_name("mouse", victim->name)
       && !is_name("bird", victim->name)
       && !is_name("swallow", victim->name)
       && !is_name("sparrow", victim->name))
      continue;

	if ( IS_AWAKE(victim) && number_range( 0, ch->level ) <= ch->level / 2 )
	{
	    act( "$n arches $s back and yowls at you!", ch, NULL, victim, TO_VICT );
	    act( "$n arches $s back at $N and yowls!", ch, NULL, victim, TO_NOTVICT );
	    return TRUE;
	}
	else
	{
        //Unnecessary unless you have changed hide/vis messages, comment out if wanted.
        if (!IS_AFFECTED(ch,AFF_HIDE))
           SET_BIT(ch->affected_by,AFF_HIDE);
        if (ch->level >= victim->level || victim->level - ch->level < 5)
        {
          //If you've made do_bite() as a combat action; 
          //uncomment the next line
          //do_function (ch, &do_bite, victim->name);
          multi_hit( ch, victim, TYPE_UNDEFINED );
	      return TRUE;
	    }
	    else
	      return FALSE;
	}
    }// End PREY section

    if (ch->hit < ch->max_hit)
      return FALSE; // Not friendly when hurt

    // Look for FRIENDS
    for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
    {
	v_next = victim->next_in_room;

	if (!can_see (ch,victim) || (victim == ch))
	  continue;

    /* IS_KENDER(ch) etc are defined in merc.h such as:
    #define IS_KENDER(ch)     (ch->race == race_lookup("kender"))
    
    You'll want to make these for any race you want the
    cats to be MORE friendly to */

    // Cats like little people better, not evils though
    if ((IS_KENDER(victim) || IS_AGHAR(victim) 
    || IS_NEIDAR(victim) || IS_HYLAR(victim) 
    || IS_GNOME(victim)))
    {
      if (number_bits (4) !=0)
      continue;
    }
    /* IS_MINOTAUR(ch) etc are defined in merc.h such as:
    #define IS_MINOTAUR(ch)     (ch->race == race_lookup("minotaur"))
    
    You'll want to make these for any race you want the
    cats to ignore or even 'fear' if you add that. */
    else if (IS_MINOTAUR(victim) || IS_GOBLIN(victim) 
    || IS_HOBGOBLIN(victim) || IS_OGRE(victim))
      continue;
    else if (number_bits (8) !=0)
      continue;

    if (is_name("rat", victim->name) 
	     || is_name("mouse", victim->name)
	     || is_name("bird", victim->name)
	     || is_name("swallow", victim->name)
	     || is_name("sparrow", victim->name)
	     || is_name("dog", victim->name)
	     || !IS_HUMANOID(victim))
      continue;

    switch (number_range (1, 12)) // Positive Reaction Switch
    {
    default:
    case 1:
    case 2:
    case 3:
      {
        act( "$n quietly meows at you.", ch, NULL, victim, TO_VICT );
        act( "$n quietly meows at $N.", ch, NULL, victim, TO_NOTVICT );
        return TRUE;
      }
      break;
    case 4:
    case 5:
      {
        act( "$n purrs at you and rubs against your leg.", ch, NULL, victim, TO_VICT );
        act( "$n purrs at $N and rubs against $S leg.", ch, NULL, victim, TO_NOTVICT );
        return TRUE;
      }
      break;
    case 6:
      {
        act( "$n meows at you loudly.", ch, NULL, victim, TO_VICT );
        act( "$n meows at $N loudly.", ch, NULL, victim, TO_NOTVICT );
        return TRUE;
      }
      break;
    case 7:
    case 8:
      {
        act( "$n looks at you and begins cleaning $mself.", ch, NULL, victim, TO_VICT );
        act( "$n looks at $N and begins cleaning $mself.", ch, NULL, victim, TO_NOTVICT );
        return TRUE;
      }
      break;    
    case 9:
    case 10:
        if (victim->position >= POS_STANDING)
        {
          act( "$n walks around your legs and purrs.", ch, NULL, victim, TO_VICT );
          act( "$n walks around $N's legs and purrs.", ch, NULL, victim, TO_NOTVICT );
        }
        else
        {
          act( "$n crawls up onto your lap for a moment and rubs against you.", ch, NULL, victim, TO_VICT );
          act( "$n crawls up onto $N's lap and rubs against $M for a moment.", ch, NULL, victim, TO_NOTVICT );
        }
      return TRUE;
      break;
    case 11:
    case 12:
        if (victim->position >= POS_STANDING)
        {
           act ("$n yawns and stretches, then curls up.", ch, NULL, NULL, TO_ROOM);
           do_function (ch, &do_sleep, "");
           return TRUE;
        }
      break;    
    }// End Random Positive Reaction Switch

    }// End FRIEND section
    return FALSE;
}
