Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

save.c File Reference

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <malloc.h>
#include "merc.h"
#include "recycle.h"
#include "tables.h"
#include "lookup.h"

Include dependency graph for save.c:

Go to the source code of this file.

Defines

#define KEY(literal, field, value)
#define KEYS(literal, field, value)
#define MAX_NEST   100

Functions

void fwrite_pet args ((CHAR_DATA *pet, FILE *fp))
void fwrite_obj args ((CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest))
void fwrite_char args ((CHAR_DATA *ch, FILE *fp))
int _filbuf args ((FILE *))
void do_save_class (char *ch, char *argument)
void fread_char (CHAR_DATA *ch, FILE *fp)
void fread_obj (CHAR_DATA *ch, FILE *fp)
void fread_pet (CHAR_DATA *ch, FILE *fp)
void fwrite_char (CHAR_DATA *ch, FILE *fp)
void fwrite_obj (CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest)
void fwrite_pet (CHAR_DATA *pet, FILE *fp)
bool load_char_obj (DESCRIPTOR_DATA *d, char *name)
void load_game_conf ()
char * print_flags (int flag)
void save_char_obj (CHAR_DATA *ch)
void save_clan_data ()
void save_game_conf ()
void save_kingdom_data ()
void save_socials ()

Variables

OBJ_DATAobj_free
static OBJ_DATArgObjNest [MAX_NEST]


Define Documentation

#define KEY literal,
field,
value   ) 
 

Value:

if ( !str_cmp( word, literal ) )    \
            {                    \
                field  = value;            \
                fMatch = TRUE;            \
                break;                \
            }

Definition at line 979 of file save.c.

#define KEYS literal,
field,
value   ) 
 

Value:

if ( !str_cmp( word, literal ) )    \
            {                    \
                free_string(field);            \
                field  = value;            \
                fMatch = TRUE;            \
                break;                \
            }

Definition at line 992 of file save.c.

Referenced by fread_char().

#define MAX_NEST   100
 

Definition at line 83 of file save.c.

Referenced by fread_obj(), and load_char_obj().


Function Documentation

void fwrite_pet args (CHAR_DATA *pet, FILE *fp)   ) 
 

void fwrite_obj args (CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest)   ) 
 

void fwrite_char args (CHAR_DATA *ch, FILE *fp)   ) 
 

int _filbuf args (FILE *)   ) 
 

void do_save_class char *  ch,
char *  argument
 

Definition at line 2060 of file save.c.

References class_table, LEVEL_IMMORTAL, MAX_CLASS, MAX_SKILL, MAX_STRING_LENGTH, and skill_table.

Referenced by do_setskill(), and null_class().

02061     {
02062         FILE *fp;
02063         char buf[MAX_STRING_LENGTH];
02064         int i,sn;
02065         for( i = 0; i < MAX_CLASS; i++ )
02066         {
02067             sprintf( buf, "./class/%s.class", class_table[i].name );
02068             fp = fopen( buf, "w" );
02069             fprintf( fp, "#CLASS\n" );
02070             fprintf( fp, "Name %s~\n", class_table[i].name );
02071             fprintf( fp, "WhoN %s\n", class_table[i].who_name );
02072             fprintf( fp, "Prime %d\n", class_table[i].attr_prime );
02073             fprintf( fp, "Weapon %d\n", class_table[i].weapon );
02074             fprintf( fp, "Guild1 %d\n", class_table[i].guild[0] );
02075             fprintf( fp, "Guild2 %d\n", class_table[i].guild[1] );
02076             fprintf( fp, "Skill %d\n", class_table[i].skill_adept );
02077             fprintf( fp, "Thac00 %d\n", class_table[i].thac0_00 );
02078             fprintf( fp, "Thac32 %d\n", class_table[i].thac0_32 );
02079             fprintf( fp, "HPMin %d\n", class_table[i].hp_min );
02080             fprintf( fp, "HPMax %d\n", class_table[i].hp_max );
02081             fprintf( fp, "FMana %d\n", class_table[i].fMana );
02082             fprintf( fp, "Pick %d\n", class_table[i].pick );
02083             fprintf( fp, "Base %s~\n", class_table[i].base_group );
02084             fprintf( fp, "Default %s~\n", class_table[i].default_group );
02085             fprintf( fp, "End\n" );
02086             fprintf( fp, "#SKILLS\n" );
02087             for( sn = 0; sn < MAX_SKILL; sn++ )
02088             {
02089                 if ( skill_table[sn].name == NULL )
02090                 break;
02091                 if ( skill_table[sn].skill_level[i] < LEVEL_IMMORTAL )
02092                 {
02093                     fprintf( fp, "%s~\n%d %d\n", skill_table[sn].name, skill_table[sn].skill_level[i],
02094                             skill_table[sn].rating[i] );
02095                 }
02096             }
02097             fprintf( fp, "End~\n" );
02098             fprintf( fp, "#END\n" );
02099             fclose( fp );
02100         }
02101 
02102     } /* save_classes */

void fread_char CHAR_DATA ch,
FILE *  fp
 

Definition at line 1001 of file save.c.

References AFF_PLAGUE, AFF_POISON, pc_data::alias, pc_data::alias_sub, affect_data::bitvector, bug(), clan_lookup(), current_time, affect_data::duration, FALSE, fread_flag(), fread_number(), fread_string(), fread_to_eol(), fread_word(), free_string(), get_mob_index(), get_room_index(), gn_add(), group_lookup(), IS_AFFECTED, KEY, KEYS, kingdom_lookup(), affect_data::level, affect_data::location, log_string(), MAX_ALIAS, MAX_CLASS, MAX_STATS, MAX_STRING_LENGTH, affect_data::modifier, new_affect(), affect_data::next, char_data::pcdata, race_lookup(), ROOM_VNUM_LIMBO, skill_lookup(), str_cmp(), str_dup(), TRUE, affect_data::type, UMIN, UPPER, and affect_data::where.

Referenced by load_char_obj().

