/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik Strfeldt, 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 * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #include <sys/time.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include "merc.h" #include "interp.h" #include "magic.h" #include "recycle.h" #include "tables.h" #include "lookup.h" #include "const.h" #if defined(KEY) #undef KEY #endif #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) if ( !str_cmp( word, literal ) ) { field = value; fMatch = TRUE; break; } struct skill_type *skill_table; void fwrite_skills(FILE *fp, int sn) { char buf[MSL]; int i; for(i = 0 ; ; i++ ) { if(spellfun_table[i].name == NULL) break; if(spellfun_table[i].spell_fun == skill_table[sn].spell_fun) sprintf(buf, "%s", spellfun_table[i].name ); } fprintf( fp, "Name %s~\n", skill_table[sn].name); fprintf( fp, "Levl "); for (i = 0 ;i < MAX_CLASS ; i++) fprintf(fp, "%d ", skill_table[sn].skill_level[i] ); fprintf( fp, "\n"); fprintf( fp, "Rate "); for (i = 0 ;i < MAX_CLASS ; i++) fprintf(fp, "%d ", skill_table[sn].rating[i] ); fprintf( fp, "\n"); fprintf( fp, "Spfun %s~\n", buf); fprintf( fp, "Targ %d\n", skill_table[sn].target); fprintf( fp, "Minp %d\n", skill_table[sn].minimum_position ); fprintf( fp, "Mmna %d\n", skill_table[sn].min_mana); fprintf( fp, "Beat %d\n", skill_table[sn].beats); fprintf( fp, "Ndam %s~\n", skill_table[sn].noun_damage); fprintf( fp, "Moff %s~\n", skill_table[sn].msg_off); fprintf( fp, "Mobj %s~\n", skill_table[sn].msg_obj); fprintf( fp, "END\n\n"); return; } void save_skills_table() { FILE *fp; int i; char buf[MSL]; sprintf(buf, "%s%s", SKILL_DIR, SKILLDAT); if ( ( fp = file_open( buf, "w") ) == NULL) { bug( "Skillfile: fopen", 0 ); perror(buf); } fprintf (fp, "%d\n", MAX_SKILL); for ( i = 0 ; i < MAX_SKILL ; i++) fwrite_skills(fp, i); file_close (fp); } void load_skill(FILE *fp, struct skill_type *skill) { char sfun[MSL]; int i; const char *word; bool fMatch = FALSE, sMatch = FALSE; for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case '*': fMatch = TRUE; fread_to_eol (fp); break; case 'B': KEY( "Beat", skill->beats, fread_number(fp) ); break; case 'E': if (!str_cmp (word, "End")) return; case 'L': if( !str_cmp( word, "Levl")) { for( i = 0; i < MAX_CLASS ; i++ ) skill->skill_level[i] = fread_number(fp ); } break; case 'M': KEY( "Moff", skill->msg_off, fread_string(fp) ); KEY( "Mobj", skill->msg_obj, fread_string(fp) ); KEY( "Minp", skill->minimum_position, fread_number(fp) ); KEY( "Mmna", skill->min_mana, fread_number(fp) ); break; case 'N': KEY( "Name", skill->name, fread_string(fp) ); KEY( "Ndam", skill->noun_damage, fread_string(fp) ); break; case 'R': if( !str_cmp( word, "Rate")) { for( i = 0; i < MAX_CLASS ; i++ ) skill->rating[i] = fread_number(fp ); } break; case 'S': if( !str_cmp(word, "Spfun") ) { sprintf(sfun, "%s", fread_string(fp) ); for (i = 0; ;i++ ) { if(spellfun_table[i].name == NULL) break; if(!strcmp(spellfun_table[i].name, sfun) ) { sMatch = TRUE; break; } } if(!sMatch) { bug("Spell_fun not found!",0); bug(sfun,0); } skill->spell_fun = spellfun_table[i].spell_fun; break; } break; case 'T': KEY("Targ", skill->target, fread_number(fp) ); break; } } } void load_skill_table() { FILE *fp; int i, sn; char buf[MSL]; for(sn=0;sn < MAX_SKILL; sn++) { skill_table[sn].name = str_dup(""); for( i = 0 ; i < MAX_CLASS ; i++ ) { skill_table[sn].skill_level[i] = 0; skill_table[sn].rating[i] = 0; } skill_table[sn].target = 0; skill_table[sn].minimum_position = 0; skill_table[sn].slot = 0; skill_table[sn].min_mana = 0; skill_table[sn].beats = 0; skill_table[sn].noun_damage = str_dup(""); skill_table[sn].msg_off = str_dup(""); skill_table[sn].msg_obj = str_dup(""); skill_table[sn].spell_fun = NULL; } sprintf(buf, "%s%s", SKILL_DIR, SKILLDAT); if ( ( fp = file_open( buf, "r") ) == NULL) { bug( "Skillfile: fopen", 0 ); perror(buf); } fscanf (fp, "%d\n", &MAX_SKILL); /* IMPORTANT to use malloc so we can realloc later on */ skill_table = (skill_type *)malloc (sizeof(struct skill_type) * (MAX_SKILL+1)); for (i = 0; i < MAX_SKILL; i++) load_skill(fp,&skill_table[i]); /* For backwards compatibility */ skill_table[MAX_SKILL].name = str_dup(""); /* empty! */ file_close(fp); }