/***************************************************************************
* 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. *
***************************************************************************/
#include <glib.h>
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#ifdef unix
#include <unistd.h>
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <lookup.h>
#include <recycle.h>
#include <tables.h>
#include <interp.h>
#include <olc.h>
/*
* Write the Pet Name
*/
void fwrite_pet( CHAR_DATA *ch, FILE *fp )
{
AFFECT_DATA *paf;
SPHERE_DATA *sp_paf;
CHAR_DATA *pet;
if (ch->pet == NULL)
return;
pet = ch->pet;
fprintf( fp, "#PET\n" );
fprintf( fp, "Name %s~\n", pet->name->str );
fprintf( fp, "ShortDescr %s~\n", pet->short_descr->str );
fprintf( fp, "LongDescr %s~\n", pet->long_descr->str );
fprintf( fp, "Description %s~\n", pet->description->str );
fprintf( fp, "iCla %d\n", pet->clan );
if (pet->sect > 0 )
fprintf( fp, "iSec %d\n", pet->sect );
fprintf( fp, "Sex %d\n", pet->sex );
fprintf( fp, "Itemaffect %d\n", pet->itemaffect );
fprintf( fp, "Form %d\n", pet->form );
fprintf( fp, "Home %d\n", pet->home );
fprintf( fp, "Played %d\n",
pet->played + (int) (current_time - pet->logon) );
fprintf( fp, "Room %d\n",
( pet->in_room == get_room_index( ROOM_VNUM_LIMBO )
&& pet->was_in_room != NULL )
? pet->was_in_room->vnum
: pet->in_room->vnum );
fprintf( fp, "Spells %d %d %d %d %d\n",
pet->spl[0], pet->spl[1], pet->spl[2], pet->spl[3], pet->spl[4] );
fprintf( fp, "HpManaMove %d %d %d %d %d %d\n",
pet->hit, pet->max_hit, pet->mana, pet->max_mana, pet->move, pet->max_move );
fprintf( fp, "Gold %d\n", pet->gold );
fprintf( fp, "Exp %d\n", pet->exp );
fprintf( fp, "Act %d\n", pet->act );
fprintf( fp, "MobCon %d\n", pet->mob_con );
fprintf( fp, "Special %d\n", pet->special );
fprintf( fp, "Extra %d\n", pet->extra );
fprintf( fp, "Added %d\n", pet->added );
fprintf( fp, "AffectedBy %d\n", pet->affected_by );
fprintf( fp, "Sphere_spaffect %d\n", pet->sphere_spaffect );
fprintf( fp, "Sphere_AffectedBy %d %d %d %d\n",pet->sphere_affected_by[TYPE_SPHERE_ADDED],pet->sphere_affected_by[TYPE_SPHERE_AFFECT],pet->sphere_affected_by[TYPE_SPHERE_ACT],pet->sphere_affected_by[TYPE_SPHERE_SPAFFECT]);
/* Bug fix from Alander */
fprintf( fp, "Position %d\n",
pet->position == POS_FIGHTING ? POS_STANDING : pet->position );
fprintf( fp, "Practice %d\n", pet->practice );
fprintf( fp, "SavingThrow %d\n", pet->saving_throw );
fprintf( fp, "Alignment %d\n", pet->alignment );
fprintf( fp, "Hitroll %d\n", pet->hitroll );
fprintf( fp, "Damroll %d\n", pet->damroll );
fprintf( fp, "Armor %d\n", pet->armor );
fprintf( fp, "Vnum %d\n", pet->pIndexData->vnum );
fprintf( fp, "Wimpy %d\n", pet->wimpy );
fprintf( fp, "PetVals %d %d %d %d %d %d %d %d %d %d\n",
pet->pet_stats[PET_AFFECTION], pet->pet_stats[PET_BEHAVIOR],pet->pet_stats[PET_TYPE],
pet->pet_stats[PET_EXAUSTION], pet->pet_stats[PET_SPELL_CAST], pet->pet_stats[PET_HUNGER],
pet->pet_stats[PET_THIRST], pet->pet_stats[PET_LAST_FOOD], pet->pet_stats[PET_LAST_FCOUNT],
pet->pet_stats[PET_PERM_AFF] );
for ( paf = pet->affected; paf != NULL; paf = paf->next )
{
/* Thx Alander
if ( paf->type < 0 || paf->type >= MAX_SKILL )
continue; */
fprintf( fp, "AffectData '%s' %3d %3d %3d %10d\n",
skill_table[paf->type].name,
paf->duration,
paf->modifier,
paf->location,
paf->bitvector
);
}
for ( sp_paf = pet->sphere_affected; sp_paf != NULL; sp_paf = sp_paf->next )
{
/* Thx Alander
if ( paf->type < 0 || paf->type >= MAX_SKILL )
continue; */
fprintf( fp, "Sphere_AffectData %d %d %d %d\n",
sp_paf->spell_number,
sp_paf->type,
sp_paf->duration,
sp_paf->bitvector
);
}
fprintf( fp, "End\n\n" );
return;
}
void fread_pet( CHAR_DATA *ch, FILE *fp )
{
char buf[MAX_STRING_LENGTH];
char log[MAX_STRING_LENGTH];
char *word;
CHAR_DATA *pet;
bool fMatch;
int vnum;
pet = new_char();
for ( ; ; )
{
Player_Load = TRUE;
Player_Error = FALSE;
word = feof( fp ) ? (char *)"End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'A':
KEY( "Act", pet->act, fread_number( fp ) );
KEY( "Added", pet->added, fread_number( fp ) );
KEY( "AffectedBy", pet->affected_by, fread_number( fp ) );
KEY( "Alignment", pet->alignment, fread_number( fp ) );
KEY( "Armor", pet->armor, fread_number( fp ) );
if ( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
{
AFFECT_DATA *paf;
paf = new_affect();
if ( !str_cmp( word, "Affect" ) )
{
/* Obsolete 2.0 form. */
paf->type = fread_number( fp );
}
else
{
int sn;
sn = skill_lookup( fread_word( fp ) );
if ( sn < 0 )
bug( "Fread_char: unknown skill.", 0 );
else
paf->type = sn;
}
paf->duration = fread_number( fp );
paf->modifier = fread_number( fp );
paf->location = fread_number( fp );
paf->bitvector = fread_number( fp );
paf->next = pet->affected;
pet->affected = paf;
fMatch = TRUE;
break;
}
break;
case 'B':
case 'C':
break;
case 'D':
KEY( "Damroll", pet->damroll, fread_number( fp ) );
g_KEY( "Description", pet->description, fread_string( fp ) );
break;
case 'E':
KEY( "Exp", pet->exp, fread_number( fp ) );
KEY( "Extra", pet->extra, fread_number( fp ) );
if ( !str_cmp( word, "End" ) )
{
ch->pet = pet;
pet->pet_master = ch;
char_to_room(pet,pet->in_room);
pet->next = char_list;
char_list = pet;
add_follower(pet,ch);
pet->leader = ch;
return;
}
break;
case 'F':
KEY( "Form", pet->form, fread_number( fp ) );
break;
case 'G':
KEY( "Gold", pet->gold, fread_number( fp ) );
break;
case 'H':
KEY( "Hitroll", pet->hitroll, fread_number( fp ) );
KEY( "Home", pet->home, fread_number( fp ) );
if ( !str_cmp( word, "HpManaMove" ) )
{
pet->hit = fread_number( fp );
pet->max_hit = fread_number( fp );
pet->mana = fread_number( fp );
pet->max_mana = fread_number( fp );
pet->move = fread_number( fp );
pet->max_move = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'I':
KEY( "iCla", pet->clan, fread_number( fp ) );
KEY( "iSec", pet->sect, fread_number( fp ) );
KEY( "Itemaffect", pet->itemaffect, fread_number( fp ) );
break;
case 'K':
break;
case 'L':
g_KEY( "LongDescr", pet->long_descr, fread_string( fp ) );
break;
case 'M':
KEY( "MobCon", pet->mob_con, fread_number( fp ) );
break;
case 'N':
if ( !str_cmp( word, "Name" ) )
{
/*
* Name already set externally.
*/
fread_to_eol( fp );
fMatch = TRUE;
break;
}
break;
case 'O':
break;
case 'P':
KEY( "Played", pet->played, fread_number( fp ) );
KEY( "Position", pet->position, fread_number( fp ) );
KEY( "Practice", pet->practice, fread_number( fp ) );
if (!str_cmp( word, "PetVals"))
{
pet->pet_stats[PET_AFFECTION] = fread_number(fp);
pet->pet_stats[PET_BEHAVIOR] = fread_number(fp);
pet->pet_stats[PET_TYPE] = fread_number(fp);
pet->pet_stats[PET_EXAUSTION] = fread_number(fp);
pet->pet_stats[PET_SPELL_CAST] = fread_number(fp);
pet->pet_stats[PET_HUNGER] = fread_number(fp);
pet->pet_stats[PET_THIRST] = fread_number(fp);
pet->pet_stats[PET_LAST_FOOD] = fread_number(fp);
pet->pet_stats[PET_LAST_FCOUNT] = fread_number(fp);
pet->pet_stats[PET_PERM_AFF] = fread_number(fp);
fMatch = TRUE;
break;
}
break;
case 'Q':
break;
case 'R':
if ( !str_cmp( word, "Room" ) )
{
pet->in_room = get_room_index( fread_number( fp ) );
if ( pet->in_room == NULL )
pet->in_room = get_room_index( ROOM_VNUM_LIMBO );
fMatch = TRUE;
break;
}
break;
case 'S':
KEY( "SavingThrow", pet->saving_throw, fread_number( fp ) );
KEY( "Sex", pet->sex, fread_number( fp ) );
g_KEY( "ShortDescr", pet->short_descr, fread_string( fp ) );
KEY( "Special", pet->special, fread_number( fp ) );
if ( !str_cmp( word, "Spells" ) )
{
pet->spl[0] = fread_number( fp );
pet->spl[1] = fread_number( fp );
pet->spl[2] = fread_number( fp );
pet->spl[3] = fread_number( fp );
pet->spl[4] = fread_number( fp );
fMatch = TRUE;
break;
}
KEY( "Sphere_spaffect", pet->sphere_spaffect, fread_number( fp ) );
if (!str_cmp(word, "Sphere_AffectedBy"))
{
pet->sphere_affected_by[TYPE_SPHERE_ADDED] = fread_number( fp );
pet->sphere_affected_by[TYPE_SPHERE_AFFECT] = fread_number( fp );
pet->sphere_affected_by[TYPE_SPHERE_ACT] = fread_number( fp );
pet->sphere_affected_by[TYPE_SPHERE_SPAFFECT] = fread_number( fp );
fMatch = TRUE;
break;
}
if (!str_cmp( word, "Sphere_AffectData" ) )
{
SPHERE_DATA *paf;
/* man i'm such a dumb ass for putting in this one
if ( sphere_free == NULL )
{
paf = alloc_perm( sizeof(*paf) );
}
else
{
paf = sphere_free;
sphere_free = sphere_free->next;
}
*/
paf = new_sphere();
paf->spell_number = fread_number( fp );
paf->type = fread_number( fp );
paf->duration = fread_number( fp );
paf->bitvector = fread_number( fp );
paf->next = pet->sphere_affected;
pet->sphere_affected = paf;
fMatch = TRUE;
break;
}
break;
case 'T':
break;
case 'V':
if (!str_cmp(word, "vnum"))
{
vnum = fread_number(fp);
pet->pIndexData = get_mob_index(vnum);
fMatch = TRUE;
}
break;
case 'W':
KEY( "Wimpy", pet->wimpy, fread_number( fp ) );
break;
}
if ( !fMatch )
{
sprintf(buf, "Fread_charB: no match. WORD: %s", word);
bug( buf, 0 );
log_string2(log);
logchan(log, NULL, NULL,WIZ_LINK,0, LEVEL_QUESTMAKER);
/* Kick them off.. with a nice warning */
//fread_to_eol( fp );
return;
}
}
return;
}