abermud/DATA/
/*
** User access files routines.
*/
#include "kernel.h"
#ifdef	RCSID
static char RCS[] =
	"$Header: newuaf.c,v 1.2 89/07/03 08:18:05 rsalz Exp $";
#endif	/* RCSID */


#define PCTL_GET	0
#define PCTL_FIND	1


static FILE *
openuaf(perm)
    char *perm;
{
    FILE *i;

    if ((i = openlock(UAF_RAND, perm)) == NULL)
	crapup("Cannot access UAF\n");
    return i;
}


static FILE *
personactl(name, d, act)
    char *name;
    PERSONA *d;
    int act;
{
    FILE *a;
    char c[32], e[32];

    a = openuaf("r+");
    lowercase(strcpy(e, name));
    while (fread((char *)d, sizeof *d, 1, a) == 1)
	if (EQ(lowercase(strcpy(c, d->p_name)), e))
	    switch (act) {
	    case PCTL_GET:
		closelock(a);
		/* Hack, return pointer to closed file. */
		return a;
	    case PCTL_FIND:
		/* Back up one spot. */
		fseek(a, ftell(a) - sizeof *d, 0);
		return a;
	    }
    closelock(a);
    return NULL;
}


findpers(name, d)
    char *name;
    PERSONA *d;
{
    return personactl(name, d, PCTL_GET) != NULL;
}


delpers(name)
    char *name;
{
    FILE *i;
    PERSONA d;

    /* Was while loop but something happened and this looped forever... */
    if (i = personactl(name, &d, PCTL_FIND)) {
	mudlog("Deleted %s", lowercase(name));
	if (!EQ(lowercase(d.p_name), name))
	    crapup("Panic: Invalid Persona Delete");
	d.p_name[0] = '\0';
	d.p_level = -1;
	fwrite((char *)&d, sizeof d, 1, i);
	closelock(i);
    }
}


putpers(name, d)
    char *name;
    PERSONA *d;
{
    FILE *i;
    off_t flen;
    PERSONA s;

    if ((i = personactl(name, &s, PCTL_FIND)) == NULL) {
	flen = -1;
	if ((i = personactl("", &s, PCTL_FIND)) == NULL) {
	    i = openuaf("a");
	    flen = ftell(i);
	}
	if (fwrite((char *)d, sizeof *d, 1, i) != 1) {
	    bprintf("Save Failed - Device Full ?\n");
	    if (flen != -1)
		ftruncate(fileno(i), (off_t)flen);
	}
    }
    else
	fwrite((char *)d, sizeof *d, 1, i);
    closelock(i);
}


decpers(d, name, str, score, lev, sex)
    PERSONA *d;
    char *name;
    int *str, *score, *lev, *sex;
{
    strcpy(name, d->p_name);
    *str = d->p_strength;
    *score = d->p_score;
    *lev = d->p_level;
    *sex = d->p_sex;
}

initme()
{
    PERSONA d;
    char s[32];

    if (findpers(globme, &d)) {
	decpers(&d, s, &my_str, &my_sco, &my_lev, &my_sex);
	if (my_str >= 0)
	    return;
    }

    d.p_score = 0;
    bprintf("Creating character....\n");
    my_sco = 0;
    my_str = 40;
    my_lev = 1;
    for (my_sex = -1; my_sex < 0; ) {
	bprintf("\nSex (M/F) : ");
	pbfr();
	key_input(">", 2);
	switch (key_buff[0]) {
	case 'M': case 'm':
	    my_sex = 0;
	    break;
	case 'F': case 'f':
	    my_sex = 1;
	    break;
	default:
	    bprintf("M or F");
	}
    }
    strcpy(d.p_name, globme);
    d.p_strength = my_str;
    d.p_level = my_lev;
    d.p_sex = my_sex;
    d.p_score = my_sco;
    putpers(globme, &d);
}

saveme()
{
    PERSONA d;

    strcpy(d.p_name, globme);
    d.p_strength = pstr(mynum);
    d.p_level = plev(mynum);
    d.p_sex = psexall(mynum);
    d.p_score = pscore(mynum);
    if (!zapped) {
	bprintf("\nSaving %s\n", pname(mynum));
	putpers(globme, &d);
    }
}