mud_dist/area/
/***************************************************************************
 *  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.                              *
 *                                                                         *
 *  Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David   *
 *  Love, Guilherme 'Willie' Arnold, and Mitchell Tse.                     *
 *                                                                         *
 *  In order to use any part of this Envy Diku Msud, you must comply with  *
 *  the original Diku license in 'license.doc', the Merc license in        *
 *  'license.txt', as well as the Envy license in 'license.nvy'.           *
 *  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.                                                  *
 ***************************************************************************/

/*$Id: cls_shm.c,v 1.17 2005/04/04 13:49:13 ahsile Exp $*/

#if defined( macintosh )
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <time.h>
#include "merc.h"

extern char* target_name;

int skill_ethereal_wolf( int sn, int level, CHAR_DATA *ch, void *vo )
{
    AFFECT_DATA af;
    char arg [ MAX_INPUT_LENGTH ];
    CHAR_DATA *victim;
   
/*
    if ( !IS_NPC( ch )
        && ( ( ch->level < skill_table[sn].skill_level[ch->class] )
        && (ch->level < skill_table[sn].skill_level[ch->multied])))
    {
        send_to_char(C_DEFAULT, "You can not perform that skill.\n\r", ch );
        return SKPELL_MISSED;
    }
*/

    // modified check so if NPCs have spell on already
    // they can use bite/howl/etc - Ahsile
    if ( IS_NPC(ch) || number_percent( ) > ( ch->pcdata->learned[sn] / 10 )  )
    {
	if (IS_NPC(ch))
	{
		if (!IS_AFFECTED4(ch, AFF_ETHEREAL_WOLF))
		{	
			send_to_char( C_DEFAULT, "You failed.\n\r", ch );
			return SKPELL_MISSED;
		}
	} else
	{
			send_to_char( C_DEFAULT, "You failed.\n\r", ch );
			return SKPELL_MISSED;
	}
    }
       
    if ( !ch->fighting )
    {
	if ( IS_AFFECTED4( ch, AFF_ETHEREAL_WOLF ) )
	{
	    send_to_char( AT_DGREY, "You replace your ethereal wolf with a new one.\n\r", ch );
	    return SKPELL_NO_DAMAGE;
	}

	/* TO DO: Mana costs */
   
	af.type = sn;
	af.level = ch->level;
	af.duration = ch->level;
	af.location = APPLY_NONE;
	af.modifier = 0;
	af.bitvector = AFF_ETHEREAL_WOLF;
	affect_to_char4(ch, &af);
	act( AT_DGREY, "$n summons an ethereal wolf!", ch, NULL, NULL, TO_ROOM );
	send_to_char( AT_DGREY, "You have summoned an ethereal wolf to assist you.\n\r", ch );

	WAIT_STATE( ch, skill_table[sn].beats );

	return SKPELL_NO_DAMAGE;
    }

    /* Wolf commands will go here */

    victim = ch->fighting;

    if (target_name[0] == '\0')
    {
	send_to_char( AT_DGREY, "You get the attention of your wolf.\n\r", ch );
	act( AT_DGREY, "$n gets the attention of $m wolf.", ch, NULL, NULL, TO_ROOM );
	return SKPELL_NO_DAMAGE;
    }

    if ( !str_cmp( target_name, "bite" ) )
    {
	send_to_char( AT_DGREY, "You order your wolf to bite!\n\r", ch );
	act( AT_DGREY, "$n orders $m ethereal wolf to bite!", ch, NULL, NULL, TO_ROOM );
	WAIT_STATE( ch, skill_table[skill_lookup("ethereal wolf bite")].beats );
	return spell_ethereal_wolf_bite ( skill_lookup("ethereal wolf bite"), ch->level, ch, victim );
	
    }

    if ( !str_cmp( arg, "claw" ) )
    {
	send_to_char( AT_DGREY, "You order your wolf to claw!\n\r", ch );
	act( AT_DGREY, "$n orders $m ethereal wolf to claw!", ch, NULL, NULL, TO_ROOM );
	WAIT_STATE( ch, skill_table[skill_lookup("ethereal wolf claw")].beats );
	return spell_ethereal_wolf_claw ( skill_lookup("ethereal wolf claw"), ch->level, ch, victim );
    }

    if ( !str_cmp( arg, "howl" ) )
    {
	send_to_char( AT_DGREY, "You order your wolf to howl!\n\r", ch );
	act( AT_DGREY, "$n orders $m ethereal wolf to howl!", ch, NULL, NULL, TO_ROOM );
	spell_ethereal_wolf_howl ( skill_lookup("ethereal wolf howl"), ch->level, ch, victim );
    
	WAIT_STATE( ch, skill_table[skill_lookup("ethereal wolf howl")].beats / 2);
	send_to_char( AT_DGREY, "You are terrified!\n\r", victim );
	if( !saves_spell( ch->level, victim ) )
	{
	    WAIT_STATE( victim, skill_table[skill_lookup("ethereal wolf howl")].beats );
	}
    
	return SKPELL_NO_DAMAGE;
    }

    send_to_char ( AT_DGREY, "You may only order your wolf to BITE, CLAW or HOWL.\n\r", ch );

    return SKPELL_BOTCHED;

}

