/**************************************************************************** * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// * * -----------------------------------------------------------| (0...0) * * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( * * -----------------------------------------------------------| {o o} * * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ * * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~* * Tricops and Fireblade | * * ------------------------------------------------------------------------ * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * ------------------------------------------------------------------------ * * Character saving and loading module * ****************************************************************************/ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <time.h> #include <sys/stat.h> #ifndef WIN32 #include <dirent.h> #endif #include "mud.h" /* * Array to keep track of equipment temporarily. -Thoric */ OBJ_DATA *save_equipment[MAX_WEAR][8]; CHAR_DATA *quitting_char, *loading_char, *saving_char; /* * Externals */ void fwrite_comments(CHAR_DATA * ch, FILE * fp); void fread_comment(CHAR_DATA * ch, FILE * fp); // Globals int file_ver; int global_eworth; int global_sworth; int global_plevel; /* * Array of containers read for proper re-nesting of objects. */ static OBJ_DATA *rgObjNest[MAX_NEST]; /* * Local functions. */ void fwrite_introduction args((CHAR_DATA *ch, FILE *fp)); void fread_introduction args((CHAR_DATA *ch, FILE *fp)); void fwrite_char args((CHAR_DATA * ch, FILE * fp)); void fread_char args((CHAR_DATA * ch, FILE * fp, bool preload)); void write_corpses args((CHAR_DATA * ch, char *name, OBJ_DATA * objrem)); void fwrite_stable args((FILE * fp, STABLE_DATA * stb)); STABLE_DATA *fread_stable args((FILE * fp)); void fwrite_mount args((FILE * fp, CHAR_DATA * mob)); CHAR_DATA *fread_mount args((FILE * fp)); #ifdef WIN32 /* NJG */ UINT timer_code = 0; /* needed to kill the timer */ /* Note: need to include: WINMM.LIB to link to timer functions */ void caught_alarm(); void CALLBACK alarm_handler(UINT IDEvent, /* identifies timer event */ UINT uReserved, /* not used */ DWORD dwUser, /* application-defined instance data */ DWORD dwReserved1, /* not used */ DWORD dwReserved2) /* not used */ { caught_alarm(); } void kill_timer() { if (timer_code) timeKillEvent(timer_code); timer_code = 0; } #endif /* * Un-equip character before saving to ensure proper -Thoric * stats are saved in case of changes to or removal of EQ */ void de_equip_char(CHAR_DATA * ch) { char buf[MSL]; OBJ_DATA *obj; int x, y; for (x = 0; x < MAX_WEAR; x++) for (y = 0; y < MAX_LAYERS; y++) save_equipment[x][y] = NULL; for (obj = ch->first_carrying; obj; obj = obj->next_content) { if (obj->wear_loc > -1 && obj->wear_loc < MAX_WEAR) { if (get_trust(ch) >= obj->level) { for (x = 0; x < MAX_LAYERS; x++) { if (!save_equipment[obj->wear_loc][x]) { save_equipment[obj->wear_loc][x] = obj; break; } if (x == MAX_LAYERS) { sprintf(buf, "%s had on more than %d layers of clothing in one location (%d): %s", ch->name, MAX_LAYERS, obj->wear_loc, obj->name); bug(buf, 0); } } } else { sprintf(buf, "%s had on %s: ch->level = %d obj->level = %d", ch->name, obj->name, ch->level, obj->level); bug(buf, 0); } unequip_char(ch, obj); } } } /* * Re-equip character -Thoric */ void re_equip_char(CHAR_DATA * ch) { int x, y; for (x = 0; x < MAX_WEAR; x++) for (y = 0; y < MAX_LAYERS; y++) if (save_equipment[x][y] != NULL) { if (quitting_char != ch) { equip_char(ch, save_equipment[x][y], x); } save_equipment[x][y] = NULL; } else break; } char *fread_lastname_line(FILE *fp) { char *word; word = feof(fp) ? "End" : fread_word(fp); if (!str_cmp(word, "End")) return "S"; else return fread_string(fp); } void remove_from_lastname_file(char *lastname, char *firstname) { FILE *fp; char strsave[200]; int x = 0; int y; char name[13]; char members[50][13]; sprintf(strsave, "%s%c/%s", LNAME_DIR, tolower(lastname[0]), capitalize(lastname)); if ((fp = fopen(strsave, "r")) == NULL) { bug("The lastname of %s is not in the directory, but on player %s", lastname, firstname); return; } else { for (;;) { sprintf(name, "%s", fread_lastname_line(fp)); if (!str_cmp(name, "S")) break; else { if (str_cmp(name, firstname)) sprintf(members[x++], "%s", name); } } if (x == 0) //remove this lastname because this person was the last... { fclose(fp); remove(strsave); return; } y = x; fclose(fp); fp = fopen(strsave, "w"); for (x = 0;;x++) { if (y != x) { fprintf(fp, "Char %s~\n", members[x]); } else { fprintf(fp, "End\n"); fclose(fp); return; } } } } //Stores a list of lastnames used for searches mainly and to keep people from picking the same lastnames void write_lastname_file(char *lastname, char *firstname) { FILE *fp; char strsave[200]; int x = 0; int y; char name[13]; char members[50][13]; sprintf(strsave, "%s%c/%s", LNAME_DIR, tolower(lastname[0]), capitalize(lastname)); if ((fp = fopen(strsave, "r")) == NULL) { fp = fopen(strsave, "w"); fprintf(fp, "Char %s~\n", firstname); fprintf(fp, "End\n"); fclose(fp); return; } else { for (;;) { sprintf(name, "%s", fread_lastname_line(fp)); if (!str_cmp(name, "S")) break; else { sprintf(members[x++], "%s", name); } } y = x; fclose(fp); fp = fopen(strsave, "w"); for (x = 0;;x++) { if (y != x) { fprintf(fp, "Char %s~\n", members[x]); } else { fprintf(fp, "Char %s~\n", firstname); fprintf(fp, "End\n"); fclose(fp); return; } } } } /* * Save a character and inventory. * Would be cool to save NPC's too for quest purposes, * some of the infrastructure is provided. */ void save_char_obj(CHAR_DATA * ch) { char strsave[MIL]; char strback[MIL]; STABLE_DATA *stb; FILE *fp; ACCOUNT_NAME *aname; if (!ch) { bug("Save_char_obj: null ch!", 0); return; } if (IS_NPC(ch)) return; //Don't want them to be saved if in auth, etc... if (IS_SET(ch->pcdata->flags, PCFLAG_UNAUTHED)) return; if (ch->desc && ch->desc->arena) return; saving_char = ch; if (ch->desc && ch->desc->original) ch = ch->desc->original; global_eworth = player_equipment_worth(ch); global_sworth = player_stat_worth(ch); global_plevel = get_player_statlevel(ch); de_equip_char(ch); //Need to write the lastname files too.... if (ch->desc && ch->pcdata->slastname == 0 && ch->desc->connected == CON_PLAYING) { write_lastname_file(ch->last_name, ch->name); ch->pcdata->slastname = 1; } ch->pcdata->save_time = current_time; sprintf(strsave, "%s%c/%s", PLAYER_DIR, tolower(ch->pcdata->filename[0]), capitalize(ch->pcdata->filename)); /* * Auto-backup pfile (can cause lag with high disk access situtations). */ /* Backup of each pfile on save as above can cause lag in high disk access situations on big muds like Realms. Quitbackup saves most of that and keeps an adequate backup -- Blodkai, 10/97 */ if (IS_SET(sysdata.save_flags, SV_BACKUP) || (IS_SET(sysdata.save_flags, SV_QUITBACKUP) && quitting_char == ch)) { sprintf(strback, "%s%c/%s", BACKUP_DIR, tolower(ch->pcdata->filename[0]), capitalize(ch->pcdata->filename)); rename(strsave, strback); } /* * Save immortal stats, level & vnums for wizlist -Thoric * and do_vnums command * * Also save the player flags so we the wizlist builder can see * who is a guest and who is retired. */ if (ch->level >= LEVEL_IMMORTAL) { sprintf(strback, "%s%s", GOD_DIR, capitalize(ch->pcdata->filename)); if ((fp = fopen(strback, "w")) == NULL) { bug("Save_god_level: fopen", 0); perror(strsave); } else { fprintf(fp, "Level %d\n", ch->level); fprintf(fp, "Pcflags %d\n", ch->pcdata->flags); if (ch->pcdata->r_range_lo && ch->pcdata->r_range_hi) fprintf(fp, "RoomRange %d %d\n", ch->pcdata->r_range_lo, ch->pcdata->r_range_hi); if (ch->pcdata->o_range_lo && ch->pcdata->o_range_hi) fprintf(fp, "ObjRange %d %d\n", ch->pcdata->o_range_lo, ch->pcdata->o_range_hi); if (ch->pcdata->m_range_lo && ch->pcdata->m_range_hi) fprintf(fp, "MobRange %d %d\n", ch->pcdata->m_range_lo, ch->pcdata->m_range_hi); fclose(fp); } } if ((fp = fopen(strsave, "w")) == NULL) { bug("Save_char_obj: fopen", 0); perror(strsave); } else { fwrite_char(ch, fp); if (ch->morph) fwrite_morph_data(ch, fp); if (ch->first_carrying) fwrite_obj(ch, ch->last_carrying, fp, 0, OS_CARRY); if (ch->pcdata->first_bankobj) fwrite_obj(ch, ch->pcdata->last_bankobj, fp, 0, OS_BANK); if (sysdata.save_pets && ch->pcdata->pet) fwrite_mobile(fp, ch->pcdata->pet); if (ch->pcdata->mount) fwrite_mount(fp, ch->pcdata->mount); for (stb = ch->pcdata->first_stable; stb; stb = stb->next) fwrite_stable(fp, stb); if (ch->comments) /* comments */ fwrite_comments(ch, fp); /* comments */ if (ch->pcdata->first_introduction) fwrite_introduction(ch, fp); //Introductions fprintf(fp, "#END\n"); fclose(fp); } re_equip_char(ch); if (ch->desc && ch->desc->account) { for (aname = ch->desc->account->first_player; aname; aname = aname->next) { if (!str_cmp(aname->name, ch->name)) break; } if (!aname) { CREATE(aname, ACCOUNT_NAME, 1); aname->name = STRALLOC(ch->name); LINK(aname, ch->desc->account->first_player, ch->desc->account->last_player, next, prev); save_account(ch->desc, 0); } } quitting_char = NULL; saving_char = NULL; return; } void fwrite_introduction(CHAR_DATA * ch, FILE * fp) { INTRO_DATA *intro; for (intro = ch->pcdata->first_introduction; intro; intro = intro->next) { fprintf(fp, "#INTRO\n"); fprintf(fp, "Pid %d\n", intro->pid); fprintf(fp, "Flags %d\n", intro->flags); fprintf(fp, "Value %d\n", intro->value); fprintf(fp, "Lastseen %d\n", intro->lastseen); fprintf(fp, "End\n"); } } /* * Write the char. */ void fwrite_char(CHAR_DATA * ch, FILE * fp) { ALIAS_DATA *pal; AFFECT_DATA *paf; int sn, track, i; sh_int pos; PKILLED_DATA *pkl; SKILLTYPE *skill = NULL; CHANNEL_HISTORY *chistory; fprintf(fp, "#PLAYER\n"); fprintf(fp, "Version %d\n", SAVEVERSION); fprintf(fp, "Name %s~\n", ch->name); fprintf(fp, "LastName %s~\n", ch->last_name); if (ch->pcdata->autocommand) fprintf(fp, "Autocommand %s~\n", ch->pcdata->autocommand); if (ch->pcdata->offeredlname) fprintf(fp, "Offeredlname %s~\n", ch->pcdata->offeredlname); fprintf(fp, "SLastName %d\n", ch->pcdata->slastname); fprintf(fp, "Pid %d\n", ch->pcdata->pid); if (ch->description[0] != '\0') fprintf(fp, "Description %s~\n", ch->description); fprintf(fp, "Sex %d\n", ch->sex); fprintf(fp, "Race %d\n", ch->race); fprintf(fp, "Languages %d %d\n", ch->speaks, ch->speaking); fprintf(fp, "Level %d\n", ch->level); fprintf(fp, "Played %d\n", ch->played + (int) (current_time - ch->pcdata->logon)); fprintf(fp, "Room %d\n", (ch->in_room == get_room_index(ROOM_VNUM_LIMBO) && ch->was_in_room) ? ch->was_in_room->vnum : ch->in_room->vnum); fprintf(fp, "HpManaMove %d %d %d %d %d %d\n", ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move, ch->max_move); fprintf(fp, "Limbs %d %d %d %d\n", ch->con_rarm, ch->con_larm, ch->con_rleg, ch->con_lleg); fprintf(fp, "HitCount %d\n", ch->pcdata->hit_cnt); fprintf(fp, "ManaCount %d\n", ch->pcdata->mana_cnt); fprintf(fp, "Righthanded %d\n", ch->pcdata->righthanded); fprintf(fp, "Gold %d\n", ch->gold); fprintf(fp, "Height %d\n", ch->height); fprintf(fp, "Weight %d\n", ch->weight); if (!xIS_EMPTY(ch->act)) fprintf(fp, "Act %s\n", print_bitvector(&ch->act)); if (!xIS_EMPTY(ch->pcdata->talent)) fprintf(fp, "Talent %s\n", print_bitvector(&ch->pcdata->talent)); if (!xIS_EMPTY(ch->affected_by)) fprintf(fp, "AffectedBy %s\n", print_bitvector(&ch->affected_by)); if (!xIS_EMPTY(ch->no_affected_by)) fprintf(fp, "NoAffectedBy %s\n", print_bitvector(&ch->no_affected_by)); if (ch->grip != 0) fprintf(fp, "Grip %d\n", ch->grip); /* * Strip off fighting positions & store as * new style (pos>=100 flags new style in character loading) */ pos = ch->position; if (pos == POS_BERSERK || pos == POS_AGGRESSIVE || pos == POS_FIGHTING || pos == POS_DEFENSIVE || pos == POS_EVASIVE) pos = POS_STANDING; pos += 100; fprintf(fp, "Position %d\n", pos); fprintf(fp, "Style %d\n", ch->style); fprintf(fp, "Practice %d\n", ch->practice); fprintf(fp, "MoveR %d\n", ch->mover); fprintf(fp, "Train %d\n", ch->pcdata->train); fprintf(fp, "Resource %d\n", ch->pcdata->resource); fprintf(fp, "Resourcetype %d\n", ch->pcdata->resourcetype); fprintf(fp, "TwinkPoints %d\n", ch->pcdata->twink_points); fprintf(fp, "SavingThrows %d %d %d %d %d\n", ch->saving_poison_death, ch->saving_wand, ch->saving_para_petri, ch->saving_breath, ch->saving_spell_staff); fprintf(fp, "Alignment %d\n", ch->alignment); fprintf(fp, "Favor %d\n", ch->pcdata->favor); fprintf(fp, "Balance %d\n", ch->pcdata->balance); fprintf(fp, "GPrompt %d\n", ch->pcdata->gprompt); fprintf(fp, "LastInterest %d\n", ch->pcdata->lastinterest); fprintf(fp, "LastIntroCheck %d\n", ch->pcdata->lastintrocheck); fprintf(fp, "Caste %d\n", ch->pcdata->caste); fprintf(fp, "SPoints %d\n", ch->pcdata->spoints); fprintf(fp, "PowerRanking %d\n", ch->pcdata->power_ranking); fprintf(fp, "FLevel %d\n", ch->pcdata->flevel); fprintf(fp, "HomeTown %d\n", ch->pcdata->hometown); fprintf(fp, "KingdomPid %d\n", ch->pcdata->kingdompid); fprintf(fp, "TimeoutLogin %d\n", ch->pcdata->timeout_login); fprintf(fp, "TimeoutNotes %d\n", ch->pcdata->timeout_notes); fprintf(fp, "TimeoutIdle %d\n", ch->pcdata->timeout_idle); fprintf(fp, "Banksize %d\n", ch->pcdata->banksize); fprintf(fp, "LostCon %d\n", ch->pcdata->lostcon); if (ch->speed > 0) fprintf(fp, "Speed %d\n", ch->speed); if (ch->pcdata->town) fprintf(fp, "Town %s~\n", ch->pcdata->town->name); if (!xIS_EMPTY(ch->pcdata->portalfnd)) fprintf(fp, "PortalsFnd %s\n", print_bitvector(&ch->pcdata->portalfnd)); if (ch->tone) fprintf(fp, "Tone %s~\n", ch->tone); if (ch->movement) fprintf(fp, "MoveMessage %s~\n", ch->movement); fprintf(fp, "Incr %d\n", ch->pcdata->incarnations); fprintf(fp, "GtRemort %d\n", ch->pcdata->gt_remort); fprintf(fp, "Tier %d\n", ch->pcdata->tier); fprintf(fp, "Lore %d\n", ch->pcdata->lore); fprintf(fp, "Whonum %d\n", ch->pcdata->whonum); fprintf(fp, "Mapdir %d\n", ch->pcdata->mapdir); fprintf(fp, "Stable %d\n", ch->pcdata->stable); fprintf(fp, "Stablenum %d\n", ch->pcdata->stablenum); fprintf(fp, "Stablecurr %d\n", ch->pcdata->stablecurr); fprintf(fp, "Glory %d\n", ch->pcdata->quest_curr); fprintf(fp, "MGlory %d\n", ch->pcdata->quest_accum); fprintf(fp, "Reward %d\n", ch->pcdata->reward_curr); fprintf(fp, "Reward_Accum %d\n", ch->pcdata->reward_accum); fprintf(fp, "Quest_Wins %d\n", ch->pcdata->quest_wins); fprintf(fp, "Quest_Loss %d\n", ch->pcdata->quest_losses); fprintf(fp, "Job %d\n", ch->pcdata->job); fprintf(fp, "Hitroll %d\n", ch->hitroll); fprintf(fp, "Damroll %d\n", ch->damroll); fprintf(fp, "Target %d\n", ch->pcdata->target); fprintf(fp, "Target_Limb %d\n", ch->pcdata->target_limb); fprintf(fp, "Armor %d\n", ch->armor); fprintf(fp, "Skincolor %d\n", ch->pcdata->skincolor); fprintf(fp, "Haircolor %d\n", ch->pcdata->haircolor); fprintf(fp, "Hairlength %d\n", ch->pcdata->hairlength); fprintf(fp, "Hairstyle %d\n", ch->pcdata->hairstyle); fprintf(fp, "Eyecolor %d\n", ch->pcdata->eyecolor); fprintf(fp, "Cheight %d\n", ch->pcdata->cheight); fprintf(fp, "Cweight %d\n", ch->pcdata->cweight); fprintf(fp, "DOffer_time %d\n", ch->pcdata->duel_offer_time); fprintf(fp, "DReceive_time %d\n", ch->pcdata->duel_receive_time); fprintf(fp, "DOffier_name %d\n", ch->pcdata->duel_offer_name); fprintf(fp, "DReceive_name %d\n", ch->pcdata->dual_receive_name); fprintf(fp, "DOffer_prank %d\n", ch->pcdata->duel_offer_pranking); fprintf(fp, "DReceive_prank %d\n", ch->pcdata->duel_receive_pranking); fprintf(fp, "SOffier_name %d\n", ch->pcdata->spar_offer_name); fprintf(fp, "SReceive_name %d\n", ch->pcdata->spar_receive_name); fprintf(fp, "PLevel %d\n", global_plevel); fprintf(fp, "Sworth %d\n", global_sworth); fprintf(fp, "EWorth %d\n", global_eworth); if (ch->wimpy) fprintf(fp, "Wimpy %d\n", ch->wimpy); if (ch->deaf) fprintf(fp, "Deaf %d\n", ch->deaf); if (ch->pcdata->imc_deaf) fprintf(fp, "IMC %ld\n", ch->pcdata->imc_deaf); if (ch->pcdata->imc_allow) fprintf(fp, "IMCAllow %ld\n", ch->pcdata->imc_allow); if (ch->pcdata->imc_deny) fprintf(fp, "IMCDeny %ld\n", ch->pcdata->imc_deny); fprintf(fp, "ICEListen %s~\n", ch->pcdata->ice_listen); if (ch->resistant) fprintf(fp, "Resistant %d\n", ch->resistant); if (ch->no_resistant) fprintf(fp, "NoResistant %d\n", ch->no_resistant); if (ch->immune) fprintf(fp, "Immune %d\n", ch->immune); if (ch->no_immune) fprintf(fp, "NoImmune %d\n", ch->no_immune); if (ch->susceptible) fprintf(fp, "Susceptible %d\n", ch->susceptible); if (ch->no_susceptible) fprintf(fp, "NoSusceptible %d\n", ch->no_susceptible); if (ch->elementb) fprintf(fp, "Elements %d\n", ch->elementb); if (ch->pcdata && ch->pcdata->outcast_time) fprintf(fp, "Outcast_time %ld\n", ch->pcdata->outcast_time); if (ch->pcdata && ch->pcdata->nuisance) fprintf(fp, "NuisanceNew %ld %ld %d %d\n", ch->pcdata->nuisance->time, ch->pcdata->nuisance->max_time, ch->pcdata->nuisance->flags, ch->pcdata->nuisance->power); if (ch->mental_state != -10) fprintf(fp, "Mentalstate %d\n", ch->mental_state); //Keep these two below together fprintf(fp, "Title %s~\n", ch->pcdata->title); //___IMPORTANT___ Title and Password have to go in order!!!! if (ch->pcdata->pwd) fprintf(fp, "Password %s~\n", ch->pcdata->pwd); //Keep these two above together if (ch->pcdata->rank && ch->pcdata->rank[0] != '\0') fprintf(fp, "Rank %s~\n", ch->pcdata->rank); if (ch->pcdata->bestowments && ch->pcdata->bestowments[0] != '\0') fprintf(fp, "Bestowments %s~\n", ch->pcdata->bestowments); fprintf(fp, "Pretit %s~\n", ch->pcdata->pretit); /* Xerves 8-2-99 */ if (ch->pcdata->homepage && ch->pcdata->homepage[0] != '\0') fprintf(fp, "Homepage %s~\n", ch->pcdata->homepage); if (ch->pcdata->email && ch->pcdata->email[0] != '\0') /* Samson 4-19-98 */ fprintf(fp, "Email %s~\n", ch->pcdata->email); if (ch->pcdata->icq > 0) /* Samson 1-4-99 */ fprintf(fp, "ICQ %d\n", ch->pcdata->icq); if (ch->pcdata->bio && ch->pcdata->bio[0] != '\0') fprintf(fp, "Bio %s~\n", ch->pcdata->bio); if (ch->pcdata->authed_by && ch->pcdata->authed_by[0] != '\0') fprintf(fp, "AuthedBy %s~\n", ch->pcdata->authed_by); if (ch->pcdata->came_from && ch->pcdata->came_from[0] != '\0') fprintf(fp, "CameFrom %s~\n", ch->pcdata->came_from); if (ch->pcdata->min_snoop) fprintf(fp, "Minsnoop %d\n", ch->pcdata->min_snoop); if (ch->pcdata->prompt && *ch->pcdata->prompt) fprintf(fp, "Prompt %s~\n", ch->pcdata->prompt); if (ch->pcdata->fprompt && *ch->pcdata->fprompt) fprintf(fp, "FPrompt %s~\n", ch->pcdata->fprompt); if (ch->pcdata->pagerlen != 24) fprintf(fp, "Pagerlen %d\n", ch->pcdata->pagerlen); /* Save note board status */ /* Save number of boards in case that number changes */ fprintf(fp, "Boards %d ", MAX_BOARD); for (i = 0; i < MAX_BOARD; i++) fprintf(fp, "%s %ld ", boards[i].short_name, ch->pcdata->last_note[i]); fprintf(fp, "\n"); for (pal = ch->pcdata->first_alias; pal; pal = pal->next) { if (!pal->name || !pal->cmd || !*pal->name || !*pal->cmd) continue; fprintf(fp, "Alias %s~ %s~\n", pal->name, pal->cmd); } /* If ch is ignoring players then store those players */ { IGNORE_DATA *temp; for (temp = ch->pcdata->first_ignored; temp; temp = temp->next) { fprintf(fp, "Ignored %s~\n", temp->name); } } if (IS_IMMORTAL(ch)) { if (ch->pcdata->bamfin && ch->pcdata->bamfin[0] != '\0') fprintf(fp, "Bamfin %s~\n", ch->pcdata->bamfin); if (ch->pcdata->bamfout && ch->pcdata->bamfout[0] != '\0') fprintf(fp, "Bamfout %s~\n", ch->pcdata->bamfout); if (ch->trust) fprintf(fp, "Trust %d\n", ch->trust); if (ch->pcdata && ch->pcdata->restore_time) fprintf(fp, "Restore_time %ld\n", ch->pcdata->restore_time); fprintf(fp, "WizInvis %d\n", ch->pcdata->wizinvis); if (ch->pcdata->r_range_lo && ch->pcdata->r_range_hi) fprintf(fp, "RoomRange %d %d\n", ch->pcdata->r_range_lo, ch->pcdata->r_range_hi); if (ch->pcdata->o_range_lo && ch->pcdata->o_range_hi) fprintf(fp, "ObjRange %d %d\n", ch->pcdata->o_range_lo, ch->pcdata->o_range_hi); if (ch->pcdata->m_range_lo && ch->pcdata->m_range_hi) fprintf(fp, "MobRange %d %d\n", ch->pcdata->m_range_lo, ch->pcdata->m_range_hi); } if (ch->pcdata->council) fprintf(fp, "Council %s~\n", ch->pcdata->council_name); if (ch->pcdata->keeper) fprintf(fp, "Keeper %d\n", ch->pcdata->keeper); if (ch->pcdata->deity_name && ch->pcdata->deity_name[0] != '\0') fprintf(fp, "Deity %s~\n", ch->pcdata->deity_name); if (ch->pcdata->clan_name && ch->pcdata->clan_name[0] != '\0') fprintf(fp, "Clan %s~\n", ch->pcdata->clan_name); fprintf(fp, "Flags %d\n", ch->pcdata->flags); if (ch->pcdata->release_date > current_time) fprintf(fp, "Helled %d %s~\n", (int) ch->pcdata->release_date, ch->pcdata->helled_by); fprintf(fp, "PKills %d\n", ch->pcdata->pkills); fprintf(fp, "PDeaths %d\n", ch->pcdata->pdeaths); fprintf(fp, "PRanking %d\n", ch->pcdata->pranking); fprintf(fp, "LastPRankingCheck %d\n", ch->pcdata->lastprankingcheck); fprintf(fp, "Fame %d\n", ch->fame); fprintf(fp, "PkPower %d\n", ch->pcdata->pkpower); if (get_timer(ch, TIMER_PKILLED) && (get_timer(ch, TIMER_PKILLED) > 0)) fprintf(fp, "PTimer %d\n", get_timer(ch, TIMER_PKILLED)); fprintf(fp, "MKills %d\n", ch->pcdata->mkills); fprintf(fp, "MDeaths %d\n", ch->pcdata->mdeaths); fprintf(fp, "IllegalPK %d\n", ch->pcdata->illegal_pk); fprintf(fp, "AttrPer %d %d %d %d %d %d %d\n", ch->pcdata->per_str, ch->pcdata->per_int, ch->pcdata->per_wis, ch->pcdata->per_dex, ch->pcdata->per_con, ch->pcdata->per_lck, ch->pcdata->per_agi); fprintf(fp, "HpMpMvPer %d %d %d", ch->pcdata->per_hp, ch->pcdata->per_mana, ch->pcdata->per_move); fprintf(fp, "AttrPerm %d %d %d %d %d %d %d %d\n", ch->perm_str, ch->perm_int, ch->perm_wis, ch->perm_dex, ch->perm_con, ch->perm_cha, ch->perm_lck, ch->perm_agi); fprintf(fp, "AttrMod %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", ch->mod_str, ch->mod_int, ch->mod_wis, ch->mod_dex, ch->mod_con, ch->mod_cha, ch->mod_lck, ch->mod_agi, ch->apply_armor, ch->apply_shield, ch->apply_stone, ch->apply_sanctify, ch->apply_tohit, ch->managen, ch->hpgen, ch->apply_wmod, ch->apply_manafuse, ch->apply_fasting, ch->apply_manashell, ch->apply_manashield, ch->apply_managuard, ch->apply_manaburn, ch->apply_weaponclamp, ch->apply_arrowcatch, ch->apply_bracing, ch->apply_hardening); fprintf(fp, "NewResists %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", ch->apply_res_fire[0], ch->apply_res_water[0], ch->apply_res_air[0], ch->apply_res_earth[0], ch->apply_res_energy[0], ch->apply_res_magic[0], ch->apply_res_nonmagic[0], ch->apply_res_blunt[0], ch->apply_res_pierce[0], ch->apply_res_slash[0], ch->apply_res_poison[0], ch->apply_res_paralysis[0], ch->apply_res_holy[0], ch->apply_res_unholy[0], ch->apply_res_undead[0]); fprintf(fp, "NewResists1 %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", ch->apply_res_fire[1], ch->apply_res_water[1], ch->apply_res_air[1], ch->apply_res_earth[1], ch->apply_res_energy[1], ch->apply_res_magic[1], ch->apply_res_nonmagic[1], ch->apply_res_blunt[1], ch->apply_res_pierce[1], ch->apply_res_slash[1], ch->apply_res_poison[1], ch->apply_res_paralysis[1], ch->apply_res_holy[1], ch->apply_res_unholy[1], ch->apply_res_undead[1]); fprintf(fp, "NewResists2 %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", ch->apply_res_fire[2], ch->apply_res_water[2], ch->apply_res_air[2], ch->apply_res_earth[2], ch->apply_res_energy[2], ch->apply_res_magic[2], ch->apply_res_nonmagic[2], ch->apply_res_blunt[2], ch->apply_res_pierce[2], ch->apply_res_slash[2], ch->apply_res_poison[2], ch->apply_res_paralysis[2], ch->apply_res_holy[2], ch->apply_res_unholy[2], ch->apply_res_undead[2]); fprintf(fp, "Condition %d %d %d %d\n", ch->pcdata->condition[0], ch->pcdata->condition[1], ch->pcdata->condition[2], ch->pcdata->condition[3]); if (ch->desc && ch->desc->host) fprintf(fp, "Site %s\n", ch->desc->host); else fprintf(fp, "Site (Link-Dead)\n"); for (sn = 1; sn < top_sn; sn++) { if (skill_table[sn]->name && ch->pcdata->learned[sn] > 0) switch (skill_table[sn]->type) { default: fprintf(fp, "Skill %d %d %d '%s'\n", ch->pcdata->spercent[sn], ch->pcdata->learned[sn], ch->pcdata->ranking[sn], skill_table[sn]->name); break; case SKILL_SPELL: fprintf(fp, "Spell %d %d %d '%s'\n", ch->pcdata->spercent[sn], ch->pcdata->learned[sn], ch->pcdata->ranking[sn], skill_table[sn]->name); break; case SKILL_TONGUE: fprintf(fp, "Tongue %d %d %d '%s'\n", ch->pcdata->spercent[sn], ch->pcdata->learned[sn], ch->pcdata->ranking[sn], skill_table[sn]->name); break; } } for (sn = 0; sn < 5; sn++) { if (ch->pcdata->forget[sn] > 0) fprintf(fp, "Forget %d '%s'\n", sn, skill_table[ch->pcdata->forget[sn]]->name); if (ch->pcdata->nolearn[sn] > 0) fprintf(fp, "NoLearn %d '%s'\n", sn, skill_table[ch->pcdata->nolearn[sn]]->name); } for (paf = ch->first_affect; paf; paf = paf->next) { if (paf->type >= 0 && (skill = get_skilltype(paf->type)) == NULL) continue; if (paf->type >= 0 && paf->type < TYPE_PERSONAL) { if ((paf->location == APPLY_WEAPONSPELL || paf->location == APPLY_WEARSPELL || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_STRIPSN || paf->location == APPLY_RECURRINGSPELL) && IS_VALID_SN(paf->modifier)) { fprintf(fp, "AffectDataRecur '%s' %d '%s' %d %s\n", skill->name, paf->duration, skill_table[paf->modifier]->name, paf->location, print_bitvector(&paf->bitvector)); } else { fprintf(fp, "AffectData '%s' %d %d %d %s\n", skill->name, paf->duration, paf->modifier, paf->location, print_bitvector(&paf->bitvector)); } } else { if ((paf->location == APPLY_WEAPONSPELL || paf->location == APPLY_WEARSPELL || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_STRIPSN || paf->location == APPLY_RECURRINGSPELL) && IS_VALID_SN(paf->modifier)) { fprintf(fp, "AffectRecur %d %d '%s' %d %s\n", paf->type, paf->duration, skill_table[paf->modifier]->name, paf->location, print_bitvector(&paf->bitvector)); } else { fprintf(fp, "Affect %d %d %d %d %s\n", paf->type, paf->duration, paf->modifier, paf->location, print_bitvector(&paf->bitvector)); } } } track = 1; for (sn = 0; sn < track; sn++) { if (ch->pcdata->killed[sn].vnum == 0) break; fprintf(fp, "Killed %d %d\n", ch->pcdata->killed[sn].vnum, ch->pcdata->killed[sn].count); } sn = 0; for (pkl = ch->pcdata->first_pkilled; pkl; pkl = pkl->next) { fprintf(fp, "Pkilled %s~\n", pkl->name); sn++; if (sn > ch->pcdata->pkilled) bug("fwrite_char: %s pkilled count is lower than the actual pkilled list", ch->name); } for (chistory = ch->pcdata->first_messagehistory; chistory; chistory = chistory->next) { fprintf(fp, "CHISTORY\n"); fprintf(fp, "%d %d %d %d %d %s~ %s~\n", chistory->channel, chistory->pid, chistory->flags, chistory->level, chistory->kpid, chistory->sender, chistory->text); } /* Overland Map - Samson 7-31-99 */ fprintf(fp, "Coordinates %d %d %d\n", ch->coord->x, ch->coord->y, ch->map); if (ch->ship) fprintf(fp, "ShipUID %d\n", ch->ship->uid); /* Save color values - Samson 9-29-98 */ { int x; fprintf(fp, "MaxColors %d\n", MAX_COLORS); fprintf(fp, "Colors "); for (x = 0; x < MAX_COLORS; x++) fprintf(fp, "%d ", ch->pcdata->colors[x]); fprintf(fp, "\n"); } fprintf(fp, "End\n\n"); return; } /* * Write an object and its contents. */ void fwrite_obj(CHAR_DATA * ch, OBJ_DATA * obj, FILE * fp, int iNest, sh_int os_type) { EXTRA_DESCR_DATA *ed; AFFECT_DATA *paf; SKILLTYPE *skill = NULL; sh_int wear, wear_loc, x; int otype; char buf[20]; if (iNest >= MAX_NEST) { bug("fwrite_obj: iNest hit MAX_NEST %d", iNest); return; } /* * Slick recursion to write lists backwards, * so loading them will load in forwards order. */ if (obj->prev_content && os_type != OS_CORPSE && os_type != OS_KINGDOM && os_type != OS_GROUND && os_type != OS_MARKET) { if (os_type == OS_BANK) otype = OS_BANK; else otype = OS_CARRY; fwrite_obj(ch, obj->prev_content, fp, iNest, otype); } /* * Castrate storage characters. * Catch deleted objects -Thoric * Do NOT save prototype items! -Thoric */ if ((obj->item_type == ITEM_KEY && !IS_OBJ_STAT(obj, ITEM_CLANOBJECT) && !IS_OBJ_STAT(obj, ITEM_KINGDOMKEY)) || obj_extracted(obj) || IS_OBJ_STAT(obj, ITEM_PROTOTYPE)) return; /* Corpse saving. -- Altrag */ if (os_type == OS_BANK) sprintf(buf, "#BANK"); else if (os_type == OS_MARKET) sprintf(buf, "#MARKETOBJ"); else if (os_type == OS_GROUND) sprintf(buf, "#GROUND"); else if (os_type == OS_CORPSE) sprintf(buf, "#CORPSE"); else sprintf(buf, "#OBJECT"); fprintf(fp, "%s\n", buf); fprintf(fp, "Version %d\n", SAVEVERSION); if (iNest) fprintf(fp, "Nest %d\n", iNest); if (obj->count > 1) fprintf(fp, "Count %d\n", obj->count); if (!QUICKMATCH(obj->name, obj->pIndexData->name)) fprintf(fp, "Name %s~\n", obj->name); if (!QUICKMATCH(obj->short_descr, obj->pIndexData->short_descr)) fprintf(fp, "ShortDescr %s~\n", obj->short_descr); if (obj->trap) { fprintf(fp, "Trap\n"); save_trap_file(obj->trap, fp); } if (!QUICKMATCH(obj->description, obj->pIndexData->description)) fprintf(fp, "Description %s~\n", obj->description); if (!QUICKMATCH(obj->action_desc, obj->pIndexData->action_desc)) fprintf(fp, "ActionDesc %s~\n", obj->action_desc); fprintf(fp, "Vnum %d\n", obj->pIndexData->vnum); if ((os_type == OS_CORPSE || os_type == OS_GROUND) && obj->in_room) fprintf(fp, "Room %d\n", obj->in_room->vnum); if (!xSAME_BITS(obj->extra_flags, obj->pIndexData->extra_flags)) fprintf(fp, "ExtraFlags %s\n", print_bitvector(&obj->extra_flags)); if (obj->wear_flags != obj->pIndexData->wear_flags) fprintf(fp, "WearFlags %d\n", obj->wear_flags); wear_loc = -1; for (wear = 0; wear < MAX_WEAR; wear++) for (x = 0; x < MAX_LAYERS; x++) if (obj == save_equipment[wear][x]) { wear_loc = wear; break; } else if (!save_equipment[wear][x]) break; if (wear_loc != -1) fprintf(fp, "WearLoc %d\n", wear_loc); if (obj->item_type != obj->pIndexData->item_type) fprintf(fp, "ItemType %d\n", obj->item_type); if (obj->weight != obj->pIndexData->weight) fprintf(fp, "Weight %f\n", obj->weight); if (obj->bless_dur != obj->pIndexData->bless_dur) fprintf(fp, "BlessDuration %d\n", obj->bless_dur); if (obj->level) fprintf(fp, "Level %d\n", obj->level); fprintf(fp, "Sworthrestrict %d\n", obj->sworthrestrict); if (obj->imbueslots) fprintf(fp, "Imbueslots %d\n", obj->imbueslots); if (obj->first_imbue) { IMBUE_DATA *imbue; for (imbue = obj->first_imbue; imbue; imbue = imbue->next) { if (imbue->type > 0) { fprintf(fp, "Gem %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", imbue->type, imbue->sworth, imbue->lowvalue, imbue->highvalue, imbue->value, imbue->type2, imbue->sworth2, imbue->lowvalue2, imbue->highvalue2, imbue->value2, imbue->type3, imbue->sworth3, imbue->lowvalue3, imbue->highvalue3, imbue->value2, imbue->plevel, imbue->gemnum); } } } if (obj->timer) fprintf(fp, "Timer %d\n", obj->timer); if (obj->cost != obj->pIndexData->cost) fprintf(fp, "Cost %d\n", obj->cost); fprintf(fp, "Coords %d %d %d\n", obj->map, obj->coord->x, obj->coord->y); if (obj->value[0] || obj->value[1] || obj->value[2] || obj->value[3] || obj->value[4] || obj->value[5] || obj->value[6] || obj->value[7] || obj->value[8] || obj->value[9] || obj->value[10] || obj->value[11]) fprintf(fp, "Values %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", obj->value[0], obj->value[1], obj->value[2], obj->value[3], obj->value[4], obj->value[5], obj->value[6], obj->value[7], obj->value[8], obj->value[9], obj->value[10], obj->value[11], obj->value[12], obj->value[13]); switch (obj->item_type) { case ITEM_PILL: /* was down there with staff and wand, wrongly - Scryn */ break; case ITEM_WEAPON: if (IS_VALID_SN(obj->value[4]) && obj->value[4] > 0) fprintf(fp, "Spell 4 '%s'\n", skill_table[obj->value[4]]->name); break; case ITEM_POTION: case ITEM_SCROLL: if (IS_VALID_SN(obj->value[1])) fprintf(fp, "Spell 1 '%s'\n", skill_table[obj->value[1]]->name); if (IS_VALID_SN(obj->value[2])) fprintf(fp, "Spell 2 '%s'\n", skill_table[obj->value[2]]->name); if (IS_VALID_SN(obj->value[3])) fprintf(fp, "Spell 3 '%s'\n", skill_table[obj->value[3]]->name); break; case ITEM_SALVE: break; case ITEM_SPELLBOOK: if (IS_VALID_SN(obj->value[1])) fprintf(fp, "Spell 1 '%s'\n", skill_table[obj->value[1]]->name); break; } for (paf = obj->first_affect; paf; paf = paf->next) { /* * Save extra object affects -Thoric */ if (paf->type < 0 || paf->type >= top_sn) { if ((paf->location == APPLY_WEAPONSPELL || paf->location == APPLY_WEARSPELL || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_STRIPSN || paf->location == APPLY_RECURRINGSPELL) && IS_VALID_SN(paf->modifier)) { fprintf(fp, "AffectRecur %d %d '%s' %d %s %d\n", paf->type, paf->duration, skill_table[paf->modifier]->name, paf->location, print_bitvector(&paf->bitvector), paf->gemnum); } else { fprintf(fp, "Affect %d %d %d %d %s %d\n", paf->type, paf->duration, paf->modifier, paf->location, print_bitvector(&paf->bitvector), paf->gemnum); } } else { if (paf->type >= 0 && (skill = get_skilltype(paf->type)) == NULL) continue; if ((paf->location == APPLY_WEAPONSPELL || paf->location == APPLY_WEARSPELL || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_STRIPSN || paf->location == APPLY_RECURRINGSPELL) && IS_VALID_SN(paf->modifier)) { fprintf(fp, "AffectDataRecur '%s' %d '%s' %d %s %d\n", skill->name, paf->duration, skill_table[paf->modifier]->name, paf->location, print_bitvector(&paf->bitvector), paf->gemnum); } else { fprintf(fp, "AffectData '%s' %d %d %d %s %d\n", skill->name, paf->duration, paf->modifier, paf->location, print_bitvector(&paf->bitvector), paf->gemnum); } } } for (ed = obj->first_extradesc; ed; ed = ed->next) fprintf(fp, "ExtraDescr %s~ %s~\n", ed->keyword, ed->description); fprintf(fp, "End\n\n"); if (obj->first_content) fwrite_obj(ch, obj->last_content, fp, iNest + 1, os_type == OS_BANK ? OS_BANK : OS_CARRY); return; } void save_account(DESCRIPTOR_DATA *d, int editing) { FILE *fp; char strsave[MIL]; ACCOUNT_NAME *aname; sprintf(strsave, "%s%c/%s", ACCOUNT_DIR, tolower(d->account->name[0]), capitalize(d->account->name)); if ((fp = fopen(strsave, "w")) != NULL) { fprintf(fp, "Name %s~\n", d->account->name); fprintf(fp, "Passwd %s~\n", d->account->passwd); fprintf(fp, "Email %s~\n", d->account->email); fprintf(fp, "Editing %d\n", editing); fprintf(fp, "Changes %d\n", d->account->changes); fprintf(fp, "LastTimeReset %d\n", d->account->lasttimereset); fprintf(fp, "Ban %d\n", d->account->ban); fprintf(fp, "SkipLMenu %d\n", d->account->skiplmenu); fprintf(fp, "NoEmail %d\n", d->account->noemail); for (aname = d->account->first_player; aname; aname = aname->next) { fprintf(fp, "Player %s~\n", aname->name); } fprintf(fp, "QPlayer1 %s~\n", d->account->qplayer1); fprintf(fp, "QPlayer2 %s~\n", d->account->qplayer2); fprintf(fp, "QPlayer3 %s~\n", d->account->qplayer3); fprintf(fp, "QPlayer4 %s~\n", d->account->qplayer4); fprintf(fp, "End\n"); fclose(fp); } else { write_to_buffer(d, "There has been a problem saving your account, notify Xerves of this problem.\n\r", 0); } return; } #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } //Loads a player account into a descriptor bool load_account(DESCRIPTOR_DATA * d, char *name, bool preload) { ACCOUNT_DATA *account; ACCOUNT_NAME *aname; char strsave[MIL]; char *rname; int fndq = 0; FILE *fp; char *word; bool fMatch; CREATE(account, ACCOUNT_DATA, 1); d->account = account; sprintf(strsave, "%s%c/%s", ACCOUNT_DIR, tolower(name[0]), capitalize(name)); if ((fp = fopen(strsave, "r")) != NULL) { for (;;) { word = feof(fp) ? "End" : fread_word(fp); fMatch = FALSE; switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'B': KEY("Ban", account->ban, fread_number(fp)); break; case 'C': KEY("Changes", account->changes, fread_number(fp)); break; case 'L': KEY("LastTimeReset", account->lasttimereset, fread_number(fp)); break; case 'P': if (!str_cmp(word, "Player")) { fMatch = TRUE; rname = fread_string(fp); CREATE(aname, ACCOUNT_NAME, 1); aname->name = STRALLOC(rname); LINK(aname, account->first_player, account->last_player, next, prev); } KEY("Passwd", account->passwd, fread_string(fp)); break; case 'Q': if (!str_cmp(word, "QPlayer1") || !str_cmp(word, "QPlayer2") || !str_cmp(word, "QPlayer3") || !str_cmp(word, "QPlayer4")) { fndq = 1; } KEY("QPlayer1", account->qplayer1, fread_string(fp)); KEY("QPlayer2", account->qplayer2, fread_string(fp)); KEY("QPlayer3", account->qplayer3, fread_string(fp)); KEY("QPlayer4", account->qplayer4, fread_string(fp)); break; case 'N': KEY("Name", account->name, fread_string(fp)); KEY("NoEmail", account->noemail, fread_number(fp)); break; case 'S': KEY("SkipLMenu", account->skiplmenu, fread_number(fp)); break; case 'E': KEY("Email", account->email, fread_string(fp)); KEY("Editing", account->editing, fread_number(fp)); if (!str_cmp(word, "End")) { if (fndq == 0) { account->qplayer1 = STRALLOC(""); account->qplayer2 = STRALLOC(""); account->qplayer3 = STRALLOC(""); account->qplayer4 = STRALLOC(""); } fclose(fp); return TRUE; } } } } return FALSE; } /* * Load a char and inventory into a new ch structure. */ bool load_char_obj(DESCRIPTOR_DATA * d, char *name, bool preload) { char strsave[MIL]; CHAR_DATA *ch; FILE *fp; bool found; struct stat fst; int i, x; extern FILE *fpArea; extern char strArea[MIL]; char buf[MIL]; CREATE(ch, CHAR_DATA, 1); for (x = 0; x < MAX_WEAR; x++) for (i = 0; i < MAX_LAYERS; i++) save_equipment[x][i] = NULL; clear_char(ch); loading_char = ch; CREATE(ch->pcdata, PC_DATA, 1); d->character = ch; ch->desc = d; ch->pcdata->filename = STRALLOC(name); ch->name = NULL; ch->act = multimeb(PLR_BLANK, PLR_COMBINE, PLR_PROMPT, -1); ch->pcdata->first_stable = NULL; ch->pcdata->last_stable = NULL; ch->pcdata->first_pkilled = NULL; ch->pcdata->last_pkilled = NULL; ch->pcdata->first_introduction = ch->pcdata->last_introduction = NULL; ch->pcdata->pkilled = 0; ch->perm_str = 13; ch->perm_int = 13; ch->perm_wis = 13; ch->perm_dex = 13; ch->perm_con = 13; ch->perm_cha = 13; ch->perm_lck = 13; ch->perm_agi = 15; ch->pcdata->duel_offer_time = 0; ch->pcdata->duel_receive_time = 0; ch->pcdata->duel_offer_name = -1; ch->pcdata->dual_receive_name = -1; ch->pcdata->duel_offer_pranking = 0; ch->pcdata->duel_receive_pranking = 0; ch->pcdata->spar_offer_name = -1; ch->pcdata->spar_receive_name = -1; ch->speed = 3; ch->desc->speed = 3; ch->pcdata->per_str = 3000; ch->pcdata->per_int = 3000; ch->pcdata->per_wis = 3000; ch->pcdata->per_dex = 3000; ch->pcdata->per_con = 3000; ch->pcdata->per_lck = 3000; ch->pcdata->per_agi = 300; ch->pcdata->per_hp = 300; ch->pcdata->per_mana = 300; ch->pcdata->per_move = 300; ch->apply_res_fire[0] = 100; ch->apply_res_water[0] = 100; ch->apply_res_air[0] = 100; ch->apply_res_earth[0] = 100; ch->pcdata->twink_points = 0; ch->pcdata->power_ranking = 20; ch->pcdata->lastprankingcheck = 0; ch->apply_res_energy[0] = 100; ch->apply_res_magic[0] = 100; ch->apply_res_nonmagic[0] = 100; ch->apply_res_blunt[0] = 100; ch->apply_res_pierce[0] = 100; ch->apply_res_slash[0] = 100; ch->apply_res_poison[0] = 100; ch->apply_res_paralysis[0] = 100; ch->apply_res_holy[0] = 100; ch->apply_res_unholy[0] = 100; ch->apply_res_undead[0] = 100; ch->con_rarm = 1000; ch->con_larm = 1000; ch->move = 1000; ch->max_move = 1000; ch->mover = 30; ch->con_rleg = 1000; ch->con_lleg = 1000; ch->pcdata->banksize = 100; ch->pcdata->righthanded = 1; SET_BIT(ch->grip, GRIP_BASH); ch->no_resistant = 0; ch->no_susceptible = 0; ch->no_immune = 0; ch->was_in_room = NULL; ch->elementb = 0; xCLEAR_BITS(ch->no_affected_by); xCLEAR_BITS(ch->pcdata->portalfnd); ch->pcdata->condition[COND_THIRST] = 48; ch->pcdata->condition[COND_FULL] = 48; ch->pcdata->condition[COND_BLOODTHIRST] = 10; ch->pcdata->nuisance = NULL; ch->pcdata->wizinvis = 0; ch->pcdata->balance = 0; ch->pcdata->gprompt = 0; ch->pcdata->caste = 2; ch->pcdata->flevel = 1; ch->pcdata->lore = 0; ch->pcdata->town = NULL; ch->pcdata->target = GRIP_BASH; ch->pcdata->target_limb = LM_BODY; ch->pcdata->hometown = 0; ch->pcdata->kingdompid = 0; ch->pcdata->incarnations = 0; ch->pcdata->gt_remort = 0; ch->pcdata->tier = 1; ch->pcdata->pranking = 0; ch->pcdata->pkpower = 0; ch->pcdata->train = 0; ch->pcdata->lastintrocheck = 0; ch->pcdata->skincolor = 0; ch->pcdata->haircolor = 0; ch->pcdata->hairlength = 0; ch->pcdata->hairstyle = 0; ch->pcdata->eyecolor = 0; ch->pcdata->cheight = 0; ch->pcdata->cweight = 0; ch->pcdata->lostcon = 0; ch->pcdata->quest_wins = 0; ch->pcdata->quest_losses = 0; ch->pcdata->timeout_login = sysdata.timeout_login; ch->pcdata->timeout_notes = sysdata.timeout_notes; ch->pcdata->timeout_idle = sysdata.timeout_idle; ch->pcdata->whonum = 1; ch->pcdata->stable = 0; ch->pcdata->stablenum = 0; ch->pcdata->stablecurr = 0; ch->pcdata->resource = 0; ch->pcdata->resourcetype = 0; ch->pcdata->job = 0; ch->pcdata->lastinterest = 0; ch->pcdata->authwait = -1; /* Also needed for Remort */ ch->mental_state = -10; ch->mobinvis = 0; //spherepoints & grouppoints are used to keep track of groups/spheres for skill improvement/degeneration for (i = 1; i <= MAX_SPHERE; i++) ch->pcdata->spherepoints[i] = -1; for (i = 1; i <= MAX_GROUP+5; i++) ch->pcdata->grouppoints[i] = -1; for (i = 0; i < MAX_SKILL; i++) ch->pcdata->learned[i] = 0; for (i = 0; i < 5; i++) { ch->pcdata->forget[i] = 0; ch->pcdata->nolearn[i] = 0; } for (i = 0; i < MAX_GROUP + 2; i++) ch->pcdata->spellgroups[i] = 0; for (i = 0; i < MAX_GROUP + 2; i++) ch->pcdata->spellpoints[i] = 0; ch->pcdata->mapdir = -1; ch->pcdata->release_date = 0; ch->pcdata->helled_by = NULL; ch->saving_poison_death = 0; ch->saving_wand = 0; ch->saving_para_petri = 0; ch->pcdata->spoints = 0; ch->saving_breath = 0; ch->saving_spell_staff = 0; ch->pcdata->logon = current_time; ch->style = STYLE_FIGHTING; ch->comments = NULL; /* comments */ ch->pcdata->pagerlen = 24; ch->pcdata->first_ignored = NULL; /* Ignore list */ ch->pcdata->last_ignored = NULL; ch->pcdata->aimtarget = NULL; //Target in battle to aim at in Wilderness. ch->pcdata->tell_history = NULL; /* imm only lasttell cmnd */ ch->pcdata->lt_index = 0; /* last tell index */ ch->morph = NULL; ch->pcdata->secedit = 18; /* Initialize Map OLC sector - Samson 8-1-99 */ ch->map = -1; /* Initialize map they're on - Samson 8-3-99 */ CREATE(ch->coord, COORD_DATA, 1); ch->coord->x = -1; ch->coord->y = -1; ch->fcounter = 0; ch->pcdata->email = NULL; /* Initialize email address - Samson 1-4-99 */ ch->pcdata->homepage = NULL; /* Initialize homepage - Samson 1-4-99 */ ch->pcdata->icq = 0; /* Initalize icq# - Samson 1-4-99 */ /* Set up defaults for imc stuff */ ch->pcdata->imc_deaf = 0; ch->pcdata->imc_deny = 0; ch->pcdata->imc_allow = 0; ch->pcdata->ice_listen = NULL; found = FALSE; sprintf(strsave, "%s%c/%s", PLAYER_DIR, tolower(name[0]), capitalize(name)); if (stat(strsave, &fst) != -1) { if (fst.st_size == 0) { sprintf(strsave, "%s%c/%s", BACKUP_DIR, tolower(name[0]), capitalize(name)); send_to_char("Restoring your backup player file...", ch); } else { sprintf(buf, "%s player data for: %s (%dK)", preload ? "Preloading" : "Loading", ch->pcdata->filename, (int) fst.st_size / 1024); log_string_plus(buf, LOG_COMM, LEVEL_HI_IMM); } } /* else no player file */ if ((fp = fopen(strsave, "r")) != NULL) { int iNest; for (iNest = 0; iNest < MAX_NEST; iNest++) rgObjNest[iNest] = NULL; found = TRUE; /* Cheat so that bug will show line #'s -- Altrag */ fpArea = fp; strcpy(strArea, strsave); for (;;) { char letter; char *word; letter = fread_letter(fp); if (letter == '*') { fread_to_eol(fp); continue; } if (letter != '#') { bug("Load_char_obj: # not found.", 0); bug(name, 0); break; } word = fread_word(fp); if (!strcmp(word, "PLAYER")) { fread_char(ch, fp, preload); if (preload) break; } else if (!strcmp(word, "OBJECT")) /* Objects */ fread_obj(ch, fp, OS_CARRY); else if (!strcmp(word, "BANK")) fread_obj(ch, fp, OS_BANK); else if (!strcmp(word, "MorphData")) /* Morphs */ fread_morph_data(ch, fp); else if (!strcmp(word, "COMMENT")) fread_comment(ch, fp); /* Comments */ else if (!strcmp(word, "INTRO")) fread_introduction(ch, fp); else if (!strcmp(word, "STABLE")) { STABLE_DATA *stb; stb = fread_stable(fp); LINK(stb, ch->pcdata->first_stable, ch->pcdata->last_stable, next, prev); } else if (!strcmp(word, "MOBILE")) { CHAR_DATA *mob; mob = fread_mobile(fp); ch->pcdata->pet = mob; mob->master = ch; if (IS_ONMAP_FLAG(ch)) { mob->coord->x = ch->coord->x; mob->coord->y = ch->coord->y; mob->map = ch->map; SET_ONMAP_FLAG(mob); } if (ch->in_room->vnum == mob->in_room->vnum) { if (xIS_SET(mob->act, ACT_MOUNTABLE)) { ch->mount = mob; xSET_BIT(mob->act, ACT_MOUNTED); } } else { ch->mount = NULL; xREMOVE_BIT(mob->act, ACT_MOUNTED); } xSET_BIT(mob->affected_by, AFF_CHARM); } else if (!strcmp(word, "MOUNT")) { CHAR_DATA *mount; mount = fread_mount(fp); ch->pcdata->mount = mount; mount->master = ch; REMOVE_ONMAP_FLAG(mount); if (mount->in_room->vnum != OVERLAND_SOLAN) REMOVE_ONMAP_FLAG(mount); else SET_ONMAP_FLAG(mount); if (ch->in_room->vnum == OVERLAND_SOLAN && mount->in_room->vnum == OVERLAND_SOLAN) { mount->coord->x = ch->coord->x; mount->coord->y = ch->coord->y; mount->map = ch->map; SET_ONMAP_FLAG(mount); } if (mount->in_room->vnum == OVERLAND_SOLAN && ch->in_room->vnum != OVERLAND_SOLAN) { char_from_room(mount); char_to_room(mount, get_room_index(ROOM_VNUM_TEMPLE)); mount->coord->x = -1; mount->coord->y = -1; mount->map = -1; REMOVE_ONMAP_FLAG(mount); } if (ch->in_room->vnum == mount->in_room->vnum) { if (xIS_SET(mount->act, ACT_MOUNTABLE)) { ch->mount = mount; xSET_BIT(mount->act, ACT_MOUNTED); } } else { ch->mount = NULL; xREMOVE_BIT(mount->act, ACT_MOUNTED); } if (ch->ship) { mount->ship = ch->ship; mount->coord->x = ch->ship->x; mount->coord->y = ch->ship->y; LINK(mount, ch->ship->first_char, ch->ship->last_char, next_ship, prev_ship); } xSET_BIT(mount->affected_by, AFF_CHARM); mount->m4 = ch->pcdata->hometown; } else if (!strcmp(word, "END")) /* Done */ break; else { bug("Load_char_obj: bad section.", 0); bug(name, 0); break; } } fclose(fp); fpArea = NULL; strcpy(strArea, "$"); } if (ch->pcdata->ice_listen == NULL) ch->pcdata->ice_listen = str_dup(""); if (!found) { ch->name = STRALLOC(name); ch->short_descr = STRALLOC(""); ch->long_descr = STRALLOC(""); ch->description = STRALLOC(""); ch->editor = NULL; ch->pcdata->clan_name = STRALLOC(""); ch->pcdata->clan = NULL; ch->pcdata->council_name = STRALLOC(""); ch->pcdata->council = NULL; ch->pcdata->deity_name = STRALLOC(""); ch->pcdata->deity = NULL; ch->pcdata->first_alias = NULL; ch->pcdata->last_alias = NULL; ch->pcdata->pet = NULL; ch->pcdata->mount = NULL; /* every characters starts at default board from login.. this board should be read_level == 0 ! */ ch->pcdata->board = &boards[DEFAULT_BOARD]; ch->pcdata->bamfin = str_dup(""); ch->pcdata->bamfout = str_dup(""); ch->pcdata->rank = str_dup(""); ch->pcdata->bestowments = str_dup(""); ch->pcdata->title = STRALLOC(""); ch->pcdata->pretit = str_dup(""); /* Xerves 8-2-99 */ ch->pcdata->homepage = str_dup(""); ch->pcdata->email = str_dup(""); /* Samson 4-19-98 */ ch->pcdata->icq = 0; /* Samson 1-4-99 */ ch->pcdata->bio = STRALLOC(""); ch->pcdata->authed_by = STRALLOC(""); ch->pcdata->came_from = STRALLOC(""); ch->pcdata->prompt = STRALLOC(""); ch->pcdata->fprompt = STRALLOC(""); ch->tone = STRALLOC(""); ch->movement = STRALLOC(""); ch->pcdata->r_range_lo = 0; ch->pcdata->r_range_hi = 0; ch->pcdata->m_range_lo = 0; ch->pcdata->m_range_hi = 0; ch->pcdata->o_range_lo = 0; ch->pcdata->o_range_hi = 0; ch->pcdata->wizinvis = 0; } else { if (!ch->name) ch->name = STRALLOC(name); if (!ch->pcdata->clan_name) { ch->pcdata->clan_name = STRALLOC(""); ch->pcdata->clan = NULL; } if (!ch->pcdata->council_name) { ch->pcdata->council_name = STRALLOC(""); ch->pcdata->council = NULL; } if (!ch->pcdata->deity_name) { ch->pcdata->deity_name = STRALLOC(""); ch->pcdata->deity = NULL; } if (!ch->pcdata->bio) ch->pcdata->bio = STRALLOC(""); if (!ch->pcdata->came_from) ch->pcdata->came_from = STRALLOC(""); if (!ch->pcdata->pretit) ch->pcdata->pretit = str_dup(""); /* Xerves 8-2-99 */ if (!ch->pcdata->authed_by) ch->pcdata->authed_by = STRALLOC(""); if (xIS_SET(ch->act, PLR_FLEE)) xREMOVE_BIT(ch->act, PLR_FLEE); if (IS_IMMORTAL(ch)) { if (ch->pcdata->wizinvis < 2) ch->pcdata->wizinvis = ch->level; assign_area(ch); } if (file_ver > 1) { for (i = 0; i < MAX_WEAR; i++) { for (x = 0; x < MAX_LAYERS; x++) { if (save_equipment[i][x]) { equip_char(ch, save_equipment[i][x], i); save_equipment[i][x] = NULL; } else break; } } } /* Must be done *AFTER* eq is worn because of wis/int modifiers */ /* if ( !IS_IMMORTAL(ch) ) REMOVE_BIT(ch->speaks, LANG_COMMON | race_table[ch->race]->language); if ( countlangs(ch->speaks) < (ch->level / 10) && !IS_IMMORTAL(ch) ) { int prct = 5 + (get_curr_int(ch) / 6) + (get_curr_wis(ch) / 7); do { int iLang; int lang = 1; int need = (ch->level / 10) - countlangs(ch->speaks); int prac = 2 - (get_curr_cha(ch) / 17) * (70 / prct) * need; if ( ch->practice >= prac ) break; for ( iLang = 1; lang_array[iLang] != LANG_UNKNOWN; iLang++ ) if ( number_range( 1, iLang ) == 1 ) lang = iLang; if ( (iLang = bsearch_skill_exact( lang_names[lang], gsn_first_tongue, gsn_top_sn-1 )) < 0 ) continue; if ( ch->pcdata->learned[iLang] > 0 ) continue; SET_BIT(ch->speaks, lang_array[lang]); ch->pcdata->learned[iLang] = 70; ch->speaks &= VALID_LANGS; REMOVE_BIT(ch->speaks, LANG_COMMON | race_table[ch->race]->language); } }*/ } /* Rebuild affected_by and RIS to catch errors - FB */ update_aris(ch); loading_char = NULL; return found; } void fread_arena_affect(CHAR_DATA * ch, FILE * fp) { char *word; for (;;) { word = feof(fp) ? "End" : fread_word(fp); switch (UPPER(word[0])) { case '*': fread_to_eol(fp); break; case 'A': if (!strcmp(word, "AffectData")) { AFFECT_DATA *paf; int sn; char *sname = fread_word(fp); CREATE(paf, AFFECT_DATA, 1); if ((sn = skill_lookup(sname)) < 0) { if ((sn = herb_lookup(sname)) < 0) bug("Fread_arena_affect: unknown skill.", 0); else sn += TYPE_HERB; } paf->type = sn; paf->duration = fread_number(fp); paf->modifier = fread_number(fp); paf->location = fread_number(fp); if (paf->location == APPLY_WEAPONSPELL || paf->location == APPLY_WEARSPELL || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_STRIPSN || paf->location == APPLY_RECURRINGSPELL) paf->modifier = slot_lookup(paf->modifier); paf->bitvector = fread_bitvector(fp); LINK(paf, ch->first_affect, ch->last_affect, next, prev); break; } case 'E': if (!strcmp(word, "End")) return; } } } void read_obj_arena(CHAR_DATA * ch, char *argument) { FILE *pfile; char pload[MIL]; struct stat fst; int x, i; for (x = 0; x < MAX_WEAR; x++) for (i = 0; i < MAX_LAYERS; i++) save_equipment[x][i] = NULL; pload[0] = '\0'; sprintf(pload, "%s%c/%s", PLAYER_DIR, tolower(argument[0]), capitalize(argument)); if (stat(pload, &fst) == -1) { bug("%s's file cannot be found, not good.", ch->name); return; } if (stat(pload, &fst) != -1) { if ((pfile = fopen(pload, "r")) != NULL) { for (;;) { char letter; char *word; letter = fread_letter(pfile); if (letter != '#') continue; word = fread_word(pfile); if (!str_cmp(word, "PLAYER")) fread_arena_affect(ch, pfile); else if (!str_cmp(word, "OBJECT")) fread_obj(ch, pfile, OS_CARRY); else if (!str_cmp(word, "END")) break; } fclose(pfile); } } for (i = 0; i < MAX_WEAR; i++) { for (x = 0; x < MAX_LAYERS; x++) { if (save_equipment[i][x]) { equip_char(ch, save_equipment[i][x], i); save_equipment[i][x] = NULL; } else break; } } return; } /* * Read in a char. */ #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !strcmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } void fread_char(CHAR_DATA * ch, FILE * fp, bool preload) { char buf[MSL]; char *line; char *word; int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25; int max_colors = 0; /* Color code */ sh_int killcnt; bool fMatch; CHANNEL_HISTORY *chistory; file_ver = 0; killcnt = 0; /* Setup color values in case player has none set - Samson */ memcpy(&ch->pcdata->colors, &default_set, sizeof(default_set)); for (;;) { word = feof(fp) ? "End" : fread_word(fp); fMatch = FALSE; if (!str_cmp(word, "EWorth") || !str_cmp(word, "Sworth") || !str_cmp(word, "PLevel")) { fread_to_eol(fp); fMatch = TRUE; continue; } switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'A': KEY("Act", ch->act, fread_bitvector(fp)); KEY("AffectedBy", ch->affected_by, fread_bitvector(fp)); KEY("Alignment", ch->alignment, fread_number(fp)); KEY("Armor", ch->armor, fread_number(fp)); if (!strcmp(word, "Affect") || !strcmp(word, "AffectData") || !strcmp(word, "AffectRecur") || !strcmp(word, "AffectDataRecur")) { AFFECT_DATA *paf; int recur = 0; if (!str_cmp(word, "AffectRecur") || !str_cmp(word, "AffectDataRecur")) recur = 1; if (preload) { fMatch = TRUE; fread_to_eol(fp); break; } CREATE(paf, AFFECT_DATA, 1); if (!strcmp(word, "Affect") || !strcmp(word, "AffectRecur")) { paf->type = fread_number(fp); } else { int sn; char *sname = fread_word(fp); if ((sn = skill_lookup(sname)) < 0) { if ((sn = herb_lookup(sname)) < 0) bug("Fread_char: unknown skill.", 0); else sn += TYPE_HERB; } paf->type = sn; } paf->duration = fread_number(fp); if (recur) { paf->modifier = skill_lookup(fread_word(fp)); } else { paf->modifier = fread_number(fp); } paf->location = fread_number(fp); paf->bitvector = fread_bitvector(fp); LINK(paf, ch->first_affect, ch->last_affect, next, prev); fMatch = TRUE; break; } if (!strcmp(word, "AttrMod")) { int x26; line = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = 13; x8 = 10; x9=x10=x11=x12=x13=x14=x15=x16=x17=x18=x19=x20=x21=x22=x23=x24=x25=x26=0; sscanf(line, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12, &x13, &x14, &x15, &x16, &x17, &x18, &x19, &x20, &x21, &x22, &x23, &x24, &x25, &x26); ch->mod_str = x1; ch->mod_int = x2; ch->mod_wis = x3; ch->mod_dex = x4; ch->mod_con = x5; ch->mod_cha = x6; ch->mod_lck = x7; ch->mod_agi = x8; ch->apply_armor = x9; ch->apply_shield = x10; ch->apply_stone = x11; ch->apply_sanctify = x12; ch->apply_tohit = x13; ch->managen = x14; ch->hpgen = x15; ch->apply_wmod = x16; ch->apply_manafuse = x17; ch->apply_fasting = x18; ch->apply_manashell = x19; ch->apply_manashield = x20; ch->apply_managuard = x21; ch->apply_manaburn = x22; ch->apply_weaponclamp = x23; ch->apply_arrowcatch = x24; ch->apply_bracing = x25; ch->apply_hardening = x26; if (!x7) ch->mod_lck = 0; fMatch = TRUE; break; } if (!strcmp(word, "AttrPer")) { line = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = 0; sscanf(line, "%d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7); ch->pcdata->per_str = x1; ch->pcdata->per_int = x2; ch->pcdata->per_wis = x3; ch->pcdata->per_dex = x4; ch->pcdata->per_con = x5; ch->pcdata->per_lck = x6; ch->pcdata->per_agi = x7; fMatch = TRUE; break; } if (!str_cmp(word, "Alias")) { ALIAS_DATA *pal; if (preload) { fMatch = TRUE; fread_to_eol(fp); break; } CREATE(pal, ALIAS_DATA, 1); pal->name = fread_string_nohash(fp); pal->cmd = fread_string_nohash(fp); LINK(pal, ch->pcdata->first_alias, ch->pcdata->last_alias, next, prev); fMatch = TRUE; break; } if (!strcmp(word, "AttrPerm")) { line = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = 0; sscanf(line, "%d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8); ch->perm_str = x1; ch->perm_int = x2; ch->perm_wis = x3; ch->perm_dex = x4; ch->perm_con = x5; ch->perm_cha = x6; ch->perm_lck = x7; ch->perm_agi = x8; if (!x7 || x7 == 0) ch->perm_lck = 13; fMatch = TRUE; break; } KEY("AuthedBy", ch->pcdata->authed_by, fread_string(fp)); KEY("Autocommand", ch->pcdata->autocommand, fread_string(fp)); break; case 'B': KEY("Balance", ch->pcdata->balance, fread_number(fp)); KEY("Banksize", ch->pcdata->banksize, fread_number(fp)); KEY("Bamfin", ch->pcdata->bamfin, fread_string_nohash(fp)); KEY("Bamfout", ch->pcdata->bamfout, fread_string_nohash(fp)); /* Read in board status */ if (!str_cmp(word, "Boards")) { int i, num = fread_number(fp); /* number of boards saved */ char *boardname; for (; num; num--) /* for each of the board saved */ { boardname = fread_word(fp); i = board_lookup(boardname); /* find board number */ if (i == BOARD_NOTFOUND) /* Does board still exist ? */ { sprintf(buf, "fread_char: %s had unknown board name: %s. Skipped.", ch->name, boardname); log_string(buf); fread_number(fp); /* read last_note and skip info */ } else /* Save it */ ch->pcdata->last_note[i] = fread_number(fp); } /* for */ fMatch = TRUE; } /* Boards */ KEY("Bestowments", ch->pcdata->bestowments, fread_string_nohash(fp)); KEY("Bio", ch->pcdata->bio, fread_string(fp)); break; case 'C': KEY("CameFrom", ch->pcdata->came_from, fread_string(fp)); KEY("Cheight", ch->pcdata->cheight, fread_number(fp)); if (!str_cmp(word, "CHISTORY")) { CREATE(chistory, CHANNEL_HISTORY, 1); LINK(chistory, ch->pcdata->first_messagehistory, ch->pcdata->last_messagehistory, next, prev); chistory->channel = fread_number(fp); chistory->pid = fread_number(fp); chistory->flags = fread_number(fp); chistory->level = fread_number(fp); chistory->kpid = fread_number(fp); chistory->sender = fread_string(fp); chistory->text = fread_string(fp); fMatch = TRUE; break; } KEY("Cweight", ch->pcdata->cweight, fread_number(fp)); KEY("Caste", ch->pcdata->caste, fread_number(fp)); if (!strcmp(word, "Clan")) { ch->pcdata->clan_name = fread_string(fp); if (!preload && ch->pcdata->clan_name[0] != '\0' && (ch->pcdata->clan = get_clan(ch->pcdata->clan_name)) == NULL) { sprintf(buf, "Warning: the organization %s no longer exists, and therefore you no longer\n\rbelong to that organization.\n\r", ch->pcdata->clan_name); send_to_char(buf, ch); STRFREE(ch->pcdata->clan_name); ch->pcdata->clan_name = STRALLOC(""); } fMatch = TRUE; break; } if (!strcmp(word, "Condition")) { line = fread_line(fp); sscanf(line, "%d %d %d %d", &x1, &x2, &x3, &x4); ch->pcdata->condition[0] = x1; ch->pcdata->condition[1] = x2; ch->pcdata->condition[2] = x3; ch->pcdata->condition[3] = x4; fMatch = TRUE; break; } /* Load color values - Samson 9-29-98 */ { int x; if (!str_cmp(word, "Colors")) { for (x = 0; x < max_colors; x++) ch->pcdata->colors[x] = fread_number(fp); fMatch = TRUE; break; } } if (!str_cmp(word, "Coordinates")) { ch->coord->x = fread_number(fp); ch->coord->y = fread_number(fp); ch->map = fread_number(fp); if (!IS_ONMAP_FLAG(ch)) { ch->coord->x = -1; ch->coord->y = -1; ch->map = -1; } fMatch = TRUE; break; } if (!strcmp(word, "Council")) { ch->pcdata->council_name = fread_string(fp); if (!preload && ch->pcdata->council_name[0] != '\0' && (ch->pcdata->council = get_council(ch->pcdata->council_name)) == NULL) { sprintf(buf, "Warning: the council %s no longer exists, and herefore you no longer\n\rbelong to a council.\n\r", ch->pcdata->council_name); send_to_char(buf, ch); STRFREE(ch->pcdata->council_name); ch->pcdata->council_name = STRALLOC(""); } fMatch = TRUE; break; } break; case 'D': KEY("Damroll", ch->damroll, fread_number(fp)); KEY("Deaf", ch->deaf, fread_number(fp)); KEY("DOffer_time", ch->pcdata->duel_offer_time, fread_number(fp)); KEY("DReceive_time", ch->pcdata->duel_receive_time, fread_number(fp)); KEY("DOffier_name", ch->pcdata->duel_offer_name, fread_number(fp)); KEY("DReceive_name", ch->pcdata->dual_receive_name, fread_number(fp)); KEY("DOffer_prank", ch->pcdata->duel_offer_pranking, fread_number(fp)); KEY("DReceive_prank", ch->pcdata->duel_receive_pranking, fread_number(fp)); if (!strcmp(word, "Deity")) { ch->pcdata->deity_name = fread_string(fp); if (!preload && ch->pcdata->deity_name[0] != '\0' && (ch->pcdata->deity = get_deity(ch->pcdata->deity_name)) == NULL) { sprintf(buf, "Warning: the deity %s no longer exists.\n\r", ch->pcdata->deity_name); send_to_char(buf, ch); STRFREE(ch->pcdata->deity_name); ch->pcdata->deity_name = STRALLOC(""); ch->pcdata->favor = 0; } fMatch = TRUE; break; } KEY("Description", ch->description, fread_string(fp)); break; /* 'E' was moved to after 'S' */ case 'F': KEY("Fame", ch->fame, fread_number(fp)); KEY("Favor", ch->pcdata->favor, fread_number(fp)); if (!strcmp(word, "Filename")) { /* * File Name already set externally. */ fread_to_eol(fp); fMatch = TRUE; break; } KEY("Flags", ch->pcdata->flags, fread_number(fp)); KEY("FLevel", ch->pcdata->flevel, fread_number(fp)); if (!strcmp(word, "Forget")) { int x; int sn; x = fread_number(fp); sn = skill_lookup(fread_word(fp)); ch->pcdata->forget[x] = sn; fMatch = TRUE; break; } KEY("FPrompt", ch->pcdata->fprompt, fread_string(fp)); break; case 'G': KEY("Glory", ch->pcdata->quest_curr, fread_number(fp)); KEY("Gold", ch->gold, fread_number(fp)); KEY("GtRemort", ch->pcdata->gt_remort, fread_number(fp)); KEY("Grip", ch->grip, fread_number(fp)); KEY("GPrompt", ch->pcdata->gprompt, fread_number(fp)); /* temporary measure */ if (!strcmp(word, "Guild")) { ch->pcdata->clan_name = fread_string(fp); if (!preload && ch->pcdata->clan_name[0] != '\0' && (ch->pcdata->clan = get_clan(ch->pcdata->clan_name)) == NULL) { sprintf(buf, "Warning: the organization %s no longer exists, and therefore you no longer\n\rbelong to that organization.\n\r", ch->pcdata->clan_name); send_to_char(buf, ch); STRFREE(ch->pcdata->clan_name); ch->pcdata->clan_name = STRALLOC(""); } fMatch = TRUE; break; } break; case 'H': KEY("Haircolor", ch->pcdata->haircolor, fread_number(fp)); KEY("Hairlength", ch->pcdata->hairlength, fread_number(fp)); KEY("Hairstyle", ch->pcdata->hairstyle, fread_number(fp)); KEY("Height", ch->height, fread_number(fp)); if (!strcmp(word, "Helled")) { ch->pcdata->release_date = fread_number(fp); ch->pcdata->helled_by = fread_string(fp); if (ch->pcdata->release_date < current_time) { STRFREE(ch->pcdata->helled_by); ch->pcdata->helled_by = NULL; ch->pcdata->release_date = 0; } fMatch = TRUE; break; } KEY("HitCount", ch->pcdata->hit_cnt, fread_number(fp)); KEY("Hitroll", ch->hitroll, fread_number(fp)); KEY("Homepage", ch->pcdata->homepage, fread_string_nohash(fp)); if (!strcmp(word, "HomeTown")) { ch->pcdata->hometown = fread_number(fp); if (ch->pcdata->hometown >= sysdata.max_kingdom) { bug("load_char: %s had an invalid kingdom of %d", ch->name, ch->pcdata->hometown); ch->pcdata->hometown = 0; } fMatch = TRUE; break; } if (!strcmp(word, "HpMpMvPer")) { ch->pcdata->per_hp = fread_number(fp); ch->pcdata->per_mana = fread_number(fp); ch->pcdata->per_move = fread_number(fp); fMatch = TRUE; break; } if (!strcmp(word, "HpManaMove")) { int toss; ch->hit = fread_number(fp); ch->max_hit = fread_number(fp); ch->mana = fread_number(fp); ch->max_mana = fread_number(fp); ch->move = fread_number(fp); toss = fread_number(fp); ch->max_move = 1000; fMatch = TRUE; break; } break; case 'I': KEY("ICQ", ch->pcdata->icq, fread_number(fp)); if (!strcmp(word, "Ignored")) { char *temp; char fname[1024]; struct stat fst; int ign; IGNORE_DATA *inode; /* Get the name */ temp = fread_string(fp); sprintf(fname, "%s%c/%s", PLAYER_DIR, tolower(temp[0]), capitalize(temp)); /* If there isn't a pfile for the name */ /* then don't add it to the list */ if (stat(fname, &fst) == -1) { fMatch = TRUE; break; } /* Count the number of names already ignored */ for (ign = 0, inode = ch->pcdata->first_ignored; inode; inode = inode->next) { ign++; } /* Add the name unless the limit has been reached */ if (ign >= MAX_IGN) { bug("fread_char: too many ignored names"); } else { /* Add the name to the list */ CREATE(inode, IGNORE_DATA, 1); inode->name = STRALLOC(temp); inode->next = NULL; inode->prev = NULL; LINK(inode, ch->pcdata->first_ignored, ch->pcdata->last_ignored, next, prev); } fMatch = TRUE; break; } KEY("IllegalPK", ch->pcdata->illegal_pk, fread_number(fp)); KEY("IMC", ch->pcdata->imc_deaf, fread_number(fp)); KEY("IMCAllow", ch->pcdata->imc_allow, fread_number(fp)); KEY("IMCDeny", ch->pcdata->imc_deny, fread_number(fp)); KEY("ICEListen", ch->pcdata->ice_listen, fread_string_nohash(fp)); KEY("Immune", ch->immune, fread_number(fp)); KEY("Incr", ch->pcdata->incarnations, fread_number(fp)); break; case 'J': KEY("Job", ch->pcdata->job, fread_number(fp)); break; case 'K': KEY("Keeper", ch->pcdata->keeper, fread_number(fp)); if (!strcmp(word, "Killed")) { fMatch = TRUE; if (killcnt >= MAX_KILLTRACK) bug("fread_char: killcnt (%d) >= MAX_KILLTRACK", killcnt); else { ch->pcdata->killed[killcnt].vnum = fread_number(fp); ch->pcdata->killed[killcnt++].count = fread_number(fp); } } KEY("KingdomPid", ch->pcdata->kingdompid, fread_number(fp)); break; case 'L': KEY("LastIntroCheck", ch->pcdata->lastintrocheck, fread_number(fp)); KEY("LastInterest", ch->pcdata->lastinterest, fread_number(fp)); KEY("LastPRankingCheck", ch->pcdata->lastprankingcheck, fread_number(fp)); KEY("LastName", ch->last_name, fread_string(fp)); KEY("Level", ch->level, fread_number(fp)); KEY("LongDescr", ch->long_descr, fread_string(fp)); KEY("Lore", ch->pcdata->lore, fread_number(fp)); KEY("LostCon", ch->pcdata->lostcon, fread_number(fp)); if (!strcmp(word, "Languages")) { ch->speaks = fread_number(fp); ch->speaking = fread_number(fp); fMatch = TRUE; } if (!strcmp(word, "Limbs")) { ch->con_rarm = fread_number(fp); ch->con_larm = fread_number(fp); ch->con_rleg = fread_number(fp); ch->con_lleg = fread_number(fp); fMatch = TRUE; break; } break; case 'M': KEY("Mapdir", ch->pcdata->mapdir, fread_number(fp)); KEY("ManaCount", ch->pcdata->mana_cnt, fread_number(fp)); KEY("MaxColors", max_colors, fread_number(fp)); KEY("MDeaths", ch->pcdata->mdeaths, fread_number(fp)); KEY("Mentalstate", ch->mental_state, fread_number(fp)); KEY("MGlory", ch->pcdata->quest_accum, fread_number(fp)); KEY("Minsnoop", ch->pcdata->min_snoop, fread_number(fp)); KEY("MKills", ch->pcdata->mkills, fread_number(fp)); KEY("MoveMessage", ch->movement, fread_string(fp)); KEY("Mobinvis", ch->mobinvis, fread_number(fp)); if (!strcmp(word, "MobRange")) { ch->pcdata->m_range_lo = fread_number(fp); ch->pcdata->m_range_hi = fread_number(fp); fMatch = TRUE; } KEY("MoveR", ch->mover, fread_number(fp)); break; case 'N': KEY("Name", ch->name, fread_string(fp)); KEY("NoAffectedBy", ch->no_affected_by, fread_bitvector(fp)); KEY("NoImmune", ch->no_immune, fread_number(fp)); if (!strcmp(word, "NewResists")) { line = fread_line(fp); x1=x2=x3=x4=x5=x6=x7=x8=x9=x10=x11=x12=x13=x14=x15=0; sscanf(line, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12, &x13, &x14, &x15); ch->apply_res_fire[0] = x1; ch->apply_res_water[0] = x2; ch->apply_res_air[0] = x3; ch->apply_res_earth[0] = x4; ch->apply_res_energy[0] = x5; ch->apply_res_magic[0] = x6; ch->apply_res_nonmagic[0] = x7; ch->apply_res_blunt[0] = x8; ch->apply_res_pierce[0] = x9; ch->apply_res_slash[0] = x10; ch->apply_res_poison[0] = x11; ch->apply_res_paralysis[0] = x12; ch->apply_res_holy[0] = x13; ch->apply_res_unholy[0] = x14; ch->apply_res_undead[0] = x15; fMatch = TRUE; break; } if (!strcmp(word, "NewResists1")) { line = fread_line(fp); x1=x2=x3=x4=x5=x6=x7=x8=x9=x10=x11=x12=x13=x14=x15=0; sscanf(line, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12, &x13, &x14, &x15); ch->apply_res_fire[1] = x1; ch->apply_res_water[1] = x2; ch->apply_res_air[1] = x3; ch->apply_res_earth[1] = x4; ch->apply_res_energy[1] = x5; ch->apply_res_magic[1] = x6; ch->apply_res_nonmagic[1] = x7; ch->apply_res_blunt[1] = x8; ch->apply_res_pierce[1] = x9; ch->apply_res_slash[1] = x10; ch->apply_res_poison[1] = x11; ch->apply_res_paralysis[1] = x12; ch->apply_res_holy[1] = x13; ch->apply_res_unholy[1] = x14; ch->apply_res_undead[1] = x15; fMatch = TRUE; break; } if (!strcmp(word, "NewResists2")) { line = fread_line(fp); x1=x2=x3=x4=x5=x6=x7=x8=x9=x10=x11=x12=x13=x14=x15=0; sscanf(line, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12, &x13, &x14, &x15); ch->apply_res_fire[2] = x1; ch->apply_res_water[2] = x2; ch->apply_res_air[2] = x3; ch->apply_res_earth[2] = x4; ch->apply_res_energy[2] = x5; ch->apply_res_magic[2] = x6; ch->apply_res_nonmagic[2] = x7; ch->apply_res_blunt[2] = x8; ch->apply_res_pierce[2] = x9; ch->apply_res_slash[2] = x10; ch->apply_res_poison[2] = x11; ch->apply_res_paralysis[2] = x12; ch->apply_res_holy[2] = x13; ch->apply_res_unholy[2] = x14; ch->apply_res_undead[2] = x15; fMatch = TRUE; break; } if (!strcmp(word, "NoLearn")) { int x; int sn; x = fread_number(fp); sn = skill_lookup(fread_word(fp)); ch->pcdata->nolearn[x] = sn; fMatch = TRUE; break; } KEY("NoResistant", ch->no_resistant, fread_number(fp)); KEY("NoSusceptible", ch->no_susceptible, fread_number(fp)); if (!strcmp("Nuisance", word)) { fMatch = TRUE; CREATE(ch->pcdata->nuisance, NUISANCE_DATA, 1); ch->pcdata->nuisance->time = fread_number(fp); ch->pcdata->nuisance->max_time = fread_number(fp); ch->pcdata->nuisance->flags = fread_number(fp); ch->pcdata->nuisance->power = 1; } if (!strcmp("NuisanceNew", word)) { fMatch = TRUE; CREATE(ch->pcdata->nuisance, NUISANCE_DATA, 1); ch->pcdata->nuisance->time = fread_number(fp); ch->pcdata->nuisance->max_time = fread_number(fp); ch->pcdata->nuisance->flags = fread_number(fp); ch->pcdata->nuisance->power = fread_number(fp); } break; case 'O': KEY("Offeredlname", ch->pcdata->offeredlname, fread_string(fp)); KEY("Outcast_time", ch->pcdata->outcast_time, fread_number(fp)); if (!strcmp(word, "ObjRange")) { ch->pcdata->o_range_lo = fread_number(fp); ch->pcdata->o_range_hi = fread_number(fp); fMatch = TRUE; } break; case 'P': KEY("Pagerlen", ch->pcdata->pagerlen, fread_number(fp)); KEY("Password", ch->pcdata->pwd, fread_string_nohash(fp)); KEY("PDeaths", ch->pcdata->pdeaths, fread_number(fp)); KEY("Pid", ch->pcdata->pid, fread_number(fp)); KEY("PkPower", ch->pcdata->pkpower, fread_number(fp)); KEY("PRanking", ch->pcdata->pranking, fread_number(fp)); if (!strcmp(word, "Pkilled")) { PKILLED_DATA *pkl; fMatch = TRUE; CREATE(pkl, PKILLED_DATA, 1); pkl->name = fread_string(fp); LINK(pkl, ch->pcdata->first_pkilled, ch->pcdata->last_pkilled, next, prev); ch->pcdata->pkilled++; if (ch->pcdata->pkilled > MAX_PKILLTRACK) bug("%s pkill number is over 10 with %d", ch->name, ch->pcdata->pkilled); } KEY("PKills", ch->pcdata->pkills, fread_number(fp)); KEY("Played", ch->played, fread_number(fp)); KEY("PortalsFnd", ch->pcdata->portalfnd, fread_bitvector(fp)); KEY("PowerRanking", ch->pcdata->power_ranking, fread_number(fp)); /* KEY( "Position", ch->position, fread_number( fp ) ); */ /* * new positions are stored in the file from 100 up * old positions are from 0 up * if reading an old position, some translation is necessary */ if (!strcmp(word, "Position")) { ch->position = fread_number(fp); if (ch->position < 100) { switch (ch->position) { default:; case 0:; case 1:; case 2:; case 3:; case 4: break; case 5: ch->position = 6; break; case 6: ch->position = 8; break; case 7: ch->position = 9; break; case 8: ch->position = 12; break; case 9: ch->position = 13; break; case 10: ch->position = 14; break; case 11: ch->position = 15; break; } fMatch = TRUE; } else { ch->position -= 100; fMatch = TRUE; } } KEY("Practice", ch->practice, fread_number(fp)); KEY("Pretit", ch->pcdata->pretit, fread_string_nohash(fp)); KEY("Prompt", ch->pcdata->prompt, fread_string(fp)); if (!strcmp(word, "PTimer")) { add_timer(ch, TIMER_PKILLED, fread_number(fp), NULL, 0); fMatch = TRUE; break; } break; case 'Q': KEY("Quest_Loss", ch->pcdata->quest_losses, fread_number(fp)); KEY("Quest_Wins", ch->pcdata->quest_wins, fread_number(fp)); break; case 'R': KEY("Race", ch->race, fread_number(fp)); KEY("Rank", ch->pcdata->rank, fread_string_nohash(fp)); KEY("Resistant", ch->resistant, fread_number(fp)); KEY("Resource", ch->pcdata->resource, fread_number(fp)); KEY("Resourcetype", ch->pcdata->resourcetype, fread_number(fp)); KEY("Restore_time", ch->pcdata->restore_time, fread_number(fp)); KEY("Reward", ch->pcdata->reward_curr, fread_number(fp)); KEY("Reward_Accum", ch->pcdata->reward_accum, fread_number(fp)); KEY("Righthanded", ch->pcdata->righthanded, fread_number(fp)); if (!strcmp(word, "Room")) { ch->in_room = get_room_index(fread_number(fp)); if (!ch->in_room) ch->in_room = get_room_index(ROOM_VNUM_LIMBO); fMatch = TRUE; break; } if (!strcmp(word, "RoomRange")) { ch->pcdata->r_range_lo = fread_number(fp); ch->pcdata->r_range_hi = fread_number(fp); fMatch = TRUE; } break; case 'S': KEY("Sex", ch->sex, fread_number(fp)); if (!str_cmp(word, "ShipUID")) { SHIP_DATA *ship; int uid = fread_number(fp); for (ship = first_ship; ship; ship = ship->next) { if (ship->uid == uid) { ch->ship = ship; ch->coord->x = ship->x; ch->coord->y = ship->y; LINK(ch, ship->first_char, ship->last_char, next_ship, prev_ship); break; } } if (!ship) { bug("Player %s is attached to an invalid ship", ch->name); char_from_room(ch); char_to_room(ch, get_room_index(ROOM_VNUM_TEMPLE)); ch->coord->x = ch->coord->y = 0; ch->map = -1; REMOVE_ONMAP_FLAG(ch); } fMatch = TRUE; break; } KEY("SLastName", ch->pcdata->slastname, fread_number(fp)); KEY("ShortDescr", ch->short_descr, fread_string(fp)); KEY("Skincolor", ch->pcdata->skincolor, fread_number(fp)); if (!str_cmp(word, "Speed")) { ch->speed = fread_number(fp); if (ch->desc) ch->desc->speed = ch->speed; fMatch = TRUE; break; } KEY("SOffier_name", ch->pcdata->spar_offer_name, fread_number(fp)); KEY("SReceive_name", ch->pcdata->spar_receive_name, fread_number(fp)); KEY("SPoints", ch->pcdata->spoints, fread_number(fp)); KEY("Stable", ch->pcdata->stable, fread_number(fp)); KEY("Stablecurr", ch->pcdata->stablecurr, fread_number(fp)); KEY("Stablenum", ch->pcdata->stablenum, fread_number(fp)); KEY("Style", ch->style, fread_number(fp)); KEY("Susceptible", ch->susceptible, fread_number(fp)); if (!strcmp(word, "SavingThrow")) { ch->saving_wand = fread_number(fp); ch->saving_poison_death = ch->saving_wand; ch->saving_para_petri = ch->saving_wand; ch->saving_breath = ch->saving_wand; ch->saving_spell_staff = ch->saving_wand; fMatch = TRUE; break; } if (!strcmp(word, "SavingThrows")) { ch->saving_poison_death = fread_number(fp); ch->saving_wand = fread_number(fp); ch->saving_para_petri = fread_number(fp); ch->saving_breath = fread_number(fp); ch->saving_spell_staff = fread_number(fp); fMatch = TRUE; break; } if (!strcmp(word, "Site")) { if (!preload) { sprintf(buf, "Last connected from: %s\n\r", fread_word(fp)); send_to_char(buf, ch); } else fread_to_eol(fp); fMatch = TRUE; if (preload) word = "End"; else break; } if (!strcmp(word, "Skill")) { int sn; int value; int mastery; int spercent; if (preload) word = "End"; else { spercent = fread_number(fp); value = fread_number(fp); mastery = fread_number(fp); if (file_ver < 3) sn = skill_lookup(fread_word(fp)); else sn = bsearch_skill_exact(fread_word(fp), gsn_first_skill, gsn_first_weapon - 1); if (sn < 0) bug("Fread_char: unknown skill.", 0); else { ch->pcdata->spercent[sn] = spercent; ch->pcdata->learned[sn] = value; ch->pcdata->ranking[sn] = mastery; } fMatch = TRUE; break; } } if (!strcmp(word, "Spell")) { int sn; int value; int mastery; int spercent; if (preload) word = "End"; else { spercent = fread_number(fp); value = fread_number(fp); mastery = fread_number(fp); sn = bsearch_skill_exact(fread_word(fp), gsn_first_spell, gsn_first_skill - 1); if (sn < 0) bug("Fread_char: unknown spell.", 0); else { ch->pcdata->spercent[sn] = spercent; ch->pcdata->learned[sn] = value; ch->pcdata->ranking[sn] = mastery; } fMatch = TRUE; break; } } if (strcmp(word, "End")) break; case 'E': if (!strcmp(word, "End")) { if (!ch->short_descr) ch->short_descr = STRALLOC(""); if (!ch->long_descr) ch->long_descr = STRALLOC(""); if (!ch->description) ch->description = STRALLOC(""); if (!ch->pcdata->bamfin) ch->pcdata->bamfin = str_dup(""); if (!ch->pcdata->bamfout) ch->pcdata->bamfout = str_dup(""); if (!ch->pcdata->bio) ch->pcdata->bio = STRALLOC(""); if (!ch->pcdata->came_from) ch->pcdata->came_from = STRALLOC(""); if (!ch->pcdata->rank) ch->pcdata->rank = str_dup(""); if (!ch->pcdata->bestowments) ch->pcdata->bestowments = str_dup(""); if (!ch->pcdata->title) ch->pcdata->title = STRALLOC(""); if (!ch->pcdata->pretit) ch->pcdata->pretit = str_dup(""); if (!ch->pcdata->homepage) ch->pcdata->homepage = str_dup(""); if (!ch->pcdata->email) ch->pcdata->email = str_dup(""); if (!ch->pcdata->authed_by) ch->pcdata->authed_by = STRALLOC(""); if (!ch->pcdata->prompt) ch->pcdata->prompt = STRALLOC(""); if (!ch->pcdata->fprompt) ch->pcdata->fprompt = STRALLOC(""); ch->editor = NULL; killcnt = 1; if (killcnt < MAX_KILLTRACK) ch->pcdata->killed[killcnt].vnum = 0; /* no good for newbies at all */ if (!IS_IMMORTAL(ch) && !ch->speaking) ch->speaking = LANG_COMMON; /* ch->speaking = race_table[ch->race]->language; */ if (IS_IMMORTAL(ch)) { int i; ch->speaks = ~0; if (ch->speaking == 0) ch->speaking = ~0; CREATE(ch->pcdata->tell_history, char *, 26); for (i = 0; i < 26; i++) ch->pcdata->tell_history[i] = NULL; } if (!ch->pcdata->prompt) ch->pcdata->prompt = STRALLOC(""); /* this disallows chars from being 6', 180lbs, but easier than a flag */ if (ch->height == 72) ch->height = number_range(race_table[ch->race]->height * .9, race_table[ch->race]->height * 1.1); if (ch->weight == 180) ch->weight = number_range(race_table[ch->race]->weight * .9, race_table[ch->race]->weight * 1.1); REMOVE_PLR_FLAG(ch, PLR_MAPEDIT); /* In case they saved while editing */ return; } KEY("Email", ch->pcdata->email, fread_string_nohash(fp)); KEY("Elements", ch->elementb, fread_number(fp)); KEY("Eyecolor", ch->pcdata->eyecolor, fread_number(fp)); break; case 'T': KEY("Talent", ch->pcdata->talent, fread_bitvector(fp)); KEY("Target", ch->pcdata->target, fread_number(fp)); KEY("Target_Limb", ch->pcdata->target_limb, fread_number(fp)); if (!strcmp(word, "Tongue")) { int sn; int value; int mastery; int spercent; if (preload) word = "End"; else { spercent = fread_number(fp); value = fread_number(fp); mastery = fread_number(fp); sn = bsearch_skill_exact(fread_word(fp), gsn_first_tongue, gsn_top_sn - 1); if (sn < 0) bug("Fread_char: unknown tongue.", 0); else { ch->pcdata->spercent[sn] = spercent; ch->pcdata->learned[sn] = value; ch->pcdata->ranking[sn] = mastery; } fMatch = TRUE; } break; } if (!strcmp(word, "Town")) { char *town; TOWN_DATA *gtown; town = fread_string(fp); gtown = get_town(town); if (gtown) ch->pcdata->town = gtown; else { ch->pcdata->town = NULL; bug("%s has a bad town field of %s.\n\r", ch->name, town); } fMatch = TRUE; } KEY("Tier", ch->pcdata->tier, fread_number(fp)); KEY("TimeoutLogin", ch->pcdata->timeout_login, fread_number(fp)); KEY("TimeoutNotes", ch->pcdata->timeout_notes, fread_number(fp)); KEY("TimeoutIdle", ch->pcdata->timeout_idle, fread_number(fp)); KEY("Tone", ch->tone, fread_string(fp)); KEY("Train", ch->pcdata->train, fread_number(fp)); KEY("Trust", ch->trust, fread_number(fp)); KEY("TwinkPoints", ch->pcdata->twink_points, fread_number(fp)); /* Let no character be trusted higher than one below maxlevel -- Narn */ ch->trust = UMIN(ch->trust, MAX_LEVEL - 1); if (!strcmp(word, "Title")) { ch->pcdata->title = fread_string(fp); if (isalpha(ch->pcdata->title[0]) || isdigit(ch->pcdata->title[0])) { sprintf(buf, " %s", ch->pcdata->title); if (ch->pcdata->title) STRFREE(ch->pcdata->title); ch->pcdata->title = STRALLOC(buf); } fMatch = TRUE; break; } break; case 'V': if (!strcmp(word, "Vnum")) { ch->pIndexData = get_mob_index(fread_number(fp)); fMatch = TRUE; break; } KEY("Version", file_ver, fread_number(fp)); break; case 'W': KEY("Weight", ch->weight, fread_number(fp)); KEY("Whonum", ch->pcdata->whonum, fread_number(fp)); KEY("Wimpy", ch->wimpy, fread_number(fp)); KEY("WizInvis", ch->pcdata->wizinvis, fread_number(fp)); break; } if (!fMatch) { sprintf(buf, "Fread_char: no match: %s", word); bug(buf, 0); } } } void fread_obj(CHAR_DATA * ch, FILE * fp, sh_int os_type) { OBJ_DATA *obj; char *word; char buf[MSL]; int iNest; bool fMatch; int version = 3; bool fNest; bool fVnum; ROOM_INDEX_DATA *room = NULL; if (ch) room = ch->in_room; CREATE(obj, OBJ_DATA, 1); obj->count = 1; obj->wear_loc = -1; obj->weight = 1; CREATE(obj->coord, COORD_DATA, 1); obj->map = -1; obj->coord->x = -1; obj->coord->y = -1; fNest = TRUE; /* Requiring a Nest 0 is a waste */ fVnum = TRUE; iNest = 0; for (;;) { word = feof(fp) ? "End" : fread_word(fp); fMatch = FALSE; switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'A': KEY("ActionDesc", obj->action_desc, fread_string(fp)); if (!strcmp(word, "Affect") || !strcmp(word, "AffectData") || !strcmp(word, "AffectRecur") || !strcmp(word, "AffectDataRecur")) { AFFECT_DATA *paf; int recur = 0; if (!str_cmp(word, "AffectRecur") || !str_cmp(word, "AffectDataRecur")) recur = 1; CREATE(paf, AFFECT_DATA, 1); if (!strcmp(word, "Affect") || !strcmp(word, "AffectRecur")) { paf->type = fread_number(fp); } else { int sn; sn = skill_lookup(fread_word(fp)); if (sn < 0) bug("Fread_obj: unknown skill.", 0); else paf->type = sn; } paf->duration = fread_number(fp); if (recur) { paf->modifier = skill_lookup(fread_word(fp)); } else { paf->modifier = fread_number(fp); } paf->location = fread_number(fp); paf->bitvector = fread_bitvector(fp); if (version >= 5) paf->gemnum = fread_number(fp); LINK(paf, obj->first_affect, obj->last_affect, next, prev); fMatch = TRUE; break; } break; case 'C': if (!strcmp(word, "Coords")) { obj->map = fread_number(fp); obj->coord->x = fread_number(fp); obj->coord->y = fread_number(fp); fMatch = TRUE; break; } KEY("Cost", obj->cost, fread_number(fp)); KEY("Count", obj->count, fread_number(fp)); break; case 'D': KEY("Description", obj->description, fread_string(fp)); break; case 'E': KEY("ExtraFlags", obj->extra_flags, fread_bitvector(fp)); if (!strcmp(word, "ExtraDescr")) { EXTRA_DESCR_DATA *ed; CREATE(ed, EXTRA_DESCR_DATA, 1); ed->keyword = fread_string(fp); ed->description = fread_string(fp); LINK(ed, obj->first_extradesc, obj->last_extradesc, next, prev); fMatch = TRUE; } if (!strcmp(word, "End")) { if (!fNest || !fVnum) { if (obj->name) sprintf(buf, "Fread_obj: %s incomplete object.", obj->name); else sprintf(buf, "Fread_obj: incomplete object."); bug(buf, 0); if (obj->name) STRFREE(obj->name); if (obj->description) STRFREE(obj->description); if (obj->short_descr) STRFREE(obj->short_descr); DISPOSE(obj); return; } else { sh_int wear_loc = obj->wear_loc; if (!obj->name) obj->name = QUICKLINK(obj->pIndexData->name); if (!obj->description) obj->description = QUICKLINK(obj->pIndexData->description); if (!obj->short_descr) obj->short_descr = QUICKLINK(obj->pIndexData->short_descr); if (!obj->action_desc) obj->action_desc = QUICKLINK(obj->pIndexData->action_desc); LINK(obj, first_object, last_object, next, prev); obj->pIndexData->count += obj->count; if (!obj->serial) { cur_obj_serial = UMAX((cur_obj_serial + 1) & (BV30 - 1), 1); obj->serial = obj->pIndexData->serial = cur_obj_serial; } if (fNest) rgObjNest[iNest] = obj; numobjsloaded += obj->count; ++physicalobjects; if (file_ver > 1 || obj->wear_loc < -1 || obj->wear_loc >= MAX_WEAR) obj->wear_loc = -1; /* Corpse saving. -- Altrag */ if (os_type == OS_CORPSE) { if (!room) { bug("Fread_obj: Corpse without room, moving to the morgue", 0); room = get_room_index(VNUM_ROOM_MORGUE); } /* Give the corpse a timer if there isn't one */ if (obj->timer < 1) obj->timer = 40; obj = obj_to_room(obj, room, NULL); } else if (iNest == 0 || rgObjNest[iNest] == NULL) { int slot = -1; bool reslot = FALSE; if (file_ver > 1 && wear_loc > -1 && wear_loc < MAX_WEAR) { int x; for (x = 0; x < MAX_LAYERS; x++) if (!save_equipment[wear_loc][x]) { save_equipment[wear_loc][x] = obj; slot = x; reslot = TRUE; break; } if (x == MAX_LAYERS) bug("Fread_obj: too many layers %d", wear_loc); } if (os_type == OS_BANK) { //Set in tables.c when a bank obj is loaded in for a town if (globaltownload) obj = obj_to_townbank(obj, globaltownptr); else obj = obj_to_bank(obj, ch); } else if (os_type == OS_MARKET) { globalmarketptr->obj = obj; } else if (os_type == OS_GROUND) { if (!room) { bug("Fread_obj: Cannot find anywhere to put a quest obj, moving it to the morgue", 0); room = get_room_index(VNUM_ROOM_MORGUE); } obj = obj_to_room(obj, room, NULL); } else obj = obj_to_char(obj, ch); if (reslot && slot != -1) save_equipment[wear_loc][slot] = obj; } else { if (rgObjNest[iNest - 1]) { separate_obj(rgObjNest[iNest - 1]); obj = obj_to_obj(obj, rgObjNest[iNest - 1]); } else bug("Fread_obj: nest layer missing %d", iNest - 1); } if (fNest) rgObjNest[iNest] = obj; return; } } break; case 'G': if (!str_cmp(word, "Gem")) { IMBUE_DATA *imbue; CREATE(imbue, IMBUE_DATA, 1); LINK(imbue, obj->first_imbue, obj->last_imbue, next, prev); imbue->type = fread_number(fp); imbue->sworth = fread_number(fp); imbue->lowvalue = fread_number(fp); imbue->highvalue = fread_number(fp); imbue->value = fread_number(fp); imbue->type2 = fread_number(fp); imbue->sworth2 = fread_number(fp); imbue->lowvalue2 = fread_number(fp); imbue->highvalue2 = fread_number(fp); imbue->value2 = fread_number(fp); imbue->type3 = fread_number(fp); imbue->sworth3 = fread_number(fp); imbue->lowvalue3 = fread_number(fp); imbue->highvalue3 = fread_number(fp); imbue->value3 = fread_number(fp); imbue->plevel = fread_number(fp); imbue->gemnum = fread_number(fp); fMatch = TRUE; } break; case 'I': KEY("ItemType", obj->item_type, fread_number(fp)); KEY("Imbueslots", obj->imbueslots, fread_number(fp)); break; case 'L': KEY("Level", obj->level, fread_number(fp)); break; case 'N': KEY("Name", obj->name, fread_string(fp)); if (!strcmp(word, "Nest")) { iNest = fread_number(fp); if (iNest < 0 || iNest >= MAX_NEST) { bug("Fread_obj: bad nest %d.", iNest); iNest = 0; fNest = FALSE; } fMatch = TRUE; } break; case 'R': KEY("Room", room, get_room_index(fread_number(fp))); case 'S': KEY("ShortDescr", obj->short_descr, fread_string(fp)); KEY("Sworthrestrict", obj->sworthrestrict, fread_number(fp)); if (!strcmp(word, "Spell")) { int iValue; int sn; iValue = fread_number(fp); sn = skill_lookup(fread_word(fp)); if (iValue < 0 || iValue > 5) bug("Fread_obj: bad iValue %d.", iValue); else if (sn < 0) bug("Fread_obj: unknown skill.", 0); else obj->value[iValue] = sn; fMatch = TRUE; break; } break; case 'T': KEY("Timer", obj->timer, fread_number(fp)); if (!str_cmp(word, "Trap")) { TRAP_DATA *trap; trap = load_trap_file(fp); if (!trap) { bug("fread_obj: Did not load trap file correctly."); } else { obj->trap = trap; trap->obj = obj; } fMatch = TRUE; } break; case 'V': KEY("Version", version, fread_number(fp)); if (!strcmp(word, "Values")) { int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14; char *ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = x10 = x11 = x12 = x13 = x14 = 0; sscanf(ln, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12, &x13, &x14); if (obj->pIndexData && (obj->pIndexData->vnum < 21101 || obj->pIndexData->vnum > 21145)) { obj->value[0] = x1; obj->value[1] = x2; obj->value[2] = x3; obj->value[3] = x4; obj->value[4] = x5; obj->value[5] = x6; obj->value[6] = x7; obj->value[7] = x8; obj->value[8] = x9; obj->value[9] = x10; obj->value[10] = x11; obj->value[11] = x12; obj->value[12] = x13; obj->value[13] = x14; } else if (obj->pIndexData && obj->pIndexData->vnum >= 21101 && obj->pIndexData->vnum <= 21145) { obj->value[0] = obj->pIndexData->value[0]; obj->value[1] = obj->pIndexData->value[1]; obj->value[2] = obj->pIndexData->value[2]; obj->value[3] = obj->pIndexData->value[3]; obj->value[4] = obj->pIndexData->value[4]; obj->value[5] = obj->pIndexData->value[5]; obj->value[6] = obj->pIndexData->value[6]; obj->value[7] = obj->pIndexData->value[7]; obj->value[8] = obj->pIndexData->value[8]; obj->value[9] = obj->pIndexData->value[9]; obj->value[10] = obj->pIndexData->value[10]; obj->value[11] = obj->pIndexData->value[11]; obj->value[12] = obj->pIndexData->value[12]; obj->value[13] = obj->pIndexData->value[13]; } if (obj->item_type == ITEM_WEAPON && obj->pIndexData) { if (obj->value[12] == 0) obj->value[12] = obj->pIndexData->value[12]; if (obj->value[13] == 0) obj->value[13] = obj->pIndexData->value[13]; } fMatch = TRUE; break; } if (!strcmp(word, "Vnum")) { int vnum; vnum = fread_number(fp); /* bug( "Fread_obj: bad vnum %d.", vnum ); */ if ((obj->pIndexData = get_obj_index(vnum)) == NULL) fVnum = FALSE; else { fVnum = TRUE; obj->cost = obj->pIndexData->cost; obj->weight = obj->pIndexData->weight; obj->bless_dur = obj->pIndexData->bless_dur; obj->item_type = obj->pIndexData->item_type; obj->wear_flags = obj->pIndexData->wear_flags; obj->extra_flags = obj->pIndexData->extra_flags; } fMatch = TRUE; break; } break; case 'W': KEY("WearFlags", obj->wear_flags, fread_number(fp)); KEY("WearLoc", obj->wear_loc, fread_number(fp)); KEY("Weight", obj->weight, fread_float(fp)); break; case 'B': KEY("BlessDuration", obj->bless_dur, fread_number(fp)); break; } if (!fMatch) { EXTRA_DESCR_DATA *ed; AFFECT_DATA *paf; bug("Fread_obj: no match.", 0); bug(word, 0); fread_to_eol(fp); if (obj->name) STRFREE(obj->name); if (obj->description) STRFREE(obj->description); if (obj->short_descr) STRFREE(obj->short_descr); while ((ed = obj->first_extradesc) != NULL) { STRFREE(ed->keyword); STRFREE(ed->description); UNLINK(ed, obj->first_extradesc, obj->last_extradesc, next, prev); DISPOSE(ed); } while ((paf = obj->first_affect) != NULL) { UNLINK(paf, obj->first_affect, obj->last_affect, next, prev); DISPOSE(paf); } DISPOSE(obj); return; } } } void set_alarm(long seconds) { #ifdef WIN32 kill_timer(); /* kill old timer */ timer_code = timeSetEvent(seconds * 1000L, 1000, alarm_handler, 0, TIME_PERIODIC); #else alarm(seconds); #endif } /* * Based on last time modified, show when a player was last on -Thoric */ void do_last(CHAR_DATA * ch, char *argument) { char buf[MSL]; char arg[MIL]; char name[MIL]; struct stat fst; argument = one_argument(argument, arg); if (arg[0] == '\0') { send_to_char("Usage: last <playername>\n\r", ch); send_to_char("Usage: last <# of entries OR \'-1\' for all entries OR \'today\' for all of today's entries>\n\r", ch); send_to_char("Usage: last <playername> <count>\n\r", ch); return; } if (get_trust(ch) < LEVEL_STAFF) { set_char_color(AT_IMMORT, ch); send_to_char("Their godly glow prevents you from getting a good look.\n\r", ch); return; } if (isdigit(arg[0]) || atoi(arg) == -1 || !str_cmp(arg, "today")) //View list instead of players { send_to_char("Name Time Host/Ip\n\r---------------------------------------------------------------------------\n\r", ch); if (!str_cmp(arg, "today")) read_last_file(ch, -2, NULL); else read_last_file(ch, atoi(arg), NULL); return; } strcpy(name, capitalize(arg)); if (argument[0] != '\0') { send_to_char("Name Time Host/Ip\n\r---------------------------------------------------------------------------\n\r", ch); read_last_file(ch, atoi(argument), name); return; } sprintf(buf, "%s%c/%s", PLAYER_DIR, tolower(arg[0]), name); if (stat(buf, &fst) != -1) sprintf(buf, "%s was last on: %s\r", name, ctime(&fst.st_mtime)); else sprintf(buf, "%s was not found.\n\r", name); send_to_char(buf, ch); } /* * Added support for removeing so we could take out the write_corpses * so we could take it out of the save_char_obj function. --Shaddai */ void write_corpses(CHAR_DATA * ch, char *name, OBJ_DATA * objrem) { OBJ_DATA *corpse; FILE *fp = NULL; /* Name and ch support so that we dont have to have a char to save their corpses.. (ie: decayed corpses while offline) */ if (ch && IS_NPC(ch)) { bug("Write_corpses: writing NPC corpse.", 0); return; } if (ch) name = ch->name; /* Go by vnum, less chance of screwups. -- Altrag */ for (corpse = first_object; corpse; corpse = corpse->next) if (corpse->pIndexData->vnum == OBJ_VNUM_CORPSE_PC && corpse->in_room != NULL && !str_cmp(corpse->short_descr + 14, name) && objrem != corpse) { if (!fp) { char buf[127]; sprintf(buf, "%s%s", CORPSE_DIR, capitalize(name)); if (!(fp = fopen(buf, "w"))) { bug("Write_corpses: Cannot open file.", 0); perror(buf); return; } } fwrite_obj(ch, corpse, fp, 0, OS_CORPSE); } if (fp) { fprintf(fp, "#END\n\n"); fclose(fp); } else { char buf[127]; sprintf(buf, "%s%s", CORPSE_DIR, capitalize(name)); remove(buf); } return; } void load_corpses(void) { DIR *dp; struct dirent *de; extern FILE *fpArea; extern char strArea[MIL]; extern int falling; if (!(dp = opendir(CORPSE_DIR))) { bug("Load_corpses: can't open CORPSE_DIR", 0); perror(CORPSE_DIR); return; } falling = 1; /* Arbitrary, must be >0 though. */ while ((de = readdir(dp)) != NULL) { if (de->d_name[0] != '.') { sprintf(strArea, "%s%s", CORPSE_DIR, de->d_name); fprintf(stderr, "Corpse -> %s\n", strArea); if (!(fpArea = fopen(strArea, "r"))) { perror(strArea); continue; } for (;;) { char letter; char *word; letter = fread_letter(fpArea); if (letter == '*') { fread_to_eol(fpArea); continue; } if (letter != '#') { bug("Load_corpses: # not found.", 0); break; } word = fread_word(fpArea); if (!strcmp(word, "CORPSE")) fread_obj(NULL, fpArea, OS_CORPSE); else if (!strcmp(word, "OBJECT")) fread_obj(NULL, fpArea, OS_CARRY); else if (!strcmp(word, "END")) break; else { bug("Load_corpses: bad section.", 0); break; } } fclose(fpArea); } } fpArea = NULL; strcpy(strArea, "$"); closedir(dp); falling = 0; return; } void fwrite_stable(FILE * fp, STABLE_DATA * stb) { fprintf(fp, "#STABLE\n"); fprintf(fp, "Vnum %d\n", stb->vnum); fprintf(fp, "Name %s~\n", stb->name); fprintf(fp, "Short %s~\n", stb->short_descr); fprintf(fp, "Long %s~\n", stb->long_descr); fprintf(fp, "Description %s~\n", stb->description); fprintf(fp, "Endurance %d\n", stb->level); fprintf(fp, "Exp %d\n", stb->exp); fprintf(fp, "Hp %d\n", stb->hit); fprintf(fp, "MaxHp %d\n", stb->max_hit); fprintf(fp, "Move %d\n", stb->move); fprintf(fp, "MaxMove %d\n", stb->max_move); fprintf(fp, "EndMobile\n"); return; } void fwrite_mount(FILE * fp, CHAR_DATA * mob) { if (!IS_NPC(mob) || !fp) return; fprintf(fp, "#MOUNT\n"); fprintf(fp, "Vnum %d\n", mob->pIndexData->vnum); if (mob->in_room) fprintf(fp, "Room %d\n", (mob->in_room == get_room_index(ROOM_VNUM_LIMBO) && mob->was_in_room) ? mob->was_in_room->vnum : mob->in_room->vnum); if (!QUICKMATCH(mob->name, mob->pIndexData->player_name)) fprintf(fp, "Name %s~\n", mob->name); if (!QUICKMATCH(mob->short_descr, mob->pIndexData->short_descr)) fprintf(fp, "Short %s~\n", mob->short_descr); if (!QUICKMATCH(mob->long_descr, mob->pIndexData->long_descr)) fprintf(fp, "Long %s~\n", mob->long_descr); if (!QUICKMATCH(mob->description, mob->pIndexData->description)) fprintf(fp, "Description %s~\n", mob->description); fprintf(fp, "Position %d\n", mob->position); fprintf(fp, "Flags %s\n", print_bitvector(&mob->act)); fprintf(fp, "Endurance %d\n", mob->mover); fprintf(fp, "Hp %d\n", mob->hit); fprintf(fp, "Maxhp %d\n", mob->max_hit); fprintf(fp, "Move %d\n", mob->move); fprintf(fp, "Maxmove %d\n", mob->max_move); fprintf(fp, "Exp %d\n", mob->m1); /* Might need these later --Shaddai de_equip_char( mob ); re_equip_char( mob ); */ if (mob->first_carrying) fwrite_obj(mob, mob->last_carrying, fp, 0, OS_CARRY); fprintf(fp, "EndMobile\n"); return; } STABLE_DATA *fread_stable(FILE * fp) { STABLE_DATA *stb; char *word; bool fMatch; CREATE(stb, STABLE_DATA, 1); word = feof(fp) ? "EndMobile" : fread_word(fp); if (!strcmp(word, "Vnum")) switch (UPPER(word[0])) { case '*': fread_to_eol(fp); break; case 'V': KEY("Vnum", stb->vnum, fread_number(fp)); break; } for (;;) { word = feof(fp) ? "EndMobile" : fread_word(fp); fMatch = FALSE; switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'D': KEY("Description", stb->description, fread_string(fp)); break; case 'E': if (!strcmp(word, "EndMobile")) { return stb; } KEY("Exp", stb->exp, fread_number(fp)); break; case 'H': KEY("Hp", stb->hit, fread_number(fp)); break; case 'L': KEY("Endurance", stb->level, fread_number(fp)); KEY("Long", stb->long_descr, fread_string(fp)); break; case 'M': KEY("MaxHp", stb->max_hit, fread_number(fp)); KEY("MaxMove", stb->max_move, fread_number(fp)); KEY("Move", stb->move, fread_number(fp)); break; case 'N': KEY("Name", stb->name, fread_string(fp)); break; case 'S': KEY("Short", stb->short_descr, fread_string(fp)); break; } if (!fMatch) { bug("Fread_mobile: no match.", 0); bug(word, 0); } } return NULL; } void fread_introduction(CHAR_DATA *ch, FILE *fp) { INTRO_DATA *intro; char *word; bool fMatch; CREATE(intro, INTRO_DATA, 1); for (;;) { word = feof(fp) ? "End" : fread_word(fp); fMatch = FALSE; switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'F': KEY("Flags", intro->flags, fread_number(fp)); break; case 'L': KEY("Lastseen", intro->lastseen, fread_number(fp)); break; case 'P': KEY("Pid", intro->pid, fread_number(fp)); break; case 'V': KEY("Value", intro->value, fread_number(fp)); break; case 'E': if (!strcmp(word, "End")) { LINK(intro, ch->pcdata->first_introduction, ch->pcdata->last_introduction, next, prev); return; } } if (!fMatch) { bug("Fread_introduction: no match.", 0); bug(word, 0); } } } /* * This will read one mobile structure pointer to by fp --Shaddai */ CHAR_DATA *fread_mount(FILE * fp) { CHAR_DATA *mob = NULL; char *word; bool fMatch; int inroom = 0; ROOM_INDEX_DATA *pRoomIndex = NULL; word = feof(fp) ? "EndMobile" : fread_word(fp); if (!strcmp(word, "Vnum")) { int vnum; vnum = fread_number(fp); mob = create_mobile(get_mob_index(vnum)); if (!mob) { for (;;) { word = feof(fp) ? "EndMobile" : fread_word(fp); /* So we don't get so many bug messages when something messes up * --Shaddai */ if (!strcmp(word, "EndMobile")) break; } bug("Fread_mobile: No index data for vnum %d", vnum); return NULL; } } else { for (;;) { word = feof(fp) ? "EndMobile" : fread_word(fp); /* So we don't get so many bug messages when something messes up * --Shaddai */ if (!strcmp(word, "EndMobile")) break; } extract_char(mob, TRUE); bug("Fread_mobile: Vnum not found", 0); return NULL; } for (;;) { word = feof(fp) ? "EndMobile" : fread_word(fp); fMatch = FALSE; switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case '#': if (!strcmp(word, "#OBJECT")) fread_obj(mob, fp, OS_CARRY); case 'D': KEY("Description", mob->description, fread_string(fp)); break; case 'E': if (!strcmp(word, "EndMobile")) { if (inroom == 0) inroom = ROOM_VNUM_TEMPLE; pRoomIndex = get_room_index(inroom); if (!pRoomIndex) pRoomIndex = get_room_index(ROOM_VNUM_TEMPLE); char_to_room(mob, pRoomIndex); return mob; } KEY("Endurance", mob->mover, fread_number(fp)); KEY("Exp", mob->m1, fread_number(fp)); break; case 'F': KEY("Flags", mob->act, fread_bitvector(fp)); break; case 'H': KEY("Hp", mob->hit, fread_number(fp)); break; case 'L': KEY("Long", mob->long_descr, fread_string(fp)); break; case 'M': KEY("Maxhp", mob->max_hit, fread_number(fp)); KEY("Maxmove", mob->max_move, fread_number(fp)); KEY("Move", mob->move, fread_number(fp)); break; case 'N': KEY("Name", mob->name, fread_string(fp)); break; case 'P': KEY("Position", mob->position, fread_number(fp)); break; case 'R': KEY("Room", inroom, fread_number(fp)); break; case 'S': KEY("Short", mob->short_descr, fread_string(fp)); break; } if (!fMatch) { bug("Fread_mobile: no match.", 0); bug(word, 0); } } return NULL; } /* * This will write one mobile structure pointed to be fp --Shaddai */ void fwrite_mobile(FILE * fp, CHAR_DATA * mob) { AFFECT_DATA *paf; SKILLTYPE *skill = NULL; if (!IS_NPC(mob) || !fp) return; fprintf(fp, "#MOBILE\n"); fprintf(fp, "Vnum %d\n", mob->pIndexData->vnum); if (mob->in_room) fprintf(fp, "Room %d\n", (mob->in_room == get_room_index(ROOM_VNUM_LIMBO) && mob->was_in_room) ? mob->was_in_room->vnum : mob->in_room->vnum); if (!QUICKMATCH(mob->name, mob->pIndexData->player_name)) fprintf(fp, "Name %s~\n", mob->name); if (!QUICKMATCH(mob->short_descr, mob->pIndexData->short_descr)) fprintf(fp, "Short %s~\n", mob->short_descr); if (!QUICKMATCH(mob->long_descr, mob->pIndexData->long_descr)) fprintf(fp, "Long %s~\n", mob->long_descr); if (!QUICKMATCH(mob->description, mob->pIndexData->description)) fprintf(fp, "Description %s~\n", mob->description); fprintf(fp, "Position %d\n", mob->position); fprintf(fp, "Flags %s\n", print_bitvector(&mob->act)); //Added for quest saving fprintf(fp, "Race %d\n", mob->race); fprintf(fp, "Sex %d\n", mob->sex); fprintf(fp, "Gold %d\n", mob->gold ); fprintf(fp, "HpManaMove %d %d %d %d %d %d\n", mob->hit, mob->max_hit, mob->mana, mob->max_mana, mob->move, mob->max_move ); fprintf(fp, "Stats %d %d %d %d %d %d\n", mob->perm_str, mob->perm_int, mob->perm_wis, mob->perm_lck, mob->perm_dex, mob->perm_agi); fprintf(fp, "Limbs %d %d %d %d\n", mob->con_rarm, mob->con_larm, mob->con_rleg, mob->con_lleg); fprintf(fp, "ACTohit %d %d %d %d\n", mob->tohitbash, mob->tohitslash, mob->tohitstab, mob->armor); fprintf(fp, "Attacks %s\n", print_bitvector(&mob->attacks)); fprintf(fp, "Defenses %s\n", print_bitvector(&mob->defenses)); fprintf(fp, "Immune %d\n", mob->immune); fprintf(fp, "Resistant %d\n", mob->resistant); fprintf(fp, "Susc %d\n", mob->susceptible); for ( paf = mob->first_affect; paf; paf = paf->next ) { if ( paf->type >= 0 && (skill=get_skilltype(paf->type)) == NULL ) continue; if ( paf->type >= 0 && paf->type < TYPE_PERSONAL ) { fprintf( fp, "AffectData '%s' %3d %3d %3d %s\n", skill->name, paf->duration, paf->modifier, paf->location, print_bitvector(&paf->bitvector) ); } else { fprintf( fp, "Affect %3d %3d %3d %3d %s\n", paf->type, paf->duration, paf->modifier, paf->location, print_bitvector(&paf->bitvector) ); } } /* Might need these later --Shaddai de_equip_char( mob ); re_equip_char( mob ); */ if (mob->first_carrying) fwrite_obj(mob, mob->last_carrying, fp, 0, OS_CARRY); fprintf(fp, "EndMobile\n"); return; } /* * This will read one mobile structure pointer to by fp --Shaddai */ CHAR_DATA *fread_mobile(FILE * fp) { CHAR_DATA *mob = NULL; char *word; bool fMatch; int inroom = 0; ROOM_INDEX_DATA *pRoomIndex = NULL; word = feof(fp) ? "EndMobile" : fread_word(fp); if (!strcmp(word, "Vnum")) { int vnum; vnum = fread_number(fp); mob = create_mobile(get_mob_index(vnum)); if (!mob) { for (;;) { word = feof(fp) ? "EndMobile" : fread_word(fp); /* So we don't get so many bug messages when something messes up * --Shaddai */ if (!strcmp(word, "EndMobile")) break; } bug("Fread_mobile: No index data for vnum %d", vnum); return NULL; } } else { for (;;) { word = feof(fp) ? "EndMobile" : fread_word(fp); /* So we don't get so many bug messages when something messes up * --Shaddai */ if (!strcmp(word, "EndMobile")) break; } extract_char(mob, TRUE); bug("Fread_mobile: Vnum not found", 0); return NULL; } for (;;) { word = feof(fp) ? "EndMobile" : fread_word(fp); fMatch = FALSE; switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case '#': if (!strcmp(word, "#OBJECT")) { fread_obj(mob, fp, OS_CARRY); fMatch = TRUE; } break; case 'A': if ( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) ) { AFFECT_DATA *paf; CREATE( paf, AFFECT_DATA, 1 ); if ( !str_cmp( word, "Affect" ) ) { paf->type = fread_number( fp ); } else { int sn; char *sname = fread_word(fp); if ( (sn=skill_lookup(sname)) < 0 ) { if ( (sn=herb_lookup(sname)) < 0 ) bug( "%s", "load_mobile: unknown skill." ); else sn += TYPE_HERB; } paf->type = sn; } paf->duration = fread_number( fp ); paf->modifier = fread_number( fp ); paf->location = fread_number( fp ); if ( paf->location == APPLY_WEAPONSPELL || paf->location == APPLY_WEARSPELL || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_STRIPSN || paf->location == APPLY_RECURRINGSPELL) paf->modifier = slot_lookup( paf->modifier ); paf->bitvector = fread_bitvector( fp ); LINK( paf, mob->first_affect, mob->last_affect, next, prev ); fMatch = TRUE; break; } if (!str_cmp(word, "ACTohit")) { mob->tohitbash = fread_number(fp); mob->tohitslash = fread_number(fp); mob->tohitstab = fread_number(fp); mob->armor = fread_number(fp); fMatch = TRUE; break; } KEY( "AffectedBy", mob->affected_by, fread_bitvector( fp ) ); KEY("Attacks", mob->attacks, fread_bitvector(fp)); break; case 'D': KEY("Defenses", mob->defenses, fread_bitvector(fp)); KEY("Description", mob->description, fread_string(fp)); break; case 'E': if (!strcmp(word, "EndMobile")) { if (inroom == 0) inroom = ROOM_VNUM_TEMPLE; pRoomIndex = get_room_index(inroom); if (!pRoomIndex) pRoomIndex = get_room_index(ROOM_VNUM_TEMPLE); char_to_room(mob, pRoomIndex); mob->apply_res_fire[0] = 100; mob->apply_res_water[0] = 100; mob->apply_res_air[0] = 100; mob->apply_res_earth[0] = 100; mob->apply_res_energy[0] = 100; mob->apply_res_magic[0] = 100; mob->apply_res_nonmagic[0] = 100; mob->apply_res_blunt[0] = 100; mob->apply_res_pierce[0] = 100; mob->apply_res_slash[0] = 100; mob->apply_res_poison[0] = 100; mob->apply_res_paralysis[0] = 100; mob->apply_res_holy[0] = 100; mob->apply_res_unholy[0] = 100; mob->apply_res_undead[0] = 100; return mob; } break; case 'F': KEY("Flags", mob->act, fread_bitvector(fp)); break; case 'G': KEY( "Gold", mob->gold, fread_number(fp)); break; case 'H': if ( !str_cmp( word, "HpManaMove" ) ) { mob->hit = fread_number( fp ); mob->max_hit = fread_number( fp ); mob->mana = fread_number( fp ); mob->max_mana = fread_number( fp ); mob->move = fread_number( fp ); mob->max_move = fread_number( fp ); fMatch = TRUE; } break; case 'I': KEY("Immune", mob->immune, fread_number(fp)); case 'L': if (!str_cmp(word, "Limbs")) { mob->con_rarm = fread_number(fp); mob->con_larm = fread_number(fp); mob->con_rleg = fread_number(fp); mob->con_lleg = fread_number(fp); fMatch = TRUE; break; } KEY("Long", mob->long_descr, fread_string(fp)); break; case 'N': KEY("Name", mob->name, fread_string(fp)); break; case 'P': KEY("Position", mob->position, fread_number(fp)); break; case 'R': KEY("Race", mob->race, fread_number(fp)); KEY("Resistant", mob->resistant, fread_number(fp)); KEY("Room", inroom, fread_number(fp)); break; case 'S': KEY("Sex", mob->sex, fread_number(fp)); KEY("Short", mob->short_descr, fread_string(fp)); if (!str_cmp(word, "Stats")) { mob->perm_str = fread_number(fp); mob->perm_int = fread_number(fp); mob->perm_wis = fread_number(fp); mob->perm_lck = fread_number(fp); mob->perm_dex = fread_number(fp); mob->perm_agi = fread_number(fp); fMatch = TRUE; break; } KEY("Susc", mob->susceptible, fread_number(fp)); break; } if (!fMatch) { bug("Fread_mobile: no match.", 0); bug(word, 0); } } return NULL; } /* * This will write in the saved mobile for a char --Shaddai */ void write_char_mobile(CHAR_DATA * ch, char *argument) { FILE *fp; CHAR_DATA *mob; char buf[MSL]; if (IS_NPC(ch) || !ch->pcdata->pet) return; fclose(fpReserve); if ((fp = fopen(argument, "w")) == NULL) { sprintf(buf, "Write_char_mobile: couldn't open %s for writing!\n\r", argument); bug(buf, 0); fpReserve = fopen(NULL_FILE, "r"); return; } mob = ch->pcdata->pet; xSET_BIT(mob->affected_by, AFF_CHARM); fwrite_mobile(fp, mob); fclose(fp); fpReserve = fopen(NULL_FILE, "r"); return; } /* * This will read in the saved mobile for a char --Shaddai */ void read_char_mobile(char *argument) { FILE *fp; CHAR_DATA *mob; char buf[MSL]; fclose(fpReserve); if ((fp = fopen(argument, "r")) == NULL) { sprintf(buf, "Read_char_mobile: couldn't open %s for reading!\n\r", argument); bug(buf, 0); fpReserve = fopen(NULL_FILE, "r"); return; } mob = fread_mobile(fp); fclose(fp); fpReserve = fopen(NULL_FILE, "r"); return; }