lurf/area/
lurf/build/testing/
lurf/log/
lurf/player/
lurf/player/backup/
/***************************************************************************
 *  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;
}