#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* main header file */
#include "mud.h"
void save_pfile ( D_MOBILE *dMob );
void save_profile ( D_MOBILE *dMob );
void save_player(D_MOBILE *dMob)
{
if (!dMob) return;
save_pfile(dMob); /* saves the actual player data */
save_profile(dMob); /* saves the players profile */
}
void save_pfile(D_MOBILE *dMob)
{
char pName[20];
char pfile[256];
FILE *fp;
int size, i;
pName[0] = toupper(dMob->name[0]);
size = strlen(dMob->name);
for (i = 1; i < size; i++)
pName[i] = tolower(dMob->name[i]);
pName[i] = '\0';
/* open the pfile so we can write to it */
sprintf(pfile, "../players/%s.pfile", pName);
if ((fp = fopen(pfile, "w")) == NULL)
{
bug("Unable to write to %s's pfile", dMob->name);
return;
}
/* dump the players data into the file */
fprintf(fp, "Name %s~\n", dMob->name);
fprintf(fp, "Password %s~\n", dMob->password);
fprintf(fp, "Title %s~\n", dMob->title);
fprintf(fp, "Level %d\n", dMob->level);
fprintf(fp, "PLevel %d\n", dMob->p_level);
fprintf(fp, "Age %d\n", dMob->age);
fprintf(fp, "Experience %d\n", dMob->xp);
fprintf(fp, "HpMaStEg %d %d %d %d %d %d %d %d\n",
dMob->stats[0], dMob->stats[1], dMob->stats[2], dMob->stats[3], dMob->stats[4],
dMob->stats[5], dMob->stats[6], dMob->stats[7]);
fprintf(fp, "Attribs %d %d %d %d %d %d %d %d\n",
dMob->attribs[0], dMob->attribs[1], dMob->attribs[2], dMob->attribs[3],
dMob->attribs[4], dMob->attribs[5], dMob->attribs[6], dMob->attribs[7]);
fprintf(fp, "Attribs_max %d %d %d %d %d %d %d %d\n",
dMob->attribs_max[0], dMob->attribs_max[1], dMob->attribs_max[2], dMob->attribs_max[3],
dMob->attribs_max[4], dMob->attribs_max[5], dMob->attribs_max[6], dMob->attribs_max[7]);
fprintf(fp, "Race %d\n", dMob->race);
fprintf(fp, "Class %d\n", dMob->class);
fprintf(fp, "Locationx %d\n", dMob->x);
fprintf(fp, "Locationy %d\n", dMob->y);
fprintf(fp, "Locationz %d\n", dMob->z);
fprintf(fp, "ChunkX %d\n", dMob->i_x);
fprintf(fp, "ChunkY %d\n", dMob->i_y);
fprintf(fp, "ImmFlags %ld\n", dMob->immortal_flags);
fprintf(fp, "PlrFlags %ld\n", dMob->player_flags);
fprintf(fp, "ViewX %d\n", dMob->view_x);
fprintf(fp, "ViewY %d\n", dMob->view_y);
/* Time to save the Skills/talents/Knowledges */
for (i = 0; i < MAX_TALENTS; i++)
{
if (talent_table[i].name != NULL && dMob->talents[i] != 0)
{
fprintf(fp, "Talent %d %s\n", dMob->talents[i], talent_table[i].name);
}
}
i = 0;
/* Save Skills */
for (i = 0; i < MAX_SKILLS; i++)
{
if (skill_table[i].name != NULL && dMob->skills[i] != 0)
{
fprintf(fp, "Skill %d %s\n", dMob->skills[i], skill_table[i].name);
}
}
i = 0;
/* Save Knowledges */
for (i = 0; i < MAX_KNOW; i++)
{
if (knowledge_table[i].name != NULL && dMob->knowledge[i] != 0)
{
fprintf(fp, "Knowle %d %s\n", dMob->knowledge[i], knowledge_table[i].name);
}
}
/* terminate the file */
fprintf(fp, "%s\n", FILE_TERMINATOR);
fclose(fp);
}
D_MOBILE *load_player(char *player)
{
FILE *fp;
D_MOBILE *dMob = NULL;
char pfile[256];
char pName[20];
char *word;
bool done = FALSE, found;
int i, size;
pName[0] = toupper(player[0]);
size = strlen(player);
for (i = 1; i < size; i++)
pName[i] = tolower(player[i]);
pName[i] = '\0';
/* open the pfile so we can write to it */
sprintf(pfile, "../players/%s.pfile", pName);
if ((fp = fopen(pfile, "r")) == NULL)
return NULL;
/* create new mobile data */
if (dmobile_free == NULL)
{
if ((dMob = malloc(sizeof(*dMob))) == NULL)
{
bug("Load_player: Cannot allocate memory.");
abort();
}
}
else
{
dMob = dmobile_free;
dmobile_free = dmobile_free->next;
}
clear_mobile(dMob);
/* load data */
word = fread_word(fp);
while (!done)
{
found = FALSE;
switch (word[0])
{
case 'A':
IREAD( "Age", dMob->age );
if (compares(word, "Attribs"))
{
dMob->attribs[0] = fread_number(fp);
dMob->attribs[1] = fread_number(fp);
dMob->attribs[2] = fread_number(fp);
dMob->attribs[3] = fread_number(fp);
dMob->attribs[4] = fread_number(fp);
dMob->attribs[5] = fread_number(fp);
dMob->attribs[6] = fread_number(fp);
dMob->attribs[7] = fread_number(fp);
found = TRUE;
break;
}
if (compares(word, "Attribs_max"))
{
dMob->attribs_max[0] = fread_number(fp);
dMob->attribs_max[1] = fread_number(fp);
dMob->attribs_max[2] = fread_number(fp);
dMob->attribs_max[3] = fread_number(fp);
dMob->attribs_max[4] = fread_number(fp);
dMob->attribs_max[5] = fread_number(fp);
dMob->attribs_max[6] = fread_number(fp);
dMob->attribs_max[7] = fread_number(fp);
found = TRUE;
break;
}
break;
case 'C':
IREAD( "ChunkX", dMob->i_x );
IREAD( "ChunkY", dMob->i_y );
IREAD( "Class", dMob->class );
break;
case 'E':
EREAD( "EOF" );
IREAD( "Experience", dMob->xp );
break;
case 'H':
VREAD( "HpMaStEg", dMob );
break;
case 'I':
IREAD( "ImmFlags", dMob->immortal_flags );
break;
case 'L':
IREAD( "Level", dMob->level );
IREAD( "Locationx", dMob->x );
IREAD( "Locationy", dMob->y );
IREAD( "Locationz", dMob->z );
break;
case 'K':
KREAD( "Knowle", dMob );
break;
case 'N':
SREAD( "Name", dMob->name );
break;
case 'P':
SREAD( "Password", dMob->password );
IREAD( "PlrFlags", dMob->player_flags );
IREAD( "PLevel", dMob->p_level );
break;
case 'R':
IREAD( "Race", dMob->race );
break;
case 'S':
LREAD( "Skill", dMob );
break;
case 'T':
SREAD( "Title", dMob->title );
TREAD( "Talent", dMob );
break;
case 'V':
IREAD( "ViewX", dMob->view_x );
IREAD( "ViewY", dMob->view_y );
break;
}
if (!found)
{
bug("Load_player: unexpected '%s' in %s's pfile.", word, player);
free_mobile(dMob);
}
/* read one more */
if (!done) word = fread_word(fp);
}
fclose(fp);
return dMob;
}
/*
* This function loads a players profile, and stores
* it in a mobile_data... DO NOT USE THIS DATA FOR
* ANYTHING BUT CHECKING PASSWORDS OR SIMILAR.
*/
D_MOBILE *load_profile(char *player)
{
FILE *fp;
D_MOBILE *dMob = NULL;
char pfile[256];
char pName[20];
char *word;
bool done = FALSE, found;
int i, size;
pName[0] = toupper(player[0]);
size = strlen(player);
for (i = 1; i < size; i++)
pName[i] = tolower(player[i]);
pName[i] = '\0';
/* open the pfile so we can write to it */
sprintf(pfile, "../players/%s.profile", pName);
if ((fp = fopen(pfile, "r")) == NULL)
return NULL;
/* create new mobile data */
if (dmobile_free == NULL)
{
if ((dMob = malloc(sizeof(*dMob))) == NULL)
{
bug("Load_profile: Cannot allocate memory.");
abort();
}
}
else
{
dMob = dmobile_free;
dmobile_free = dmobile_free->next;
}
clear_mobile(dMob);
/* load data */
word = fread_word(fp);
while (!done)
{
found = FALSE;
switch (word[0])
{
case 'E':
if (compares(word, "EOF")) {done = TRUE; found = TRUE; break;}
break;
case 'N':
SREAD( "Name", dMob->name );
break;
case 'P':
SREAD( "Password", dMob->password );
break;
}
if (!found)
{
bug("Load_player: unexpected '%s' in %s's pfile.", word, player);
free_mobile(dMob);
return NULL;
}
/* read one more */
if (!done) word = fread_word(fp);
}
fclose(fp);
return dMob;
}
/*
* This file stores only data vital to load
* the character, and check for things like
* password and other such data.
*/
void save_profile(D_MOBILE *dMob)
{
char pfile[256];
char pName[20];
FILE *fp;
int size, i;
pName[0] = toupper(dMob->name[0]);
size = strlen(dMob->name);
for (i = 1; i < size; i++)
pName[i] = tolower(dMob->name[i]);
pName[i] = '\0';
/* open the pfile so we can write to it */
sprintf(pfile, "../players/%s.profile", pName);
if ((fp = fopen(pfile, "w")) == NULL)
{
bug("Unable to write to %s's pfile", dMob->name);
return;
}
/* dump the players data into the file */
fprintf(fp, "Name %s~\n", dMob->name);
fprintf(fp, "Password %s~\n", dMob->password);
/* terminate the file */
fprintf(fp, "%s\n", FILE_TERMINATOR);
fclose(fp);
}