EmberMUD/
EmberMUD/clan/
EmberMUD/classes/
EmberMUD/doc/design/
EmberMUD/gods/
EmberMUD/log/
EmberMUD/notes/
EmberMUD/player/
EmberMUD/player/temp/
EmberMUD/src/MSVC/
EmberMUD/src/Sleep/
EmberMUD/src/StartMUD/
EmberMUD/src/Win32Common/
/* Online setting of skill/spell levels, 
 * (c) 1996 Erwin S. Andreasen <erwin@pip.dknet.dk>
 *
 */

#if defined(WIN32)
#include <windows.h>
#include <time.h>
#else
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merc.h"
#include "interp.h"

DECLARE_DO_FUN( do_skill );

/* 

  Class table levels loading/saving
  
*/

/* Save this class */
void save_class( int num )
{
    FILE *fp;
    char buf[MAX_STRING_LENGTH];
    int lev, cp, i;

    sprintf( buf, "%s%s", sysconfig.class_dir, class_table[num].name );

    if ( !( fp = fopen( buf, "w" ) ) )
    {
        bug( "Could not open file %s in order to save class %s.", buf,
             class_table[num].name );
        return;
    }

    for ( lev = 0; lev < LEVEL_IMMORTAL; lev++ )
        for ( i = 0; i < MAX_SKILL; i++ )
        {
            if ( !skill_table[i].name || !skill_table[i].name[0] )
                continue;

            if ( skill_table[i].skill_level[num] == lev )
            {
                cp = skill_table[i].rating[num];
                fprintf( fp, "%d %d %s\n", lev, cp, skill_table[i].name );
            }
        }

    fprintf( fp, "-1" );        /* EOF -1 */
    fclose( fp );
}

void save_classes(  )
{
    int i;

    for ( i = 0; i < MAX_CLASS; i++ )
        save_class( i );
}

/* Load a class */
void load_class( int num )
{
    char buf[MAX_STRING_LENGTH];
    int level, cp, n;
    FILE *fp;

    sprintf( buf, "%s%s", sysconfig.class_dir, class_table[num].name );

    if ( !( fp = fopen( buf, "r" ) ) )
    {
        bug( "Could not open file %s in order to load class %s.", buf,
             class_table[num].name );
        return;
    }

    fscanf( fp, "%d %d", &level, &cp );

    while ( level != -1 )
    {
        fscanf( fp, " %[^\n]\n", buf ); /* read name of skill into buf */

        n = skill_lookup( buf );    /* find index */

        if ( n == -1 )
        {
            char buf2[200];
            sprintf( buf2, "Class %s: unknown spell %s", class_table[num].name,
                     buf );
            bug( buf2, 0 );
        }
        else
        {
            skill_table[n].skill_level[num] = level;
            skill_table[n].rating[num] = cp;
        }

        fscanf( fp, "%d %d", &level, &cp );
    }

    fclose( fp );
}

void load_classes(  )
{
    int i, j;

    for ( i = 0; i < MAX_CLASS; i++ )
    {
        for ( j = 0; j < MAX_SKILL; j++ )
            skill_table[j].skill_level[i] = LEVEL_IMMORTAL;

        load_class( i );
    }
}

void do_skill( CHAR_DATA * ch, char *argument )
{
    char class_type[4], skill_type[MAX_SKILL], lvl[MAX_LEVEL];
    int sn, level, cp, class_no;

    argument = one_argument( argument, class_type );
    argument = one_argument( argument, skill_type );

    if ( !argument[0] )
    {
        send_to_char( "Syntax is: ASKILL <class> <skill> <level> <cp>.\n\r",
                      ch );
        return;
    }

    argument = one_argument( argument, lvl );
    if ( !is_number( lvl ) )
    {
        printf_to_char( ch, "Level range is from 0 to %d.\n\r",
                        LEVEL_IMMORTAL );
        return;
    }

    level = atoi( lvl );
    cp = atoi( argument );

    if ( !is_number( argument ) || level <= 0 )
    {
        cp = 1;
    }

    if ( ( sn = skill_lookup( skill_type ) ) == -1 )
    {
        printf_to_char( ch, "There is no such spell/skill as '%s'.\n\r",
                        skill_type );
        return;
    }

    for ( class_no = 0; class_no < MAX_CLASS; class_no++ )
        if ( !str_cmp( class_type, class_table[class_no].who_name ) )
            break;

    if ( class_no >= MAX_CLASS )
    {
        printf_to_char( ch,
                        "No class named '%s' exists. Use the 3-letter WHO names (Thi, Mag etc.)\n\r",
                        class_type );
        return;
    }

    skill_table[sn].skill_level[class_no] = level;
    skill_table[sn].rating[class_no] = cp;

    printf_to_char( ch, "OK, %ss will now gain %s at level %d%s for %d cp.\n\r",
                    class_table[class_no].name, skill_table[sn].name, level,
                    level == LEVEL_IMMORTAL ? " (i.e. never)" : "", cp );

    save_classes(  );
}