Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

NetHack 2.3 Update Pt. 12a of 12

6 views
Skip to first unread message

Mike Stephenson

unread,
Apr 15, 1988, 7:42:25 AM4/15/88
to

This shar contains all of the files on which "diff" produced a
patch listing larger than the original file. They are included in full.

The shell script "Update.sh" will automatically move all of the
files these are intended to replace to a "filename.orig" format name.
Please be careful if you are on a USG system, as some of the filenames are
very long, and Update.sh may actually end up clobbering things.

MAKE A BACKUP BEFORE YOU DO ANYTHING!!!!!!!!!!

README BEFORE YOU LEAP!!!!!!

-------------------------------cut here---------------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# decl.c.new
# extern.h.new
# mkroom.h.new
# nethack.cnf.new
# o_init.c.new
# obj.h.new
# permonst.h.new
# rnd.c.new
# termcap.c.new
# topten.c.new
# This archive created: Mon Apr 4 08:52:41 1988
export PATH; PATH=/bin:$PATH
echo shar: extracting "'decl.c.new'" '(2357 characters)'
if test -f 'decl.c.new'
then
echo shar: will not over-write existing file "'decl.c.new'"
else
cat << \SHAR_EOF > 'decl.c.new'
/* SCCS Id: @(#)decl.c 2.3 87/12/16
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

#include "hack.h"
char nul[40]; /* contains zeros */
char plname[PL_NSIZ]; /* player name */

#ifdef GRAPHICS
struct symbols defsyms = {
' ', '|', '-', '-', '-', '-', '-', '+', '.', '#', '<', '>', '^',
# ifdef FOUNTAINS
'}', '{',
# endif
# ifdef NEWCLASS
'\\',
# endif
# ifdef SPIDERS
'"',
# endif
#ifdef SINKS
'#',
#endif
};

struct symbols showsyms; /* will contain the symbols actually used */

#endif /* GRAPHICS /**/

#ifdef DGK
char hackdir[PATHLEN]; /* where rumors, help, record are */
char levels[PATHLEN]; /* where levels are */
char lock[FILENAME]; /* pathname of level files */
char permbones[PATHLEN]; /* where permanent copy of bones go */
int ramdisk = FALSE; /* whether to copy bones to levels or not */
int saveprompt = TRUE;
char *alllevels = "levels.*";
char *allbones = "bones.*";
char *configfile = "NetHack.cnf"; /* read by read_config_file() */
#else
char lock[PL_NSIZ+4] = "1lock"; /* long enough for login name .99 */
#endif

boolean in_mklev, restoring;
struct rm levl[COLNO][ROWNO]; /* level map */

#ifndef QUEST
#include "mkroom.h"
struct mkroom rooms[MAXNROFROOMS+1];
coord doors[DOORMAX];
#endif

struct monst *fmon = 0;
struct trap *ftrap = 0;
struct gold *fgold = 0;
struct obj *fobj = 0, *fcobj = 0, *invent = 0, *uwep = 0, *uarm = 0,
#ifdef SHIRT
*uarmu = 0, /* under-wear, so to speak */
#endif
*uarm2 = 0, *uarmh = 0, *uarms = 0, *uarmg = 0, *uright = 0,
*uleft = 0, *uchain = 0, *uball = 0;
struct flag flags;
struct you u;

#ifdef SPELLS
struct spell spl_book[MAXSPELL + 1];
#endif

struct monst youmonst; /* dummy; used as return value for boomhit */

xchar dlevel = 1;
xchar xupstair, yupstair, xdnstair, ydnstair;
char *save_cm = 0, *killer, *nomovemsg;

long moves = 1;
long wailmsg = 0;
int multi = 0;
char *occtxt;
#ifdef DGKMOD
int occtime;
#endif
#ifdef REDO
int in_doagain = FALSE;
#endif

char *HI, *HE; /* set up in termcap.c */
#ifdef MSDOSCOLOR
char *HI_MON, *HI_OBJ; /* set up in termcap.c */
#endif

char genocided[60];
char fut_geno[60];
#ifdef KAA
boolean stoned; /* done to monsters hit by 'c' */
boolean unweapon;
#endif

xchar curx,cury;
xchar seelx, seehx, seely, seehy; /* corners of lit room */

coord bhitpos;

char quitchars[] = " \r\n\033";
SHAR_EOF
if test 2357 -ne "`wc -c < 'decl.c.new'`"
then
echo shar: error transmitting "'decl.c.new'" '(should have been 2357 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'extern.h.new'" '(1501 characters)'
if test -f 'extern.h.new'
then
echo shar: will not over-write existing file "'extern.h.new'"
else
cat << \SHAR_EOF > 'extern.h.new'
/* SCCS Id: @(#)extern.h 2.3 87/12/12
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

#include "config.h"

/*
* I have been told, that in Sys V R3.1, this has to be commented out.
*/
#ifndef MSDOS
extern char *sprintf();
#endif

extern long *alloc();

extern xchar xdnstair, ydnstair, xupstair, yupstair; /* stairs up and down. */

extern xchar dlevel;

#ifdef SPELLS
#include "spell.h"
extern struct spell spl_book[]; /* sized in decl.c */
#endif

extern int occtime;
extern char *occtxt; /* defined when occupation != NULL */

#ifdef REDO
extern int in_doagain;
#endif

extern char *HI, *HE; /* set up in termcap.c */
#ifdef MSDOSCOLOR
extern char *HI_MON, *HI_OBJ; /* set up in termcap.c */
#endif

#include "obj.h"
extern struct obj *invent, *uwep, *uarm, *uarm2, *uarmh, *uarms, *uarmg,
#ifdef SHIRT
*uarmu, /* under-wear, so to speak */
#endif
*uleft, *uright, *fcobj;
extern struct obj *uchain; /* defined iff PUNISHED */
extern struct obj *uball; /* defined if PUNISHED */
struct obj *o_at(), *getobj(), *sobj_at();

extern char *traps[];
extern char *monnam(), *Monnam(), *amonnam(), *Amonnam(),
*doname(), *aobjnam();
extern char readchar();
extern char vowels[];

#include "you.h"

extern struct you u;

extern xchar curx,cury; /* cursor location on screen */

extern xchar seehx,seelx,seehy,seely; /* where to see*/
extern char *save_cm,*killer;

extern xchar dlevel, maxdlevel; /* dungeon level */

extern long moves;

extern int multi;