01002     {
01003         char buf[MAX_STRING_LENGTH];
01004         char *word;
01005         bool fMatch;
01006         int count = 0;
01007         int lastlogoff = current_time;
01008         int percent;
01009 
01010         sprintf (buf, "Loading %s.", ch->name);
01011         log_string (buf);
01012 
01013         for (;;)
01014         {
01015         word = feof (fp) ? "End" : fread_word (fp);
01016         fMatch = FALSE;
01017 
01018         switch (UPPER (word[0]))
01019         {
01020             case '*':
01021             fMatch = TRUE;
01022             fread_to_eol (fp);
01023             break;
01024 
01025             case 'A':
01026             KEY ("Act", ch->act, fread_flag (fp));
01027             KEY ("AffectedBy", ch->affected_by, fread_flag (fp));
01028             KEY ("AfBy", ch->affected_by, fread_flag (fp));
01029             KEY ("Age", ch->pcdata->plr_age, fread_number (fp));
01030             KEY ("Alignment", ch->alignment, fread_number (fp));
01031             KEY ("Alig", ch->alignment, fread_number (fp));
01032 
01033             if (!str_cmp (word, "Alia"))
01034             {
01035                 if (count >= MAX_ALIAS)
01036                 {
01037                 fread_to_eol (fp);
01038                 fMatch = TRUE;
01039                 break;
01040                 }
01041 
01042                 ch->pcdata->alias[count] = str_dup (fread_word (fp));
01043                 ch->pcdata->alias_sub[count] = str_dup (fread_word (fp));
01044                 count++;
01045                 fMatch = TRUE;
01046                 break;
01047             }
01048 
01049             if (!str_cmp (word, "Alias"))
01050             {
01051                 if (count >= MAX_ALIAS)
01052                 {
01053                 fread_to_eol (fp);
01054                 fMatch = TRUE;
01055                 break;
01056                 }
01057 
01058                 ch->pcdata->alias[count] = str_dup (fread_word (fp));
01059                 ch->pcdata->alias_sub[count] = fread_string (fp);
01060                 count++;
01061                 fMatch = TRUE;
01062                 break;
01063             }
01064 
01065             if (!str_cmp (word, "AC") || !str_cmp (word, "Armor"))
01066             {
01067                 fread_to_eol (fp);
01068                 fMatch = TRUE;
01069                 break;
01070             }
01071 
01072             if (!str_cmp (word, "ACs"))
01073             {
01074                 int i;
01075 
01076                 for (i = 0; i < 4; i++)
01077                 ch->armor[i] = fread_number (fp);
01078                 fMatch = TRUE;
01079                 break;
01080             }
01081 
01082             if (!str_cmp (word, "AffD"))
01083             {
01084                 AFFECT_DATA *paf;
01085                 int sn;
01086 
01087                 paf = new_affect ();
01088 
01089                 sn = skill_lookup (fread_word (fp));
01090                 if (sn < 0)
01091                 bug ("Fread_char: unknown skill.", 0);
01092                 else
01093                 paf->type = sn;
01094 
01095                 paf->level = fread_number (fp);
01096                 paf->duration = fread_number (fp);
01097                 paf->modifier = fread_number (fp);
01098                 paf->location = fread_number (fp);
01099                 paf->bitvector = fread_number (fp);
01100                 paf->next = ch->affected;
01101                 ch->affected = paf;
01102                 fMatch = TRUE;
01103                 break;
01104             }
01105 
01106             if (!str_cmp (word, "Affc"))
01107             {
01108                 AFFECT_DATA *paf;
01109                 int sn;
01110 
01111                 paf = new_affect ();
01112 
01113                 sn = skill_lookup (fread_word (fp));
01114                 if (sn < 0)
01115                 bug ("Fread_char: unknown skill.", 0);
01116                 else
01117                 paf->type = sn;
01118 
01119                 paf->where = fread_number (fp);
01120                 paf->level = fread_number (fp);
01121                 paf->duration = fread_number (fp);
01122                 paf->modifier = fread_number (fp);
01123                 paf->location = fread_number (fp);
01124                 paf->bitvector = fread_number (fp);
01125                 paf->next = ch->affected;
01126                 ch->affected = paf;
01127                 fMatch = TRUE;
01128                 break;
01129             }
01130 
01131             if (!str_cmp (word, "AttrMod") || !str_cmp (word, "AMod"))
01132             {
01133                 int stat;
01134                 for (stat = 0; stat < MAX_STATS; stat++)
01135                 ch->mod_stat[stat] = fread_number (fp);
01136                 fMatch = TRUE;
01137                 break;
01138             }
01139 
01140             if (!str_cmp (word, "AttrPerm") || !str_cmp (word, "Attr"))
01141             {
01142                 int stat;
01143 
01144                 for (stat = 0; stat < MAX_STATS; stat++)
01145                 ch->perm_stat[stat] = fread_number (fp);
01146                 fMatch = TRUE;
01147                 break;
01148             }
01149             break;
01150 
01151             case 'B':
01152             KEY ("Bamfin", ch->pcdata->bamfin, fread_string (fp));
01153             KEY ("Bamfout", ch->pcdata->bamfout, fread_string (fp));
01154             KEY ("Bin", ch->pcdata->bamfin, fread_string (fp));
01155             KEY ("Bout", ch->pcdata->bamfout, fread_string (fp));
01156             KEY ("Bodytype", ch->pcdata->bodytype, fread_string(fp));
01157 
01158             break;
01159 
01160             case 'C':
01161             KEY ("Class", ch->class, fread_number (fp));
01162             KEY ("Cla", ch->class, fread_number (fp));
01163             /*f (ch->class != 0)
01164             {
01165                 if (class_lookup[ch->class] == -1 || (ch->class > MAX_CLASS))
01166                     ch->class = 1;
01167             }*/
01168             KEY ("Clan", ch->clan, clan_lookup (fread_string (fp)));
01169             KEY ("Comm", ch->comm, fread_flag (fp));
01170             KEY ("Chann", ch->chann, fread_flag (fp));
01171             KEY ("CClan", ch->cclan, fread_flag (fp));
01172             if (!str_cmp (word, "Condition") || !str_cmp (word, "Cond"))
01173             {
01174                 ch->pcdata->condition[0] = fread_number (fp);
01175                 ch->pcdata->condition[1] = fread_number (fp);
01176                 ch->pcdata->condition[2] = fread_number (fp);
01177                 fMatch = TRUE;
01178                 break;
01179             }
01180             if (!str_cmp (word, "Cnd"))
01181             {
01182                 ch->pcdata->condition[0] = fread_number (fp);
01183                 ch->pcdata->condition[1] = fread_number (fp);
01184                 ch->pcdata->condition[2] = fread_number (fp);
01185                 ch->pcdata->condition[3] = fread_number (fp);
01186                 fMatch = TRUE;
01187                 break;
01188             }
01189 
01190                /*if (!str_cmp (word, "Coloura"))
01191             {
01192                 LOAD_COLOUR (text)
01193                 LOAD_COLOUR (auction)
01194                 LOAD_COLOUR (gossip)
01195                 LOAD_COLOUR (music)
01196                 LOAD_COLOUR (question) fMatch = TRUE;
01197                 break;
01198             }
01199             if (!str_cmp (word, "Colourb"))
01200             {
01201                 LOAD_COLOUR (answer)
01202                 LOAD_COLOUR (quote)
01203                 LOAD_COLOUR (quote_text)
01204                 LOAD_COLOUR (immtalk_text)
01205                 LOAD_COLOUR (immtalk_type) fMatch = TRUE;
01206                 break;
01207             }
01208             if (!str_cmp (word, "Colourc"))
01209             {
01210                 LOAD_COLOUR (info)
01211                 LOAD_COLOUR (tell)
01212                 LOAD_COLOUR (reply)
01213                 LOAD_COLOUR (gtell_text)
01214                 LOAD_COLOUR (gtell_type) fMatch = TRUE;
01215                 break;
01216             }
01217             if (!str_cmp (word, "Colourd"))
01218             {
01219                 LOAD_COLOUR (room_title)
01220                 LOAD_COLOUR (room_text)
01221                 LOAD_COLOUR (room_exits)
01222                 LOAD_COLOUR (room_things)
01223                 LOAD_COLOUR (prompt) fMatch = TRUE;
01224                 break;
01225             }
01226             if (!str_cmp (word, "Coloure"))
01227             {
01228                 LOAD_COLOUR (fight_death)
01229                 LOAD_COLOUR (fight_yhit)
01230                 LOAD_COLOUR (fight_ohit)
01231                 LOAD_COLOUR (fight_thit)
01232                 LOAD_COLOUR (fight_skill) fMatch = TRUE;
01233                 break;
01234             }
01235             if (!str_cmp (word, "Colourf"))
01236             {
01237                 LOAD_COLOUR (wiznet)
01238                 LOAD_COLOUR (say)
01239                 LOAD_COLOUR (say_text)
01240                 LOAD_COLOUR (tell_text)
01241                 LOAD_COLOUR (reply_text) fMatch = TRUE;
01242                 break;
01243             }
01244             if (!str_cmp (word, "Colourg"))
01245             {
01246                 LOAD_COLOUR (auction_text)
01247                 LOAD_COLOUR (gossip_text)
01248                             LOAD_COLOUR (music_text)
01249                 LOAD_COLOUR (question_text)
01250                 LOAD_COLOUR (answer_text) fMatch = TRUE;
01251                 break;
01252             }*/
01253 
01254             break;
01255 
01256             case 'D':
01257             KEY ("Damroll", ch->damroll, fread_number (fp));
01258             KEY ("Dam", ch->damroll, fread_number (fp));
01259             KEY ("Description", ch->description, fread_string (fp));
01260             KEY ("Desc", ch->description, fread_string (fp));
01261             break;
01262 
01263             case 'E':
01264             if (!str_cmp (word, "End"))
01265             {
01266                 /* adjust hp mana move up  -- here for speed's sake */
01267                 percent =
01268                 (current_time - lastlogoff) * 25 / (2 * 60 * 60);
01269 
01270                 percent = UMIN (percent, 100);
01271 
01272                 if (percent > 0 && !IS_AFFECTED (ch, AFF_POISON)
01273                 && !IS_AFFECTED (ch, AFF_PLAGUE))
01274                 {
01275                 ch->hit += (ch->max_hit - ch->hit) * percent / 100;
01276                 ch->mana += (ch->max_mana - ch->mana) * percent / 100;
01277                 ch->move += (ch->max_move - ch->move) * percent / 100;
01278                 }
01279                 if (ch->class > MAX_CLASS)
01280                 {
01281                     ch->class = 1;
01282                     bug ("Fread_char: Class bigger then MAX_CLASS.",0);
01283                 }
01284                 return;
01285             }
01286             KEY ("Eyecolor", ch->pcdata->eyecolor, fread_string(fp));
01287             KEY ("Exp", ch->exp, fread_number (fp));
01288             break;
01289             case 'F':
01290             KEY ("Facialhair", ch->pcdata->facialhair, fread_string(fp));
01291             break;
01292 
01293             case 'G':
01294             KEY ("Gold", ch->gold, fread_number (fp));
01295             if (!str_cmp (word, "Group") || !str_cmp (word, "Gr"))
01296             {
01297                 int gn;
01298                 char *temp;
01299 
01300                 temp = fread_word (fp);
01301                 gn = group_lookup (temp);
01302                 /* gn    = group_lookup( fread_word( fp ) ); */
01303                 if (gn < 0)
01304                 {
01305                 fprintf (stderr, "%s", temp);
01306                 bug ("Fread_char: unknown group. ", 0);
01307                 }
01308                 else
01309                 gn_add (ch, gn);
01310                 fMatch = TRUE;
01311             }
01312             break;
01313 
01314             case 'H':
01315             KEY ("Hairtype", ch->pcdata->hairtype, fread_string(fp));
01316             KEY ("Haircolor", ch->pcdata->haircolor, fread_string(fp));
01317             KEY ("Hairlength", ch->pcdata->hairlength, fread_string(fp));
01318             KEY ("Hitroll", ch->hitroll, fread_number (fp));
01319             KEY ("Hit", ch->hitroll, fread_number (fp));
01320 
01321             if (!str_cmp (word, "HpManaMove") || !str_cmp (word, "HMV"))
01322             {
01323                 ch->hit = fread_number (fp);
01324                 ch->max_hit = fread_number (fp);
01325                 ch->mana = fread_number (fp);
01326                 ch->max_mana = fread_number (fp);
01327                 ch->move = fread_number (fp);
01328                 ch->max_move = fread_number (fp);
01329                 fMatch = TRUE;
01330                 break;
01331             }
01332 
01333             if (!str_cmp (word, "HpManaMovePerm")
01334                 || !str_cmp (word, "HMVP"))
01335             {
01336                 ch->pcdata->perm_hit = fread_number (fp);
01337                 ch->pcdata->perm_mana = fread_number (fp);
01338                 ch->pcdata->perm_move = fread_number (fp);
01339                 fMatch = TRUE;
01340                 break;
01341             }
01342 
01343             break;
01344 
01345             case 'I':
01346             KEY ("Id", ch->id, fread_number (fp));
01347             KEY ("InvisLevel", ch->invis_level, fread_number (fp));
01348             KEY ("Inco", ch->incog_level, fread_number (fp));
01349             KEY ("Invi", ch->invis_level, fread_number (fp));
01350             KEY ("Immtitle", ch->pcdata->imm_title, fread_string(fp));
01351             KEY ("Immort", ch->pcdata->immortal, fread_flag(fp));
01352             break;
01353 
01354             case 'K':
01355             KEY ("King", ch->king, kingdom_lookup (fread_string (fp)));
01356             KEY ("KKing", ch->kking, fread_flag (fp));
01357             break;
01358 
01359             case 'L':
01360             KEY ("LastLevel", ch->pcdata->last_level, fread_number (fp));
01361             KEY ("Lastnote", ch->pcdata->last_note, fread_number(fp));
01362             KEY ("Lastidea", ch->pcdata->last_idea, fread_number(fp));
01363             KEY ("Lastpena", ch->pcdata->last_penalty, fread_number(fp));
01364             KEY ("Lastnews", ch->pcdata->last_news, fread_number(fp));
01365             KEY ("Lastchan", ch->pcdata->last_changes, fread_number(fp));
01366             KEY ("Lasthist", ch->pcdata->last_history, fread_number(fp));
01367             KEY ("LLev", ch->pcdata->last_level, fread_number (fp));
01368             KEY ("Level", ch->level, fread_number (fp));
01369             KEY ("Lev", ch->level, fread_number (fp));
01370             KEY ("Levl", ch->level, fread_number (fp));
01371             KEY ("LogO", lastlogoff, fread_number (fp));
01372             KEY ("LongDescr", ch->long_descr, fread_string (fp));
01373             KEY ("LnD", ch->long_descr, fread_string (fp));
01374             break;
01375 
01376             case 'N':
01377             KEYS ("Name", ch->name, fread_string (fp));
01378             break;
01379 
01380             case 'P':
01381             //    KEY ("Password", ch->pcdata->pwd, fread_string (fp));
01382             KEY ("Pass", ch->pcdata->pwd, fread_string (fp));
01383             KEY ("Played", ch->played, fread_number (fp));
01384             KEY ("Plyd", ch->played, fread_number (fp));
01385             KEY ("Points", ch->pcdata->points, fread_number (fp));
01386             KEY ("Pnts", ch->pcdata->points, fread_number (fp));
01387             KEY ("Position", ch->position, fread_number (fp));
01388             KEY ("Pos", ch->position, fread_number (fp));
01389             KEY ("Practice", ch->practice, fread_number (fp));
01390             KEY ("Prac", ch->practice, fread_number (fp));
01391             KEYS ("Prompt", ch->prompt, fread_string (fp));
01392             KEY ("Prom", ch->prompt, fread_string (fp));
01393             break;
01394 
01395             case 'R':
01396             KEY ("Race", ch->race, race_lookup (fread_string (fp)));
01397 
01398             if (!str_cmp (word, "Room"))
01399             {
01400                 ch->in_room = get_room_index (fread_number (fp));
01401                 if (ch->in_room == NULL)
01402                 ch->in_room = get_room_index (ROOM_VNUM_LIMBO);
01403                 fMatch = TRUE;
01404                 break;
01405             }
01406 
01407             break;
01408 
01409             case 'S':
01410             KEY ("SavingThrow", ch->saving_throw, fread_number (fp));
01411             KEY ("Save", ch->saving_throw, fread_number (fp));
01412             KEY ("Scro", ch->lines, fread_number (fp));
01413             KEY ("Sex", ch->sex, fread_number (fp));
01414             KEY ("ShortDescr", ch->short_descr, fread_string (fp));
01415             KEY ("ShD", ch->short_descr, fread_string (fp));
01416             KEY ("Sec", ch->pcdata->security, fread_number (fp));    /* OLC */
01417             KEY ("Silv", ch->silver, fread_number (fp));
01418 
01419 
01420             if (!str_cmp (word, "Skill") || !str_cmp (word, "Sk"))
01421             {
01422                 int sn;
01423                 int value;
01424                 char *temp;
01425 
01426                 value = fread_number (fp);
01427                 temp = fread_word (fp);
01428                 sn = skill_lookup (temp);
01429                 /* sn    = skill_lookup( fread_word( fp ) ); */
01430                 if (sn < 0)
01431                 {
01432                 fprintf (stderr, "%s", temp);
01433                 bug ("Fread_char: unknown skill. ", 0);
01434                 }
01435                 else
01436                 ch->pcdata->learned[sn] = value;
01437                 fMatch = TRUE;
01438             }
01439 
01440             break;
01441 
01442             case 'T':
01443             KEY ("TrueSex", ch->pcdata->true_sex, fread_number (fp));
01444             KEY ("TSex", ch->pcdata->true_sex, fread_number (fp));
01445             KEY ("Trai", ch->train, fread_number (fp));
01446             KEY ("Trust", ch->trust, fread_number (fp));
01447             KEY ("Tru", ch->trust, fread_number (fp));
01448 
01449             if (!str_cmp (word, "Title") || !str_cmp (word, "Titl"))
01450             {
01451                 ch->pcdata->title = fread_string (fp);
01452                 if (ch->pcdata->title[0] != '.'
01453                 && ch->pcdata->title[0] != ','
01454                 && ch->pcdata->title[0] != '!'
01455                 && ch->pcdata->title[0] != '?')
01456                 {
01457                 sprintf (buf, " %s", ch->pcdata->title);
01458                 free_string (ch->pcdata->title);
01459                 ch->pcdata->title = str_dup (buf);
01460                 }
01461                 fMatch = TRUE;
01462                 break;
01463             }
01464 
01465             break;
01466 
01467             case 'V':
01468             KEY ("Version", ch->version, fread_number (fp));
01469             KEY ("Vers", ch->version, fread_number (fp));
01470             if (!str_cmp (word, "Vnum"))
01471             {
01472                 ch->pIndexData = get_mob_index (fread_number (fp));
01473                 fMatch = TRUE;
01474                 break;
01475             }
01476             break;
01477 
01478             case 'W':
01479             KEY ("Wimpy", ch->wimpy, fread_number (fp));
01480             KEY ("Wimp", ch->wimpy, fread_number (fp));
01481             KEY ("Wizn", ch->wiznet, fread_flag (fp));
01482             break;
01483         }
01484 
01485         if (!fMatch)
01486         {
01487             bug ("Fread_char: no match.", 0);
01488             bug (word, 0);
01489             fread_to_eol (fp);
01490         }
01491         }
01492     }

