/* 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( ); }