extern char lock[];
SHAR_EOF
if test 1501 -ne "`wc -c < 'extern.h.new'`"
then
echo shar: error transmitting "'extern.h.new'" '(should have been 1501 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'mkroom.h.new'" '(2085 characters)'
if test -f 'mkroom.h.new'
then
echo shar: will not over-write existing file "'mkroom.h.new'"
else
cat << \SHAR_EOF > 'mkroom.h.new'
/* SCCS Id: @(#)mkroom.h 2.3 87/12/12
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

/* mkroom.h - types and structures for room and shop initialization */

struct mkroom {
schar lx,hx,ly,hy; /* usually xchar, but hx may be -1 */
schar rtype,rlit,doorct,fdoor;
};

struct shclass {
char *name; /* name of the shop type */
char symb; /* this identifies the shop type */
int prob; /* the shop type probability in % */
schar dist; /* artifact placement type */
#define D_SCATTER 0 /* normal placement */
#define D_SHOP 1 /* shop-like placement */
#define D_TEMPLE 2 /* temple-like placement */
struct itp {
int iprob; /* probability of an item type */
int itype; /* item type: if >=0 a class, if < 0 a specific item */
} iprobs[5];
char **shknms; /* string list of shopkeeper names for this type */
};
extern struct shclass shtypes[]; /* defined in shknam.c */

#define MAXNROFROOMS 15
extern struct mkroom rooms[MAXNROFROOMS+1];

#define DOORMAX 100
extern coord doors[DOORMAX];

/* values for rtype in the room definition structure */
#define OROOM 0 /* ordinary room */
#define COURT 2 /* contains a throne */
#define SWAMP 3 /* contains pools */
#define VAULT 4 /* contains piles of gold */
#define BEEHIVE 5 /* contains killer bees and royal jelly */
#define MORGUE 6 /* contains corpses, undead and ghosts */
#define BARRACKS 7 /* contains soldiers and their gear */
#define ZOO 8 /* floor covered with treasure and monsters */
#define SHOPBASE 9 /* everything above this is a shop */

#define IS_SHOP(x) ((x).rtype >= SHOPBASE)

/* mkshop.c entry points (should become mkroom.c in next major release) */
extern void mkroom(); /* make and stock a room of a given type */
extern boolean nexttodoor(); /* TRUE if adjacent to a door */
extern boolean has_dnstairs(); /* TRUE if given room has a down staircase */
extern boolean has_upstairs(); /* TRUE if given room has an up staircase */
extern int dist2(); /* Euclidean square-of-distance function */
extern struct permonst *courtmon(); /* generate a court monster */
SHAR_EOF
if test 2085 -ne "`wc -c < 'mkroom.h.new'`"
then
echo shar: error transmitting "'mkroom.h.new'" '(should have been 2085 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'nethack.cnf.new'" '(618 characters)'
if test -f 'nethack.cnf.new'
then
echo shar: will not over-write existing file "'nethack.cnf.new'"
else
cat << \SHAR_EOF > 'nethack.cnf.new'
#
# nethack.cnf for NetHack release 2.3
#
HACKDIR=c:\games\nethack
SAVE=c:\games\nethack\save
LEVELS=c:\games\nethack\save
OPTIONS=male,rawio,IBMBIOS,no rest_on_space,time,packorder:"/!?=)[%(*0
OPTIONS=silent,endgame:10t/0a
# The 9 GRAPHICS characters are:
# vertical wall, horizontal wall, top left corner, top right corner
# bottom left corner, bottom right corner, door, floor, corridor
# An example using the IBM graphics character set.
# from hack.35: GRAPHICS = 186 205 201 187 200 188 206 249 177
# from hack.36: GRAPHICS = 179 196 218 191 192 217 206 250 176
GRAPHICS = 032 186 205 201 187 200 188 206 249 177
SHAR_EOF
if test 618 -ne "`wc -c < 'nethack.cnf.new'`"
then
echo shar: error transmitting "'nethack.cnf.new'" '(should have been 618 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'o_init.c.new'" '(6079 characters)'
if test -f 'o_init.c.new'
then
echo shar: will not over-write existing file "'o_init.c.new'"
else
cat << \SHAR_EOF > 'o_init.c.new'
/* SCCS Id: @(#)o_init.c 2.3 88/01/24
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

#include "config.h" /* for typedefs */
#include "objects.h"
#include "onames.h" /* for LAST_GEM */
extern char *index();

int
letindex(let) register char let; {
register int i = 0;
register char ch;
while((ch = obj_symbols[i++]) != 0)
if(ch == let) return(i);
return(0);
}

init_objects(){
register int i, j, first, last, sum, end;
register char let, *tmp;

/* bug fix to prevent "initialization error" abort on Intel Xenix.
* reported by mikew@semike
*/
for(i = 0; i != sizeof(obj_symbols); i++)
bases[i] = 0;

/* init base; if probs given check that they add up to 100,
otherwise compute probs; shuffle descriptions */
end = SIZE(objects);
first = 0;
while( first < end ) {
let = objects[first].oc_olet;
last = first+1;
while(last < end && objects[last].oc_olet == let
&& objects[last].oc_name != NULL) last++;
i = letindex(let);
if((!i && let != ILLOBJ_SYM) || bases[i] != 0)
error("initialization error");
bases[i] = first;

if(let == GEM_SYM) setgemprobs();
check:
sum = 0;
for(j = first; j < last; j++) sum += objects[j].oc_prob;
if(sum == 0) {
for(j = first; j < last; j++)
objects[j].oc_prob = (100+j-first)/(last-first);
goto check;
}
if(sum != 100)
error("init-prob error for %c (%d%%)", let, sum);

if(objects[first].oc_descr != NULL && let != TOOL_SYM){
/* shuffle, also some additional descriptions */
while(last < end && objects[last].oc_olet == let)
last++;
j = last;
if (let == GEM_SYM) {
while(--j > first)
/* NOTE: longest color name must be default */
if(!strcmp(objects[j].oc_name,"turquoise")) {
if(rn2(2)) /* change from green? */
strcpy(objects[j].oc_descr,"blue");
} else if (!strcmp(objects[j].oc_name,"aquamarine")) {
if(rn2(2)) /* change from green? */
strcpy(objects[j].oc_descr,"blue");
} else if (!strcmp(objects[j].oc_name,"fluorite")) {
switch (rn2(4)) { /* change from violet? */
case 0: break;
case 1:
strcpy(objects[j].oc_descr,"blue");
break;
case 2:
strcpy(objects[j].oc_descr,"white");
break;
case 3:
strcpy(objects[j].oc_descr,"green");
break;
}
}
} else
while(--j > first) {
i = first + rn2(j+1-first);
tmp = objects[j].oc_descr;
objects[j].oc_descr = objects[i].oc_descr;
objects[i].oc_descr = tmp;
}
}
first = last;
}
}