Here is the call graph for this function:

void fread_obj CHAR_DATA ch,
FILE *  fp
 

Definition at line 1722 of file save.c.

References obj_data::affected, affect_data::bitvector, bug(), obj_data::condition, obj_data::cost, obj_index_data::count, create_object(), extra_descr_data::description, obj_data::description, affect_data::duration, obj_data::enchanted, obj_data::extra_descr, obj_data::extra_flags, extract_obj(), FALSE, fread_number(), fread_string(), fread_to_eol(), fread_word(), free_obj(), free_string(), get_obj_index(), ITEM_ARMOR, obj_data::item_type, ITEM_WEAPON, KEY, extra_descr_data::keyword, obj_data::level, affect_data::level, affect_data::location, MAX_NEST, affect_data::modifier, obj_data::name, new_affect(), new_extra_descr(), obj_index_data::new_format, new_obj(), obj_data::next, extra_descr_data::next, affect_data::next, obj_free, obj_to_char(), obj_to_obj(), OBJ_VNUM_DUMMY, object_list, obj_data::pIndexData, rgObjNest, obj_data::short_descr, skill_lookup(), str_cmp(), str_dup(), obj_data::timer, TRUE, affect_data::type, UPPER, obj_index_data::value, obj_data::value, obj_data::wear_flags, obj_data::wear_loc, obj_data::weight, and affect_data::where.

