ackmud/area/imc/
ackmud/npcs/a/
ackmud/npcs/c/
ackmud/npcs/d/
ackmud/npcs/e/
ackmud/npcs/f/
ackmud/npcs/h/
ackmud/npcs/i/
ackmud/npcs/k/
ackmud/npcs/l/
ackmud/npcs/n/
ackmud/npcs/o/
ackmud/npcs/p/
ackmud/npcs/r/
ackmud/npcs/s/
ackmud/npcs/w/
ackmud/player/c/
ackmud/player/z/
/***************************************************************************
 *                                                                         *
 *       _/          _/_/_/     _/    _/     _/    ACK! MUD is modified    *
 *      _/_/        _/          _/  _/       _/    Merc2.0/2.1/2.2 code    *
 *     _/  _/      _/           _/_/         _/    (c)Stephen Dooley 1994  *
 *    _/_/_/_/      _/          _/  _/             "This mud has not been  *
 *   _/      _/      _/_/_/     _/    _/     _/      tested on animals."   *
 *                                                                         *
 *                                                                         *
 * OBJ_FUN: Like special.c, but for objects, basically.			   *
 ***************************************************************************/

#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"

DECLARE_OBJ_FUN(	objfun_giggle	  	); /* test obj_fun 	*/
DECLARE_OBJ_FUN(	objfun_cast_fight	); /* Casts in fights 	*/
DECLARE_OBJ_FUN(	objfun_sword_aggro	); /* starts fights	*/
DECLARE_OBJ_FUN(	objfun_soul_moan	); /* moaning souls	*/
DECLARE_OBJ_FUN(  objfun_infused_soul ); /* objs with a soul in them */
DECLARE_OBJ_FUN(	objfun_flaming	  	); /* test obj_fun 	*/
DECLARE_OBJ_FUN(	objfun_healing	  	); /* test obj_fun 	*/
DECLARE_OBJ_FUN(	objfun_dispeller  	); /* test obj_fun 	*/
DECLARE_OBJ_FUN(	objfun_regen  	); /* test obj_fun 	*/


OBJ_FUN *obj_fun_lookup( const char *name )
{
   if ( !str_cmp( name, "objfun_giggle"		) ) return objfun_giggle;
   if ( !str_cmp( name, "objfun_cast_fight"	) ) return objfun_cast_fight;
   if ( !str_cmp( name, "objfun_sword_aggro"	) ) return objfun_sword_aggro;
   if ( !str_cmp( name, "objfun_soul_moan"      ) ) return objfun_soul_moan;
   if ( !str_cmp( name, "objfun_infused_soul"   ) ) return objfun_infused_soul;
   if ( !str_cmp( name, "objfun_flaming"	) ) return objfun_flaming;
   if ( !str_cmp( name, "objfun_healing"   ) ) return objfun_healing;
   if ( !str_cmp( name, "objfun_dispeller"	) ) return objfun_dispeller;
   if ( !str_cmp( name, "objfun_regen"	) ) return objfun_regen;

   return 0;
}


char * rev_obj_fun_lookup( void *func )
{
  if ( func == objfun_giggle ) 		return "objfun_giggle";
  if ( func == objfun_cast_fight )	return "objfun_cast_fight";
  if ( func == objfun_sword_aggro )	return "objfun_sword_aggro";
  if ( func == objfun_soul_moan   ) return "objfun_soul_moan";
  if ( func == objfun_infused_soul   ) return "objfun_infused_soul";
  if ( func == objfun_flaming   ) return "objfun_flaming";
  if ( func == objfun_healing   ) return "objfun_healing";
  if ( func == objfun_dispeller   ) return "objfun_dispeller";
  if ( func == objfun_regen   ) return "objfun_regen";

  return 0;
}

void print_obj_fun_lookup( char *buf )
{
   strcat( buf, " objfun_giggle \n\r" );
   strcat( buf, " objfun_cast_fight	\n\r" );
   strcat( buf, " objfun_sword_aggro \n\r" );
   strcat( buf, " objfun_soul_moan \n\r  " );
   strcat( buf, " objfun_infused_soul \n\r  " );
   strcat( buf, " objfun_flaming \n\r" );
   strcat( buf, " objfun_healing \n\r  " );
   strcat( buf, " objfun_dispeller \n\r  " );
   strcat( buf, " objfun_regen \n\r  " );

   return;
}

/********************* OBJFUN FUNCTIONS ********************************/