probtype(let) register char let; {
register int i = bases[letindex(let)];
register int prob = rn2(100);
while((prob -= objects[i].oc_prob) >= 0) i++;
if(objects[i].oc_olet != let || !objects[i].oc_name)
panic("probtype(%c) error, i=%d", let, i);
return(i);
}

setgemprobs()
{
register int j,first;
extern xchar dlevel;

first = bases[letindex(GEM_SYM)];

for(j = 0; j < 9-dlevel/3; j++)
objects[first+j].oc_prob = 0;
first += j;
if(first >= LAST_GEM || first >= SIZE(objects) ||
objects[first].oc_olet != GEM_SYM ||
objects[first].oc_name == NULL)
printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
first, j, LAST_GEM);
for(j = first; j < LAST_GEM; j++)
objects[j].oc_prob = (18+j-first)/(LAST_GEM-first);
}

oinit() /* level dependent initialization */
{
setgemprobs();
}

extern long *alloc();

savenames(fd) register fd; {
register int i;
unsigned len;
struct objclass *now = &objects[0];
bwrite(fd, (char *) &now, sizeof now);
bwrite(fd, (char *) bases, sizeof bases);
bwrite(fd, (char *) objects, sizeof objects);
/* as long as we use only one version of Hack/Quest we
need not save oc_name and oc_descr, but we must save
oc_uname for all objects */
for(i=0; i < SIZE(objects); i++) {
if(objects[i].oc_uname) {
len = strlen(objects[i].oc_uname)+1;
bwrite(fd, (char *) &len, sizeof len);
bwrite(fd, objects[i].oc_uname, len);
}
}
}

restnames(fd) register fd; {
register int i;
unsigned len;
struct objclass *then;
long differ;
mread(fd, (char *) &then, sizeof then);
mread(fd, (char *) bases, sizeof bases);
mread(fd, (char *) objects, sizeof objects);
#ifndef MSDOS
differ = (char *)&objects[0] - (char *)then;
#else
differ = (long)&objects[0] - (long)then;
#endif
for(i=0; i < SIZE(objects); i++) {
if (objects[i].oc_name) {
#ifndef MSDOS
objects[i].oc_name += differ;
#else
objects[i].oc_name =
(char *)((long)(objects[i].oc_name) + differ);
#endif
}
if (objects[i].oc_descr) {
#ifndef MSDOS
objects[i].oc_descr += differ;
#else
objects[i].oc_descr =
(char *)((long)(objects[i].oc_descr) + differ);
#endif
}
if (objects[i].oc_uname) {
mread(fd, (char *) &len, sizeof len);
objects[i].oc_uname = (char *) alloc(len);
mread(fd, objects[i].oc_uname, len);
}
}
}

dodiscovered() /* free after Robert Viduya */
{
extern char *typename();
register int i, end;
int ct = 0;
#ifdef DGKMOD
char class = -1;
extern char *let_to_name();
#endif

cornline(0, "Discoveries");

end = SIZE(objects);
for (i = 0; i < end; i++) {
if (interesting_to_discover (i)) {
ct++;
#ifdef DGKMOD
if (objects[i].oc_olet != class) {
class = objects[i].oc_olet;
cornline(1, let_to_name(class));
}
#endif
cornline(1, typename(i));
}
}
if (ct == 0) {
pline ("You haven't discovered anything yet...");
cornline(3, (char *) 0);
} else
cornline(2, (char *) 0);

return(0);
}

interesting_to_discover(i)
register int i;
{
return(
objects[i].oc_uname != NULL ||
(objects[i].oc_name_known && objects[i].oc_descr != NULL)
);
}

init_corpses() {

#ifdef SPIDERS
strcpy(objects[DEAD_GIANT_SPIDER].oc_name, "dead giant spider");
#endif

#ifdef KOPS
strcpy(objects[DEAD_KOP].oc_name, "dead Kop");
# endif

#ifdef ROCKMOLE
strcpy(objects[DEAD_ROCKMOLE].oc_name, "dead rockmole");
#endif

#ifndef KAA
strcpy(objects[DEAD_QUASIT].oc_name, "dead quasit");
strcpy(objects[DEAD_VIOLET_FUNGI].oc_name, "dead violet fungi");
#endif
return(0);
}
SHAR_EOF
if test 6079 -ne "`wc -c < 'o_init.c.new'`"
then
echo shar: error transmitting "'o_init.c.new'" '(should have been 6079 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'obj.h.new'" '(1800 characters)'
if test -f 'obj.h.new'
then
echo shar: will not over-write existing file "'obj.h.new'"
else
cat << \SHAR_EOF > 'obj.h.new'
/* SCCS Id: @(#)obj.h 2.3 88/01/21
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

#ifndef OBJ_H
#define OBJ_H

struct obj {
struct obj *nobj;
unsigned o_id;
unsigned o_cnt_id; /* id of container object is in */
xchar ox,oy;
xchar odx,ody;
unsigned otyp;
#ifdef DGK
unsigned int owt;
unsigned int quan;
#else
uchar owt;
uchar quan; /* use oextra for tmp gold objects */
#endif
schar spe; /* quality of weapon, armor or ring (+ or -)
number of charges for wand ( >= -1 )
special for uball and amulet %% BAH */
char olet;
char invlet;
Bitfield(oinvis,1); /* not yet implemented */
Bitfield(odispl,1);
Bitfield(known,1); /* exact nature known */
Bitfield(dknown,1); /* color or text known */
Bitfield(cursed,1);
Bitfield(unpaid,1); /* on some bill */
Bitfield(rustfree,1);
Bitfield(no_charge, 1); /* if shk shouldn't charge for this */
Bitfield(onamelth,6);
long age; /* creation date */
long owornmask;
#define W_ARM 01L
#define W_ARM2 02L
#define W_ARMH 04L
#define W_ARMS 010L
#define W_ARMG 020L
#define W_TOOL 040L /* wearing a blindfold or badge */
#ifdef SHIRT
#define W_ARMU 0100L
#define W_ARMOR (W_ARM | W_ARM2 | W_ARMH | W_ARMS | W_ARMG | W_ARMU)
#else
#define W_ARMOR (W_ARM | W_ARM2 | W_ARMH | W_ARMS | W_ARMG)
#endif
#define W_RINGL 010000L /* make W_RINGL = RING_LEFT (see uprop) */
#define W_RINGR 020000L
#define W_RING (W_RINGL | W_RINGR)
#define W_WEP 01000L
#define W_BALL 02000L
#define W_CHAIN 04000L
long oextra[1]; /* used for name of ordinary objects - length
is flexible; amount for tmp gold objects */
};