Referenced by load_char_obj().

01723     {
01724         OBJ_DATA *obj;
01725         char *word;
01726         int iNest;
01727         bool fMatch;
01728         bool fNest;
01729         bool fVnum;
01730         bool first;
01731         bool new_format;            /* to prevent errors */
01732         bool make_new;                /* update object */
01733 
01734         fVnum = FALSE;
01735         obj = NULL;
01736         first = TRUE;                /* used to counter fp offset */
01737         new_format = FALSE;
01738         make_new = FALSE;
01739 
01740         word = feof (fp) ? "End" : fread_word (fp);
01741         if (!str_cmp (word, "Vnum"))
01742         {
01743         int vnum;
01744         first = FALSE;            /* fp will be in right place */
01745 
01746         vnum = fread_number (fp);
01747         if (get_obj_index (vnum) == NULL)
01748         {
01749             bug ("Fread_obj: bad vnum %d.", vnum);
01750         }
01751         else
01752         {
01753             obj = create_object (get_obj_index (vnum), -1);
01754             new_format = TRUE;
01755         }
01756 
01757         }
01758 
01759         if (obj == NULL)
01760         {                            /* either not found or old style */
01761         obj = new_obj ();
01762         obj->name = str_dup ("");
01763         obj->short_descr = str_dup ("");
01764         obj->description = str_dup ("");
01765         }
01766 
01767         fNest = FALSE;
01768         fVnum = TRUE;
01769         iNest = 0;
01770 
01771         for (;;)
01772         {
01773         if (first)
01774             first = FALSE;
01775         else
01776             word = feof (fp) ? "End" : fread_word (fp);
01777         fMatch = FALSE;
01778 
01779         switch (UPPER (word[0]))
01780         {
01781             case '*':
01782             fMatch = TRUE;
01783             fread_to_eol (fp);
01784             break;
01785 
01786             case 'A':
01787             if (!str_cmp (word, "AffD"))
01788             {
01789                 AFFECT_DATA *paf;
01790                 int sn;
01791 
01792                 paf = new_affect ();
01793 
01794                 sn = skill_lookup (fread_word (fp));
01795                 if (sn < 0)
01796                 bug ("Fread_obj: unknown skill.", 0);
01797                 else
01798                 paf->type = sn;
01799 
01800                 paf->level = fread_number (fp);
01801                 paf->duration = fread_number (fp);
01802                 paf->modifier = fread_number (fp);
01803                 paf->location = fread_number (fp);
01804                 paf->bitvector = fread_number (fp);
01805                 paf->next = obj->affected;
01806                 obj->affected = paf;
01807                 fMatch = TRUE;
01808                 break;
01809             }
01810             if (!str_cmp (word, "Affc"))
01811             {
01812                 AFFECT_DATA *paf;
01813                 int sn;
01814 
01815                 paf = new_affect ();
01816 
01817                 sn = skill_lookup (fread_word (fp));
01818                 if (sn < 0)
01819                 bug ("Fread_obj: unknown skill.", 0);
01820                 else
01821                 paf->type = sn;
01822 
01823                 paf->where = fread_number (fp);
01824                 paf->level = fread_number (fp);
01825                 paf->duration = fread_number (fp);
01826                 paf->modifier = fread_number (fp);
01827                 paf->location = fread_number (fp);
01828                 paf->bitvector = fread_number (fp);
01829                 paf->next = obj->affected;
01830                 obj->affected = paf;
01831                 fMatch = TRUE;
01832                 break;
01833             }
01834             break;
01835 
01836             case 'C':
01837             KEY ("Cond", obj->condition, fread_number (fp));
01838             KEY ("Cost", obj->cost, fread_number (fp));
01839             break;
01840 
01841             case 'D':
01842             KEY ("Description", obj->description, fread_string (fp));
01843             KEY ("Desc", obj->description, fread_string (fp));
01844             break;
01845 
01846             case 'E':
01847 
01848             if (!str_cmp (word, "Enchanted"))
01849             {
01850                 obj->enchanted = TRUE;
01851                 fMatch = TRUE;
01852                 break;
01853             }
01854 
01855             KEY ("ExtraFlags", obj->extra_flags, fread_number (fp));
01856             KEY ("ExtF", obj->extra_flags, fread_number (fp));
01857 
01858             if (!str_cmp (word, "ExtraDescr") || !str_cmp (word, "ExDe"))
01859             {
01860                 EXTRA_DESCR_DATA *ed;
01861 
01862                 ed = new_extra_descr ();
01863 
01864                 ed->keyword = fread_string (fp);
01865                 ed->description = fread_string (fp);
01866                 ed->next = obj->extra_descr;
01867                 obj->extra_descr = ed;
01868                 fMatch = TRUE;
01869             }
01870 
01871             if (!str_cmp (word, "End"))
01872             {
01873                 if (!fNest || (fVnum && obj->pIndexData == NULL))
01874                 {
01875                 bug ("Fread_obj: incomplete object.", 0);
01876                 //free_obj (obj);
01877                                 free_string( obj->name        );
01878                             free_string( obj->description );
01879                             free_string( obj->short_descr );
01880                             obj->next = obj_free;
01881                             obj_free  = obj;
01882                 return;
01883                 }
01884                 else
01885                 {
01886                 if (!fVnum)
01887                 {
01888                     free_obj (obj);
01889                     obj =
01890                     create_object (get_obj_index (OBJ_VNUM_DUMMY),
01891                                0);
01892                 }
01893 
01894                 if (!new_format)
01895                 {
01896                     obj->next = object_list;
01897                     object_list = obj;
01898                     obj->pIndexData->count++;
01899                 }
01900 
01901                 if (!obj->pIndexData->new_format
01902                     && obj->item_type == ITEM_ARMOR
01903                     && obj->value[1] == 0)
01904                 {
01905                     obj->value[1] = obj->value[0];
01906                     obj->value[2] = obj->value[0];
01907                 }
01908                 if (make_new)
01909                 {
01910                     int wear;
01911 
01912                     wear = obj->wear_loc;
01913                     extract_obj (obj);
01914 
01915                     obj = create_object (obj->pIndexData, 0);
01916                     obj->wear_loc = wear;
01917                 }
01918                 if (iNest == 0 || rgObjNest[iNest] == NULL)
01919                     obj_to_char (obj, ch);
01920                 else
01921                     obj_to_obj (obj, rgObjNest[iNest - 1]);
01922                 return;
01923                 }
01924             }
01925             break;
01926 
01927             case 'I':
01928             KEY ("ItemType", obj->item_type, fread_number (fp));
01929             KEY ("Ityp", obj->item_type, fread_number (fp));
01930             break;
01931 
01932             case 'L':
01933             KEY ("Level", obj->level, fread_number (fp));
01934             KEY ("Lev", obj->level, fread_number (fp));
01935             break;
01936 
01937             case 'N':
01938             KEY ("Name", obj->name, fread_string (fp));
01939 
01940             if (!str_cmp (word, "Nest"))
01941             {
01942                 iNest = fread_number (fp);
01943                 if (iNest < 0 || iNest >= MAX_NEST)
01944                 {
01945                 bug ("Fread_obj: bad nest %d.", iNest);
01946                 }
01947                 else
01948                 {
01949                 rgObjNest[iNest] = obj;
01950                 fNest = TRUE;
01951                 }
01952                 fMatch = TRUE;
01953             }
01954             break;
01955 
01956             case 'O':
01957             if (!str_cmp (word, "Oldstyle"))
01958             {
01959                 if (obj->pIndexData != NULL
01960                 && obj->pIndexData->new_format)
01961                 make_new = TRUE;
01962                 fMatch = TRUE;
01963             }
01964             break;
01965 
01966 
01967             case 'S':
01968             KEY ("ShortDescr", obj->short_descr, fread_string (fp));
01969             KEY ("ShD", obj->short_descr, fread_string (fp));
01970 
01971             if (!str_cmp (word, "Spell"))
01972             {
01973                 int iValue;
01974                 int sn;
01975 
01976                 iValue = fread_number (fp);
01977                 sn = skill_lookup (fread_word (fp));
01978                 if (iValue < 0 || iValue > 3)
01979                 {
01980                 bug ("Fread_obj: bad iValue %d.", iValue);
01981                 }
01982                 else if (sn < 0)
01983                 {
01984                 bug ("Fread_obj: unknown skill.", 0);
01985                 }
01986                 else
01987                 {
01988                 obj->value[iValue] = sn;
01989                 }
01990                 fMatch = TRUE;
01991                 break;
01992             }
01993 
01994             break;
01995 
01996             case 'T':
01997             KEY ("Timer", obj->timer, fread_number (fp));
01998             KEY ("Time", obj->timer, fread_number (fp));
01999             break;
02000 
02001             case 'V':
02002             if (!str_cmp (word, "Values") || !str_cmp (word, "Vals"))
02003             {
02004                 obj->value[0] = fread_number (fp);
02005                 obj->value[1] = fread_number (fp);
02006                 obj->value[2] = fread_number (fp);
02007                 obj->value[3] = fread_number (fp);
02008                 if (obj->item_type == ITEM_WEAPON && obj->value[0] == 0)
02009                 obj->value[0] = obj->pIndexData->value[0];
02010                 fMatch = TRUE;
02011                 break;
02012             }
02013 
02014             if (!str_cmp (word, "Val"))
02015             {
02016                 obj->value[0] = fread_number (fp);
02017                 obj->value[1] = fread_number (fp);
02018                 obj->value[2] = fread_number (fp);
02019                 obj->value[3] = fread_number (fp);
02020                 obj->value[4] = fread_number (fp);
02021                 fMatch = TRUE;
02022                 break;
02023             }
02024 
02025             if (!str_cmp (word, "Vnum"))
02026             {
02027                 int vnum;
02028 
02029                 vnum = fread_number (fp);
02030                 if ((obj->pIndexData = get_obj_index (vnum)) == NULL)
02031                 
02032                 bug ("Fread_obj: bad vnum %d.", vnum);
02033             
02034                 
02035                 else
02036                 fVnum = TRUE;
02037                 fMatch = TRUE;
02038                 break;
02039             }
02040             break;
02041 
02042             case 'W':
02043             KEY ("WearFlags", obj->wear_flags, fread_number (fp));
02044             KEY ("WeaF", obj->wear_flags, fread_number (fp));
02045             KEY ("WearLoc", obj->wear_loc, fread_number (fp));
02046             KEY ("Wear", obj->wear_loc, fread_number (fp));
02047             KEY ("Weight", obj->weight, fread_number (fp));
02048             KEY ("Wt", obj->weight, fread_number (fp));
02049             break;
02050 
02051         }
02052 
02053         if (!fMatch)
02054         {
02055             bug ("Fread_obj: no match.", 0);
02056             fread_to_eol (fp);
02057         }
02058         }
02059     }