void objfun_giggle( OBJ_DATA *obj, CHAR_DATA *keeper )
{
   if ( keeper == NULL || keeper->in_room == NULL  )
      return;

   /* Come on... it was SO annoying! */   

   if ( number_percent() < 5 )
   {
      act( "$p carried by $n starts giggling to itself!", keeper, obj, NULL, TO_ROOM );
      act( "$p carried by you starts giggling to itself!", keeper, obj, NULL, TO_CHAR );
      return;
   }
   return;    
}

void objfun_soul_moan( OBJ_DATA *obj, CHAR_DATA *keeper )
{
   if ( keeper == NULL || keeper->in_room == NULL  )
      return;

     /* Come on... it was SO annoying! */   
     if ( number_percent() < 2 )
     {
        act( "@@NThe @@eSoul@@N in $p@@N carried by @@a$n@@N moans in agony.", keeper, obj, NULL, TO_ROOM );
        act( "@@NThe @@eSoul@@N in $p @@Ncarried by you moans to be set free!", keeper, obj, NULL, TO_CHAR );
        return;
     }

     if ( number_percent() < 2 )
     {
        act( "@@NThe @@eSoul@@N in $p@@N carried by @@a$n@@N tries to break free of it's inprisonment!", keeper, obj, NULL, TO_ROOM );
        act( "@@NThe @@eSoul@@N in $p @@Ncarried by you starts writhing--look out!!", keeper, obj, NULL, TO_CHAR );
        return;
     }

   return;    
}

void objfun_infused_soul( OBJ_DATA *obj, CHAR_DATA *keeper )
{

   int sn;
   CHAR_DATA *victim;
   int min_lev;
   char *spell = "";

   if ( keeper == NULL || keeper->in_room == NULL  )
      return;
   if (  ( keeper == NULL )
      || ( obj->item_type != ITEM_WEAPON ) )
      return;

   if   ( get_eq_char( keeper, WEAR_WIELD ) != obj )
  /*    && ( get_eq_char( keeper, WEAR_WIELD2 ) != obj )   )  */
      return;	/* Must be wielded to work */

   if  ( keeper->fighting != NULL )
   {
     for ( victim = keeper->in_room->first_person; victim != NULL; victim = victim->next_in_room )
      if ( victim->fighting == keeper && number_bits(1) == 0 )
         break;

 /*    if ( victim == NULL )   
      continue;  
*/      
     switch ( number_range( 0, 3 ) )
     {
       case 0: min_lev =  43; spell = "throwing star";		break;
       case 1: min_lev =  55; spell = "acid blast";		break;
       case 2: min_lev =  68; spell = "dispel magic";		break;
       case 3: min_lev = 55; spell = "flamestrike";		break;

     } 
     if ( ( sn = skill_lookup( spell ) ) < 0 )
      return;
     act( "$p glows brightly at $n!", victim, obj, NULL, TO_ROOM );
     act( "$p glows brightly at you!", victim, obj, NULL, TO_CHAR );
     obj_cast_spell( sn, obj->level, keeper, victim, obj );
     return;
   }
   else
   {
     /* Come on... it was SO annoying! */   
     if ( number_percent() < 2 )
     {
        act( "@@NThe @@eSoul@@N in $p@@N carried by @@a$n@@N moans in agony.", keeper, obj, NULL, TO_ROOM );
        act( "@@NThe @@eSoul@@N in $p @@Ncarried by you moans to be set free!", keeper, obj, NULL, TO_CHAR );
        return;
     }

     if ( number_percent() < 2 )
     {
        act( "@@NThe @@eSoul@@N in $p@@N carried by @@a$n@@N tries to break free of it's inprisonment!", keeper, obj, NULL, TO_ROOM );
        act( "@@NThe @@eSoul@@N in $p @@Ncarried by you starts writhing--look out!!", keeper, obj, NULL, TO_CHAR );
        return;
     }
   }
   return;    
}

void objfun_cast_fight( OBJ_DATA *obj, CHAR_DATA *keeper )
{
   int sn;
   CHAR_DATA *victim;
   int min_lev;
   char *spell = "";
   if ( keeper == NULL || ( keeper->fighting == NULL )
        || ( obj->item_type != ITEM_WEAPON ) )
      return;
   if ( get_eq_char( keeper, WEAR_WIELD ) != obj )
      return;	/* Must be wielded to work */
   for ( victim = keeper->in_room->first_person; victim != NULL; victim = victim->next_in_room )
      if ( victim->fighting == keeper && number_bits(2) == 0 )
         break;

   if ( victim == NULL )
      return;
   switch ( number_range( 0, 5 ) )
   {
      case 0: min_lev =  5; spell = "magic missile"; 		break;
      case 1: min_lev =  7; spell = "colour spray";		break;
      case 2: min_lev =  8; spell = "chill touch";		break;
      case 3: min_lev = 30; spell = "fireball";			break;
      case 4: min_lev = 55; spell = "flamestrike";		break;
      case 5: min_lev = 30; spell = "lightning bolt";		break;
   } 
   if ( ( sn = skill_lookup( spell ) ) < 0 )
      return;
   act( "$p glows brightly at $n!", victim, obj, NULL, TO_ROOM );
   act( "$p glows brightly at you!", victim, obj, NULL, TO_CHAR );
   obj_cast_spell( sn, obj->level, keeper, victim, obj );
   return;
}