extern struct obj *fobj;

#define newobj(xl) (struct obj *) alloc((unsigned)(xl) + sizeof(struct obj))
#define ONAME(otmp) ((char *) otmp->oextra)
#define OGOLD(otmp) (otmp->oextra[0])

#endif
SHAR_EOF
if test 1800 -ne "`wc -c < 'obj.h.new'`"
then
echo shar: error transmitting "'obj.h.new'" '(should have been 1800 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'permonst.h.new'" '(1431 characters)'
if test -f 'permonst.h.new'
then
echo shar: will not over-write existing file "'permonst.h.new'"
else
cat << \SHAR_EOF > 'permonst.h.new'
/* SCCS Id: @(#)permonst.h 2.3 87/12/16
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

struct permonst {
char *mname,mlet;
schar mlevel,mmove,ac,mr,damn,damd;
unsigned pxlth;
};

extern struct permonst mons[];
#define PM_GNOME &mons[1]
#define PM_HOBGOBLIN &mons[2]
#ifndef KOPS
#define PM_KOBOLD &mons[4]
#endif
#define PM_ACID_BLOB &mons[7]
#ifdef ROCKMOLE
#define PM_ORC &mons[10]
#define PM_ZOMBIE &mons[12]
#else
#define PM_ORC &mons[11]
#define PM_ZOMBIE &mons[13]
#endif
#define PM_PIERCER &mons[17]
#define PM_CENTAUR &mons[22]
#define PM_KILLER_BEE &mons[26]
#ifdef SPIDERS
#define PM_SPIDER &mons[31]
#endif
#define PM_WRAITH &mons[33]
#define PM_MIMIC &mons[37]
#define PM_TROLL &mons[38]
#define PM_VAMPIRE &mons[43]
#define PM_XORN &mons[44]
#define PM_CHAMELEON &mons[47]
#define PM_DRAGON &mons[48]
#define PM_ETTIN &mons[49]
/* The ones below changed to include giants. */
#define PM_DEMON &mons[55]

#define PM_MINOTAUR &mons[56] /* last in mons array */
#define PM_SHK &mons[57] /* very last */

#define PM_GHOST &pm_ghost
#define PM_EEL &pm_eel
#define PM_WIZARD &pm_wizard
#ifdef RPH
#define PM_MEDUSA &pm_medusa
#endif
#ifdef SAC
#define PM_SOLDIER &pm_soldier
#endif
#define CMNUM 56 /* number of common monsters */
#ifdef STOOGES
#define PM_LARRY &pm_larry
#define PM_CURLY &pm_curly
#define PM_MOE &pm_moe
#endif
#define PM_DJINNI &pm_djinni
#define PM_GREMLIN &pm_gremlin
SHAR_EOF
if test 1431 -ne "`wc -c < 'permonst.h.new'`"
then
echo shar: error transmitting "'permonst.h.new'" '(should have been 1431 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'rnd.c.new'" '(897 characters)'
if test -f 'rnd.c.new'
then
echo shar: will not over-write existing file "'rnd.c.new'"
else
cat << \SHAR_EOF > 'rnd.c.new'
/* SCCS Id: @(#)rnd.c 2.3 87/12/12
*/
#include "config.h"
/* rand() is either random() or lrand48() - see config.h. */
#ifdef UNIX
#define RND(x) (rand() % (x))
#else
/* Good luck: the bottom order bits are cyclic. */
#define RND(x) ((rand()>>3) % (x))
#endif

rn1(x,y) /* y <= rn1(x,y) < (y+x) */
register x,y;
{
return(RND(x)+y);
}

rn2(x) /* 0 <= rn2(x) < x */
register x;
{
return(RND(x));
}

rnd(x) /* 1 <= rnd(x) <= x */
register x;
{
return(RND(x)+1);
}

d(n,x) /* n <= d(n,x) <= (n*x) */
register n,x;
{
register tmp = n;

while(n--) tmp += RND(x);
return(tmp);
}

rne(x) /* by stewr 870807 */
register x;
{
register tmp = 1;
while(!rn2(x)) tmp++;
return(tmp);
}

rnz(i)
int i;
{
register long x = i;
register long tmp = 1000;
tmp += rn2(1000);
tmp *= rne(4);
if (rn2(2)) { x *= tmp; x /= 1000; }
else { x *= 1000; x /= tmp; }
return((int)x);
}
SHAR_EOF
if test 897 -ne "`wc -c < 'rnd.c.new'`"
then
echo shar: error transmitting "'rnd.c.new'" '(should have been 897 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'termcap.c.new'" '(8638 characters)'
if test -f 'termcap.c.new'
then
echo shar: will not over-write existing file "'termcap.c.new'"
else
cat << \SHAR_EOF > 'termcap.c.new'
/* SCCS Id: @(#)termcap.c 2.3 87/12/12
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

#include <stdio.h>
#include <ctype.h> /* for isdigit() */
#include "hack.h" /* for ROWNO, COLNO, *HI, *HE */
#ifdef GENIX
#define void int /* jhn - mod to prevent compiler from bombing */
#endif

extern char *tgetstr(), *tgoto(), *getenv();
extern long *alloc();

#ifndef SYSV
# ifndef LINT
extern /* it is defined in libtermlib (libtermcap) */
# endif
short ospeed; /* terminal baudrate; used by tputs */
#else
short ospeed = 0; /* gets around "not defined" error message */
#endif

static char tbuf[512];
static char *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE;
static char *VS, *VE, *US, *UE;
static int SG;
static char PC = '\0';
char *CD; /* tested in pri.c: docorner() */
int CO, LI; /* used in pri.c and whatis.c */

#if defined(MSDOS) && !defined(TERMLIB)
static char tgotobuf[20];
#define tgoto(fmt, x, y) (sprintf(tgotobuf, fmt, y+1, x+1), tgotobuf)
#endif /* MSDOS /**/

