/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, 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-1996 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@efn.org) *
* Gabrielle Taylor *
* 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 *
***************************************************************************/
/*
* Loaders and util functions for dynamic race system.
* Dec 24, 2003
* Blue Lang, blue@b-side.org
*/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <time.h>
#include <string.h>
#include "merc.h"
#include "magic.h"
#include "interp.h"
#include "utils.h"
/*
* Load the race list.
*/
void load_races( FILE * fp )
{
RACE_DATA *pRace;
char *word;
bool done = FALSE;
bool fMatch;
int count;
// we have no easy way of reading in char arrays, so we fudge it
int feeds_count = 0;
int skills_count = 0;
//FIXME: switch this to new_race
pRace = alloc_perm(sizeof(*pRace));
for (;;) {
if (done)
break;
word = feof(fp) ? "$" : fread_word(fp);
switch (UPPER(word[0])) {
default:
break;
case '$':
done = TRUE;
break;
case 'A':
KEY("Act", pRace->act, fread_flag(fp));
KEY("Aff", pRace->aff, fread_flag(fp));
break;
case 'E':
//clean up and get ready for the next one..
if (!strcmp( word, "End" )) {
if (race_first == NULL)
race_first = pRace;
if (race_last != NULL)
race_last->next = pRace;
race_last = pRace;
pRace->next = NULL;
top_race++;
printf( "name %s\r\n", pRace->name);
printf(" who_name %s\r\n", pRace->who_name);
printf(" gen_name %s\r\n", pRace->gen_name);
printf(" pc_race %d\r\n", pRace->pc_race);
//FIXME: switch this to new_race
pRace = alloc_perm(sizeof(*pRace));
break;
}
break;
case 'F':
KEY("Form", pRace->form, fread_flag(fp));
if (!strcmp( word, "Feeds" )) {
if ( feeds_count >= MAX_RACE_FEEDS ) {
printf("We have too many feeds saved.\r\n");
feeds_count = 0;
}
pRace->feeds[feeds_count] = str_dup(fread_word(fp));
feeds_count++;
break;
}
break;
case 'G':
KEYS("Gen", pRace->gen_name, fread_string(fp));
break;
case 'I':
KEY("Imm", pRace->imm, fread_flag(fp));
break;
case 'L':
KEY("Lifespan", pRace->lifespan, fread_number(fp));
break;
case 'M':
KEY("Max", pRace->max_level, fread_number(fp));
KEY("Min", pRace->min_level, fread_number(fp));
break;
case 'N':
KEYS("Name", pRace->name, fread_string(fp));
break;
case 'O':
KEY("Off", pRace->off, fread_flag(fp));
break;
case 'P':
KEY("Parts", pRace->parts, fread_flag(fp));
KEY("PC", pRace->pc_race, fread_number(fp));
KEY("Points", pRace->points, fread_number(fp));
break;
case 'R':
KEY("Res", pRace->res, fread_flag(fp));
break;
case 'S':
KEY("Sex", pRace->sex, fread_number(fp));
KEY("Size", pRace->size, fread_number(fp));
// we assume that stats get written in a row on a
// single line
if (!strcmp( word, "Stats" )) {
for ( count = 0; count < MAX_STATS; count++) {
pRace->stats[count] = fread_number(fp);
}
break;
}
// we assume that senses get written in a row on a
// single line
if (!strcmp( word, "Senses" )) {
for ( count = 0; count < MAX_SENSES; count++) {
pRace->senses[count] = fread_number(fp);
}
break;
}
if (!strcmp( word, "Skill" )) {
if ( skills_count >= MAX_RACE_SKILLS ) {
printf("We have too many racial skills saved.\r\n");
skills_count = 0;
}
pRace->skills[skills_count] = str_dup(fread_word(fp));
skills_count++;
break;
}
break;
case 'V':
KEY("Version", pRace->version, fread_number(fp));
KEY("Vuln", pRace->vuln, fread_flag(fp));
break;
case 'W':
KEYS("Who", pRace->who_name, fread_string(fp));
break;
} // switch (UPPER(word[0])) {
} // per-race for loop
return;
}
/*
RACE_DATA *get_race_by_name(char *argument) {
RACE_DATA *pRace;
for (pRace = race_first; pRace != NULL; pRace = pRace->next) {
if (is_name(argument, pRace->name))
return pRace;
}
return NULL;
}
*/