/* Battle Rager Class by Zaphonite and Xkilla */

#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 "rok.h"
#include "player.h"
#include "battlerager.h"

/*
 *Local Functions
 */


void do_unfrenzy( CHAR_DATA *ch, char *argument )
{
    if ( IS_NPC(ch) )
        return;

if (IS_CLASS(ch, CLASS_BATTLERAGER))
    {
        send_to_char("You take a deep breath and calm yourself.\n\r",ch);
        act("$n takes a deep breath and tries to calm $mself.",ch,NULL,NULL,TO_ROOM);
        ch->pcdata->stats[UNI_RAGE] = 0;
        WAIT_STATE(ch,12);
        return;
    }
send_to_char("But you are not in crinos form!\n\r",ch);
    return;
}

void do_frenzy(  CHAR_DATA *ch, char *argument  )
{
    if (IS_NPC(ch)) return;
 
        if (!IS_CLASS(ch, CLASS_BATTLERAGER) && (ch, BAT_RAGE))
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }

  if ( IS_CLASS(ch, CLASS_BATTLERAGER) && (ch, BAT_RAGE))
  {
 
        if ( ch->pcdata->stats[UNI_RAGE] >= 10 )
        {
            send_to_char("But you have already frenzied.\n\r",ch);
            return;
        }
        if ( ch->move < 100 )
        {
                send_to_char("But you don't have enough move to frenzy.\n\r", ch);
                return;
        }
 
        send_to_char("You start to frenzy.\n\r",ch);
        act("$n is starting to frenzy.",ch,NULL,NULL,TO_ROOM);
        ch->pcdata->stats[UNI_RAGE] += 250;
        ch->move -= 100;
        WAIT_STATE(ch,12);
        return;
  }

else if ((ch, BAT_RAGE) && (ch, BAT_ALE))
{
 
        if ( ch->pcdata->stats[UNI_RAGE] >= 10 )
        {
            send_to_char("But you have already frenzied.\n\r",ch);
            return;
        }
        if ( ch->move < 100 )
        {
                send_to_char("But you don't have enough move to frenzy.\n\r", ch);
                return;
        }
 
        send_to_char("You start to frenzy.\n\r",ch);
        act("$n is starting to frenzy.",ch,NULL,NULL,TO_ROOM);
        ch->pcdata->stats[UNI_RAGE] += 250;
        ch->move -= 100;
        WAIT_STATE(ch,12);
        return;
  }

        else
    send_to_char("But you are already in the state of Michi.\n\r",ch);
    return;
}


void do_bragertrain( CHAR_DATA *ch, char *argument )
 {
       CHAR_DATA *victim;
       char      arg1 [MAX_INPUT_LENGTH];
       char      arg2 [MAX_INPUT_LENGTH];
       int       inpart = 0;
       int       cost = 0;

       smash_tilde(argument);
       argument = one_argument( argument, arg1 );
       argument = one_argument( argument, arg2 );

       if (IS_NPC(ch)) return;

           if (!IS_CLASS(ch, CLASS_BATTLERAGER))
           {
             send_to_char("Huh?\n\r", ch);
             return;
           }

       if ( arg1[0] == '\0' || arg2[0] == '\0' )
       {
            send_to_char( "Syntax: BRagertrain <person> <power> \n\r", ch);
            send_to_char("Speed (15000), Toughness (15000), Strength (20000), Ale (10000), Frenzy (10000),\n\r",ch);
            send_to_char("Weaponskill (25000), BRagerRun (20000), BRagerSight (15000), BRagerFrenzy (15000).\n\r",ch);
            return;
       }

       if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
       {
           send_to_char( "They arent here.\n\r", ch );
           return;
       }

       if ( IS_NPC(victim) )
       {
           send_to_char("Not on NPC's.\n\r", ch );
           return;
       }

        if (!IS_CLASS(victim, CLASS_BATTLERAGER)) {
                send_to_char("Only on battleragers.\n\r", ch );
                return;}

       if (!str_cmp(arg2,"toughness"))
           {inpart = BAT_TOUGHNESS; cost = 15000;}
       else if (!str_cmp(arg2,"strength"))
           {inpart = BAT_STRENGTH; cost = 20000;}
       else if (!str_cmp(arg2,"ale"))
           {inpart = BAT_ALE; cost = 10000;}
       else if (!str_cmp(arg2,"frenzy"))
           {inpart = BAT_RAGE; cost = 10000;}
       else if (!str_cmp(arg2,"weaponskill"))
           {inpart = BAT_WEAPONSKILL; cost = 25000;}    
       else if (!str_cmp(arg2,"bragersight"))
           {inpart = BAT_RAGERSIGHT; cost = 15000;}
       else if (!str_cmp(arg2,"bragerfrenzy"))
           {inpart = BAT_RAGERFRENZY; cost = 15000;}
       else if (!str_cmp(arg2,"bragerrun"))
	   {inpart = BAT_RAGERRUN; cost = 20000;}
      else if (!str_cmp(arg2,"speed"))
	   {inpart = BAT_SPEED; cost = 15000;}
       else
       {
           send_to_char("Please specify a power:\n\r",ch);
           send_to_char("Speed (15000), Toughness (15000), Strength (20000), Ale (10000), Rage (10000),\n\r",ch);
           send_to_char("Weaponskill (25000),RagerRun (20000), RagerSight (15000), RagerFrenzy (15000).\n\r",ch);
           return;
       }
         
    if (IS_SET(victim->pcdata->powers[1], inpart))
    {
        send_to_char("They have already got that power.\n\r",ch);
        return;
    }
  
       if (ch->pcdata->stats[BATTLE_TOTAL] < cost ||
           ch->pcdata->stats[BATTLE_CURRENT] < cost)
       {
           send_to_char("You have insufficient rager power to train that power.\n\r",ch);
           return;
       }
       SET_BIT(victim->pcdata->powers[1], inpart); 
       ch->pcdata->stats[BATTLE_CURRENT] -= cost;
       if (victim != ch) send_to_char("You have been trained in a battle rager power!.\n\r",victim);
       send_to_char("Done.\n\r",ch);
       if (victim != ch) save_char_obj(ch);
       save_char_obj(victim);
       return;
 }