void objfun_sword_aggro( OBJ_DATA *obj, CHAR_DATA *keeper )
{
   /* Weapon 'draws' an aggro mob's attention to the player */   
   /* If fighting,  make cast spells? */
   CHAR_DATA *vch;
   if ( obj->item_type != ITEM_WEAPON )
      return;
   if ( ( keeper == NULL ) || ( obj == NULL ) )
       return;

   if ( get_eq_char( keeper, WEAR_WIELD ) != obj )
      return;
   if ( keeper == NULL || keeper->fighting == NULL )
      return;

   for ( vch = keeper->in_room->first_person; vch != NULL; vch = vch->next_in_room )
   {
      if ( IS_NPC( vch )
      && ( vch->level > keeper->level )
      && IS_SET( vch->act, ACT_AGGRESSIVE )
      && vch->fighting == NULL
      && number_bits( 4 ) == 0 )
      {
         act( "$p carried by $n glows in $s hands.", keeper, obj, NULL, TO_ROOM );
         act( "$p carried by you glows in your hands.", keeper, obj, NULL, TO_CHAR );
         act( "$p says 'LOOK! LOOK!  $n is here!!'", keeper, obj, NULL, TO_ROOM );
         act( "$p says 'LOOK! LOOK!  $n is here!!'", keeper, obj, NULL, TO_CHAR );
         multi_hit( vch, keeper, TYPE_UNDEFINED );
         break;
      }
   }
   return;
}

void objfun_flaming( OBJ_DATA *obj, CHAR_DATA *keeper )
{
   int sn;
   CHAR_DATA *victim;
   int min_lev;
   char *spell = "";
   if ( keeper == NULL || keeper->in_room == NULL  )
      return;
   if (  ( keeper == NULL )
      || ( obj->item_type != ITEM_WEAPON ) )
      return;

   for ( victim = keeper->in_room->first_person; victim != NULL; victim = victim->next_in_room )
      if ( victim->fighting == keeper && number_bits(2) == 0 )
         break;

   if ( victim == NULL )
   {
     if ( number_percent() < 2 )
     {
        act( "@@N$p@@N carried by @@a$n@@e flames @@ybrightly@@N!", keeper, obj, NULL, TO_ROOM );
        act( "@@N$p @@Ncarried by you@@e flames @@ybrightly@@N!", keeper, obj, NULL, TO_CHAR );
        return;
     }

     if ( number_percent() < 2 )
     {
        act( "@@N$p@@N carried by @@a$n@@N goes @@ddim@@N.", keeper, obj, NULL, TO_ROOM );
        act( "@@N$p @@Ncarried by you@@N goes @@ddim@@N.", keeper, obj, NULL, TO_CHAR );
        return;
     }
     return;
   }
   if ( get_eq_char( keeper, WEAR_WIELD ) != obj )
      return;	/* Must be wielded to work */

   switch ( number_range( 0, 11 ) )
   {
      case 0: 
      case 1: 
      case 2: 
      case 3: min_lev =  5; spell = "fireball"; 		break;
      case 4: 
      case 5: 
      case 6: 
      case 7: min_lev =  7; spell = "flamestrike";		break;
      case 8: 
      case 9: 
      case 10: min_lev =  8; spell = "lava burst";		break;
      case 11: min_lev = 30; spell = "heat armor";		break;

   } 
   if ( ( sn = skill_lookup( spell ) ) < 0 )
      return;
   act( "$p flames at $n!", victim, obj, NULL, TO_ROOM );
   act( "$p flames brightly at you!", victim, obj, NULL, TO_CHAR );
   obj_cast_spell( sn, obj->level, keeper, victim, obj );
   return;
}