Here is the call graph for this function:

void fread_pet CHAR_DATA ch,
FILE *  fp
 

Definition at line 1495 of file save.c.

References char_data::act, AFF_PLAGUE, AFF_POISON, char_data::affected, char_data::affected_by, char_data::alignment, char_data::armor, affect_data::bitvector, bug(), check_pet_affected(), char_data::clan, clan_lookup(), char_data::comm, create_mobile(), current_time, char_data::damroll, char_data::description, affect_data::duration, char_data::exp, FALSE, fread_flag(), fread_number(), fread_string(), fread_to_eol(), fread_word(), free_affect(), get_mob_index(), char_data::gold, char_data::hit, char_data::hitroll, IS_AFFECTED, KEY, char_data::leader, char_data::level, affect_data::level, affect_data::location, char_data::long_descr, char_data::mana, char_data::master, char_data::max_hit, char_data::max_mana, char_data::max_move, MAX_STATS, MOB_VNUM_FIDO, char_data::mod_stat, affect_data::modifier, char_data::move, char_data::name, new_affect(), affect_data::next, char_data::perm_stat, char_data::pet, char_data::position, char_data::race, race_lookup(), char_data::saving_throw, char_data::sex, char_data::short_descr, char_data::silver, skill_lookup(), str_cmp(), TRUE, affect_data::type, UMIN, UPPER, and affect_data::where.