void do_bragersight( CHAR_DATA *ch, char *argument )
{
    if ( IS_NPC(ch) )
        return;
 
if (IS_CLASS(ch, CLASS_BATTLERAGER))
     {
         if (!( ch, BAT_RAGERSIGHT))
         {
             send_to_char("You havent been trained to unleash your wild senses.\n\r",ch);
             return;
         }
     } 
    if ( IS_SET(ch->act, PLR_HOLYLIGHT) )
    {
        REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
        send_to_char( "Your wild senses return to normal.\n\r", ch );
    }
    else
    {
        SET_BIT(ch->act, PLR_HOLYLIGHT);
        send_to_char( "Your wild senses increase.\n\r", ch );
}
 
    return;
}


 void do_bragerrun( CHAR_DATA *ch, char *argument )
 {
     char       arg [MAX_INPUT_LENGTH];
     CHAR_DATA *victim;

     argument = one_argument( argument, arg );

     if (IS_NPC(ch)) return;

     if (!IS_CLASS(ch, CLASS_BATTLERAGER))
     {
         send_to_char("Huh?.\n\r",ch);
         return;
     }
     if (IS_CLASS(ch, CLASS_BATTLERAGER))
     {
         if (!( ch, BAT_RAGERRUN))
         {
             send_to_char("You havent been trained to RagerRun.\n\r",ch);
             return;
         }
     }
     if ( arg[0] == '\0' )
     {
         send_to_char("Run to who?.\n\r",ch);
         return;
     }
     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
     {
         send_to_char( "They are not here.\n\r",ch);
         return;
     }
          
     if ( victim == ch ) {
                  send_to_char( "You run into yourself.\n\r",
ch);
                  return; }

     if (victim->level != LEVEL_AVATAR ||
         !IS_CLASS(victim, CLASS_BATTLERAGER))
     {
         send_to_char( "Hmm... You can't seem to run to
them.\n\r",ch );
         return;
     }

     if (victim->in_room == NULL)
     {
         send_to_char( "You can't run to them.\n\r",ch);
         return;
     }

     send_to_char("You run out of the room.\n\r",ch);
     act("$n runs out of the room.",ch,NULL,NULL,TO_ROOM);
     char_from_room(ch);
     char_to_room(ch,victim->in_room);
     do_look(ch,"");
     send_to_char("You run into the room.\n\r",ch);
     act("$n runs into the room.",ch,NULL,NULL,TO_ROOM);
     return;
 }

 void do_bragerarmour( CHAR_DATA *ch, char *argument )
{
    OBJ_INDEX_DATA *pObjIndex;
    OBJ_DATA *obj;
    char arg[MAX_INPUT_LENGTH];
    int vnum = 0;

    argument = one_argument( argument, arg );
  

    if (IS_NPC(ch)) return;

    if (!IS_CLASS(ch, CLASS_BATTLERAGER))
    {
        send_to_char("Huh?\n\r",ch);
        return;    
    }
    
    if (arg[0] == '\0')
    {
    send_to_char("Command: bragerarmour <piece>.\n\r", ch);
    return;
    }

    if      (!str_cmp(arg,"ring"     )) vnum = 29621;
    else if (!str_cmp(arg,"collar"   )) vnum = 29622;
    else if (!str_cmp(arg,"plate"    )) vnum = 29612;
    else if (!str_cmp(arg,"helmet"   )) vnum = 29613;
    else if (!str_cmp(arg,"leggings" )) vnum = 29616;
    else if (!str_cmp(arg,"boots"    )) vnum = 29614;
    else if (!str_cmp(arg,"gauntlets")) vnum = 29615;
    else if (!str_cmp(arg,"armguards")) vnum = 29620;
    else if (!str_cmp(arg,"cloak"    )) vnum = 29619;
    else if (!str_cmp(arg,"belt"     )) vnum = 29617;
    else if (!str_cmp(arg,"bracer"   )) vnum = 29618;
    else if (!str_cmp(arg,"mask"     )) vnum = 29623;
    else if (!str_cmp(arg,"spear"    )) vnum = 29611;
    else
    {
        send_to_char("Please specify what BattleRager armor you wish to make: Ring Collar\n\rPlate Helmet Leggings Boots
Gauntlets Sleeves Cape Belt Bracer Visor.\n\r",ch);
        return;
    }
    if ( (ch->pcdata->stats[BATTLE_TOTAL] < 20000 || ch->pcdata->stats[BATTLE_CURRENT] < 20000))
    {
        send_to_char("It costs 20000 rager power points to create BattleRager armour.\n\r",ch);
        return;
    }
    if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
    {
        send_to_char("Missing object, please inform KaVir.\n\r",ch);
        return;
    }
    ch->pcdata->stats[BATTLE_CURRENT] -= 20000;
    ch->pcdata->stats[BATTLE_TOTAL] -= 20000;
    obj = create_object(pObjIndex, 50);
    obj_to_char(obj, ch);
    act("$p appears in your hands in a swirl of chaos.",ch,obj,NULL,TO_CHAR);
    act("$p appears in $n's hands in a swirl of chaos.",ch,obj,NULL,TO_ROOM);
    return;
}

void do_clanstats( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char lord[MAX_INPUT_LENGTH];
    CHAR_DATA *gch;

    if (IS_NPC(ch)) return;

	if (ch->pcdata->stats[UNI_GEN] < 3)
		strcpy(lord,ch->name);
	else strcpy(lord,ch->lord);
    sprintf( buf, "Clan: %s \n\r", ch->clan );
    send_to_char( buf, ch );
    send_to_char("[      Name      ] [ Hits ] [ Mana ] [ Move ] [   Exp   ] [  Power  ]\n\r", ch );
    for ( gch = char_list; gch != NULL; gch = gch->next )
    {
	if ( IS_NPC(gch) ) continue;
	if ( !str_cmp(ch->lord,lord) || !str_cmp(ch->name,lord))
	{
	    sprintf( buf,
	    "[%-16s] [%-6d] [%-6d] [%-6d] [%-9d] [ %-7d ]\n\r",
		capitalize( gch->name ),
		gch->hit,gch->mana,gch->move,
		gch->exp,gch->pcdata->stats[DEMON_POWER]);
		send_to_char( buf, ch );
	}
    }
    return;
}

void do_rclass( CHAR_DATA *ch, char *argument )
{
    char      buf [MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    char      arg [MAX_INPUT_LENGTH];

    argument = one_argument( argument, arg );

    if (IS_NPC(ch)) return;

    if (!IS_CLASS(ch, CLASS_BATTLERAGER) || ch->pcdata->stats[UNI_GEN] > 3) 
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }

    if ( arg[0] == '\0' )
    {
	send_to_char( "Who do you wish to make a Rager?\n\r", ch );
	return;
    }

    if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC(victim) )
    {
	send_to_char( "Not on NPC's.\n\r", ch );
	return;
    }

    if ( ch == victim )
    {
	send_to_char("Not on yourself.\n\r", ch );
	return;
    }

    if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) )
    {
	send_to_char( "Only on avatars.\n\r", ch );
	return;
    }

    if (!IS_IMMUNE(victim,IMM_DEMON))
    {
	send_to_char( "Not on an unwilling person.\n\r", ch);
	return;
    }
        if (victim->class != 0) {
        send_to_char("They already have a profession.\n\r", ch );
        return;}

    if (ch->exp < 10000)
    {
	send_to_char("You cannot afford the 10,000 exp.\n\r",ch);
	return;
    }

    ch->exp = ch->exp - 10000;
    act("You make $N a rager!", ch, NULL, victim, TO_CHAR);
    act("$n makes $N a rager!", ch, NULL, victim, TO_NOTVICT);
    act("$n makes you a rager!", ch, NULL, victim, TO_VICT);
    victim->class=0;
    victim->class=CLASS_BATTLERAGER;
    victim->special=0;

    if (IS_CLASS(victim, CLASS_VAMPIRE)) do_mortalvamp(victim,"");
    REMOVE_BIT(victim->act, PLR_HOLYLIGHT);
    REMOVE_BIT(victim->act, PLR_WIZINVIS);
    REMOVE_BIT(victim->special, SPC_SIRE);
    REMOVE_BIT(victim->special, SPC_ANARCH);
    victim->pcdata->stats[UNI_RAGE] = 0;
    victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
	victim->special = 0;
    free_string(victim->morph);
    victim->morph=str_dup("");
                free_string(victim->clan);
            victim->clan=str_dup(ch->clan);

    free_string(victim->lord);
    if (ch->pcdata->stats[UNI_GEN] == 1)
        victim->lord=str_dup(ch->name);
    else
    {
        sprintf(buf,"%s %s",ch->lord,ch->name);
        victim->lord=str_dup(buf);
    }
 
    save_char_obj(ch);
    save_char_obj(victim);
    return;
}