startup()
{
register char *term;
register char *tptr;
char *tbufptr, *pc;
register int i;

tptr = (char *) alloc(1024);

tbufptr = tbuf;
if(!(term = getenv("TERM")))
error("Can't get TERM.");
if(!strncmp(term, "5620", 4))
flags.nonull = 1; /* this should be a termcap flag */
if(tgetent(tptr, term) < 1)
error("Unknown terminal type: %s.", term);
if(pc = tgetstr("pc", &tbufptr))
PC = *pc;
if(!(BC = tgetstr("bc", &tbufptr))) {
if(!tgetflag("bs"))
error("Terminal must backspace.");
BC = tbufptr;
tbufptr += 2;
*BC = '\b';
}
HO = tgetstr("ho", &tbufptr);
CO = tgetnum("co");
LI = tgetnum("li");
if(CO < COLNO || LI < ROWNO+2)
setclipped();
if(!(CL = tgetstr("cl", &tbufptr)))
error("Hack needs CL.");
ND = tgetstr("nd", &tbufptr);
if(tgetflag("os"))
error("Hack can't have OS.");
CE = tgetstr("ce", &tbufptr);
UP = tgetstr("up", &tbufptr);
/* It seems that xd is no longer supported, and we should use
a linefeed instead; unfortunately this requires resetting
CRMOD, and many output routines will have to be modified
slightly. Let's leave that till the next release. */
XD = tgetstr("xd", &tbufptr);
/* not: XD = tgetstr("do", &tbufptr); */
if(!(CM = tgetstr("cm", &tbufptr))) {
if(!UP && !HO)
error("Hack needs CM or UP or HO.");
printf("Playing hack on terminals without cm is suspect...\n");
getret();
}
SO = tgetstr("so", &tbufptr);
SE = tgetstr("se", &tbufptr);
US = tgetstr("us", &tbufptr);
UE = tgetstr("ue", &tbufptr);
SG = tgetnum("sg"); /* -1: not fnd; else # of spaces left by so */
if(!SO || !SE || (SG > 0)) SO = SE = US = UE = "";
TI = tgetstr("ti", &tbufptr);
TE = tgetstr("te", &tbufptr);
VS = VE = "";
#if defined(SORTING) || defined(MSDOSCOLOR)
/* Get rid of padding numbers for HI and HE. Hope they
* aren't really needed!!! HI and HE are ouputted to the
* pager as a string - so how can you send it NULLS???
* -jsb
*/
HI = (char *) alloc((unsigned)(strlen(SO)+1));
HE = (char *) alloc((unsigned)(strlen(SE)+1));
i = 0;
while(isdigit(SO[i])) i++;
strcpy(HI, &SO[i]);
i = 0;
while(isdigit(SE[i])) i++;
strcpy(HE, &SE[i]);
#endif
CD = tgetstr("cd", &tbufptr);
set_whole_screen(); /* uses LI and CD */
if(tbufptr-tbuf > sizeof(tbuf)) error("TERMCAP entry too big...\n");
free(tptr);
#ifdef MSDOSCOLOR
init_hilite();
#endif
}

start_screen()
{
xputs(TI);
xputs(VS);
#ifdef DGK
/* Select normal ASCII and line drawing character sets.
*/
if (flags.DECRainbow)
xputs("\033(B\033)0");
#endif
}

end_screen()
{
clear_screen();
xputs(VE);
xputs(TE);
}

/* Cursor movements */
extern xchar curx, cury;

curs(x, y)
register int x, y; /* not xchar: perhaps xchar is unsigned and
curx-x would be unsigned as well */
{

if (y == cury && x == curx)
return;
if(!ND && (curx != x || x <= 3)) { /* Extremely primitive */
cmov(x, y); /* bunker!wtm */
return;
}
if(abs(cury-y) <= 3 && abs(curx-x) <= 3)
nocmov(x, y);
else if((x <= 3 && abs(cury-y)<= 3) || (!CM && x<abs(curx-x))) {
(void) putchar('\r');
curx = 1;
nocmov(x, y);
} else if(!CM) {
nocmov(x, y);
} else
cmov(x, y);
}

nocmov(x, y)
{
if (cury > y) {
if(UP) {
while (cury > y) { /* Go up. */
xputs(UP);
cury--;
}
} else if(CM) {
cmov(x, y);
} else if(HO) {
home();
curs(x, y);
} /* else impossible("..."); */
} else if (cury < y) {
if(XD) {
while(cury < y) {
xputs(XD);
cury++;
}
} else if(CM) {
cmov(x, y);
} else {
while(cury < y) {
xputc('\n');
curx = 1;
cury++;
}
}
}
if (curx < x) { /* Go to the right. */
if(!ND) cmov(x, y); else /* bah */
/* should instead print what is there already */
while (curx < x) {
xputs(ND);
curx++;
}
} else if (curx > x) {
while (curx > x) { /* Go to the left. */
xputs(BC);
curx--;
}
}
}

cmov(x, y)
register x, y;
{
xputs(tgoto(CM, x-1, y-1));
cury = y;
curx = x;
}

xputc(c) char c; {
(void) fputc(c, stdout);
}

xputs(s) char *s; {
#if defined(MSDOS) && !defined(TERMLIB)
fputs(s, stdout);
#else
tputs(s, 1, xputc);
#endif
}

cl_end() {
if(CE)
xputs(CE);
else { /* no-CE fix - free after Harold Rynes */
/* this looks terrible, especially on a slow terminal
but is better than nothing */
register cx = curx, cy = cury;

while(curx < COLNO) {
xputc(' ');
curx++;
}
curs(cx, cy);
}
}

clear_screen() {
xputs(CL);
home();
}

home()
{
if(HO)
xputs(HO);
else if(CM)
xputs(tgoto(CM, 0, 0));
else
curs(1, 1); /* using UP ... */
curx = cury = 1;
}

standoutbeg()
{
if(SO) xputs(SO);
}

standoutend()
{
if(SE) xputs(SE);
}

backsp()
{
xputs(BC);
curx--;
}

bell()
{
#ifdef DGKMOD
if (flags.silent) return;
#endif /* DGKMOD /**/
(void) putchar('\007'); /* curx does not change */
(void) fflush(stdout);
}

static short tmspc10[] = { /* from termcap */
0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5
};

delay_output() {
/* delay 50 ms - could also use a 'nap'-system call */
/* BUG: if the padding character is visible, as it is on the 5620
then this looks terrible. */
#ifdef MSDOS
/* simulate the delay with "cursor here" */
register i;
for (i = 0; i < 3; i++) {
cmov(curx, cury);
(void) fflush(stdout);
}
#else /* MSDOS /**/
if(!flags.nonull)
#ifdef TERMINFO
tputs("$<50>", 1, xputs);
#else
tputs("50", 1, xputs);
#endif
/* cbosgd!cbcephus!pds for SYS V R2 */
/* is this terminfo, or what? */
/* tputs("$<50>", 1, xputc); */

else if(ospeed > 0 || ospeed < SIZE(tmspc10)) if(CM) {
/* delay by sending cm(here) an appropriate number of times */
register int cmlen = strlen(tgoto(CM, curx-1, cury-1));
register int i = 500 + tmspc10[ospeed]/2;

while(i > 0) {
cmov(curx, cury);
i -= cmlen*tmspc10[ospeed];
}
}
#endif /* MSDOS /**/
}

