/*************************************************************************** * 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; }