Referenced by load_char_obj().

01496     {
01497         char *word;
01498         CHAR_DATA *pet;
01499         bool fMatch;
01500         int lastlogoff = current_time;
01501         int percent;
01502         int vnum = 0;
01503 
01504         /* first entry had BETTER be the vnum or we barf */
01505         word = feof (fp) ? "END" : fread_word (fp);
01506         if (!str_cmp (word, "Vnum"))
01507         {
01508 
01509         vnum = fread_number (fp);
01510         if (get_mob_index (vnum) == NULL)
01511         {
01512             bug ("Fread_pet: bad vnum %d.", vnum);
01513             pet = create_mobile (get_mob_index (MOB_VNUM_FIDO));
01514         }
01515         else
01516             pet = create_mobile (get_mob_index (vnum));
01517         }
01518         else
01519         {
01520         bug ("Fread_pet: no vnum in file.", 0);
01521         pet = create_mobile (get_mob_index (MOB_VNUM_FIDO));
01522         }
01523 
01524         for (;;)
01525         {
01526         word = feof (fp) ? "END" : fread_word (fp);
01527         fMatch = FALSE;
01528 
01529         switch (UPPER (word[0]))
01530         {
01531             case '*':
01532             fMatch = TRUE;
01533             fread_to_eol (fp);
01534             break;
01535 
01536             case 'A':
01537             KEY ("Act", pet->act, fread_flag (fp));
01538             KEY ("AfBy", pet->affected_by, fread_flag (fp));
01539             KEY ("Alig", pet->alignment, fread_number (fp));
01540 
01541             if (!str_cmp (word, "ACs"))
01542             {
01543                 int i;
01544 
01545                 for (i = 0; i < 4; i++)
01546                 pet->armor[i] = fread_number (fp);
01547                 fMatch = TRUE;
01548                 break;
01549             }
01550 
01551             if (!str_cmp (word, "AffD"))
01552             {
01553                 AFFECT_DATA *paf;
01554                 int sn;
01555 
01556                 paf = new_affect ();
01557 
01558                 sn = skill_lookup (fread_word (fp));
01559                 if (sn < 0)
01560                 bug ("Fread_char: unknown skill.", 0);
01561                 else
01562                 paf->type = sn;
01563 
01564                 paf->level = fread_number (fp);
01565                 paf->duration = fread_number (fp);
01566                 paf->modifier = fread_number (fp);
01567                 paf->location = fread_number (fp);
01568                 paf->bitvector = fread_number (fp);
01569                 paf->next = pet->affected;
01570                 pet->affected = paf;
01571                 fMatch = TRUE;
01572                 break;
01573             }
01574 
01575             if (!str_cmp (word, "Affc"))
01576             {
01577                 AFFECT_DATA *paf;
01578                 int sn;
01579 
01580                 paf = new_affect ();
01581 
01582                 sn = skill_lookup (fread_word (fp));
01583                 if (sn < 0)
01584                 bug ("Fread_char: unknown skill.", 0);
01585                 else
01586                 paf->type = sn;
01587 
01588                 paf->where = fread_number (fp);
01589                 paf->level = fread_number (fp);
01590                 paf->duration = fread_number (fp);
01591                 paf->modifier = fread_number (fp);
01592                 paf->location = fread_number (fp);
01593                 paf->bitvector = fread_number (fp);
01594                         /* Added here after Chris Litchfield (The Mage's Lair)
01595                          * pointed out a bug with duplicating affects in saved
01596                          * pets. -- JR 2002/01/31
01597                          */
01598                         if (!check_pet_affected(vnum,paf))
01599                         {
01600                             paf->next       = pet->affected;
01601                             pet->affected   = paf;
01602                         } else{
01603                             free_affect(paf);
01604                         }
01605                 fMatch = TRUE;
01606                 break;
01607             }
01608 
01609             if (!str_cmp (word, "AMod"))
01610             {
01611                 int stat;
01612 
01613                 for (stat = 0; stat < MAX_STATS; stat++)
01614                 pet->mod_stat[stat] = fread_number (fp);
01615                 fMatch = TRUE;
01616                 break;
01617             }
01618 
01619             if (!str_cmp (word, "Attr"))
01620             {
01621                 int stat;
01622 
01623                 for (stat = 0; stat < MAX_STATS; stat++)
01624                 pet->perm_stat[stat] = fread_number (fp);
01625                 fMatch = TRUE;
01626                 break;
01627             }
01628             break;
01629 
01630             case 'C':
01631             KEY ("Clan", pet->clan, clan_lookup (fread_string (fp)));
01632             KEY ("Comm", pet->comm, fread_flag (fp));
01633             break;
01634 
01635             case 'D':
01636             KEY ("Dam", pet->damroll, fread_number (fp));
01637             KEY ("Desc", pet->description, fread_string (fp));
01638             break;
01639 
01640             case 'E':
01641             if (!str_cmp (word, "End"))
01642             {
01643                 pet->leader = ch;
01644                 pet->master = ch;
01645                 ch->pet = pet;
01646                 /* adjust hp mana move up  -- here for speed's sake */
01647                 percent =
01648                 (current_time - lastlogoff) * 25 / (2 * 60 * 60);
01649 
01650                 if (percent > 0 && !IS_AFFECTED (ch, AFF_POISON)
01651                 && !IS_AFFECTED (ch, AFF_PLAGUE))
01652                 {
01653                 percent = UMIN (percent, 100);
01654                 pet->hit += (pet->max_hit - pet->hit) * percent / 100;
01655                 pet->mana +=
01656                     (pet->max_mana - pet->mana) * percent / 100;
01657                 pet->move +=
01658                     (pet->max_move - pet->move) * percent / 100;
01659                 }
01660                 return;
01661             }
01662             KEY ("Exp", pet->exp, fread_number (fp));
01663             break;
01664 
01665             case 'G':
01666             KEY ("Gold", pet->gold, fread_number (fp));
01667             break;
01668 
01669             case 'H':
01670             KEY ("Hit", pet->hitroll, fread_number (fp));
01671 
01672             if (!str_cmp (word, "HMV"))
01673             {
01674                 pet->hit = fread_number (fp);
01675                 pet->max_hit = fread_number (fp);
01676                 pet->mana = fread_number (fp);
01677                 pet->max_mana = fread_number (fp);
01678                 pet->move = fread_number (fp);
01679                 pet->max_move = fread_number (fp);
01680                 fMatch = TRUE;
01681                 break;
01682             }
01683             break;
01684 
01685             case 'L':
01686             KEY ("Levl", pet->level, fread_number (fp));
01687             KEY ("LnD", pet->long_descr, fread_string (fp));
01688             KEY ("LogO", lastlogoff, fread_number (fp));
01689             break;
01690 
01691             case 'N':
01692             KEY ("Name", pet->name, fread_string (fp));
01693             break;
01694 
01695             case 'P':
01696             KEY ("Pos", pet->position, fread_number (fp));
01697             break;
01698 
01699             case 'R':
01700             KEY ("Race", pet->race, race_lookup (fread_string (fp)));
01701             break;
01702 
01703             case 'S':
01704             KEY ("Save", pet->saving_throw, fread_number (fp));
01705             KEY ("Sex", pet->sex, fread_number (fp));
01706             KEY ("ShD", pet->short_descr, fread_string (fp));
01707             KEY ("Silv", pet->silver, fread_number (fp));
01708             break;
01709 
01710             if (!fMatch)
01711             {
01712                 bug ("Fread_pet: no match.", 0);
01713                 fread_to_eol (fp);
01714             }
01715 
01716         }
01717         }
01718     }

