ddance/area/
ddance/data/
ddance/gods/
ddance/player/
ddance/player/skill/
/****************************************************************************
 *  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.								*
 *																			*
 *  In order to use any part of this Merc Diku Mud, you must comply with	*
 *  both the original Diku license in 'license.doc' as well the Merc		*
 *  license in 'license.txt'.  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.													*
 ***************************************************************************/
 
/****************************************************************************
*	ROM 2.4 is copyright 1993-1998 Russ Taylor								*
*	ROM has been brought to you by the ROM consortium						*
*	    Russ Taylor (rtaylor@hypercube.org)									*
*	    Gabrielle Taylor (gtaylor@hypercube.org)							*
*	    Brian Moore (zump@rom.org)											*
*	By using this code, you have agreed to follow the terms of the			*
*	ROM license, in the file Rom24/doc/rom.license							*
***************************************************************************/
/****************************************************************************
*	Demon's Dance MUD, and source code are property of Eric Goetschalckx	*
*	By compiling this code, you agree to include the following in your		*
*	login screen:															*
*	    Derivative of Demon's Dance, by Enzo/Stan							*
***************************************************************************/

/*
*	Legionare Skill File
*/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "arena.h"
#include "interp.h"
#include "tables.h"
#include "olc.h"
#include "recycle.h"
#include "lookup.h"

void do_strike( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    OBJ_DATA *obj;
 
    one_argument( argument, arg );

	if (arg[0] == '\0')
    {
	victim = ch->fighting;
	if (victim == NULL)
	{
	send_to_char("But you aren't fighting anyone!\n\r",ch);
	return;
	}
    }

	else if ((victim = get_char_room(ch,NULL,arg)) == NULL)
    {
    send_to_char("They aren't here.\n\r",ch);
    return;
    }
 
    if ( is_safe( ch, victim ) )
      return;
	if (!know_skill(ch,"strike"))
		return;
 
    if (IS_NPC(victim) 
		&& victim->fighting != NULL 
		&& !is_same_group(ch,victim->fighting) 
		&& !is_arena(victim))
    {
    send_to_char("Kill stealing is not permitted.\n\r",ch);
    return;
    }

    if ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL)
    {
        send_to_char( "You must wield a weapon to strike your enemy.\n\r", ch );
        return;
    }
 
    check_killer( ch, victim );
	WAIT_STATE( ch, skill_table[gsn_strike].beats );
    if ( number_percent( ) < get_skill(ch,gsn_strike)
    || ( get_skill(ch,gsn_strike) >= 2 && !IS_AWAKE(victim) ) )
    {
        check_improve(ch,gsn_strike,TRUE,1);
		check_dual_attack(ch,victim, gsn_strike);
	}
    else
    {
        check_improve(ch,gsn_strike,FALSE,1);
        damage( ch, victim, 0, gsn_strike,DAM_NONE,TRUE,FALSE);
    }
 
    return;
}

