abermud/DATA/
head     1.2;
access   ;
symbols  ;
locks    ; strict;
comment  @ * @;


1.2
date     89.07.03.08.18.05;  author rsalz;  state Exp;
branches ;
next     1.1;

1.1
date     89.03.13.09.37.15;  author rsalz;  state Exp;
branches ;
next     ;


desc
@@




1.2
log
@Incorporate many fixes by Jussi <eloranta@@tukki.jyu.fi>,
and some minor tweaks by Rich.
@
text
@/*
**
*/
#include "kernel.h"
#ifdef	RCSID
static char RCS[] =
	"$Header: newuaf.c,v 1.1 89/03/13 09:37:15 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);
    }
}
@


1.1
log
@Initial revision
@
text
@d7 1
a7 1
	"$Header$";
d36 1
a36 1
    a = openuaf("r");
d46 2
a47 1
		fseek(a, ftell(a) - sizeof (PERSONA), 0);
d55 1
a55 1
findpers(name, x)
d57 1
a57 1
    PERSONA *x;
d59 1
a59 1
    return personactl(name, x, PCTL_GET) != NULL;
d67 1
a67 1
    PERSONA x;
d69 2
a70 1
    while (i = personactl(name, &x, PCTL_FIND)) {
d72 1
a72 1
	if (!EQ(lowercase(x.p_name), name))
d74 3
a76 3
	x.p_name[0] = '\0';
	x.p_level = -1;
	fwrite((char *)&x, sizeof x, 1, i);
d82 1
a82 2

putpers(name, pers)
d84 1
a84 1
    PERSONA *pers;
d96 1
a96 1
	if (fwrite((char *)pers, sizeof *pers, 1, i) != 1) {
a100 2
	closelock(i);
	return;
d102 2
a103 1
    fwrite((char *)pers, sizeof *pers, 1, i);
d107 3
a109 2
decpers(pers, name, str, score, lev, sex)
    PERSONA *pers;
d113 5
a117 5
    strcpy(name, pers->p_name);
    *str = pers->p_strength;
    *score = pers->p_score;
    *lev = pers->p_level;
    *sex = pers->p_sex;
d122 1
a122 1
    PERSONA x;
d125 2
a126 2
    if (findpers(globme, &x) == 0) {
	decpers(&x, s, &my_str, &my_sco, &my_lev, &my_sex);
d131 1
a131 1
    x.p_score = 0;
d151 6
a156 6
    strcpy(x.p_name, globme);
    x.p_strength = my_str;
    x.p_level = my_lev;
    x.p_sex = my_sex;
    x.p_score = my_sco;
    putpers(globme, &x);
d161 1
a161 1
    PERSONA x;
d163 5
a167 7
    if (EQ(pname(mynum), globme))
	zapped = 1;
    strcpy(x.p_name, globme);
    x.p_strength = pstr(mynum);
    x.p_level = plev(mynum);
    x.p_sex = psexall(mynum);
    x.p_score = pscore(mynum);
d170 1
a170 1
	putpers(globme, &x);
@