Here is the call graph for this function:

void fwrite_char CHAR_DATA ch,
FILE *  fp
 

Definition at line 175 of file save.c.

References affect_data::bitvector, clan_table, current_time, affect_data::duration, get_room_index(), group_table, IS_NPC, kingdom_table, affect_data::level, affect_data::location, MAX_ALIAS, MAX_GROUP, MAX_SKILL, affect_data::modifier, skill_type::name, kingdom_type::name, clan_type::name, pc_race_type::name, affect_data::next, pc_race_table, POS_FIGHTING, POS_STANDING, print_flags(), ROOM_VNUM_LIMBO, skill_table, STAT_CON, STAT_DEX, STAT_INT, STAT_STR, STAT_WIS, str_cmp(), affect_data::type, and affect_data::where.

Referenced by save_char_obj().

00176     {
00177         AFFECT_DATA *paf;
00178         int sn, gn, pos, i;
00179 
00180         fprintf (fp, "#%s\n", IS_NPC (ch) ? "MOB" : "PLAYER");
00181 
00182         fprintf (fp, "Name %s~\n", ch->name);
00183         fprintf (fp, "Id   %ld\n", ch->id);
00184         fprintf (fp, "LogO %ld\n", current_time);
00185         fprintf (fp, "Vers %d\n", 5);
00186         if (ch->sh