/* Stat Training Code V2.0 for Smaug.
Developed and maintained by Belgarath on Night of the Vampires 
New Features are increased practice cost as well as support for secondary attributes.
Also support may be added for multiple class types by contacting
belgarath at notv@nightofthevampires.org.
Future features will be support for deficient attributes.*/

/*

build.c, locate the following:

char *	const	act_flags [] =
{
"npc", "sentinel", "scavenger", "r1", "r2", "aggressive", "stayarea",
"wimpy", "pet", "train", "practice", "immortal", "deadly", "polyself",
"meta_aggr", "guardian", "running", "nowander", "mountable", "mounted",
"scholar", "secretive", "hardhat", "mobinvis", "noassist", "autonomous",
"pacifist", "noattack", "annoying", "statshield", "prototype", "r14"
};

Add "train" to the list.

in mud.h
add the following line in the appropriate section

DECLARE_DO_FUN( do_train        );

also make sure you have #define ACT_TRAIN in the BV section for mob act_flags

in struct char_data, find the line     sh_int              saving_spell_staff;

add

int                 hp_from_gain;         /*for stat training*/



in tables.c

in case 't' add
        if ( !str_cmp( name, "do_train" ))              return do_train;

also in tables.c after the line    

if ( skill == do_traffic )          return "do_traffic";

add
    if ( skill == do_train )            return "do_train";

*/

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "mud.h"