void objfun_healing( OBJ_DATA *obj, CHAR_DATA *keeper )
{
   int sn;
   CHAR_DATA *victim;
   int min_lev;
   char *spell = "";
   if ( keeper == NULL || keeper->in_room == NULL  )
      return;
   if (  ( keeper == NULL )
      || ( obj->item_type != ITEM_WEAPON ) )
      return;

   for ( victim = keeper->in_room->first_person; victim != NULL; victim = victim->next_in_room )
      if ( victim->fighting == keeper && number_bits(1) == 0 )
         break;

   if ( victim == NULL )
   {
     if ( number_percent() < 2 )
     {
        act( "@@N$p@@N carried by @@a$n@@y glows@@N with a @@mHoly @@Wlight@@N!", keeper, obj, NULL, TO_ROOM );
        act( "@@N$p @@Ncarried by you@@y glows@@N with a @@mHoly @@Wlight@@N!", keeper, obj, NULL, TO_CHAR );
        return;
     }

     if ( number_percent() < 2 )
     {
        act( "@@N$p@@N carried by @@a$n@@N sings a @@mhymn@@N.", keeper, obj, NULL, TO_ROOM );
        act( "@@N$p @@Ncarried by you@@N sings a hymn@@N.", keeper, obj, NULL, TO_CHAR );
        return;
     }
     return;
   }
   if ( get_eq_char( keeper, WEAR_WIELD ) != obj )
      return;	/* Must be wielded to work */
   switch ( number_range( 0, 11 ) )
   {
      case 0: 
      case 1: min_lev =  5; spell = "cure light"; 		break;
      case 2: 
      case 3: 
      case 4: min_lev =  7; spell = "cure serious";		break;
      case 5: 
      case 6: 
      case 7: min_lev =  8; spell = "cure critical";		break;
      case 8: 
      case 9: 
      case 10: 
      case 11: min_lev = 30; spell = "heal";		break;

   } 
   if ( ( sn = skill_lookup( spell ) ) < 0 )
      return;
   act( "$p blankets $n @@Win a @@mhealing @@Waura@@N!", keeper, obj, NULL, TO_ROOM );
   act( "$p blankets you in a @@mhealing @@Waura@@N!", keeper, obj, NULL, TO_CHAR );
   obj_cast_spell( sn, obj->level, keeper, keeper, obj );
   return;
}

void objfun_dispeller( OBJ_DATA *obj, CHAR_DATA *keeper )
{
   int sn;
   CHAR_DATA *victim;
   int min_lev;
   char *spell = "";
   if ( keeper == NULL || keeper->in_room == NULL  )
      return;
   if (  ( keeper == NULL )
      || ( obj->item_type != ITEM_WEAPON ) )
      return;

   for ( victim = keeper->in_room->first_person; victim != NULL; victim = victim->next_in_room )
      if ( victim->fighting == keeper && number_bits(2) == 0 )
         break;

   if ( victim == NULL )
   {
     if ( number_percent() < 2 )
     {
        act( "@@N$p@@N carried by @@a$n@@a vibrates @@Nsuddenly@@N!", keeper, obj, NULL, TO_ROOM );
        act( "@@N$p @@Ncarried by you@@a vibrates @@Nsuddenly@@N!", keeper, obj, NULL, TO_CHAR );
        return;
     }

     if ( number_percent() < 2 )
     {
        act( "@@N$p@@N carried by @@a$n@@a peers@@N at your inventory@@N.", keeper, obj, NULL, TO_ROOM );
        act( "@@N$p @@Ncarried by you@@a peers@@N around the room@@N.", keeper, obj, NULL, TO_CHAR );
        return;
     }
     return;
   }
   if ( get_eq_char( keeper, WEAR_WIELD ) != obj )
      return;	/* Must be wielded to work */

   switch ( number_range( 0, 11 ) )
   {
      case 0: 
      case 1: 
      case 2: 
      case 3: min_lev =  5; spell = "ego whip"; 		break;
      case 4: 
      case 5: 
      case 6: min_lev =  7; spell = "bloody tears";		break; 
      case 7: 
      case 8: 
      case 9: 
      case 10: 
      case 11: min_lev = 30; spell = "dispel magic";		break;

   } 
   if ( ( sn = skill_lookup( spell ) ) < 0 )
      return;
   act( "$p @@apeers@@N deeply into the mind of $n!", victim, obj, NULL, TO_ROOM );
   act( "$p @@apeers @@Ninto your thoughts!", victim, obj, NULL, TO_CHAR );
   obj_cast_spell( sn, obj->level, keeper, victim, obj );
   return;
}
void objfun_regen( OBJ_DATA *obj, CHAR_DATA *keeper )
{
   if ( keeper == NULL || keeper->in_room == NULL  )
      return;

   if ( obj->wear_loc < 0 )
     return;
   keeper->hit = UMIN( keeper->max_hit, keeper->hit + (  number_range( obj->level/ 20, obj->level/ 5 ) ) );
   return;
}