void do_phalanx( CHAR_DATA *ch, char *argument)
{
	int chance, hp_percent;

    if ((chance = get_skill(ch,gsn_phalanx)) == 0)
    {
	send_to_char("You are unable to join the phalanx formation, and you hang your head in shame\n\r",ch);
	return;
    }

    if (IS_AFFECTED(ch,AFF_CALM))
    {
	send_to_char("You're feeling to mellow to move int a phalanx.\n\r",ch);
	return;
    }

	if ( is_affected(ch,gsn_phalanx) )
	{
		send_to_char("You're already in the Phalanx formation dummy.",ch);
		return;
	}

    if (ch->mana < 50)
    {
	send_to_char("You can't get up enough energy.\n\r",ch);
	return;
    }

    /* modifiers */

    /* fighting */
    if (ch->position == POS_FIGHTING)
	chance += 10;

    /* damage -- below 50% of hp helps, above hurts */
    hp_percent = 100 * ch->hit/ch->max_hit;
    chance += 25 - hp_percent/2;

    if (number_percent() < chance)
    {
	AFFECT_DATA af;
	WAIT_STATE(ch,skill_table[gsn_phalanx].beats);
	ch->mana -= 50;

	/* heal a little damage */
	ch->hit += ch->level * 2;
	ch->hit = UMIN(ch->hit,ch->max_hit);

	send_to_char("You shift into the Phalanx position, ready for attack\n\r",ch);
	act("$n moves into a phalanx position, readying for attack",ch,NULL,NULL,TO_ROOM);
	check_improve(ch,gsn_phalanx,TRUE,2);

	af.where	= TO_AFFECTS2;
	af.type		= gsn_phalanx;
	af.level	= ch->level;
	af.duration	= number_fuzzy(ch->level / 30);
	af.modifier	= UMAX(1, ch->level / 1.5);
	af.bitvector = AFF_PHALANX;

	af.location	= APPLY_HITROLL;
	affect_to_char(ch,&af);

	af.location	= APPLY_DAMROLL;
	affect_to_char(ch,&af);

	af.modifier	= (-1 * UMAX(10,15 * (ch->level/3)));
	af.location	= APPLY_AC;
	affect_to_char(ch,&af);
    }

    else
    {
	WAIT_STATE(ch,skill_table[gsn_phalanx].beats);
	ch->mana -= 25;

	send_to_char("Your movements are to slow, and the phalanx moves off without you\n\r",ch);
	check_improve(ch,gsn_phalanx,FALSE,2);
    }
}


void do_shield_wall ( CHAR_DATA *ch, char *argument)
{
	int chance;

    AFFECT_DATA af;

    if ( IS_AFFECTED2(ch, AFF_SHIELD_WALL) )
    {
	send_to_char("You are already protected by your shield\n\r",ch);
	return;
    }

	if ( (get_eq_char (ch,WEAR_SHIELD)) == NULL)
	{
		send_to_char("You can't very well hide behind something you aren't using now can you\n\r",ch);
		return;
	}

	if ((chance = get_skill(ch,gsn_shield_wall)) == 0
    ||  (!IS_NPC(ch)
    &&   ch->level < skill_table[gsn_shield_wall].skill_level[ch->class]))
    {
	send_to_char("You can't hide behind your shield because you are to oafish.\n\r",ch);
	return;
    }

    if (ch->position < POS_STANDING)
	{
		send_to_char("How do you expect to hide behind your shield when you're sleeping?\n\r", ch);
		return;
	}
	/*set the shieldwall flag*/
	af.where     = TO_AFFECTS2;
	af.type		 = gsn_shield_wall;
    af.level     = ch->level;
    af.duration  = number_fuzzy( ch->level / 30 );
    af.location  = APPLY_NONE;
    af.modifier  = 0;
    af.bitvector = AFF_SHIELD_WALL;
	affect_to_char(ch,&af);

	/*negaive hit and dam affect*/
	af.modifier	= (UMAX(1, ch->level / 2))*-1;
	af.bitvector 	= AFF_SHIELD_WALL;

	af.location	= APPLY_HITROLL;
	affect_to_char(ch,&af);

	af.location	= APPLY_DAMROLL;
	affect_to_char(ch,&af);
    act( "$n hunkers down behind $s shield", ch, NULL, NULL, TO_ROOM );
    send_to_char( "You sucsessfully protect your entire body behind your shield\n\r", ch );
	check_improve(ch,gsn_shield_wall,TRUE,2);
    return;
}


void do_emerge ( CHAR_DATA *ch, char *argument)
{

    if ( !is_affected(ch,gsn_shield_wall) || !(IS_AFFECTED2(ch, AFF_SHIELD_WALL)))
	{
	send_to_char("You moron, you arent hiding behind a shield right now\n\r", ch);
	return;
	}

	else
	{
	affect_strip(ch,gsn_shield_wall);
	REMOVE_BIT(ch->affected2_by,AFF_SHIELD_WALL);
	send_to_char("You emerge from behind your shield, ready once again to battle at your fullest potential\n\r",ch);
	act( "$n pops out from behind $s shield, ready to fight you man to man\n\r", ch, NULL, NULL, TO_ROOM );
	return;
	}
}