int skill_ethereal_snake( int sn, int level, CHAR_DATA *ch, void *vo )
{
    AFFECT_DATA af;
    CHAR_DATA *victim;
   
/*
    if ( !IS_NPC( ch )
        && ( ( ch->level < skill_table[sn].skill_level[ch->class] )
        && (ch->level < skill_table[sn].skill_level[ch->multied])))
    {
        send_to_char(C_DEFAULT, "You can not perform that skill.\n\r", ch );
        return SKPELL_MISSED;
    }
*/

    // modified check so if NPCs have spell on already
    // they can use bite/devour/etc - Ahsile
    if ( IS_NPC(ch) || number_percent( ) > ( ch->pcdata->learned[sn] / 10 ) )
    {
	if (IS_NPC(ch))
	{
		if (!IS_AFFECTED4(ch, AFF_ETHEREAL_SNAKE))
		{	
			send_to_char( C_DEFAULT, "You failed.\n\r", ch );
			return SKPELL_MISSED;
		}
	} else
	{
			send_to_char( C_DEFAULT, "You failed.\n\r", ch );
			return SKPELL_MISSED;
	}
    }
   
    if ( !ch->fighting )
    {
	if ( IS_AFFECTED4( ch, AFF_ETHEREAL_SNAKE ) )
	{
	    send_to_char( AT_DGREY, "You replace your ethereal snake with a new one.\n\r", ch );
	    return SKPELL_NO_DAMAGE;
	}

	/* TO DO: Mana costs */
   
	af.type = sn;
	af.level = ch->level;
	af.duration = ch->level;
	af.location = APPLY_NONE;
	af.modifier = 0;
	af.bitvector = AFF_ETHEREAL_SNAKE;
	affect_to_char4(ch, &af);
	act( AT_DGREY, "$n summons an ethereal snake!", ch, NULL, NULL, TO_ROOM );
	send_to_char( AT_DGREY, "You have summoned an ethereal snake to assist you.\n\r", ch );

	WAIT_STATE( ch, skill_table[sn].beats );

	return SKPELL_NO_DAMAGE;
    }

    /* Snake commands will go here */

    victim = ch->fighting;

    if (target_name[0] == '\0')
    {
	send_to_char( AT_DGREY, "You get the attention of your snake.\n\r", ch );
	act( AT_DGREY, "$n gets the attention of $m snake.", ch, NULL, NULL, TO_ROOM );
	return SKPELL_NO_DAMAGE;
    }

    if ( !str_cmp( target_name, "bite" ) )
    {
	send_to_char( AT_DGREY, "You order your snake to bite!\n\r", ch );
	act( AT_DGREY, "$n orders $m ethereal snake to bite!", ch, NULL, NULL, TO_ROOM );
	WAIT_STATE( ch, skill_table[skill_lookup("ethereal snake bite")].beats );
	
	return spell_ethereal_snake_bite ( skill_lookup("ethereal snake bite"), ch->level, ch, victim );
    }

    if ( !str_cmp( target_name, "strike" ) )
    {
	send_to_char( AT_DGREY, "You order your snake to strike!\n\r", ch );
	act( AT_DGREY, "$n orders $m ethereal snake to strike!", ch, NULL, NULL, TO_ROOM );
	WAIT_STATE( ch, skill_table[skill_lookup("ethereal snake strike")].beats );

	return spell_ethereal_snake_strike ( skill_lookup("ethereal snake strike"), ch->level, ch, victim );

    }

    if ( !str_cmp( target_name, "devour" ) )
    {
	send_to_char( AT_DGREY, "You order your snake to devour!\n\r", ch );
	act( AT_DGREY, "$n orders $m ethereal snake to devour its target whole!", ch, NULL, NULL, TO_ROOM );
	WAIT_STATE( ch, skill_table[skill_lookup("ethereal snake devour")].beats);
	
	return spell_ethereal_snake_devour ( skill_lookup("ethereal snake devour"), ch->level, ch, victim );

    }

    send_to_char ( AT_DGREY, "You may only order your snake to BITE, STRIKE or DEVOUR.\n\r", ch );

    return SKPELL_BOTCHED;

}