cl_eos() /* free after Robert Viduya */
{ /* must only be called with curx = 1 */

if(CD)
xputs(CD);
else {
register int cx = curx, cy = cury;
while(cury <= LI-2) {
cl_end();
xputc('\n');
curx = 1;
cury++;
}
cl_end();
curs(cx, cy);
}
}

#ifdef MSDOSCOLOR
/* Sets up highlighting, using ANSI escape sequences, for monsters and
* objects (highlight code found in pri.c).
* The termcap entry for HI (from SO) is scanned to find the background
* color. If everything is o.k., monsters are displayed in the color
* used to define HILITE_MONSTER and objects are displayed in the color
* used to define HILITE_OBJECT. */

#define ESC 0x1b
#define NONE 0
#define HIGH_INTENSITY 1
#define BLACK 0
#define RED 1
#define GREEN 2
#define YELLOW 3
#define BLUE 4
#define MAGENTA 5
#define CYAN 6
#define WHITE 7

#define HILITE_ATTRIB NONE
#define HILITE_MONSTER RED
#define HILITE_OBJECT YELLOW

init_hilite()
{
register int backg, len, mfore, ofore;

backg = BLACK;
mfore = ofore = WHITE;
/* find the background color, HI[len] == 'm' */
len = strlen(HI) - 1;
if (len > 3)
if (isdigit(HI[len-1]) &&
isdigit(HI[len-2]) && HI[len-2] != 3) {
backg = HI[len-1] - '0';
mfore = HILITE_MONSTER;
ofore = HILITE_OBJECT;
}
if (mfore == backg || ofore == backg) {
if (len < 7) mfore = ofore = WHITE;
else {
if (HI[2] == '3') mfore = ofore = HI[3] - '0';
else if (HI[4] == '3') mfore = ofore = HI[5] - '0';
else mfore = ofore = WHITE; /* give up! */
}
}

HI_MON = (char *) alloc(sizeof("E[0;33;44;54m"));
sprintf(HI_MON, "%c[%d;3%d;4%dm", ESC, HILITE_ATTRIB,
mfore, backg);
HI_OBJ = (char *) alloc(sizeof("E[0;33;44;54m"));
sprintf(HI_OBJ, "%c[%d;3%d;4%dm", ESC, HILITE_ATTRIB,
ofore, backg);
}

#endif
SHAR_EOF
if test 8638 -ne "`wc -c < 'termcap.c.new'`"
then
echo shar: error transmitting "'termcap.c.new'" '(should have been 8638 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'topten.c.new'" '(12536 characters)'
if test -f 'topten.c.new'
then
echo shar: will not over-write existing file "'topten.c.new'"
else
cat << \SHAR_EOF > 'topten.c.new'
/* SCCS Id: @(#)topten.c 2.3 88/02/01
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

#include <stdio.h>
#include "hack.h"
#ifdef GENIX
#define void int /* jhn - mod to prevent compiler from bombing */
#endif

#define Sprintf (void) sprintf
extern char plname[], pl_character[];
#ifndef MSC /* set by the Microsoft "C" compiler */
extern char *itoa();
#endif
extern char *ordin(), *eos();
extern int done_hup, done_stopprint;

#define newttentry() (struct toptenentry *) alloc(sizeof(struct toptenentry))
#define NAMSZ 10
#define DTHSZ 60
#define PERSMAX 3 /* entries per name/uid per char. allowed */
#define POINTSMIN 1 /* must be > 0 */
#define ENTRYMAX 100 /* must be >= 10 */
#ifndef MSDOS
#define PERS_IS_UID /* delete for PERSMAX per name; now per uid */
#endif
struct toptenentry {
struct toptenentry *tt_next;
long int points;
int level,maxlvl,hp,maxhp;
int uid;
char plchar;
char sex;
char name[NAMSZ+1];
char death[DTHSZ+1];
char date[7]; /* yymmdd */
} *tt_head;