void do_train( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char buf2[20];
    CHAR_DATA *mob;
    int add_hp = 0;
    int add_mana = 0;
    short *AttrPerm;
    char *pOutput;
    int cost,cost1,cost2,cost3,cost4,cost5;  /* Urrgghh */
    buf[0] = '\0';
    buf2[0] = '\0';

    if ( IS_NPC(ch) )
    {
        send_to_char( "Not for NPCs.  Sorry.\n\r", ch );
        return;
    }

    /*
     * Check for trainer.
     */

    for ( mob = ch->in_room->first_person; mob; mob = ch->next_in_room )
      {
        if ( IS_NPC(mob) && xIS_SET(mob->act, ACT_TRAIN) )
              break;
      }

    if ( !mob  )
      {
        send_to_char( "You can't do that here.\n\r", ch );
        return;
      }

    if ( argument[0] == '\0' )
      {
        sprintf( buf, "You have %d practice sessions.\n\r", ch->practice );
        send_to_char( buf, ch );
        argument = "foo";
      }

    cost = 8;

    if ( !str_cmp( argument, "str" ) )
      {
       
        if ( class_table[ch->class]->attr_second == APPLY_STR )
              cost    = 7;
        AttrPerm    = &ch->perm_str;
        pOutput     = "strength";
      }

    else if ( !str_cmp( argument, "str" ) )
      { 
    
        if ( class_table[ch->class]->attr_prime == APPLY_STR )
              cost    = 6;
        AttrPerm    = &ch->perm_str;
        pOutput     = "strength";  
      }

    else if ( !str_cmp( argument, "int" ) )
      {

        if ( class_table[ch->class]->attr_second == APPLY_INT )
              cost    = 6;
        AttrPerm   = &ch->perm_int;
        pOutput     = "intelligence";
      }

    else if ( !str_cmp( argument, "int" ) )
      {
        if ( class_table[ch->class]->attr_prime == APPLY_INT )
              cost    = 6;
        AttrPerm   = &ch->perm_int; 
        pOutput     = "intelligence";
      }

    else if ( !str_cmp( argument, "wis" ) )
      {
        if ( class_table[ch->class]->attr_second == APPLY_WIS )
              cost    = 7;
        AttrPerm    = &ch->perm_wis;
        pOutput     = "wisdom";
      }

    else if ( !str_cmp( argument, "wis" ) )
      {
        if ( class_table[ch->class]->attr_prime == APPLY_WIS ) 
              cost    = 7;
        AttrPerm    = &ch->perm_wis;
        pOutput     = "wisdom";
      }

    else if ( !str_cmp( argument, "dex" ) )
      {
        if ( class_table[ch->class]->attr_second == APPLY_DEX )
              cost    = 7;
        AttrPerm   = &ch->perm_dex;
        pOutput     = "dexterity"; 
      }

    else if ( !str_cmp( argument, "dex" ) )
      {
        if ( class_table[ch->class]->attr_prime == APPLY_DEX ) 
              cost    = 6;
        AttrPerm   = &ch->perm_dex; 
        pOutput     = "dexterity";
      }

    else if ( !str_cmp( argument, "con" ) )
      {
        if ( class_table[ch->class]->attr_second == APPLY_CON )
              cost    = 7;
        AttrPerm    = &ch->perm_con; 
        pOutput     = "constitution";
      }

    else if ( !str_cmp( argument, "con" ) )
      {
        if ( class_table[ch->class]->attr_prime == APPLY_CON )
              cost    = 6;
        AttrPerm    = &ch->perm_con;
        pOutput     = "constitution";
      }

    else if ( !str_cmp( argument, "hp" ) )
      {
        AttrPerm = &ch->max_hit;
        pOutput = "number of hit points";
        cost = 4;    /* this is pracs per "train hp" */
        add_hp = 1; /* this is hp gained per "train hp" */
      }

    else if ( !str_cmp( argument, "mana" ) )
      {
        AttrPerm = &ch->max_mana;
        pOutput = "amount of mana";
        cost = 5;
        add_mana = 1;
      }

    else

      {
        /* Work out the costs... */
        cost1=8 ;cost2=8 ;cost3=8 ;cost4=8 ;cost5=8;
        if ( class_table[ch->class]->attr_prime == APPLY_STR )
              cost1    = 6;
        if ( class_table[ch->class]->attr_second == APPLY_STR )
             cost1     = 7;       
        if ( class_table[ch->class]->attr_prime == APPLY_INT )
              cost2    = 6;
        if ( class_table[ch->class]->attr_second == APPLY_INT )
              cost2    = 7;
        if ( class_table[ch->class]->attr_prime == APPLY_WIS )
              cost3    = 6;
        if ( class_table[ch->class]->attr_second == APPLY_WIS )
              cost3    = 7;
        if ( class_table[ch->class]->attr_prime == APPLY_DEX )
              cost4    = 6;
        if ( class_table[ch->class]->attr_second == APPLY_DEX )
              cost4    = 7;
        if ( class_table[ch->class]->attr_prime == APPLY_CON )
              cost5    = 6;
        if ( class_table[ch->class]->attr_second == APPLY_CON )
              cost5    = 7;

        strcpy( buf, "You can train: hp (4)  mana (5)" );

        if ( ch->perm_str < 18 )
        {
            strcat( buf, "  str" );
            sprintf( buf2, " (%d)", cost1 );
            strcat( buf, buf2 );
        }
        if ( ch->perm_int < 18 )
        {
            strcat( buf, "  int" );
            sprintf( buf2, " (%d)", cost2 );
            strcat( buf, buf2 );
        }
        if ( ch->perm_wis < 18 )
        {
            strcat( buf, "  wis" );
            sprintf( buf2, " (%d)", cost3 );
            strcat( buf, buf2 );
        }
        if ( ch->perm_dex < 18 )
        {
            strcat( buf, "  dex" );
            sprintf( buf2, " (%d)", cost4 );
            strcat( buf, buf2 );
        }
        if ( ch->perm_con < 18 )
        {
            strcat( buf, "  con" );
            sprintf( buf2, " (%d)", cost5 );
            strcat( buf, buf2 );
        }
        if ( buf[strlen(buf)-1] != ':' )
          {
                strcat( buf, ".\n\r" );
                    send_to_char( buf, ch );
              }
         return;
      }



    if ( !str_cmp( argument, "hp" ) )
      {

        if ( cost > ch->practice )
          {
            send_to_char( "You don't have enough practices.\n\r", ch );
            return;
          }

             ch->practice        -= 4;
/*             *AttrPerm           += add_hp;*/
             ch->max_hit         += add_hp;
             act( AT_ACTION, "Your $T increases!", ch, NULL, pOutput, TO_CHAR );
             act( AT_ACTION, "$n's $T increases!", ch, NULL, pOutput, TO_ROOM );
             return;
      }

      if ( !str_cmp( argument, "mana" ) )
      {

        if ( cost > ch->practice )
          {
            send_to_char( "You don't have enough practices.\n\r", ch );
            return;
          }

             ch->practice        -= 5;
/*             *AttrPerm           += add_mana;*/
             ch->max_mana       += add_mana;

             act( AT_ACTION, "Your $T increases!", ch, NULL,  pOutput, TO_CHAR );
             act( AT_ACTION, "$n's $T increases!", ch, NULL,  pOutput, TO_ROOM );
             return;
      }
    
      if ( !str_cmp( argument, "str" ) )
      {
          if ( *AttrPerm >= 18 )
           {
            act( AT_ACTION, "Your $T is already at maximum.", ch,NULL, pOutput, TO_CHAR );
	    return;
            }

        if ( cost > ch->practice )
          {
            send_to_char( "You don't have enough practices.\n\r", ch );
            return;
          }

             ch->practice        -= cost;
/*             *AttrPerm           += add_mana;*/
             ch->perm_str       += 1;

             act( AT_ACTION, "Your $T increases!", ch, NULL, pOutput, TO_CHAR );
             act( AT_ACTION, "$n's $T increases!", ch, NULL, pOutput, TO_ROOM );
             return;
      }

      if ( !str_cmp( argument, "int" ) )
      {
          if ( *AttrPerm >= 18 )
           {
            act( AT_ACTION, "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR );
            return;
            }

        if ( cost > ch->practice )
          {
            send_to_char( "You don't have enough practices.\n\r", ch );
            return;
          }

             ch->practice        -= cost;
/*             *AttrPerm           += add_mana;*/
             ch->perm_int       += 1;

             act( AT_ACTION, "Your $T increases!", ch, NULL, pOutput, TO_CHAR );
             act( AT_ACTION, "$n's $T increases!", ch, NULL, pOutput, TO_ROOM );
             return;
      }

      if ( !str_cmp( argument, "wis" ) )
      {
          if ( *AttrPerm >= 18 )
           {
            act( AT_ACTION, "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR );
            return;
            }

        if ( cost > ch->practice )
          {
            send_to_char( "You don't have enough practices.\n\r", ch );
            return;
          }

             ch->practice        -= cost;
/*             *AttrPerm           += add_mana;*/
             ch->perm_wis       += 1;

             act( AT_ACTION, "Your $T increases!", ch, NULL, pOutput, TO_CHAR );
             act( AT_ACTION, "$n's $T increases!", ch, NULL, pOutput, TO_ROOM );
             return;
      }

      if ( !str_cmp( argument, "dex" ) )
      {
          if ( *AttrPerm >= 18 )
           {
            act( AT_ACTION, "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR );
            return;
            }

        if ( cost > ch->practice )
          {
            send_to_char( "You don't have enough practices.\n\r", ch );
            return;
          }

             ch->practice        -= cost;
/*             *AttrPerm           += add_mana;*/
             ch->perm_dex       += 1;

             act( AT_ACTION, "Your $T increases!", ch, NULL, pOutput, TO_CHAR );
             act( AT_ACTION, "$n's $T increases!", ch, NULL, pOutput, TO_ROOM );
             return;
      }

      if ( !str_cmp( argument, "con" ) )
      {
          if ( *AttrPerm >= 18 )
           {
            act( AT_ACTION, "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR );
            return;
            }

        if ( cost > ch->practice )
          {
            send_to_char( "You don't have enough practices.\n\r", ch );
            return;
          }

             ch->practice        -= cost;
/*             *AttrPerm           += add_mana;*/
             ch->perm_con       += 1;

             act( AT_ACTION, "Your $T increases!", ch, NULL, pOutput, TO_CHAR );
             act( AT_ACTION, "$n's $T increases!", ch, NULL, pOutput, TO_ROOM );
             return;
      }
}