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_bar.c,v 1.6 2005/03/11 17:47:55 ahsile Exp $*/

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

char* target_name;
extern void check_killer  args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
extern void one_hit       args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) );

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

    CHAR_DATA *victim = (CHAR_DATA*) vo;

    if ( !( victim = get_char_world( ch, target_name ) )
        || IS_SET( victim->in_room->room_flags, ROOM_PRIVATE   )
        || IS_SET( victim->in_room->room_flags, ROOM_SOLITARY  ) )
    {
        send_to_char(AT_BLUE, "You failed.\n\r", ch );
        return SKPELL_BOTCHED;
    }

    if ( ch->fighting )
    {
        send_to_char(C_DEFAULT, "Not while in combat.\n\r", ch );
        return SKPELL_BOTCHED;
    }
    if ( victim == NULL )
    {
      send_to_char(AT_GREY, "Leap to whom?\n\r", ch );
      return SKPELL_BOTCHED;
    }

    if ( victim->in_room->area != ch->in_room->area
        || IS_SET( victim->in_room->room_flags, ROOM_PRIVATE   )
        || IS_SET( victim->in_room->room_flags, ROOM_SOLITARY  )
	|| IS_SET( victim->in_room->room_flags, ROOM_INDOORS )
	|| IS_SET( ch->in_room->room_flags, ROOM_INDOORS )
        || IS_SET( victim->in_room->area->area_flags, AREA_PROTOTYPE )
        || (IS_AFFECTED4(victim, AFF_DECEPTION) && (number_percent() < (ch->level - 10))))
    {
        send_to_char(AT_GREY, "You are unable to Leap to that one.\n\r", ch );
        return SKPELL_BOTCHED;
    }

    if ( IS_SET(ch->in_room->area->area_flags, AREA_PRESENT)
        && (IS_SET( victim->in_room->area->area_flags, AREA_FUTURE )
        || IS_SET( victim->in_room->area->area_flags, AREA_PAST ) ) )
    {
	send_to_char(AT_GREY, "You are unable to Leap to that one.\n\r", ch );
        return SKPELL_BOTCHED;
    }

    if ( IS_SET(ch->in_room->area->area_flags, AREA_FUTURE)
        && (IS_SET( victim->in_room->area->area_flags, AREA_PRESENT )
        || IS_SET( victim->in_room->area->area_flags, AREA_PAST ) ) )
    {
	send_to_char(AT_GREY, "Your are unable to Leap to that one.\n\r", ch );
        return SKPELL_BOTCHED;
    }

    if ( IS_SET(ch->in_room->area->area_flags, AREA_PAST)
        && (IS_SET( victim->in_room->area->area_flags, AREA_FUTURE )
        || IS_SET( victim->in_room->area->area_flags, AREA_PRESENT ) ) )
    {
	send_to_char(AT_GREY, "Your are unable to Leap to that one.\n\r", ch );
        return SKPELL_BOTCHED;
    }

    act(AT_RED, "$n bends $s muscular legs and jumps into the clouds above!", ch, NULL, NULL, TO_ROOM );
    if ( ch != victim )
    {
     char_from_room( ch );
     char_to_room( ch, victim->in_room );
    }
    act(AT_RED, "$n comes hurtling from the sky at lands with a large THUD!", ch, NULL, NULL, TO_ROOM );
    do_look( ch, "auto" );
    
	return SKPELL_NO_DAMAGE;
}

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

    if ( !( victim = get_char_world( ch, target_name ) )
        || IS_SET( victim->in_room->room_flags, ROOM_SAFE  )
        || IS_SET( ch->in_room->room_flags, ROOM_SAFE  ) )
    {
        send_to_char(AT_BLUE, "You failed.\n\r", ch );
        return SKPELL_BOTCHED;
    }

    spell_leap(sn, ch->level, ch, (void*) victim);

    if(ch->in_room != victim->in_room)
    {
		return SKPELL_BOTCHED;
    }


    if ( victim == ch )
    {
        send_to_char(C_DEFAULT, "How can you jump at yourself?\n\r", ch );
        return SKPELL_BOTCHED;
    }

    if ( victim->fighting )
    {
        send_to_char(C_DEFAULT, "You can't jump on someone who is fighting.\n\r", ch );
        return SKPELL_MISSED;
    }

    if ( victim->hit < (victim->max_hit/2) )
    {
        act(C_DEFAULT, "$N is hurt and suspicious ... you can't leap upon them.",
            ch, NULL, victim, TO_CHAR );
        return SKPELL_MISSED;
    }

    if ( !is_pkillable( ch, victim ) ) {
        return SKPELL_MISSED;
    }

    if ( IS_AFFECTED2( ch, AFF_SHADOW_PLANE ))
    {
      send_to_char(AT_WHITE, "You must leave the shadow realm.\n\r", ch);
      return SKPELL_BOTCHED;
    }
    if ( IS_AFFECTED4( ch, AFF_BURROW ))
    {
      send_to_char(AT_WHITE, "You must wait until the earth heals you.\n\r", ch);
      return SKPELL_BOTCHED;
    }

    if ( IS_AFFECTED2( victim, AFF_SHADOW_PLANE ))
    {
      send_to_char(AT_WHITE, "You can not attack someone who is in the shadow plane.\n\r", ch);
      return SKPELL_BOTCHED;
    }
    if ( IS_AFFECTED4( victim, AFF_BURROW ))
    {
      send_to_char(AT_WHITE, "You can not attack someone who is burrowed.\n\r", ch);
      return SKPELL_BOTCHED;
    }

    if ( IS_AFFECTED( victim, AFF_PEACE ) )
    {
      send_to_char(AT_WHITE, "A wave of peace overcomes you.\n\r", ch);
      return SKPELL_BOTCHED;
    }
    if ( !IS_NPC ( ch ) )
    {
        if (( number_percent( ) >= ((number_fuzzy(ch->pcdata->learned[sn])/20) + ((get_curr_dex( ch ) + get_curr_str( ch )/2)))) && str_cmp(ch->name,"Torfi"))
        {
	    /* Double Wait state for missing */
            send_to_char(AT_YELLOW, "You miss your target!.\n\r", ch );
	    act(AT_RED, "$n's weapon grazes your ear narrowly missing you, $e looks stunned!", ch, NULL, NULL, TO_ROOM );
	    WAIT_STATE( ch, skill_table[sn].beats );
            return SKPELL_MISSED;
        }
    }

    if (!IS_NPC(victim))
        ch->pkill_timer = 0;

    one_hit( ch, victim, sn );    

    return SKPELL_NO_DAMAGE;
}