topten(){
int uid = getuid();
int rank, rank0 = -1, rank1 = 0;
int occ_cnt = PERSMAX;
register struct toptenentry *t0, *t1, *tprev;
char *recfile = RECORD;
#ifdef UNIX
char *reclock = "record_lock";
#endif
int sleepct = 300;
FILE *rfile;
register flg = 0;
extern char *getdate();
#ifdef LOGFILE
char *lgfile = LOGFILE;
FILE *lfile;
char *loglock = "logfile_lock";
int sleeplgct = 30;
#endif

#ifndef DGK
#define HUP if(!done_hup)
#else
#define HUP
#endif

#ifdef UNIX
while(link(recfile, reclock) == -1) {
HUP perror(reclock);
if(!sleepct--) {
HUP puts("I give up. Sorry.");
HUP puts("Perhaps there is an old record_lock around?");
return;
}
HUP printf("Waiting for access to record file. (%d)\n",
sleepct);
HUP (void) fflush(stdout);
sleep(1);
}
#endif
if(!(rfile = fopen(recfile,"r"))){
HUP puts("Cannot open record file!");
goto unlock;
}
HUP (void) putchar('\n');

/* create a new 'topten' entry */
t0 = newttentry();
t0->level = dlevel;
t0->maxlvl = maxdlevel;
t0->hp = u.uhp;
t0->maxhp = u.uhpmax;
t0->points = u.urexp;
t0->plchar = pl_character[0];
t0->sex = (flags.female ? 'F' : 'M');
t0->uid = uid;
(void) strncpy(t0->name, plname, NAMSZ);
(t0->name)[NAMSZ] = 0;
(void) strncpy(t0->death, killer, DTHSZ);
(t0->death)[DTHSZ] = 0;
(void) strcpy(t0->date, getdate());

/* assure minimum number of points */
if(t0->points < POINTSMIN)
t0->points = 0;
#ifdef LOGFILE /* used for debugging (who dies of what, where) */
while(link(lgfile, loglock) == -1) {
HUP perror(loglock);
if(!sleeplgct--) {
HUP puts("I give up. Sorry.");
HUP puts("Perhaps there is an old logfile_lock around?");
goto lgend;
}
HUP printf("Waiting for access to log file. (%d)\n",
sleeplgct);
HUP (void) fflush(stdout);
sleep(1);
}
if(!(lfile = fopen(lgfile,"a"))){
HUP puts("Cannot open log file!");
goto lgend;
}
fprintf(lfile,"%6s %d %d %d %d %d %ld %c%c %s,%s\n",
t0->date, t0->uid,
t0->level, t0->maxlvl,
t0->hp, t0->maxhp, t0->points,
t0->plchar, t0->sex, t0->name, t0->death);
fclose(lfile);
(void) unlink(loglock);
lgend:;
#endif

t1 = tt_head = newttentry();
tprev = 0;
/* rank0: -1 undefined, 0 not_on_list, n n_th on list */
for(rank = 1; ; ) {
if(fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]",
t1->date, &t1->uid,
&t1->level, &t1->maxlvl,
&t1->hp, &t1->maxhp, &t1->points,
&t1->plchar, &t1->sex, t1->name, t1->death) != 11
|| t1->points < POINTSMIN)
t1->points = 0;
if(rank0 < 0 && t1->points < t0->points) {
rank0 = rank++;
if(tprev == 0)
tt_head = t0;
else
tprev->tt_next = t0;
t0->tt_next = t1;
occ_cnt--;
flg++; /* ask for a rewrite */
} else
tprev = t1;
if(t1->points == 0) break;
if(
#ifdef PERS_IS_UID
t1->uid == t0->uid &&
#else
strncmp(t1->name, t0->name, NAMSZ) == 0 &&
#endif
t1->plchar == t0->plchar && --occ_cnt <= 0){
if(rank0 < 0){
rank0 = 0;
rank1 = rank;
HUP printf("You didn't beat your previous score of %ld points.\n\n",
t1->points);
}
if(occ_cnt < 0){
flg++;
continue;
}
}
if(rank <= ENTRYMAX){
t1 = t1->tt_next = newttentry();
rank++;
}
if(rank > ENTRYMAX){
t1->points = 0;
break;
}
}
if(flg) { /* rewrite record file */
(void) fclose(rfile);
if(!(rfile = fopen(recfile,"w"))){
HUP puts("Cannot write record file\n");
goto unlock;
}

if(!done_stopprint) if(rank0 > 0){
if(rank0 <= 10)
puts("You made the top ten list!\n");
else
printf("You reached the %d%s place on the top %d list.\n\n",
rank0, ordin(rank0), ENTRYMAX);
}
}
if(rank0 == 0) rank0 = rank1;
if(rank0 <= 0) rank0 = rank;
if(!done_stopprint) outheader();
t1 = tt_head;
for(rank = 1; t1->points != 0; rank++, t1 = t1->tt_next) {
if(flg) fprintf(rfile,"%6s %d %d %d %d %d %ld %c%c %s,%s\n",
t1->date, t1->uid,
t1->level, t1->maxlvl,
t1->hp, t1->maxhp, t1->points,
t1->plchar, t1->sex, t1->name, t1->death);
if(done_stopprint) continue;
if(rank > flags.end_top &&
(rank < rank0-flags.end_around || rank > rank0+flags.end_around)
&& (!flags.end_own ||
#ifdef PERS_IS_UID
t1->uid != t0->uid
#else
strncmp(t1->name, t0->name, NAMSZ)
#endif
)) continue;
if(rank == rank0-flags.end_around &&
rank0 > flags.end_top+flags.end_around+1 &&
!flags.end_own)
(void) putchar('\n');
if(rank != rank0)
(void) outentry(rank, t1, 0);
else if(!rank1)
(void) outentry(rank, t1, 1);
else {
int t0lth = outentry(0, t0, -1);
int t1lth = outentry(rank, t1, t0lth);
if(t1lth > t0lth) t0lth = t1lth;
(void) outentry(0, t0, t0lth);
}
}
if(rank0 >= rank) if(!done_stopprint)
(void) outentry(0, t0, 1);
(void) fclose(rfile);
unlock: ;
#ifdef UNIX
(void) unlink(reclock);
#endif
}

outheader() {
char linebuf[BUFSZ];
register char *bp;
#ifdef KJSMODS
(void) strcpy(linebuf, " No Points Name");
#else
(void) strcpy(linebuf, "Number Points Name");
#endif
bp = eos(linebuf);
while(bp < linebuf + COLNO - 9) *bp++ = ' ';
(void) strcpy(bp, "Hp [max]");
puts(linebuf);
}

/* so>0: standout line; so=0: ordinary line; so<0: no output, return lth */
int
outentry(rank,t1,so) register struct toptenentry *t1; {
boolean quit = FALSE, killed = FALSE, starv = FALSE;
char linebuf[BUFSZ];
linebuf[0] = 0;
if(rank) Sprintf(eos(linebuf), "%3d", rank);
else Sprintf(eos(linebuf), " ");
#ifdef KJSMODS
Sprintf(eos(linebuf), " %7ld %10s", t1->points, t1->name);
#else
# ifdef DGKMOD
Sprintf(eos(linebuf), " %6ld %10s", t1->points, t1->name);
# else
Sprintf(eos(linebuf), " %6ld %8s", t1->points, t1->name);
# endif
#endif
if(t1->plchar == 'X') Sprintf(eos(linebuf), " ");
else Sprintf(eos(linebuf), "-%c ", t1->plchar);
if(!strncmp("escaped", t1->death, 7)) {
if(!strcmp(" (with amulet)", t1->death+7))
Sprintf(eos(linebuf), "escaped the dungeon with amulet");
else
Sprintf(eos(linebuf), "escaped the dungeon [max level %d]",
t1->maxlvl);
} else {
if(!strncmp(t1->death,"quit",4)) {
quit = TRUE;
#ifndef KJSMODS
if(t1->maxhp < 3*t1->hp && t1->maxlvl < 4)
Sprintf(eos(linebuf), "cravenly gave up");
else
#endif
Sprintf(eos(linebuf), "quit");
}
else if(!strcmp(t1->death,"choked"))
Sprintf(eos(linebuf), "choked on %s food",
(t1->sex == 'F') ? "her" : "his");
else if(!strncmp(t1->death,"starv",5))
Sprintf(eos(linebuf), "starved to death"), starv = TRUE;
else Sprintf(eos(linebuf), ", killed"), killed = TRUE;
Sprintf(eos(linebuf), " on%s level %d",
(killed || starv) ? "" : " dungeon", t1->level);
if(t1->maxlvl != t1->level)
Sprintf(eos(linebuf), " [max %d]", t1->maxlvl);
if(quit && t1->death[4]) Sprintf(eos(linebuf), t1->death + 4);
}
if(killed) Sprintf(eos(linebuf), " by %s%s",
(!strncmp(t1->death, "trick", 5) || !strncmp(t1->death, "the ", 4))
? "" :
index(vowels,*t1->death) ? "an " : "a ",
t1->death);
Sprintf(eos(linebuf), ".");
if(t1->maxhp) {
register char *bp = eos(linebuf);
char hpbuf[10];
int hppos;
#ifdef KJSMODS
int lngr = strlen(linebuf);
#endif
Sprintf(hpbuf, (t1->hp > 0) ? itoa(t1->hp) : "-");
hppos = COLNO - 7 - strlen(hpbuf);
#ifdef KJSMODS
if (lngr >= hppos) hppos = (2*COLNO) - 7 - strlen(hpbuf);
#endif
if(bp <= linebuf + hppos) {
/* pad any necessary blanks to the hit point entry */
while(bp < linebuf + hppos) *bp++ = ' ';
(void) strcpy(bp, hpbuf);
Sprintf(eos(bp), " [%d]", t1->maxhp);
}
}
if(so == 0) puts(linebuf);
else if(so > 0) {
register char *bp = eos(linebuf);
if(so >= COLNO) so = COLNO-1;
while(bp < linebuf + so) *bp++ = ' ';
*bp = 0;
standoutbeg();
fputs(linebuf,stdout);
standoutend();
(void) putchar('\n');
}
return(strlen(linebuf));
}