void do_fortify ( CHAR_DATA *ch, char *argument)
{
	int chance;
	OBJ_DATA *fort;
	char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];

	argument = one_arg_caps( argument, arg1 );
    argument = one_arg_caps( argument, arg2 );

	if ((chance = get_skill(ch,gsn_fortify)) == 0
    ||  (!IS_NPC(ch)
    &&   ch->level < skill_table[gsn_fortify].skill_level[ch->class]))
    {
	send_to_char("You are totally lost when it comes to building fortifications\n\r",ch);
	return;
    }
	
	send_to_char("You begin building a protective wooden fort\n\r", ch);
	act("$n begins to build a wooden fort\n\r", ch, NULL, NULL, TO_ROOM );
	check_improve(ch,gsn_fortify,TRUE,2);
	WAIT_STATE(ch,skill_table[gsn_fortify].beats);

	if ((arg1[0] == '\0') || (arg2[0] == '\0'))
	{
	fort = create_object(get_obj_index(OBJ_VNUM_FORT), 0);
	}

	else /*customize*/ 
	{
	WAIT_STATE(ch,skill_table[gsn_fortify].beats);
	fort = create_object(get_obj_index(OBJ_VNUM_FORT), 0);
	sprintf( buf, arg1);
    free_string( fort->short_descr );
    fort->short_descr = str_dup( buf ); /*Set Short Desc*/
    sprintf( buf, arg2 );
    free_string( fort->description );
    fort->description = str_dup( buf ); /*Set Long Desc*/
	}/*done customizing*/
    
	obj_to_room( fort, ch->in_room );
	check_improve(ch,gsn_fortify,TRUE,2);
	return;
}


void do_enter_fort ( CHAR_DATA *ch, char *argument)
{
	OBJ_DATA *fort;
	char arg[MAX_INPUT_LENGTH];
	AFFECT_DATA af;

	one_argument(argument,arg);
	fort = get_obj_list( ch, argument,  ch->in_room->contents );

	if (arg[0] == '\0')
    {
	send_to_char("Which fort would you like to enter?",ch);
	return;
	}

	if (fort == NULL)
	{
	    send_to_char("You don't see that here.\n\r",ch);
	    return;
	}

	if ( IS_AFFECTED2(ch, AFF_FORTIFY) )
    {
	send_to_char("You are already in a fort you bastard\n\r",ch);
	return;
    }

/*charcater enters a fort*/
	if (fort->item_type == ITEM_FORT)
	{
		af.where     = TO_AFFECTS2;
		af.type		 = gsn_fortify;
		af.level     = ch->level;
		af.duration  = number_fuzzy( ch->level / 5 );
		af.location  = APPLY_NONE;
		af.modifier  = 0;
		af.bitvector = AFF_FORTIFY;
		affect_to_char(ch,&af);
		
		/*hit & dam affects*/
		af.modifier	= (UMAX(1, ch->level / 2));
		af.bitvector 	= AFF_FORTIFY;
		af.location	= APPLY_HITROLL;
		affect_to_char(ch,&af);
		af.location	= APPLY_DAMROLL;
		affect_to_char(ch,&af);

		act( "{W$n enters the fortification{x", ch, NULL, NULL, TO_ROOM );
		send_to_char( "{WYou enter the fort, prepared to defend it with your life{x\n\r", ch );
		return;
	}
}

void do_exit_fort ( CHAR_DATA *ch, char *argument)
{
	char buf[MAX_STRING_LENGTH];
	

	if(!is_affected(ch,gsn_fortify))
	{
		send_to_char("You aren't in a fortified position at the moment.\n\r",ch);
		return;
	}
	
	else
	{
	affect_strip(ch,gsn_fortify);
	REMOVE_BIT(ch->affected2_by,AFF_FORTIFY);
	send_to_char("{WYou exit the fort, once again able to move freely{x\n\r",ch);
	act( "{W$n exits the fort $e was hiding in{x\n\r", ch, NULL, NULL, TO_ROOM );
	free_string( ch->long_descr );
	sprintf(buf, "%s is here.\n\r", ch->name);
	ch->long_descr = str_dup(buf);
	return;
	}
}