int spell_ethereal_wolf_bite( int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    int        dam;
        
    dam = number_range(  ch->level * 3, ch->level * 7 );
    if ( saves_spell( level, victim ) )
    {
        dam = number_range( ch->level * 3 / 2, ch->level * 7 / 2 );
    }
    damage( ch, victim, dam, sn );

    return SKPELL_NO_DAMAGE;
}

int spell_ethereal_wolf_claw( int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    int        dam;
    
    dam = number_range(  ch->level * 4, ch->level * 6 );
    if ( saves_spell( level, victim ) )
    {
        dam = number_range( ch->level * 4 / 2, ch->level * 7 / 6 );
    }
    damage( ch, victim, dam, sn );
    
    return SKPELL_NO_DAMAGE;
}

int spell_ethereal_wolf_howl( int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA  *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;
 
    if ( is_affected( victim, sn ) || is_affected( ch, sn ) )
    {
        return SKPELL_MISSED;
    }

    af.type      = sn;
    af.level     = level;
    af.duration  = level / 5;
    af.location  = APPLY_DAMROLL;
    af.modifier  = ( level / 5 ) * -1;
    af.bitvector = 0;
    affect_to_char( victim, &af );

    af.location  = APPLY_HITROLL;
    af.modifier  = ( level / 5 ) * -1;
    affect_to_char( victim, &af );

    af.location = APPLY_DAMROLL;
    af.modifier = level / 5;
    affect_to_char( ch, &af );

    af.location = APPLY_HITROLL;
    af.modifier	 = level / 5;
    affect_to_char( ch, &af );

    return SKPELL_NO_DAMAGE;
}

int spell_ethereal_snake_strike( int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    int        dam;
        
    dam = number_range(  ch->level * 5, ch->level * 7 );
    if ( saves_spell( level, victim ) )
    {
        dam = number_range( ch->level * 5 / 2, ch->level * 7 / 2 );
    }
    damage( ch, victim, dam, sn );

    return SKPELL_NO_DAMAGE;
}

int spell_ethereal_snake_bite(int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    int        dam;

    if ( !saves_spell( level, victim ) )
    {
	dam = number_range( ch->level * 5, ch->level * 6 );
    }
    else
    {
	dam = number_range( ch->level * 7, ch->level * 9 );

	spell_poison( skill_lookup("poison"), ch->level, ch, victim );
    }

    damage( ch, victim, dam, sn );

    return SKPELL_NO_DAMAGE;
}

int spell_ethereal_snake_devour(int sn, int level, CHAR_DATA *ch, void *vo )
{

    CHAR_DATA *victim = (CHAR_DATA *) vo;
    OBJ_DATA  *obj_lose;
    OBJ_DATA  *obj_next;
        
    if ( !IS_NPC(victim) )
    {
      send_to_char(AT_BLUE, "You failed.\n\r", ch);
      return SKPELL_MISSED;
    }
        
    if ( number_percent( ) < level && !saves_spell( level, victim ) )
      for ( obj_lose = victim->carrying; obj_lose; obj_lose = obj_next )
      {
          obj_next = obj_lose->next_content;
          if ( obj_lose->deleted )
              continue;
   
          if ( number_bits( 2 ) != 0 )
              continue;
     
          act(AT_WHITE, "$p has been devoured by an ethereal snake!",      victim, obj_lose, NULL, TO_CHAR );
          act(AT_WHITE, "$n's $p has been devoured by an ethereal snake!", victim, obj_lose, NULL, TO_ROOM );
          extract_obj( obj_lose ) ;
      }
        
    if ( !saves_spell( level, victim ) )

    /*
     * Devour char, do not generate a corpse, do not
     * give experience for kill.  Extract_char will take care   
     * of items carried/wielded by victim.
     */
    {
        act(AT_WHITE, "Your ethereal snake has DEVOURED $N!",         ch, NULL, victim, TO_CHAR );
        act(AT_WHITE, "You have been DEVOURED by $n's ethereal snake!", ch, NULL, victim, TO_VICT );
        act(AT_WHITE, "$n's ethereal snake DEDVOURS $N!",       ch, NULL, victim, TO_ROOM );
    
        if ( IS_NPC( victim ) )
	{
            extract_char( victim, TRUE );
	}
        else
	{
            extract_char( victim, FALSE );
	}
    }     
    return SKPELL_NO_DAMAGE;
}