char *
itoa(a) int a; {
static char buf[12];
Sprintf(buf,"%d",a);
return(buf);
}

char *
ordin(n) int n; {
register int d = n%10;
return((d==0 || d>3 || n/10==1) ? "th" : (d==1) ? "st" :
(d==2) ? "nd" : "rd");
}

char *
eos(s)
register char *s;
{
while(*s) s++;
return(s);
}

/*
* Called with args from main if argc >= 0. In this case, list scores as
* requested. Otherwise, find scores for the current player (and list them
* if argc == -1).
*/
prscore(argc,argv) int argc; char **argv; {
extern char *hname;
char **players;
int playerct;
int rank;
register struct toptenentry *t1, *t2;
char *recfile = RECORD;
FILE *rfile;
register flg = 0;
register int i;
#ifdef nonsense
long total_score = 0L;
char totchars[10];
int totcharct = 0;
#endif
int outflg = (argc >= -1);
#ifdef PERS_IS_UID
int uid = -1;
#else
char *player0;
#endif

if(!(rfile = fopen(recfile,"r"))){
puts("Cannot open record file!");
return;
}

if(argc > 1 && !strncmp(argv[1], "-s", 2)){
if(!argv[1][2]){
argc--;
argv++;
} else if(!argv[1][3] && index("CFKSTWX", argv[1][2])) {
argv[1]++;
argv[1][0] = '-';
} else argv[1] += 2;
}
if(argc <= 1){
#ifdef PERS_IS_UID
uid = getuid();
playerct = 0;
#else
player0 = plname;
if(!*player0)
player0 = "hackplayer";
playerct = 1;
players = &player0;
#endif
} else {
playerct = --argc;
players = ++argv;
}
if(outflg) putchar('\n');

t1 = tt_head = newttentry();
for(rank = 1; ; rank++) {
if(fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]",
t1->date, &t1->uid,
&t1->level, &t1->maxlvl,
&t1->hp, &t1->maxhp, &t1->points,
&t1->plchar, &t1->sex, t1->name, t1->death) != 11)
t1->points = 0;
if(t1->points == 0) break;
#ifdef PERS_IS_UID
if(!playerct && t1->uid == uid)
flg++;
else
#endif
for(i = 0; i < playerct; i++){
if(strcmp(players[i], "all") == 0 ||
strncmp(t1->name, players[i], NAMSZ) == 0 ||
(players[i][0] == '-' &&
players[i][1] == t1->plchar &&
players[i][2] == 0) ||
(digit(players[i][0]) && rank <= atoi(players[i])))
flg++;
}
t1 = t1->tt_next = newttentry();
}
(void) fclose(rfile);
if(!flg) {
if(outflg) {
printf("Cannot find any entries for ");
if(playerct < 1) printf("you.\n");
else {
if(playerct > 1) printf("any of ");
for(i=0; i<playerct; i++)
printf("%s%s", players[i], (i<playerct-1)?", ":".\n");
printf("Call is: %s -s [playernames]\n", hname);
}
}
return;
}

if(outflg) outheader();
t1 = tt_head;
for(rank = 1; t1->points != 0; rank++, t1 = t2) {
t2 = t1->tt_next;
#ifdef PERS_IS_UID
if(!playerct && t1->uid == uid)
goto outwithit;
else
#endif
for(i = 0; i < playerct; i++){
if(strcmp(players[i], "all") == 0 ||
strncmp(t1->name, players[i], NAMSZ) == 0 ||
(players[i][0] == '-' &&
players[i][1] == t1->plchar &&
players[i][2] == 0) ||
(digit(players[i][0]) && rank <= atoi(players[i]))){
outwithit:
if(outflg)
(void) outentry(rank, t1, 0);
#ifdef nonsense
total_score += t1->points;
if(totcharct < sizeof(totchars)-1)
totchars[totcharct++] = t1->plchar;
#endif
break;
}
}
free((char *) t1);
}
#ifdef nonsense
totchars[totcharct] = 0;

/* We would like to determine whether he is experienced. However,
the information collected here only tells about the scores/roles
that got into the topten (top 100?). We should maintain a
.hacklog or something in his home directory. */
flags.beginner = (total_score < 6000);
for(i=0; i<6; i++)
if(!index(totchars, "CFKSTWX"[i])) {
flags.beginner = 1;
if(!pl_character[0]) pl_character[0] = "CFKSTWX"[i];
break;
}
#endif /* nonsense /**/
}
SHAR_EOF
if test 12536 -ne "`wc -c < 'topten.c.new'`"
then
echo shar: error transmitting "'topten.c.new'" '(should have been 12536 characters)'
fi
fi # end of overwriting check
# End of shell archive
exit 0
--
Mike Stephenson

Mail: Genamation Inc. Phone: (416) 475-9434
351 Steelcase Rd. W
Markham, Ontario. UUCP: uunet!{mnetor,utzoo}!genat!genpyr!mike
Canada L3R 3W1 uunet!{mnetor,utzoo}!genat!mike

0 new messages