#include <glib.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <recycle.h>
#include <tables.h>
extern void fwrite_pet args( ( CHAR_DATA *ch, FILE *fp ) );
extern void fwrite_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest ) );
extern void save_char_obj args(( CHAR_DATA *ch ));
//Local Functions
void init_chardata args(( CHAR_DATA *ch ));
void reset_chardata args(( CHAR_DATA *ch ));
void reset_pcdata args(( PC_DATA *pcdata ));
/* stuff for recyling characters */
CHAR_DATA *char_free;
CHAR_DATA *new_char (void) {
//static CHAR_DATA ch_zero;
CHAR_DATA *ch;
if (char_free == NULL){
ch = g_chunk_new (CHAR_DATA, char_data_mem_chunk);
init_chardata(ch);
mudsetting->Mobiles_New++;
}
else {
ch = char_free;
char_free = char_free->next;
mudsetting->Mobiles_Recycle++;
mudsetting->Mobiles_Recycle_Heap--;
}
VALIDATE(ch);
reset_chardata(ch);
ch->logon = current_time;
ch->armor = 100;
ch->position = POS_STANDING;
ch->practice = 0;
ch->hit = 250;
ch->max_hit = 250;
ch->mana = 250;
ch->max_mana = 250;
ch->move = 250;
ch->max_move = 250;
ch->master = NULL;
ch->leader = NULL;
ch->fighting = NULL;
ch->mount = NULL;
ch->wizard = NULL;
ch->paradox[0] = 0;
ch->paradox[1] = 0;
ch->paradox[2] = 0;
ch->damcap[0] = 500;
ch->damcap[1] = 0;
return ch;
}
/*
* Used to init and reset character data.
*/
void reset_chardata(CHAR_DATA *ch)
{
int x = 0;
for (x = 0; x < 11; x++)
ch->stance[x] = 0;
for (x = 0; x < 8; x++)
ch->cmbt[x] = 0;
for (x = 0; x < 5; x++)
ch->spl[x] = 0;
for (x = 0; x < 13; x++)
ch->wpn[x] = 0;
for (x = 0; x < 7; x++)
ch->loc_hp[x] = 0;
for (x = 0; x < 10; x++)
ch->pet_stats[x] = 0;
for (x = 0; x < 2; x++)
ch->damcap[x] = 0;
for (x = 0; x < 3; x++)
ch->paradox[x] = 0;
for (x = 0; x < 4; x++)
ch->sphere_affected_by[x] = 0;
ch->questgiver = NULL;
ch->blood_count = 0;
ch->questmob = 0;
ch->questobj = 0;
ch->countdown = 0;
ch->nextquest = 0;
ch->rp_status = 0;
ch->delay_timer = 0;
ch->plane = 0;
ch->mob_con = 0;
ch->mob_fight = 0;
ch->affected_by = 0;
ch->extra = 0;
ch->act = 0;
ch->added = 0;
ch->sphere_spaffect = 0;
ch->special = 0;
ch->dead_time = 0;
ch->deaf = 0;
ch->wimpy = 0;
ch->armor = 0;
ch->id = 0;
ch->damroll = 0;
ch->hitroll = 0;
ch->alignment = 0;
ch->saving_throw = 0;
ch->carry_number = 0;
ch->carry_weight = 0;
ch->primal_hold = 0;
ch->practice = 0;
ch->position = 1;
ch->exp = 0;
ch->gold = 0;
ch->max_move = 0;
ch->move = 0;
ch->max_mana = 0;
ch->mana = 0;
ch->max_hit = 0;
ch->hit = 0;
ch->mdeath = 0;
ch->mkill = 0;
ch->pdeath = 0;
ch->arete = 0;
ch->pkill = 0;
ch->wait = 0;
ch->timer = 0;
ch->played = 0;
ch->trust = 0;
ch->invis_level = 0;
ch->level = 0;
ch->save_time = 0;
ch->home = 0;
ch->mounted = 0;
ch->beast = 0;
ch->specpower = 0;
ch->spectype = 0;
ch->vampgen_a = 0;
ch->RPts = 0;
ch->form = 0;
ch->vamppass_a = 0;
ch->itemaffect = 0;
ch->vampaff_a = 0;
ch->polyaff = 0;
ch->immune = 0;
ch->bclass = 0;
ch->creature= 0;
ch->race = 0;
ch->sex = 0;
ch->sight = 0;
ch->mprog_delay = 0;
ch->pk_sect = 0;
ch->attack_timer = 0;
ch->pk_timer = 0;
ch->silent_time = 0;
ch->lines = 0;
ch->sect = 0;
ch->clan = 0;
ch->pet_master = NULL;
ch->pet = NULL;
ch->memory = NULL;
ch->pcdata = NULL;
ch->was_in_room = NULL;
ch->in_room = NULL;
ch->carrying = NULL;
ch->sphere_affected = NULL;
ch->affected = NULL;
ch->desc = NULL;
ch->pIndexData = NULL;
ch->spec_fun = NULL;
ch->on = NULL;
ch->last_attacked = NULL;
ch->pnote = NULL;
ch->killed_by = NULL;
ch->wizard = NULL;
ch->mount = NULL;
ch->reply = NULL;
ch->mprog_target = NULL;
ch->fighting = NULL;
ch->mob_hunting = NULL;
ch->leader = NULL;
ch->master = NULL;
ch->next_in_room = NULL;
ch->next = NULL;
ch->desc = NULL;
ch->carrying = NULL;
ch->wizard = NULL;
ch->in_room = NULL;
}
/*
* Declare new Strings for pcdata
*/
void init_pcdata(PC_DATA *pcdata)
{
int x;
pcdata->marriage = g_string_new("");
for (x = 0; x < MAX_IGNORE; x++)
pcdata->ignore[x] = g_string_new("");
for (x = 0; x < MAX_ALIAS; x++)
pcdata->alias_sub[x] = g_string_new("");
for (x = 0; x < MAX_ALIAS; x++)
pcdata->alias[x] = g_string_new("");
pcdata->roompose = g_string_new("");
pcdata->anon_desc = g_string_new("");
pcdata->demeanor = g_string_new("");
pcdata->nature = g_string_new("");
pcdata->email = g_string_new("");
pcdata->cparents = g_string_new("");
pcdata->parents = g_string_new("");
pcdata->conception = g_string_new("");
pcdata->title = g_string_new("");
pcdata->bamfin = g_string_new("");
pcdata->pwd = g_string_new("");
pcdata->bamfout = g_string_new("");
}
/*
* Init new Strings for Chardata
*/
void init_chardata(CHAR_DATA *ch){
ch->murmur_command = g_string_new("");
ch->murmur_name = g_string_new("");
ch->prefix = g_string_new("");
ch->cprompt = g_string_new("");
ch->prompt = g_string_new("");
ch->powertype = g_string_new("");
ch->poweraction = g_string_new("");
ch->lasthost = g_string_new("");
ch->lasttime = g_string_new("");
ch->createtime = g_string_new("");
ch->morph = g_string_new("");
ch->lord = g_string_new("");
ch->description = g_string_new("");
ch->long_descr = g_string_new("");
ch->short_descr = g_string_new("");
ch->hunting = g_string_new("");
ch->name = g_string_new("");
ch->pload = g_string_new("");
}
void free_char (CHAR_DATA *ch)
{
OBJ_DATA *obj;
OBJ_DATA *obj_next;
AFFECT_DATA *paf;
SPHERE_DATA *sp_paf;
SPHERE_DATA *sp_paf_next;
AFFECT_DATA *paf_next;
if (!IS_VALID(ch))
return;
if (IS_NPC(ch))
{
mudsetting->mobiles_created--;
}
for (obj = ch->carrying; obj != NULL; obj = obj_next)
{
obj_next = obj->next_content;
extract_obj(obj);
}
for (paf = ch->affected; paf != NULL; paf = paf_next)
{
paf_next = paf->next;
affect_remove(ch,paf);
}
for ( sp_paf = ch->sphere_affected; sp_paf != NULL; sp_paf = sp_paf_next )
{
sp_paf_next = sp_paf->next;
sphere_remove( ch, sp_paf );
}
if (ch->pcdata != NULL)
free_pcdata(ch->pcdata);
ch->next = char_free;
char_free = ch;
mudsetting->Mobiles_Recycle_Heap++;
INVALIDATE(ch);
return;
}
PC_DATA *pcdata_free;
PC_DATA *new_pcdata(void)
{
PC_DATA *pcdata;
if (pcdata_free == NULL){
pcdata = g_chunk_new (PC_DATA, pcdata_mem_chunk);
init_pcdata(pcdata);
}
else
{
pcdata = pcdata_free;
pcdata_free = pcdata_free->next;
}
reset_pcdata(pcdata);
VALIDATE(pcdata);
return pcdata;
}
/*
* Init recycled pcdata back to 0
*/
void reset_pcdata(PC_DATA *pcdata)
{
int x = 0;
for (x = 0; x < MAX_BOARD; x++)
pcdata->last_note[x] = 0;
for (x = 0; x < 10; x++)
pcdata->hard_skills[x] = 0;
for (x = 0; x < 2; x++)
pcdata->diab[x] = 0;
for (x = 0; x < MAX_DISC; x++)
pcdata->disc[x] = 0;
for (x = 0; x < 6; x++)
pcdata->absorb[x] = 0;
for (x = 0; x < 3; x++)
pcdata->sgift[x] = 0;
for (x = 0; x < 20; x++)
pcdata->tribes[x] = 0;
for (x = 0; x < 5; x++)
pcdata->auspice[x] = 0;
for (x = 0; x < 3; x++)
pcdata->breed[x] = 0;
for (x = 0; x < 3; x++)
pcdata->Trenown[x] = 0;
for (x = 0; x < 3; x++)
pcdata->renown[x] = 0;
for (x = 0; x < 5; x++)
pcdata->spent[x] = 0;
for (x = 0; x < 2; x++)
pcdata->trait_flaw[x] = 0;
for (x = 0; x < 2; x++)
pcdata->trait_merit[x] = 0;
for (x = 0; x < 4; x++)
pcdata->stat_duration[x] = 0;
for (x = 0; x < 4; x++)
pcdata->stat_amount[x] = 0;
for (x = 0; x < 4; x++)
pcdata->stat_ability[x] = 0;
for (x = 0; x < MAX_SKILL; x++)
pcdata->learned[x] = 0;
for (x = 0; x < 3; x++)
pcdata->condition[x] = 0;
for (x = 0; x < 10; x++)
pcdata->genes[x] = 0;
for (x = 0; x < 11; x++)
pcdata->disc_a[x] = 0;
for (x = 0; x < 3; x++)
pcdata->stage[x] = 0;
for (x = 0; x < 2; x++)
pcdata->language[x] = 0;
for (x = 0; x < MAX_DISC; x++)
pcdata->Ninherited[x] = 0;
for (x = 0; x < MAX_DISCIPLINE; x++)
pcdata->inherited[x] = 0;
for (x = 0; x < MAX_DISCIPLINE; x++)
pcdata->discipline[x] = 0;
for (x = 0; x < 12; x++)
pcdata->stats[x] = 0;
for (x = 0; x < 20; x++)
pcdata->powers[x] = 0;
pcdata->ghost_ac = 0;
pcdata->ghost_damroll = 0;
pcdata->ghost_hitroll = 0;
pcdata->ghost_affects = 0;
pcdata->exhaustion = 0;
pcdata->ghost_move = 0;
pcdata->obj_vnum = 0;
pcdata->ghost_mana = 0;
pcdata->ghost_hit = 0;
pcdata->lag_time = 0;
pcdata->bodymods = 0;
pcdata->obeah = 0;
pcdata->wiznet = 0;
pcdata->conding = 0;
pcdata->comm = 0;
pcdata->willpower = 0;
pcdata->frenzy_action = 0;
pcdata->last_rite = 0;
pcdata->wwf_shape = 0;
pcdata->gnosis = 0;
pcdata->rage_points = 0;
pcdata->vote = 0;
pcdata->security = 0;
pcdata->followers = 0;
pcdata->fake_ac = 0;
pcdata->fake_move = 0;
pcdata->fake_mana = 0;
pcdata->fake_hp = 0;
pcdata->fake_dam = 0;
pcdata->fake_hit = 0;
pcdata->fake_stance = 0;
pcdata->fake_skill = 0;
pcdata->demonic_a = 0;
pcdata->rank = 0;
pcdata->wolf = 0;
pcdata->mod_con = 0;
pcdata->mod_con = 0;
pcdata->mod_dex = 0;
pcdata->mod_wis = 0;
pcdata->mod_int = 0;
pcdata->mod_str = 0;
pcdata->perm_con = 0;
pcdata->perm_dex = 0;
pcdata->perm_wis = 0;
pcdata->perm_int = 0;
pcdata->perm_str = 0;
pcdata->quest = 0;
pcdata->in_progress = NULL;
pcdata->board = NULL;
pcdata->known = NULL;
pcdata->partner = NULL;
pcdata->chobj = NULL;
pcdata->propose = NULL;
pcdata->familiar = NULL;
pcdata->next = NULL;
pcdata->charpoints = 0;
pcdata->marriage = g_string_assign(pcdata->marriage,"");
for (x = 0; x < MAX_IGNORE; x++)
pcdata->ignore[x] = g_string_assign(pcdata->ignore[x],"");
for (x = 0; x < MAX_ALIAS; x++)
pcdata->alias_sub[x] = g_string_assign(pcdata->alias_sub[x],"");
for (x = 0; x < MAX_ALIAS; x++)
pcdata->alias[x] = g_string_assign(pcdata->alias[x],"");
pcdata->roompose = g_string_assign(pcdata->roompose,"");
pcdata->anon_desc = g_string_assign(pcdata->anon_desc,"");
pcdata->demeanor = g_string_assign(pcdata->demeanor,"");
pcdata->nature = g_string_assign(pcdata->nature,"");
pcdata->email = g_string_assign(pcdata->email,"");
pcdata->cparents = g_string_assign(pcdata->cparents,"");
pcdata->parents = g_string_assign(pcdata->parents,"");
pcdata->conception = g_string_assign(pcdata->conception,"");
pcdata->title = g_string_assign(pcdata->title,"");
pcdata->bamfin = g_string_assign(pcdata->bamfin,"");
pcdata->pwd = g_string_assign(pcdata->pwd,"");
pcdata->bamfout = g_string_assign(pcdata->bamfout,"");
}
void free_pcdata(PC_DATA *pcdata)
{
KNOWN_DATA *names;
if (!IS_VALID(pcdata))
return;
/*free_buf(pcdata->buffer); */
for (names = pcdata->known; names; names = names->next)
{
free_known(names);
}
pcdata->next = pcdata_free;
pcdata_free = pcdata;
INVALIDATE(pcdata);
return;
}
void cr_imms( CHAR_DATA *ch )
{
if ( IS_IMMUNE(ch, IMM_SLASH) )
REMOVE_BIT(ch->immune, IMM_SLASH);
if ( IS_IMMUNE(ch, IMM_STAB) )
REMOVE_BIT(ch->immune, IMM_STAB);
if ( IS_IMMUNE(ch, IMM_SMASH) )
REMOVE_BIT(ch->immune, IMM_SMASH);
if ( IS_IMMUNE(ch, IMM_ANIMAL) )
REMOVE_BIT(ch->immune, IMM_ANIMAL);
if ( IS_IMMUNE(ch, IMM_MISC) )
REMOVE_BIT(ch->immune, IMM_MISC);
if ( IS_IMMUNE(ch, IMM_CHARM) )
REMOVE_BIT(ch->immune, IMM_CHARM);
if ( IS_IMMUNE(ch, IMM_HEAT) )
REMOVE_BIT(ch->immune, IMM_HEAT);
if ( IS_IMMUNE(ch, IMM_COLD) )
REMOVE_BIT(ch->immune, IMM_COLD);
if ( IS_IMMUNE(ch, IMM_LIGHTNING) )
REMOVE_BIT(ch->immune, IMM_LIGHTNING);
if ( IS_IMMUNE(ch, IMM_ACID) )
REMOVE_BIT(ch->immune, IMM_ACID);
if ( IS_IMMUNE(ch, IMM_SLEEP) )
REMOVE_BIT(ch->immune, IMM_SLEEP);
if ( IS_IMMUNE(ch, IMM_DRAIN) )
REMOVE_BIT(ch->immune, IMM_DRAIN);
if ( IS_IMMUNE(ch, IMM_VOODOO) )
REMOVE_BIT(ch->immune, IMM_VOODOO);
if ( IS_IMMUNE(ch, IMM_HURL) )
REMOVE_BIT(ch->immune, IMM_HURL);
if ( IS_IMMUNE(ch, IMM_BACKSTAB) )
REMOVE_BIT(ch->immune, IMM_BACKSTAB);
if ( IS_IMMUNE(ch, IMM_KICK) )
REMOVE_BIT(ch->immune, IMM_KICK);
if ( IS_IMMUNE(ch, IMM_DISARM) )
REMOVE_BIT(ch->immune, IMM_DISARM);
if ( IS_IMMUNE(ch, IMM_STEAL) )
REMOVE_BIT(ch->immune, IMM_STEAL);
return;
}
int count_imms( CHAR_DATA *ch )
{
int count = 0;
if ( IS_IMMUNE(ch, IMM_SLASH) ) count += 1;
if ( IS_IMMUNE(ch, IMM_STAB) ) count += 1;
if ( IS_IMMUNE(ch, IMM_SMASH) ) count += 1;
if ( IS_IMMUNE(ch, IMM_ANIMAL) ) count += 1;
if ( IS_IMMUNE(ch, IMM_MISC) ) count += 1;
if ( IS_IMMUNE(ch, IMM_CHARM) ) count += 1;
if ( IS_IMMUNE(ch, IMM_HEAT) ) count += 1;
if ( IS_IMMUNE(ch, IMM_COLD) ) count += 1;
if ( IS_IMMUNE(ch, IMM_LIGHTNING) ) count += 1;
if ( IS_IMMUNE(ch, IMM_ACID) ) count += 1;
if ( IS_IMMUNE(ch, IMM_SLEEP) ) count += 1;
if ( IS_IMMUNE(ch, IMM_DRAIN) ) count += 1;
if ( IS_IMMUNE(ch, IMM_VOODOO) ) count += 1;
if ( IS_IMMUNE(ch, IMM_HURL) ) count += 1;
if ( IS_IMMUNE(ch, IMM_BACKSTAB) ) count += 1;
if ( IS_IMMUNE(ch, IMM_KICK) ) count += 1;
if ( IS_IMMUNE(ch, IMM_DISARM) ) count += 1;
if ( IS_IMMUNE(ch, IMM_STEAL) ) count += 1;
return count;
}
void set_name(CHAR_DATA *ch, char *name){
//Bounds checking before and after
if (sizeof(name) > sizeof(ch->name)) {
}
strcpy(ch->name->str, name);
return;
}
int char_hitroll( CHAR_DATA *ch )
{
int hr = GET_HITROLL(ch);
if (!IS_NPC(ch))
{
if (IS_ADDED(ch,ADDED_HARDCORE))
hr += 300;
if (IS_SWWF(ch))
{
switch ( ch->pcdata->wwf_shape )
{
case SHAPE_GLABRO:
hr += 100;
break;
case SHAPE_CRINOS:
hr += 300;
break;
case SHAPE_HISPO:
hr += 200;
break;
case SHAPE_LUPUS:
hr += 150;
break;
}
if (ch->pcdata->wwf_shape != SHAPE_HOMID)
{
hr += ch->pcdata->rage_points / 3;
}
}
if (IS_CLASS(ch,CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
hr += ch->pcdata->stats[UNI_RAGE];
else if (IS_SET(ch->special,SPC_WOLFMAN) && ch->pcdata->stats[UNI_RAGE] > 0)
hr += ch->pcdata->stats[UNI_RAGE];
else if (IS_CLASS(ch, CLASS_HIGHLANDER) && IS_ITEMAFF(ch, ITEMA_HIGHLANDER))
{
int wpn = ch->pcdata->powers[HPOWER_WPNSKILL];
if (wpn == 1 || wpn == 3)
{
if (ch->wpn[wpn] >= 500)
hr += 500;
else
hr += ch->wpn[wpn];
}
}
}
if (IS_SET(ch->added, ADDED_INSANE))
hr -= hr * (int).2;
//new sphinx 4 hitroll modifier
if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_WEREWOLF)
&& IS_SET(ch->special, SPC_WOLFMAN) && ch->pcdata->powers[WPOWER_SPHINX] > 3)
hr += number_range(40,60) * ch->pcdata->powers[WPOWER_SPHINX];
return hr;
}
int char_damroll( CHAR_DATA *ch )
{
int dr = GET_DAMROLL(ch);
if (!IS_NPC(ch))
{
if (IS_SWWF(ch))
{
switch ( ch->pcdata->wwf_shape )
{
case SHAPE_GLABRO:
dr += 100;
break;
case SHAPE_CRINOS:
dr += 300;
break;
case SHAPE_HISPO:
dr += 200;
break;
case SHAPE_LUPUS:
dr += 150;
break;
}
if (ch->pcdata->wwf_shape != SHAPE_HOMID)
{
dr += ch->pcdata->rage_points / 3;
}
}
if (IS_CLASS(ch,CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
dr += ch->pcdata->stats[UNI_RAGE];
else if (IS_SET(ch->special,SPC_WOLFMAN) && ch->pcdata->stats[UNI_RAGE] > 0)
dr += ch->pcdata->stats[UNI_RAGE];
else if (IS_CLASS(ch, CLASS_HIGHLANDER) && IS_ITEMAFF(ch, ITEMA_HIGHLANDER))
{
int wpn = ch->pcdata->powers[HPOWER_WPNSKILL];
{
if (ch->wpn[wpn] >= 500)
dr += 500;
else
dr += ch->wpn[wpn];
}
}
}
if (IS_ADDED(ch,ADDED_HARDCORE))
dr *= 2;
if (IS_SET(ch->added, ADDED_INSANE))
dr -= dr * (int).2;
return dr;
}
int char_ac( CHAR_DATA *ch )
{
int a_c = GET_AC(ch);
if (!IS_NPC(ch))
{
if (IS_ADDED(ch,ADDED_HARDCORE))
a_c -= 200;
if (IS_SWWF(ch))
{
switch ( ch->pcdata->wwf_shape )
{
case SHAPE_GLABRO:
a_c -= 100;
break;
case SHAPE_CRINOS:
a_c -= 700;
break;
case SHAPE_HISPO:
a_c -= 300;
break;
case SHAPE_LUPUS:
a_c -= 250;
break;
}
if (ch->pcdata->wwf_shape != SHAPE_HOMID)
{
a_c -= ch->pcdata->rage_points;
}
if (get_tribe(ch,TRIBE_SILENT_STRIDERS) > 1)
{
a_c -= 100;
}
}
if (IS_CLASS(ch, CLASS_HIGHLANDER) && IS_ITEMAFF(ch, ITEMA_HIGHLANDER))
{
int wpn = ch->pcdata->powers[HPOWER_WPNSKILL];
if (wpn == 1 || wpn == 3)
a_c -= ch->wpn[wpn];
}
}
if (IS_SET(ch->act, PLR_MARBLEFLESH))
a_c -= 100;
// spheres give random ac per shield, each time called - rc
if (IS_SET(ch->sphere_spaffect, AFSPHERE_SPIRIT_SHIELD))
a_c -= number_range(180,250);
if (IS_SET(ch->sphere_spaffect, AFSPHERE_MIND_SHIELD))
a_c -= number_range(180,250);
if (IS_SET(ch->sphere_spaffect, AFSPHERE_ENTROPY_SHIELD))
a_c -= number_range(180,250);
if (IS_SET(ch->sphere_spaffect, AFSPHERE_LIFE_SHIELD))
a_c -= number_range(180,250);
if (IS_SET(ch->sphere_spaffect, AFSPHERE_FORCES_SHIELD))
a_c -= number_range(180,250);
if (IS_SET(ch->sphere_spaffect, AFSPHERE_PRIME_SHIELD))
a_c -= number_range(180,250);
return a_c;
}
sh_int fix_sect( CHAR_DATA *ch, char * sect)
{
sh_int loop_count;
for(loop_count = 0;loop_count != MAX_SECTS;loop_count++)
{
if (!str_prefix(sect,sect_table[loop_count].pretty_name))
return loop_count;
}
return 0;
}
sh_int fix_clan( CHAR_DATA *ch, char * sect)
{
sh_int loop_count;
for(loop_count = 0;loop_count != MAX_ICLAN;loop_count++)
{
if (!str_prefix(sect,iclan_table[loop_count].pretty_name))
return loop_count;
}
return 0;
}
/*
* Reset a player's data back to normal
*/
CHAR_DATA *reset_player( DESCRIPTOR_DATA *d, const char *name )
{
char *strtime;
CHAR_DATA *ch;
ch = new_char();
ch->pcdata = new_pcdata();
d->character = ch;
ch->desc = d;
ch->name = g_string_assign(ch->name, name );
ch->act = PLR_BLANK | PLR_COMBINE | PLR_PROMPT;
ch->creature = -1;
ch->id = get_pc_id();
ch->pcdata->pwd = g_string_assign(ch->pcdata->pwd,"");
ch->pcdata->bamfin = g_string_assign(ch->pcdata->bamfin,"");
ch->pcdata->bamfout = g_string_assign(ch->pcdata->bamfout,"");
ch->pcdata->title = g_string_assign(ch->pcdata->title,"");
ch->pcdata->conception = g_string_assign(ch->pcdata->conception,"");
ch->pcdata->parents = g_string_assign(ch->pcdata->parents,"");
ch->pcdata->cparents = g_string_assign(ch->pcdata->cparents,"");
ch->pcdata->marriage = g_string_assign(ch->pcdata->marriage,"");
ch->pcdata->email = g_string_assign(ch->pcdata->email,"");
ch->pcdata->board = &boards[DEFAULT_BOARD];
ch->pcdata->nature = g_string_assign(ch->pcdata->nature,"");
ch->pcdata->roompose = g_string_assign(ch->pcdata->roompose,"");
ch->pcdata->demeanor = g_string_assign(ch->pcdata->demeanor,"");
ch->lord = g_string_assign(ch->lord,"");
ch->lines = 20;
ch->pk_sect = 0;
ch->morph = g_string_assign(ch->morph,"");
ch->pload = g_string_assign(ch->pload,"");
ch->prompt = g_string_assign(ch->prompt,"");
ch->cprompt = g_string_assign(ch->cprompt,"");
ch->pcdata->confirm_delete = FALSE;
strtime = ctime( ¤t_time );
strtime[strlen(strtime)-1] = '\0';
ch->createtime = g_string_assign(ch->createtime, strtime );
ch->lasttime = g_string_assign(ch->lasttime, "" );
ch->lasthost = g_string_assign(ch->lasthost, "" );
ch->poweraction = g_string_assign(ch->poweraction, "" );
ch->powertype = g_string_assign(ch->powertype, "" );
ch->murmur_name = g_string_assign(ch->murmur_name, "" );
ch->murmur_command = g_string_assign(ch->murmur_command, "" );
ch->prefix = g_string_assign(ch->prefix, "" );
ch->hunting = g_string_assign(ch->hunting , "" );
ch->arete = 1;
ch->home = 3001;
ch->damcap[0] = 1000;
ch->plane = 1;
ch->vamppass_a = -1;
ch->form = 32767;
ch->beast = 15;
ch->creature = -1;
ch->pcdata->perm_str = 13;
ch->pcdata->perm_int = 13;
ch->pcdata->perm_wis = 13;
ch->pcdata->perm_dex = 13;
ch->pcdata->perm_con = 13;
ch->pcdata->condition[COND_THIRST] = 48;
ch->pcdata->condition[COND_FULL] = 48;
return ch;
}
void fread_char( CHAR_DATA *ch, FILE *fp )
{
char buf[MAX_STRING_LENGTH];
char log[MAX_STRING_LENGTH];
char *word;
bool fMatch;
int dummy,i;
int count = 0;
int alias_count = 0;
int sn,cimm;
for ( ; ; )
{
Player_Load = TRUE;
Player_Error = FALSE;
word = feof( fp ) ? (char *)"End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'A':
KEY( "Act", ch->act, fread_number( fp ) );
KEY( "Added", ch->added, fread_number( fp ) );
/*Horrible hack to get inivs set, Please tell me there is a better way - Spiral */
if (IS_SET(ch->act,PLR_WIZINVIS))
ch->invis_level = ch->level;
KEY( "AffectedBy", ch->affected_by, fread_number( fp ) );
KEY( "Alignment", ch->alignment, fread_number( fp ) );
KEY( "Armor", ch->armor, fread_number( fp ) );
KEY( "Arete", ch->arete, fread_number( fp ) );
KEY( "Abs_Mvnum", ch->pcdata->absorb[ABS_MOB_VNUM], fread_number( fp ) );
KEY( "Abs_MHp", ch->pcdata->absorb[ABS_MOB_HP], fread_number( fp ) );
KEY( "Abs_MMaxHp", ch->pcdata->absorb[ABS_MOB_MAX_HP], fread_number( fp ) );
h_KEY( "ANONDes", ch->pcdata->anon_desc, nonfread_string(ch->pcdata->anon_desc, fp ) );
if ( !str_cmp( word, "Auspice" ) )
{
ch->pcdata->auspice[0] = fread_number( fp );
ch->pcdata->auspice[1] = fread_number( fp );
ch->pcdata->auspice[2] = fread_number( fp );
ch->pcdata->auspice[3] = fread_number( fp );
ch->pcdata->auspice[4] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Alias" ) )
{
if (alias_count >= MAX_ALIAS)
{
fread_to_eol(fp);
fMatch = TRUE;
break;
}
ch->pcdata->alias[alias_count] = g_string_assign(ch->pcdata->alias[alias_count],fread_word(fp));
ch->pcdata->alias_sub[alias_count] = nonfread_string(ch->pcdata->alias_sub[alias_count],fp);
alias_count++;
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
{
AFFECT_DATA *paf;
paf = new_affect();
if ( !str_cmp( word, "Affect" ) )
{
/* Obsolete 2.0 form. */
paf->type = fread_number( fp );
}
else
{
int sn;
sn = skill_lookup( fread_word( fp ) );
if ( sn < 0 )
bug( "Fread_char: unknown skill.", 0 );
else
paf->type = sn;
}
paf->duration = fread_number( fp );
paf->modifier = fread_number( fp );
paf->location = fread_number( fp );
paf->bitvector = fread_number( fp );
paf->next = ch->affected;
ch->affected = paf;
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "AttrMod" ) )
{
ch->pcdata->mod_str = fread_number( fp );
ch->pcdata->mod_int = fread_number( fp );
ch->pcdata->mod_wis = fread_number( fp );
ch->pcdata->mod_dex = fread_number( fp );
ch->pcdata->mod_con = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "AttrPerm" ) )
{
ch->pcdata->perm_str = fread_number( fp );
ch->pcdata->perm_int = fread_number( fp );
ch->pcdata->perm_wis = fread_number( fp );
ch->pcdata->perm_dex = fread_number( fp );
ch->pcdata->perm_con = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'B':
h_KEY( "Bamfin", ch->pcdata->bamfin, nonfread_string(ch->pcdata->bamfin, fp ) );
h_KEY( "Bamfout", ch->pcdata->bamfout, nonfread_string(ch->pcdata->bamfout, fp ) );
KEY( "Beast", ch->beast, fread_number( fp ) );
if ( !str_cmp( word, "Breed" ) )
{
ch->pcdata->breed[0] = fread_number( fp );
ch->pcdata->breed[1] = fread_number( fp );
ch->pcdata->breed[2] = fread_number( fp );
fMatch = TRUE;
break;
}
/* 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->str, boardname);
log_string2 (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 */
break;
case 'C':
if (!str_cmp(word,"Clan"))
{
ch->clan = fix_clan(ch,fread_string(fp));
fMatch = TRUE;
break;
}
if (!str_cmp(word,"ChrPnts"))
{
if (ch->pcdata->charpoints == 0)
ch->pcdata->charpoints = fread_number(fp);
else
fread_number(fp);
fMatch = TRUE;
break;
}
KEY( "Class", ch->creature, fread_number( fp ) );
KEY( "Cing", ch->pcdata->conding, fread_string( fp ));
KEY( "Comm", ch->pcdata->comm, fread_number( fp ) );
if ( !str_cmp( word, "Combat" ) )
{
ch->cmbt[0] = fread_number( fp );
ch->cmbt[1] = fread_number( fp );
ch->cmbt[2] = fread_number( fp );
ch->cmbt[3] = fread_number( fp );
ch->cmbt[4] = fread_number( fp );
ch->cmbt[5] = fread_number( fp );
ch->cmbt[6] = fread_number( fp );
ch->cmbt[7] = fread_number( fp );
fMatch = TRUE;
break;
}
h_KEY( "Conception", ch->pcdata->conception, nonfread_string(ch->pcdata->conception, fp ) );
if ( !str_cmp( word, "Condition" ) )
{
ch->pcdata->condition[0] = fread_number( fp );
ch->pcdata->condition[1] = fread_number( fp );
ch->pcdata->condition[2] = fread_number( fp );
fMatch = TRUE;
break;
}
h_KEY( "Cparents", ch->pcdata->cparents, nonfread_string(ch->pcdata->cparents, fp ) );
h_KEY( "Cprompt", ch->cprompt, nonfread_string(ch->cprompt, fp ) );
h_KEY( "Createtime", ch->createtime, nonfread_string(ch->createtime, fp ) );
break;
case 'D':
KEY( "Damroll", ch->damroll, fread_number( fp ) );
KEY( "Deaf", ch->deaf, fread_number( fp ) );
KEY( "Demonic", dummy, fread_number( fp ) );
h_KEY( "Demeanor", ch->pcdata->demeanor, nonfread_string(ch->pcdata->demeanor, fp ) );
h_KEY( "Description", ch->description, nonfread_string(ch->description, fp ) );
KEY( "Diab", ch->pcdata->diab[DIAB_EVER], fread_number( fp ) );
if ( !str_cmp( word, "Disc" ) )
{
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Discipline" ) )
{
for ( dummy = 0 ; dummy < MAX_DISCIPLINE ; dummy++ )
{
ch->pcdata->discipline[dummy] = fread_number( fp );
}
if (IS_CLASS(ch,CLASS_VAMPIRE))
{
//Conversion TIME!!! :P
ch->pcdata->disc[DISC_ANIMALISM] = ch->pcdata->discipline[DIS_ANIMALISM];
ch->pcdata->disc[DISC_AUSPEX] = ch->pcdata->discipline[DIS_AUSPEX];
ch->pcdata->disc[DISC_CELERITY] = ch->pcdata->discipline[DIS_CELERITY];
ch->pcdata->disc[DISC_DEMENTATION] = ch->pcdata->discipline[DIS_DEMENTATION];
ch->pcdata->disc[DISC_DOMINATE] = ch->pcdata->discipline[DIS_DOMINATE];
ch->pcdata->disc[DISC_FORTITUDE] = ch->pcdata->discipline[DIS_FORTITUDE];
ch->pcdata->disc[DISC_OBFUSCATE] = ch->pcdata->discipline[DIS_OBFUSCATE];
ch->pcdata->disc[DISC_OBTENEBRATION] = ch->pcdata->discipline[DIS_OBTENEBRATION];
ch->pcdata->disc[DISC_POTENCE] = ch->pcdata->discipline[DIS_POTENCE];
ch->pcdata->disc[DISC_PRESENCE] = ch->pcdata->discipline[DIS_PRESENCE];
ch->pcdata->disc[DISC_PROTEAN] = ch->pcdata->discipline[DIS_PROTEAN];
ch->pcdata->disc[DISC_QUIETUS] = ch->pcdata->discipline[DIS_QUIETUS];
ch->pcdata->disc[DISC_SERPENTIS] = ch->pcdata->discipline[DIS_SERPENTIS];
ch->pcdata->disc[DISC_THAUMATURGY] = ch->pcdata->discipline[DIS_THAUMATURGY];
ch->pcdata->disc[DISC_VICISSITUDE] = ch->pcdata->discipline[DIS_VICISSITUDE];
}
fMatch = TRUE;
}
KEY( "Drowaff", dummy, fread_number( fp ) ); /* Drow */
KEY( "Drowpwr", dummy, fread_number( fp ) ); /* Drow */
KEY( "Drowmag", dummy, fread_number( fp ) ); /* Drow */
break;
case 'E':
h_KEY( "Email", ch->pcdata->email, nonfread_string(ch->pcdata->email, fp ) );
if ( !str_cmp( word, "End" ) )
return;
KEY( "Exhaustion", ch->pcdata->exhaustion, fread_number( fp ) );
KEY( "Exp", ch->exp, fread_number( fp ) );
KEY( "Extra", ch->extra, fread_number( fp ) );
break;
case 'F':
if ( !str_cmp( word, "FakeCon" ) )
{
ch->pcdata->fake_skill = fread_number( fp );
ch->pcdata->fake_stance = fread_number( fp );
ch->pcdata->fake_hit = fread_number( fp );
ch->pcdata->fake_dam = fread_number( fp );
ch->pcdata->fake_ac = fread_number( fp );
ch->pcdata->fake_hp = fread_number( fp );
ch->pcdata->fake_mana = fread_number( fp );
ch->pcdata->fake_move = fread_number( fp );
fMatch = TRUE;
break;
}
KEY( "Form", ch->form, fread_number( fp ) );
if (!str_cmp(word, "Follow"))
{
fread_number(fp);
fMatch= TRUE;
}
//KEY( "Follow", ch->pcdata->followers, fread_number( fp ) );
break;
case 'G':
if ( !str_cmp( word, "Genes" ) )
{
ch->pcdata->genes[0] = fread_number( fp );
ch->pcdata->genes[1] = fread_number( fp );
ch->pcdata->genes[2] = fread_number( fp );
ch->pcdata->genes[3] = fread_number( fp );
ch->pcdata->genes[4] = fread_number( fp );
ch->pcdata->genes[5] = fread_number( fp );
ch->pcdata->genes[6] = fread_number( fp );
ch->pcdata->genes[7] = fread_number( fp );
ch->pcdata->genes[8] = fread_number( fp );
ch->pcdata->genes[9] = fread_number( fp );
fMatch = TRUE;
break;
}
KEY( "Gnosis", ch->pcdata->gnosis, fread_number( fp ) );
KEY( "Gold", ch->gold, fread_number( fp ) );
break;
case 'H':
KEY( "Hitroll", ch->hitroll, fread_number( fp ) );
KEY( "Home", ch->home, fread_number( fp ) );
if (!str_cmp(word, "HardSkillz")) {
for (i = 0; i < MAX_HARD_SKILLS; i++) {
ch->pcdata->hard_skills[i] = fread_number( fp );
}
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "HpManaMove" ) )
{
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 );
ch->max_move = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'I':
KEY( "Id", ch->id, fread_number( fp ) );
if (!str_cmp( word, "Ignore"))
{
if (count >= MAX_IGNORE)
{
fread_to_eol(fp);
fMatch = TRUE;
break;
}
ch->pcdata->ignore[count] = nonfread_string(ch->pcdata->ignore[count],fp);
count++;
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Immune" ) )
{
ch->immune = fread_number( fp );
if ((cimm = count_imms(ch)) > 0)
{
ch->exp += cimm;
ch->pcdata->charpoints = 20;
if (IS_AVATAR(ch))
ch->pcdata->charpoints = 20;
cr_imms(ch);
}
fMatch = TRUE;
break;
}
KEY( "iCla", ch->clan, fread_number( fp ) );
KEY( "iSec", ch->sect, fread_number( fp ) );
KEY( "Itemaffect", ch->itemaffect, fread_number( fp ) );
if ( !str_cmp( word, "Inherited" ) )
{
for ( dummy = 0 ; dummy < MAX_DISCIPLINE ; dummy++ )
{
ch->pcdata->inherited[dummy] = fread_number( fp );
}
ch->pcdata->Ninherited[DISC_ANIMALISM] = ch->pcdata->inherited[DIS_ANIMALISM];
ch->pcdata->Ninherited[DISC_AUSPEX] = ch->pcdata->inherited[DIS_AUSPEX];
ch->pcdata->Ninherited[DISC_CELERITY] = ch->pcdata->inherited[DIS_CELERITY];
ch->pcdata->Ninherited[DISC_DEMENTATION] = ch->pcdata->inherited[DIS_DEMENTATION];
ch->pcdata->Ninherited[DISC_DOMINATE] = ch->pcdata->inherited[DIS_DOMINATE];
ch->pcdata->Ninherited[DISC_FORTITUDE] = ch->pcdata->inherited[DIS_FORTITUDE];
ch->pcdata->Ninherited[DISC_OBFUSCATE] = ch->pcdata->inherited[DIS_OBFUSCATE];
ch->pcdata->Ninherited[DISC_OBTENEBRATION] = ch->pcdata->inherited[DIS_OBTENEBRATION];
ch->pcdata->Ninherited[DISC_POTENCE] = ch->pcdata->inherited[DIS_POTENCE];
ch->pcdata->Ninherited[DISC_PRESENCE] = ch->pcdata->inherited[DIS_PRESENCE];
ch->pcdata->Ninherited[DISC_PROTEAN] = ch->pcdata->inherited[DIS_PROTEAN];
ch->pcdata->Ninherited[DISC_QUIETUS] = ch->pcdata->inherited[DIS_QUIETUS];
ch->pcdata->Ninherited[DISC_SERPENTIS] = ch->pcdata->inherited[DIS_SERPENTIS];
ch->pcdata->Ninherited[DISC_THAUMATURGY] = ch->pcdata->inherited[DIS_THAUMATURGY];
ch->pcdata->Ninherited[DISC_VICISSITUDE] = ch->pcdata->inherited[DIS_VICISSITUDE];
fMatch = TRUE;
}
break;
case 'K':
if ( !str_cmp(word, "Know"))
{
int value;
KNOWN_DATA *charname;
value = fread_number( fp );
charname = new_known();
charname->value = value;
charname->next = ch->pcdata->known;
ch->pcdata->known = charname;
fMatch = TRUE;
break;
}
if ( !str_cmp(word, "Known"))
{
int i;
int size;
int number;
size = fread_number(fp);
for ( i = 1; i < size+1; i++ )
number = fread_number(fp);
fread_word(fp); /* read final #0 */
fMatch = TRUE;
break;
}
break;
case 'L':
KEY( "Lag", ch->pcdata->lag_time, fread_number( fp ) );
if ( !str_cmp( word, "Language" ) )
{
ch->pcdata->language[0] = fread_number( fp );
ch->pcdata->language[1] = fread_number( fp );
fMatch = TRUE;
break;
}
h_KEY( "Lasthost", ch->lasthost, nonfread_string(ch->lasthost, fp ) );
h_KEY( "Lasttime", ch->lasttime, nonfread_string(ch->lasttime, fp ) );
KEY( "Level", ch->level, fread_number( fp ) );
if ( !str_cmp( word, "Locationhp" ) )
{
ch->loc_hp[0] = fread_number( fp );
ch->loc_hp[1] = fread_number( fp );
ch->loc_hp[2] = fread_number( fp );
ch->loc_hp[3] = fread_number( fp );
ch->loc_hp[4] = fread_number( fp );
ch->loc_hp[5] = fread_number( fp );
ch->loc_hp[6] = fread_number( fp );
fMatch = TRUE;
break;
}
h_KEY( "LongDescr", ch->long_descr, nonfread_string(ch->long_descr, fp ) );
h_KEY( "Lord", ch->lord, nonfread_string(ch->lord, fp ) );
KEY( "LRite", ch->pcdata->last_rite, fread_number(fp ) );
break;
case 'M':
h_KEY( "Marriage", ch->pcdata->marriage, nonfread_string(ch->pcdata->marriage, fp ) );
h_KEY( "Morph", ch->morph, nonfread_string(ch->morph, fp ) );
h_KEY( "Murmurn", ch->murmur_name, nonfread_string(ch->murmur_name, fp ) );
h_KEY( "Murmurc", ch->murmur_command, nonfread_string(ch->murmur_command, fp ) );
break;
case 'N':
if ( !str_cmp( word, "Name" ) )
{
/*
* Name already set externally.
*/
fread_to_eol( fp );
fMatch = TRUE;
break;
}
h_KEY( "Nature", ch->pcdata->nature, nonfread_string(ch->pcdata->nature, fp ) );
if (!str_cmp(word,"Note"))
{
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "NInherited" ) )
{
for ( dummy = 0 ; dummy < MAX_DISC ; dummy++ )
{
ch->pcdata->Ninherited[dummy] = fread_number( fp );
}
fMatch = TRUE;
}
if ( !str_cmp( word, "NDisc" ) )
{
for ( dummy = 0 ; dummy < MAX_DISC ; dummy++ )
{
ch->pcdata->disc[dummy] = fread_number( fp );
}
fMatch = TRUE;
}
break;
case 'O':
KEY( "Objvnum", ch->pcdata->obj_vnum, fread_number( fp ) );
break;
case 'P':
if ( !str_cmp( word, "Paradox" ) )
{
ch->paradox[0] = fread_number( fp );
ch->paradox[1] = fread_number( fp );
ch->paradox[2] = fread_number( fp );
fMatch = TRUE;
break;
}
h_KEY( "Parents", ch->pcdata->parents, nonfread_string(ch->pcdata->parents, fp ) );
h_KEY( "Password", ch->pcdata->pwd, nonfread_string(ch->pcdata->pwd, fp ) );
KEY( "Played", ch->played, fread_number( fp ) );
KEY( "Phold", ch->primal_hold, fread_number( fp ) );
KEY( "Polyaff", ch->polyaff, fread_number( fp ) );
KEY( "Power_Point", dummy, fread_number( fp ) ); /* drow */
if ( !str_cmp( word, "Power" ) )
{
for ( sn = 0; sn < 20 ; sn++ )
ch->pcdata->powers[sn] = fread_number( fp );
fMatch = TRUE;
break;
}
KEY( "Plane", ch->plane, fread_number( fp ) );
h_KEY( "Poweraction", ch->poweraction, nonfread_string(ch->poweraction, fp ) );
h_KEY( "Powertype", ch->powertype, nonfread_string(ch->powertype, fp ) );
KEY( "Position", ch->position, fread_number( fp ) );
KEY( "Practice", ch->practice, fread_number( fp ) );
if ( !str_cmp( word, "PkPdMkMd" ) )
{
ch->pkill = fread_number( fp );
ch->pdeath = fread_number( fp );
ch->mkill = fread_number( fp );
ch->mdeath = fread_number( fp );
fMatch = TRUE;
break;
}
h_KEY( "Prompt", ch->prompt, nonfread_string(ch->prompt, fp ) );
break;
case 'Q':
KEY( "Qtimer", ch->nextquest, fread_number( fp ) );
KEY( "Quest", ch->pcdata->quest, fread_number( fp ) );
break;
case 'R':
KEY( "Race", ch->race, fread_number( fp ) );
KEY( "Rage_P", ch->pcdata->rage_points, fread_number( fp ) );
KEY( "Rank", ch->pcdata->rank, fread_number( fp ) );
if ( !str_cmp( word, "Renown" ))
{
ch->pcdata->renown[RENOWN_GLORY] = fread_number( fp );
ch->pcdata->renown[RENOWN_HONOR] = fread_number( fp );
ch->pcdata->renown[RENOWN_WISDOM] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Room" ) )
{
ch->in_room = get_room_index( fread_number( fp ) );
if ( ch->in_room == NULL )
ch->in_room = get_room_index( ROOM_VNUM_LIMBO );
fMatch = TRUE;
break;
}
KEY( "RPts", ch->RPts, fread_number( fp ) );
KEY( "RP_Status", ch->rp_status, fread_number( fp ) );
if ( !str_cmp( word, "Runes" ) )
{
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
dummy = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'S':
KEY( "SavingThrow", ch->saving_throw, fread_number( fp ) );
if ( !str_cmp( word, "Score" ) )
{
fread_number( fp );
fread_number( fp );
fread_number( fp );
fread_number( fp );
fread_number( fp );
fread_number( fp );
fMatch = TRUE;
break;
}
KEY( "Sec", ch->pcdata->security, fread_number( fp ) );
if (!str_cmp(word,"Sect"))
{
ch->sect = fix_sect(ch,fread_string(fp));
fMatch = TRUE;
break;
}
KEY( "Sex", ch->sex, fread_number( fp ) );
KEY( "Sight", ch->sight, fread_number( fp ) );
KEY( "Shape", ch->pcdata->wwf_shape, fread_number( fp ) );
h_KEY( "ShortDescr", ch->short_descr, nonfread_string(ch->short_descr, fp ) );
if ( !str_cmp( word, "Skill" ) )
{
int sn;
int value;
value = fread_number( fp );
sn = skill_lookup( fread_word( fp ) );
/*
if ( sn < 0 )
bug( "Fread_char: unknown skill.", 0 );
else
ch->pcdata->learned[sn] = value;
*/
if ( sn >= 0 )
ch->pcdata->learned[sn] = value;
fMatch = TRUE;
}
KEY( "Specpower", ch->specpower, fread_number( fp ) );
KEY( "Spectype", ch->spectype, fread_number( fp ) );
KEY( "Special", ch->special, fread_number( fp ) );
if ( !str_cmp( word, "Spells" ) )
{
ch->spl[0] = fread_number( fp );
ch->spl[1] = fread_number( fp );
ch->spl[2] = fread_number( fp );
ch->spl[3] = fread_number( fp );
ch->spl[4] = fread_number( fp );
fMatch = TRUE;
break;
}
KEY( "Sphere_spaffect", ch->sphere_spaffect, fread_number( fp ) );
if (!str_cmp(word, "Sphere_AffectedBy"))
{
ch->sphere_affected_by[TYPE_SPHERE_ADDED] = fread_number( fp );
ch->sphere_affected_by[TYPE_SPHERE_AFFECT] = fread_number( fp );
ch->sphere_affected_by[TYPE_SPHERE_ACT] = fread_number( fp );
ch->sphere_affected_by[TYPE_SPHERE_SPAFFECT] = fread_number( fp );
fMatch = TRUE;
break;
}
if (!str_cmp( word, "Sphere_AffectData" ) )
{
SPHERE_DATA *paf;
/* man i'm such a dumb ass for putting in this one
if ( sphere_free == NULL )
{
paf = alloc_perm( sizeof(*paf) );
}
else
{
paf = sphere_free;
sphere_free = sphere_free->next;
}
*/
paf = new_sphere();
paf->spell_number = fread_number( fp );
paf->type = fread_number( fp );
paf->duration = fread_number( fp );
paf->bitvector = fread_number( fp );
paf->next = ch->sphere_affected;
ch->sphere_affected = paf;
fMatch = TRUE;
break;
}
if (!str_cmp(word, "Spent"))
{
ch->pcdata->spent[SPENT_QP] = fread_number( fp );
ch->pcdata->spent[SPENT_CP] = fread_number( fp );
ch->pcdata->spent[SPENT_P] = fread_number( fp );
ch->pcdata->spent[SPENT_RP] = fread_number( fp );
ch->pcdata->spent[SPENT_T] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Stage" ) )
{
ch->pcdata->stage[0] = fread_number( fp );
ch->pcdata->stage[1] = fread_number( fp );
ch->pcdata->stage[2] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Sgift" ))
{
ch->pcdata->sgift[1] = fread_number( fp );
ch->pcdata->sgift[2] = fread_number( fp );
ch->pcdata->sgift[3] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Stance" ) )
{
ch->stance[0] = fread_number( fp );
ch->stance[1] = fread_number( fp );
ch->stance[2] = fread_number( fp );
ch->stance[3] = fread_number( fp );
ch->stance[4] = fread_number( fp );
ch->stance[5] = fread_number( fp );
ch->stance[6] = fread_number( fp );
ch->stance[7] = fread_number( fp );
ch->stance[8] = fread_number( fp );
ch->stance[9] = fread_number( fp );
ch->stance[10] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "StatAbility" ) )
{
ch->pcdata->stat_ability[0] = fread_number( fp );
ch->pcdata->stat_ability[1] = fread_number( fp );
ch->pcdata->stat_ability[2] = fread_number( fp );
ch->pcdata->stat_ability[3] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "StatAmount" ) )
{
ch->pcdata->stat_amount[0] = fread_number( fp );
ch->pcdata->stat_amount[1] = fread_number( fp );
ch->pcdata->stat_amount[2] = fread_number( fp );
ch->pcdata->stat_amount[3] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "StatDuration" ) )
{
ch->pcdata->stat_duration[0] = fread_number( fp );
ch->pcdata->stat_duration[1] = fread_number( fp );
ch->pcdata->stat_duration[2] = fread_number( fp );
ch->pcdata->stat_duration[3] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Stats" ) )
{
for ( sn = 0; sn < 12 ; sn++ )
ch->pcdata->stats[sn] = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'T':
KEY( "TR", ch->pcdata->trait_merit[REG_MERIT], fread_number( fp ) );
KEY( "TF", ch->pcdata->trait_flaw[REG_FLAW], fread_number( fp ) );
KEY( "TRi", ch->pcdata->trait_merit[IMM_MERIT], fread_number( fp ) );
KEY( "TFi", ch->pcdata->trait_flaw[IMM_FLAW], fread_number( fp ) );
KEY( "Trust", ch->trust, fread_number( fp ) );
if ( !str_cmp( word, "TRenown" ))
{
ch->pcdata->Trenown[RENOWN_GLORY] = fread_number( fp );
ch->pcdata->Trenown[RENOWN_HONOR] = fread_number( fp );
ch->pcdata->Trenown[RENOWN_WISDOM] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Tribes" ) )
{
ch->pcdata->tribes[0] = fread_number( fp );
ch->pcdata->tribes[1] = fread_number( fp );
ch->pcdata->tribes[2] = fread_number( fp );
ch->pcdata->tribes[3] = fread_number( fp );
ch->pcdata->tribes[4] = fread_number( fp );
ch->pcdata->tribes[5] = fread_number( fp );
ch->pcdata->tribes[6] = fread_number( fp );
ch->pcdata->tribes[7] = fread_number( fp );
ch->pcdata->tribes[8] = fread_number( fp );
ch->pcdata->tribes[9] = fread_number( fp );
ch->pcdata->tribes[10] = fread_number( fp );
ch->pcdata->tribes[11] = fread_number( fp );
ch->pcdata->tribes[12] = fread_number( fp );
ch->pcdata->tribes[13] = fread_number( fp );
ch->pcdata->tribes[14] = fread_number( fp );
ch->pcdata->tribes[15] = fread_number( fp );
ch->pcdata->tribes[16] = fread_number( fp );
ch->pcdata->tribes[17] = fread_number( fp );
ch->pcdata->tribes[18] = fread_number( fp );
ch->pcdata->tribes[19] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Title" ) )
{
ch->pcdata->title = nonfread_string(ch->pcdata->title, fp );
if ( isalpha(ch->pcdata->title->str[0])
|| isdigit(ch->pcdata->title->str[0]) )
{
sprintf( buf, " %s", ch->pcdata->title->str );
ch->pcdata->title = g_string_assign(ch->pcdata->title, buf );
}
fMatch = TRUE;
break;
}
break;
case 'V':
KEY( "Vampaff", dummy, fread_number( fp ) );
KEY( "Vampgen", dummy, fread_number( fp ) );
KEY( "Vamppass", dummy, fread_number( fp ) );
if ( !str_cmp( word, "Vnum" ) )
{
ch->pIndexData = get_mob_index( fread_number( fp ) );
fMatch = TRUE;
break;
}
break;
case 'W':
if ( !str_cmp( word, "Weapons" ) )
{
ch->wpn[0] = fread_number( fp );
ch->wpn[1] = fread_number( fp );
ch->wpn[2] = fread_number( fp );
ch->wpn[3] = fread_number( fp );
ch->wpn[4] = fread_number( fp );
ch->wpn[5] = fread_number( fp );
ch->wpn[6] = fread_number( fp );
ch->wpn[7] = fread_number( fp );
ch->wpn[8] = fread_number( fp );
ch->wpn[9] = fread_number( fp );
ch->wpn[10] = fread_number( fp );
ch->wpn[11] = fread_number( fp );
ch->wpn[12] = fread_number( fp );
fMatch = TRUE;
break;
}
KEY( "WIL", ch->pcdata->willpower, fread_number( fp ) );
KEY( "Wimpy", ch->wimpy, fread_number( fp ) );
KEY( "Wolf", dummy, fread_number( fp ) );
KEY( "Wiznet", ch->pcdata->wiznet, fread_number( fp ) );
if ( !str_cmp( word, "Wolfform" ) )
{
dummy = fread_number( fp );
dummy = fread_number( fp );
fMatch = TRUE;
break;
}
break;
}
if (Player_Error == TRUE)
{
send_to_char("Your Pfile has a problem, please note Spiral or Dominion with another char",ch);
sprintf(log,"Pfile error in player %s",ch->name->str);
log_string2(log);
logchan(log, NULL, NULL,WIZ_LINK,0, LEVEL_QUESTMAKER);
close_socket(ch->desc);
Player_Load = FALSE;
return;
}
if ( !fMatch )
{
sprintf(buf, "Fread_charB: no match. WORD: %s", word);
bug( buf, 0 );
sprintf(log,"Pfile error in player %s",ch->name->str);
log_string2(log);
logchan(log, NULL, NULL,WIZ_LINK,0, LEVEL_QUESTMAKER);
/* Kick them off.. with a nice warning */
//fread_to_eol( fp );
send_to_char("Your pFile has a problem, please note Spiral or Dominion with another char",ch);
close_socket(ch->desc);
Player_Load = FALSE;
return;
}
}
Player_Load = FALSE;
Player_Error = FALSE;
return;
}
/*
* Write the char.
*/
void fwrite_char( CHAR_DATA *ch, FILE *fp )
{
KNOWN_DATA *names;
AFFECT_DATA *paf;
SPHERE_DATA *sp_paf;
int sn,i;
int pos;
if (IS_NPC(ch)) {
return;
}
fprintf( fp, "#%s\n", IS_NPC(ch) ? "MOB" : "PLAYERS" );
fprintf( fp, "Name %s~\n", ch->name->str );
fprintf( fp, "ShortDescr %s~\n", ch->short_descr->str );
fprintf( fp, "LongDescr %s~\n", ch->long_descr->str );
fprintf( fp, "Description %s~\n", ch->description->str );
fprintf( fp, "ANONDes %s~\n", ch->pcdata->anon_desc->str);
fprintf( fp, "Lord %s~\n", ch->lord->str );
fprintf( fp, "Id %ld\n", ch->id );
fprintf( fp, "Plane %ld\n", ch->plane );
fprintf( fp, "iCla %d\n", ch->clan );
/*fprintf( fp, "Sect %s~\n", ch->sect ); - Taken out, no more strings - Spiral*/
if (ch->sect > 0 )
fprintf( fp, "iSec %d\n", ch->sect );
fprintf( fp, "Class %d\n", ch->creature );
fprintf( fp, "Morph %s~\n", ch->morph->str );
fprintf( fp, "Createtime %s~\n", ch->createtime->str );
fprintf( fp, "Lasttime %s~\n", ch->lasttime->str );
fprintf( fp, "Lasthost %s~\n", ch->lasthost->str );
fprintf( fp, "Poweraction %s~\n", ch->poweraction->str );
fprintf( fp, "Powertype %s~\n", ch->powertype->str );
fprintf( fp, "Prompt %s~\n", ch->prompt->str );
fprintf( fp, "Cprompt %s~\n", ch->cprompt->str );
fprintf( fp, "Sex %d\n", ch->sex );
fprintf( fp, "Race %d\n", ch->race );
fprintf( fp, "Immune %d\n", ch->immune );
fprintf( fp, "Polyaff %d\n", ch->polyaff );
fprintf( fp, "Itemaffect %d\n", ch->itemaffect );
fprintf( fp, "Form %d\n", ch->form );
fprintf( fp, "Sight %ld\n", ch->sight );
fprintf( fp, "Lag %d\n", ch->pcdata->lag_time);
fprintf( fp, "Comm %d\n", ch->pcdata->comm );
fprintf( fp, "Beast %d\n", ch->beast );
fprintf( fp, "ChrPnts %d\n", ch->pcdata->charpoints );
fprintf( fp, "TR %d\n", ch->pcdata->trait_merit[REG_MERIT] );
fprintf( fp, "TF %d\n", ch->pcdata->trait_flaw[REG_FLAW] );
fprintf( fp, "TRi %d\n", ch->pcdata->trait_merit[IMM_MERIT] );
fprintf( fp, "TFi %d\n", ch->pcdata->trait_flaw[IMM_FLAW] );
fprintf( fp, "Spectype %d\n", ch->spectype );
fprintf( fp, "Specpower %d\n", ch->specpower );
fprintf( fp, "Home %d\n", ch->home );
fprintf( fp, "Level %d\n", ch->level );
fprintf( fp, "Phold %ld\n", ch->primal_hold );
fprintf( fp, "Trust %d\n", ch->trust );
fprintf( fp, "Sec %d\n", ch->pcdata->security );
fprintf( fp, "Nature %s~\n", ch->pcdata->nature->str );
fprintf( fp, "Demeanor %s~\n", ch->pcdata->demeanor->str );
fprintf( fp, "RPts %d\n", ch->RPts );
fprintf( fp, "Diab %d\n", ch->pcdata->diab[DIAB_EVER] );
fprintf( fp, "Follow %d\n", ch->pcdata->followers );
if (ch->pcdata->willpower > 0 )
fprintf( fp, "WIL %d\n", ch->pcdata->willpower );
/*
* Spiral Werewolf Save
*/
if ( IS_CLASS(ch,CLASS_SWWF))
{
fprintf( fp, "Rage_P %d\n", ch->pcdata->rage_points );
fprintf( fp, "Gnosis %d\n", ch->pcdata->gnosis );
fprintf( fp, "Shape %d\n", ch->pcdata->wwf_shape );
fprintf( fp, "Renown %d %d %d\n", ch->pcdata->renown[RENOWN_GLORY], ch->pcdata->renown[RENOWN_HONOR], ch->pcdata->renown[RENOWN_WISDOM] );
fprintf( fp, "TRenown %d %d %d\n", ch->pcdata->Trenown[RENOWN_GLORY], ch->pcdata->Trenown[RENOWN_HONOR], ch->pcdata->Trenown[RENOWN_WISDOM] );
fprintf( fp, "Sgift %d %d %d\n", ch->pcdata->sgift[1], ch->pcdata->sgift[2], ch->pcdata->sgift[3] );
fprintf( fp, "LRite %d\n", ch->pcdata->last_rite );
}
if ( ch->nextquest > 0 )
fprintf( fp, "Qtimer %d\n", ch->nextquest );
fprintf( fp, "RP_Status %d\n", ch->rp_status );
fprintf( fp, "Paradox %d %d %d\n", ch->paradox[0], ch->paradox[1],
ch->paradox[2] );
/* 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");
fprintf(fp, "HardSkillz ");
for (i = 0; i < MAX_HARD_SKILLS; i++) {
fprintf(fp, "%d ", ch->pcdata->hard_skills[i]);
}
fprintf( fp, "Played %d\n",
ch->played + (int) (current_time - ch->logon) );
fprintf( fp, "Room %d\n",
( ch->in_room == get_room_index( ROOM_VNUM_LIMBO )
&& ch->was_in_room != NULL )
? ch->was_in_room->vnum
: ch->in_room->vnum );
fprintf( fp, "PkPdMkMd %d %d %d %d\n",
ch->pkill, ch->pdeath, ch->mkill, ch->mdeath );
fprintf( fp, "Discipline ");
for ( sn = 0 ; sn < MAX_DISCIPLINE ; sn++ )
{
fprintf( fp, " %d", ch->pcdata->discipline[sn]);
}
fprintf( fp, "\n");
fprintf( fp, "NDisc ");
for ( sn = 0 ; sn < MAX_DISC ; sn++ )
{
fprintf( fp, " %d", ch->pcdata->disc[sn]);
}
fprintf( fp, "\n");
fprintf( fp, "NInherited ");
for ( sn = 0 ; sn < MAX_DISC ; sn++ )
{
fprintf( fp, " %d", ch->pcdata->Ninherited[sn]);
}
fprintf( fp, "\n");
fprintf( fp, "Weapons %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
ch->wpn[0], ch->wpn[1], ch->wpn[2], ch->wpn[3], ch->wpn[4],
ch->wpn[5], ch->wpn[6], ch->wpn[7], ch->wpn[8], ch->wpn[9],
ch->wpn[10], ch->wpn[11], ch->wpn[12] );
fprintf( fp, "Spells %d %d %d %d %d\n",
ch->spl[0], ch->spl[1], ch->spl[2], ch->spl[3], ch->spl[4] );
fprintf( fp, "Combat %d %d %d %d %d %d %d %d\n",
ch->cmbt[0], ch->cmbt[1], ch->cmbt[2], ch->cmbt[3],
ch->cmbt[4], ch->cmbt[5], ch->cmbt[6], ch->cmbt[7] );
fprintf( fp, "Stance %d %d %d %d %d %d %d %d %d %d %d\n",
ch->stance[0], ch->stance[1], ch->stance[2], ch->stance[3],
ch->stance[4], ch->stance[5], ch->stance[6], ch->stance[7],
ch->stance[8], ch->stance[9], ch->stance[10] );
fprintf( fp, "Locationhp %d %d %d %d %d %d %d\n",
ch->loc_hp[0], ch->loc_hp[1], ch->loc_hp[2], ch->loc_hp[3],
ch->loc_hp[4], ch->loc_hp[5], ch->loc_hp[6] );
fprintf( fp, "Spent %d %d %d %d %d\n",
ch->pcdata->spent[SPENT_QP],ch->pcdata->spent[SPENT_CP],
ch->pcdata->spent[SPENT_P],ch->pcdata->spent[SPENT_RP],ch->pcdata->spent[SPENT_T]);
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, "Gold %d\n", ch->gold );
fprintf( fp, "Exp %d\n", ch->exp );
fprintf( fp, "Act %d\n", ch->act );
fprintf( fp, "Arete %d\n", ch->arete );
fprintf( fp, "Special %d\n", ch->special );
fprintf( fp, "Extra %d\n", ch->extra );
fprintf( fp, "Added %d\n", ch->added );
fprintf( fp, "Wiznet %d\n", ch->pcdata->wiznet );
fprintf( fp, "AffectedBy %d\n", ch->affected_by );
fprintf( fp, "Sphere_spaffect %d\n", ch->sphere_spaffect );
fprintf( fp, "Sphere_AffectedBy %d %d %d %d\n",ch->sphere_affected_by[TYPE_SPHERE_ADDED],ch->sphere_affected_by[TYPE_SPHERE_AFFECT],ch->sphere_affected_by[TYPE_SPHERE_ACT],ch->sphere_affected_by[TYPE_SPHERE_SPAFFECT]);
/* Bug fix from Alander */
fprintf( fp, "Position %d\n",
ch->position == POS_FIGHTING ? POS_STANDING : ch->position );
fprintf( fp, "Practice %d\n", ch->practice );
fprintf( fp, "SavingThrow %d\n", ch->saving_throw );
fprintf( fp, "Alignment %d\n", ch->alignment );
fprintf( fp, "Hitroll %d\n", ch->hitroll );
fprintf( fp, "Damroll %d\n", ch->damroll );
fprintf( fp, "Armor %d\n", ch->armor );
fprintf( fp, "Wimpy %d\n", ch->wimpy );
fprintf( fp, "Deaf %ld\n", ch->deaf );
fprintf( fp, "Abs_Mvnum %d\n", ch->pcdata->absorb[ABS_MOB_VNUM]);
fprintf( fp, "Abs_MHp %d\n", ch->pcdata->absorb[ABS_MOB_HP]);
fprintf( fp, "Abs_MMaxHp %d\n", ch->pcdata->absorb[ABS_MOB_MAX_HP]);
if (str_cmp(ch->murmur_name->str,"") && str_cmp(ch->murmur_command->str,""))
{
fprintf( fp, "Murmurn %s~\n", ch->murmur_name->str);
fprintf( fp, "Murmurc %s~\n", ch->murmur_command->str);
}
if (ch->pcdata->conding != NULL)
{
fprintf( fp, "Cing %s~\n",ch->pcdata->conding);
}
if ( IS_NPC(ch) )
{
fprintf( fp, "Vnum %d\n", ch->pIndexData->vnum );
}
else
{
fprintf( fp, "Password %s~\n", ch->pcdata->pwd->str );
fprintf( fp, "Bamfin %s~\n", ch->pcdata->bamfin->str );
fprintf( fp, "Bamfout %s~\n", ch->pcdata->bamfout->str );
fprintf( fp, "Title %s~\n", ch->pcdata->title->str );
fprintf( fp, "Conception %s~\n", ch->pcdata->conception->str );
fprintf( fp, "Parents %s~\n", ch->pcdata->parents->str );
fprintf( fp, "Cparents %s~\n", ch->pcdata->cparents->str );
fprintf( fp, "Marriage %s~\n", ch->pcdata->marriage->str );
fprintf( fp, "Email %s~\n", ch->pcdata->email->str );
fprintf( fp, "AttrPerm %d %d %d %d %d\n",
ch->pcdata->perm_str,
ch->pcdata->perm_int,
ch->pcdata->perm_wis,
ch->pcdata->perm_dex,
ch->pcdata->perm_con );
fprintf( fp, "AttrMod %d %d %d %d %d\n",
ch->pcdata->mod_str,
ch->pcdata->mod_int,
ch->pcdata->mod_wis,
ch->pcdata->mod_dex,
ch->pcdata->mod_con );
fprintf( fp, "Quest %d\n", ch->pcdata->quest );
fprintf( fp, "Wolf %d\n", ch->pcdata->stats[UNI_RAGE]);
fprintf( fp, "Rank %d\n", ch->pcdata->rank );
fprintf( fp, "Language %d %d\n",
ch->pcdata->language[0],
ch->pcdata->language[1] );
fprintf( fp, "Stage %d %d %d\n",
ch->pcdata->stage[0],
ch->pcdata->stage[1],
ch->pcdata->stage[2] );
fprintf( fp, "Genes %d %d %d %d %d %d %d %d %d %d\n",
ch->pcdata->genes[0],
ch->pcdata->genes[1],
ch->pcdata->genes[2],
ch->pcdata->genes[3],
ch->pcdata->genes[4],
ch->pcdata->genes[5],
ch->pcdata->genes[6],
ch->pcdata->genes[7],
ch->pcdata->genes[8],
ch->pcdata->genes[9] );
fprintf( fp, "Power ");
for (sn=0; sn < 20; sn++)
{
fprintf(fp, "%d ", ch->pcdata->powers[sn]);
}
fprintf(fp, "\n");
fprintf( fp, "Stats ");
for (sn=0; sn < 12; sn++)
{
fprintf(fp, "%d ", ch->pcdata->stats[sn]);
}
fprintf(fp, "\n");
fprintf( fp, "FakeCon %d %d %d %d %d %d %d %d\n",
ch->pcdata->fake_skill,
ch->pcdata->fake_stance,
ch->pcdata->fake_hit,
ch->pcdata->fake_dam,
ch->pcdata->fake_ac,
ch->pcdata->fake_hp,
ch->pcdata->fake_mana,
ch->pcdata->fake_move);
if (ch->pcdata->obj_vnum != 0)
fprintf( fp, "Objvnum %d\n", ch->pcdata->obj_vnum );
fprintf( fp, "Condition %d %d %d\n",
ch->pcdata->condition[0],
ch->pcdata->condition[1],
ch->pcdata->condition[2] );
fprintf( fp, "StatAbility %d %d %d %d\n",
ch->pcdata->stat_ability[0],
ch->pcdata->stat_ability[1],
ch->pcdata->stat_ability[2],
ch->pcdata->stat_ability[3] );
fprintf( fp, "StatAmount %d %d %d %d\n",
ch->pcdata->stat_amount[0],
ch->pcdata->stat_amount[1],
ch->pcdata->stat_amount[2],
ch->pcdata->stat_amount[3] );
fprintf( fp, "StatDuration %d %d %d %d\n",
ch->pcdata->stat_duration[0],
ch->pcdata->stat_duration[1],
ch->pcdata->stat_duration[2],
ch->pcdata->stat_duration[3] );
fprintf( fp, "Exhaustion %d\n", ch->pcdata->exhaustion );
for (pos = 0; pos < MAX_IGNORE; pos++)
{
if (ch->pcdata->ignore[pos] == NULL)
break;
fprintf(fp, "Ignore %s~\n", ch->pcdata->ignore[pos]->str);
}
/* write alias */
for (pos = 0; pos < MAX_ALIAS; pos++)
{
if (ch->pcdata->alias[pos] == NULL
|| ch->pcdata->alias_sub[pos] == NULL || !strcmp(ch->pcdata->alias[pos]->str,""))
break;
fprintf(fp,"Alias %s %s~\n",ch->pcdata->alias[pos]->str,ch->pcdata->alias_sub[pos]->str);
}
/* Write out 'known people' array. */
for ( names = ch->pcdata->known; names; names = names->next )
{
fprintf(fp, "Know %ld\n", names->value);
}
for ( sn = 0; sn < MAX_SKILL; sn++ )
{
if ( skill_table[sn].name != NULL && ch->pcdata->learned[sn] > 0 )
{
fprintf( fp, "Skill %d '%s'\n",
ch->pcdata->learned[sn], skill_table[sn].name );
}
}
}
for ( paf = ch->affected; paf != NULL; paf = paf->next )
{
/* Thx Alander
if ( paf->type < 0 || paf->type >= MAX_SKILL )
continue; */
fprintf( fp, "AffectData '%s' %3d %3d %3d %10d\n",
skill_table[paf->type].name,
paf->duration,
paf->modifier,
paf->location,
paf->bitvector
);
}
for ( sp_paf = ch->sphere_affected; sp_paf != NULL; sp_paf = sp_paf->next )
{
/* Thx Alander
if ( paf->type < 0 || paf->type >= MAX_SKILL )
continue; */
fprintf( fp, "Sphere_AffectData %d %d %d %d\n",
sp_paf->spell_number,
sp_paf->type,
sp_paf->duration,
sp_paf->bitvector
);
}
//Kavir-Spiral Changes to Player File for SWWF
fprintf( fp, "Breed %d %d %d\n",
ch->pcdata->breed[0],
ch->pcdata->breed[1],
ch->pcdata->breed[2]);
fprintf( fp, "Auspice %d %d %d %d %d\n",
ch->pcdata->auspice[0], ch->pcdata->auspice[1],
ch->pcdata->auspice[2], ch->pcdata->auspice[3],
ch->pcdata->auspice[4]);
fprintf( fp, "Tribes %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
ch->pcdata->tribes[0], ch->pcdata->tribes[1], ch->pcdata->tribes[2],
ch->pcdata->tribes[3], ch->pcdata->tribes[4], ch->pcdata->tribes[5],
ch->pcdata->tribes[6], ch->pcdata->tribes[7], ch->pcdata->tribes[8],
ch->pcdata->tribes[9], ch->pcdata->tribes[10],ch->pcdata->tribes[11],
ch->pcdata->tribes[12],ch->pcdata->tribes[13],ch->pcdata->tribes[14],
ch->pcdata->tribes[15],ch->pcdata->tribes[16],ch->pcdata->tribes[17],
ch->pcdata->tribes[18],ch->pcdata->tribes[19]);
fprintf( fp, "End\n\n" );
return;
}
GString *
get_player_class_string(CHAR_DATA *ch)
{
GString *chclass;
if (ch == NULL || IS_NPC(ch))
return g_string_new("");
switch (ch->creature)
{
case CLASS_VAMPIRE:
chclass = g_string_new("Vampire");
break;
case CLASS_MAGE:
chclass = g_string_new("Mage");
break;
case CLASS_SWWF:
chclass = g_string_new("Werewolf");
break;
default:
chclass = g_string_new("Unclassed Avatar");
break;
}
return chclass;
}
void save_char_obj_finger( CHAR_DATA *ch )
{
char strsave[MAX_STRING_LENGTH];
FILE *fp;
/*players Don't save on Chaos Night!*/
if (IS_SET(mudsetting->mud_setting, MS_CHAOS_NIGHT))
return;
if ( IS_NPC(ch) || ch->level < 2 )
return;
if ( ch->desc != NULL && ch->desc->original != NULL )
ch = ch->desc->original;
ch->save_time = current_time;
fclose( fpReserve );
sprintf( strsave, "%sbackup/%s", PLAYER_DIR, capitalize(ch->name->str) );
if ( ( fp = fopen( strsave, "w" ) ) == NULL )
{
fpReserve = fopen( NULL_FILE, "r" );
bug( "Save_char_obj: fopen", 0 );
fclose( fpReserve );
}
else
{
fprintf( fp, "%s~\n", ch->name->str );
fprintf( fp, "%s~\n", ch->pcdata->title->str );
fprintf( fp, "%d\n", ch->creature );
fprintf( fp, "%d\n", ch->clan );
fprintf( fp, "%s~\n", ch->lasthost->str );
fprintf( fp, "%s~\n", ch->lasttime->str );
fprintf( fp, "%d\n", ch->extra );
fprintf( fp, "%d\n", ch->sex );
fprintf( fp, "%s~\n", ch->pcdata->conception->str );
fprintf( fp, "%s~\n", ch->createtime->str );
fprintf( fp, "%d\n", ch->level );
fprintf( fp, "%d\n", ch->race );
fprintf( fp, "%d\n",
ch->played + (int) (current_time - ch->logon));
fprintf( fp, "%s~\n", ch->pcdata->marriage->str );
fprintf( fp, "%d\n", ch->pkill );
fprintf( fp, "%d\n", ch->pdeath );
fprintf( fp, "%d\n", ch->mkill );
fprintf( fp, "%d\n", ch->mdeath );
fprintf( fp, "%s~\n", ch->pcdata->email->str );
}
fflush( fp );
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
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 strsavetmp[MAX_STRING_LENGTH];
char strsave[MAX_STRING_LENGTH];
FILE *fp;
/*players Don't save on Chaos Night!*/
if (IS_SET(mudsetting->mud_setting, MS_CHAOS_NIGHT))
return;
if ( IS_NPC(ch) || ch->level < 2 )
return;
if ( ch->desc != NULL && ch->desc->connected != CON_PLAYING )
return;
if ( ch->desc != NULL && ch->desc->original != NULL )
ch = ch->desc->original;
/*
save_char_obj_backup( ch );
*/
ch->save_time = current_time;
fclose( fpReserve );
sprintf( strsavetmp, "%s%s.tmp", PLAYER_DIR, capitalize( ch->name->str ) );
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( ch->name->str ) );
if ( ( fp = fopen( strsavetmp, "w" ) ) == NULL )
{
fpReserve = fopen( NULL_FILE, "r" );
bug( "Save_char_obj: fopen", 0 );
fclose( fpReserve );
return;
}
else
{
fwrite_char( ch, fp );
if ( ch->carrying != NULL )
fwrite_obj( ch, ch->carrying, fp, 0 );
if ( ch->pet != NULL )
fwrite_pet( ch, fp);
fprintf( fp, "#END\n" );
}
fflush( fp );
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
rename( strsavetmp, strsave );
save_char_obj_finger( ch );
return;
}
/*
* Retrieve a character's trusted level for permission checking.
*/
int get_trust( CHAR_DATA *ch )
{
if ( ch->desc != NULL && ch->desc->original != NULL )
ch = ch->desc->original;
if ( ch->trust != 0 )
return ch->trust;
if ( IS_NPC(ch) )
{
if( IS_SET(ch->act, ACT_HOLYLIGHT) )
return LEVEL_IMMORTAL;
else
return LEVEL_HERO -1;
}
return ch->level;
}
/*
* Retrieve a character's age.
*/
int get_age( CHAR_DATA *ch )
{
int age;
age = 17 + ( ch->played + (int) (current_time - ch->logon) ) / 7200;
if (!IS_NPC(ch) && IS_MERIT(ch,MERIT_WISE))
age += 150;
if (!IS_NPC(ch) && IS_FLAW(ch,FLAW_FOOLISH))
age -= 150;
if (age < 0)
age =0;
return age;
}
/*
* Retrieve character's current strength.
*/
int get_curr_str( CHAR_DATA *ch )
{
sh_int max = 25;
if ( IS_NPC(ch) )
return 13;
return URANGE( 3, ch->pcdata->perm_str + ch->pcdata->mod_str, max );
}
/*
* Retrieve character's current intelligence.
*/
int get_curr_int( CHAR_DATA *ch )
{
sh_int max;
if ( IS_NPC(ch) )
return 13;
max = 25;
return URANGE( 3, ch->pcdata->perm_int + ch->pcdata->mod_int, max );
}
/*
* Retrieve character's current wisdom.
*/
int get_curr_wis( CHAR_DATA *ch )
{
sh_int max;
if ( IS_NPC(ch) )
return 13;
max = 25;
return URANGE( 3, ch->pcdata->perm_wis + ch->pcdata->mod_wis, max );
}
/*
* Retrieve character's current dexterity.
*/
int get_curr_dex( CHAR_DATA *ch )
{
sh_int max;
if ( IS_NPC(ch) )
return 13;
max = 25;
return URANGE( 3, ch->pcdata->perm_dex + ch->pcdata->mod_dex, max );
}
/*
* Retrieve character's current constitution.
*/
int get_curr_con( CHAR_DATA *ch )
{
sh_int max;
if ( IS_NPC(ch) )
return 13;
max = 25;
return URANGE( 3, ch->pcdata->perm_con + ch->pcdata->mod_con, max );
}
/*
* Retrieve a character's carry capacity.
*/
int can_carry_n( CHAR_DATA *ch )
{
if ( !IS_NPC(ch) && ch->level >= LEVEL_IMMORTAL )
return 1000;
if ( IS_NPC(ch) && IS_SET(ch->act, ACT_PET) )
return 0;
return MAX_WEAR + ( 2 * get_curr_dex( ch ) / 3 ) + ch->race * 2;
}
/*
* Retrieve a character's carry capacity.
*/
int can_carry_w( CHAR_DATA *ch )
{
if ( !IS_NPC(ch) && ch->level >= LEVEL_IMMORTAL )
return 1000000;
if ( IS_NPC(ch) && IS_SET(ch->act, ACT_PET) )
return 0;
return str_app[get_curr_str(ch)].carry;
}
/*
* the old way to See if a string is one of the names of an object.
*
bool is_name( const char *str, char *namelist )
{
char name[MAX_INPUT_LENGTH];
for ( ; ; )
{
namelist = one_argument( namelist, name );
if ( name[0] == '\0' )
return FALSE;
if ( !str_cmp( str, name ) )
return TRUE;
}
}
*/