/****************************************************************************
* 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-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>
#elif defined(WIN32)
#include <sys/types.h>
#include <time.h>
#define NOCRYPT
#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 "olc.h"
#include "db.h"
#include "const.h"
#define DIF(a,b) (~((~a)|(b)))
/*stuff to set up key*/
#if defined(KEY)
#undef KEY
#endif
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) if ( !str_cmp( string, literal ) ) { field = value; fMatch = TRUE; break; }
/*
* Snarf an obj section. Enzo style
*/
void fread_one_object( FILE *fp )
{
OBJ_INDEX_DATA *pOI;
const char *string;
char letter;
char buf[MSL];
bool fMatch;
long iHash;
CREATE( pOI, OBJ_INDEX_DATA, 1 );
pOI->value[0] = 0;
pOI->value[1] = 0;
pOI->value[2] = 0;
pOI->value[3] = 0;
pOI->value[4] = 0;
for ( ; ; )
{
string = feof( fp ) ? "End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(string[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'A':
if (!str_cmp( string, "AffectObj"))
{
AFFECT_DATA *paf;
paf = (AFFECT_DATA *)alloc_perm( sizeof(*paf) );
paf->where = TO_OBJECT;
paf->type = -1;
paf->level = pOI->level;
paf->duration = -1;
paf->location = fread_number( fp );
paf->modifier = fread_number( fp );
paf->bitvector = 0;
paf->next = pOI->affected;
pOI->affected = paf;
top_affect++;
}
break;
case 'C':
KEY( "Cost", pOI->cost, fread_number( fp ) );
if (!str_cmp( string, "Condition"))
{
letter = fread_letter( fp );
switch (letter)
{
case ('P') : pOI->condition = 100; break;
case ('G') : pOI->condition = 90; break;
case ('A') : pOI->condition = 75; break;
case ('W') : pOI->condition = 50; break;
case ('D') : pOI->condition = 25; break;
case ('B') : pOI->condition = 10; break;
case ('R') : pOI->condition = 0; break;
default: pOI->condition = 100; break;
}
}
break;
case 'D':
KEY( "Desc", pOI->description, fread_string( fp ));
break;
case 'E':
if ( !str_cmp( string, "EndObj" ) )
{
pOI->area = area_last; /* OLC */
sprintf(buf,"End obj %d\n",pOI->vnum);
iHash = pOI->vnum % MAX_KEY_HASH;
pOI->next = obj_index_hash[iHash];
obj_index_hash[iHash] = pOI;
top_obj_index++;
top_vnum_obj = top_vnum_obj < pOI->vnum ? pOI->vnum : top_vnum_obj; /* OLC */
assign_area_vnum( pOI->vnum ); /* OLC */
append_new_save(NEW_SAVE_TEST,buf);
get_obj_index(pOI->vnum);
return;
}
KEY( "Exp", pOI->exp, fread_number( fp ));
KEY( "Extra", pOI->extra_flags, fread_flag( fp ));
KEY( "Extra2", pOI->extra2_flags, fread_flag( fp ));
if ( !str_cmp( string, "ExtraDesc" ) )
{
EXTRA_DESCR_DATA *ed;
ed = (EXTRA_DESCR_DATA *)alloc_perm( sizeof(*ed) );
ed->keyword = fread_string( fp );
ed->description = fread_string( fp );
sprintf(buf,"ED->name %s, ED->desc %s",ed->keyword,ed->description);
append_new_save(NEW_SAVE_TEST,buf);
ed->next = pOI->extra_descr;
pOI->extra_descr = ed;
top_ed++;
}
break;
case 'F':
if (!str_cmp( string, "Faff"))
{
AFFECT_DATA *paf;
paf = (AFFECT_DATA *)alloc_perm( sizeof(*paf) );
paf->where = TO_AFFECTS;
paf->type = -1;
paf->level = pOI->level;
paf->duration = -1;
paf->location = fread_number(fp);
paf->modifier = fread_number(fp);
paf->bitvector = fread_flag(fp);
paf->next = pOI->affected;
pOI->affected = paf;
top_affect++;
}
if (!str_cmp( string,"Fimm"))
{
AFFECT_DATA *paf;
paf = (AFFECT_DATA *)alloc_perm( sizeof(*paf) );
paf->where = TO_IMMUNE;
paf->type = -1;
paf->level = pOI->level;
paf->duration = -1;
paf->location = fread_number(fp);
paf->modifier = fread_number(fp);
paf->bitvector = fread_flag(fp);
paf->next = pOI->affected;
pOI->affected = paf;
top_affect++;
}
if (!str_cmp( string,"Fres"))
{
AFFECT_DATA *paf;
paf = (AFFECT_DATA *)alloc_perm( sizeof(*paf) );
paf->where = TO_RESIST;
paf->type = -1;
paf->level = pOI->level;
paf->duration = -1;
paf->location = fread_number(fp);
paf->modifier = fread_number(fp);
paf->bitvector = fread_flag(fp);
paf->next = pOI->affected;
pOI->affected = paf;
top_affect++;
}
if (!str_cmp( string, "Fvul"))
{
AFFECT_DATA *paf;
paf = (AFFECT_DATA *)alloc_perm( sizeof(*paf) );
paf->where = TO_VULN;
paf->type = -1;
paf->level = pOI->level;
paf->duration = -1;
paf->location = fread_number(fp);
paf->modifier = fread_number(fp);
paf->bitvector = fread_flag(fp);
paf->next = pOI->affected;
pOI->affected = paf;
top_affect++;
}
break;
case 'I':
if (!str_cmp( string, "Item_type"))
{
pOI->item_type = item_lookup(fread_word( fp ));
}
break;
case 'L':
KEY( "Level", pOI->level, fread_number( fp ));
break;
case 'M':
KEY( "Material", pOI->material, fread_string( fp ));
break;
case 'N':
if (!str_cmp( string, "Name"))
{
pOI->name = fread_string( fp );
sprintf(buf,"obj->name %s",pOI->name);
append_new_save(NEW_SAVE_TEST,buf);
}
break;
case 'O':
if ( !str_cmp(string, "Oprg" ) )
{
PROG_LIST *pOprog;
char *word;
int trigger = 0;
pOprog = (PROG_LIST *)alloc_perm(sizeof(*pOprog));
word = fread_word( fp );
if ( !(trigger = flag_lookup( word, oprog_flags )) )
{
bug( "OBJprogs: invalid trigger.",0);
exit(1);
}
SET_BIT( pOI->oprog_flags, trigger );
pOprog->trig_type = trigger;
pOprog->vnum = fread_number( fp );
pOprog->trig_phrase = fread_string( fp );
pOprog->next = pOI->oprogs;
pOI->oprogs = pOprog;
break;
}
break;
case 'P':
KEY( "Plevel", pOI->plevel, fread_number( fp ) );
break;
case 'S':
KEY( "Short", pOI->short_descr, fread_string( fp ));
break;
case 'V':
if (!str_cmp( string, "Vnum"))
{
pOI->vnum = fread_number( fp );
pOI->new_format = TRUE;
sprintf(buf,"obj->vnum %d",pOI->vnum);
append_new_save(NEW_SAVE_TEST,buf);
}
if (!str_cmp( string, "Values"))
{
switch(pOI->item_type)
{
case ITEM_WEAPON:
pOI->value[0] = weapon_type(fread_word(fp));
pOI->value[1] = fread_number(fp);
pOI->value[2] = fread_number(fp);
pOI->value[3] = attack_lookup(fread_word(fp));
pOI->value[4] = fread_flag(fp);
break;
case ITEM_CONTAINER:
pOI->value[0] = fread_number(fp);
pOI->value[1] = fread_flag(fp);
pOI->value[2] = fread_number(fp);
pOI->value[3] = fread_number(fp);
pOI->value[4] = fread_number(fp);
break;
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
pOI->value[0] = fread_number(fp);
pOI->value[1] = fread_number(fp);
CHECK_POS(pOI->value[2], liq_lookup(fread_word(fp)), "liq_lookup" );
pOI->value[3] = fread_number(fp);
pOI->value[4] = fread_number(fp);
break;
case ITEM_WAND:
case ITEM_STAFF:
pOI->value[0] = fread_number(fp);
pOI->value[1] = fread_number(fp);
pOI->value[2] = fread_number(fp);
pOI->value[3] = skill_lookup(fread_word(fp));
pOI->value[4] = fread_number(fp);
break;
case ITEM_POTION:
case ITEM_PILL:
case ITEM_SCROLL:
pOI->value[0] = fread_number(fp);
pOI->value[1] = skill_lookup(fread_word(fp));
pOI->value[2] = skill_lookup(fread_word(fp));
pOI->value[3] = skill_lookup(fread_word(fp));
pOI->value[4] = skill_lookup(fread_word(fp));
break;
case ITEM_QUIVER:
case ITEM_ARROW:
pOI->value[0] = fread_number(fp);
pOI->value[1] = fread_number(fp);
pOI->value[2] = fread_number(fp);
pOI->value[3] = fread_number(fp);
pOI->value[4] = fread_number(fp);
break;
case ITEM_SHEATH:
pOI->value[0] = fread_number(fp);
pOI->value[1] = fread_number(fp);
pOI->value[2] = fread_number(fp);
pOI->value[3] = fread_number(fp);
break;
case ITEM_BELT:
pOI->value[0] = fread_number(fp);
pOI->value[1] = fread_number(fp);
break;
default:
pOI->value[0] = fread_flag( fp );
pOI->value[1] = fread_flag( fp );
pOI->value[2] = fread_flag( fp );
pOI->value[3] = fread_flag( fp );
pOI->value[4] = fread_flag( fp );
break;
}
}
break;
case 'W':
KEY( "Wear", pOI->wear_flags, fread_flag( fp ));
KEY( "Weight", pOI->weight, fread_number( fp ));
break;
case 'X':
KEY( "Xptolevel", pOI->xp_tolevel, fread_number( fp ) );
break;
break;
}
}
}
/*
* Append a string to a file.
*/
void append_new_save( char *file, char *str )
{
FILE *fp;
if (!file_exists(file))
perror(file);
else
{
fp = file_open(file, "a");
/*fprintf(fp, "%s\n", str);*/
file_close(fp);
}
return;
}
void fread_objects( FILE *fp )
{
char buf[MSL];
for ( ;; )
{
char letter;
char *word;
letter = fread_letter( fp );
if ( letter == '*' )
{
fread_to_eol( fp );
continue;
}
if ( letter != '#' )
{
bug( "Load_skill_table: # not found.", 0 );
break;
}
word = fread_word( fp );
if ( !str_cmp( word, "END" ) )
{
sprintf(buf,"#END found\n\n" );
append_new_save(NEW_SAVE_TEST,buf);
return;
}
else if ( !str_cmp( word, "OBJ" ) )
{
sprintf(buf,"#OBJ found" );
append_new_save(NEW_SAVE_TEST,buf);
fread_one_object( fp );
continue;
}
}
}