[comp.sources.games] v03i015: NetHack2.2 - display oriented dungeons and dragons, Part15/20

games-request@tekred.TEK.COM (12/03/87)

Submitted by: mike@genat.UUCP (Mike Stephenson)
Comp.sources.games: Volume 3, Issue 15
Archive-name: nethack2.2/Part15



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 15 (of 20)."
# Contents:  do.c do_name.c end.c makemon.c onames.h unixtty.c
# Wrapped by billr@tekred on Tue Dec  1 16:25:10 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f do.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"do.c\"
else
echo shar: Extracting \"do.c\" \(8810 characters\)
sed "s/^X//" >do.c <<'END_OF_do.c'
X/*	SCCS Id: @(#)do.c	2.0	87/09/15
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X
X/* Contains code for 'd', 'D' (drop), '>', '<' (up, down) and 't' (throw) */
X
X#include "hack.h"
X
Xextern struct obj *splitobj(), *addinv();
Xextern boolean hmon();
Xextern boolean level_exists[];
Xextern struct monst youmonst;
Xextern char *Doname();
Xextern char *nomovemsg;
Xint	identify();
X#ifdef KAA
Xextern char *xname();
X#endif
X
Xdodrop() {
X	if(u.ugold)	return(drop(getobj("0$#", "drop")));
X	else		return(drop(getobj("0#", "drop")));
X}
X
Xstatic
Xdrop(obj) register struct obj *obj; {
X	if(!obj) return(0);
X	if(obj->olet == GOLD_SYM) {		/* pseudo object */
X		register long amount = OGOLD(obj);
X
X		if(amount == 0)
X			pline("You didn't drop any gold pieces.");
X/* Fix bug with dropping huge amounts of gold read as negative    KAA */
X		else if(amount < 0) {
X			u.ugold += amount;
X	pline("The LRS would be very interested to know you have that much.");
X		} else {
X			/* uswallow test added by GAN 01/29/87 */
X			pline("You dropped %ld gold piece%s.",
X				 amount, plur(amount));
X			if(u.uswallow)
X				(u.ustuck)->mgold += amount;
X			else {
X				mkgold(amount, u.ux, u.uy);
X				if(Invisible) newsym(u.ux, u.uy);
X			}
X		}
X		free((char *) obj);
X		return(1);
X	}
X	if(obj->owornmask & (W_ARMOR | W_RING)){
X		pline("You cannot drop something you are wearing.");
X		return(0);
X	}
X	if(obj == uwep) {
X		if(uwep->cursed) {
X			pline("Your weapon is welded to your hand!");
X			return(0);
X		}
X		setuwep((struct obj *) 0);
X	}
X#ifdef WALKIES
X        if (obj->otyp == LEASH) {
X            register struct monst *mtmp = fmon;
X            while (mtmp && !mtmp->mleashed) mtmp = mtmp->nmon;
X            if (mtmp) {
X                pline ("Your leash is tied around your hand.");
X                return (0);
X            }
X        }
X#endif
X	pline("You dropped %s.", doname(obj));
X	dropx(obj);
X	return(1);
X}
X
X/* Called in several places - should not produce texts */
Xdropx(obj)
Xregister struct obj *obj;
X{
X	freeinv(obj);
X	dropy(obj);
X}
X
Xdropy(obj)
Xregister struct obj *obj;
X{
X	if(obj->otyp == CRYSKNIFE)
X		obj->otyp = WORM_TOOTH;
X	/* uswallow check done by GAN 01/29/87 */
X	if(u.uswallow)
X		mpickobj(u.ustuck,obj);
X	else  {
X		obj->ox = u.ux;
X		obj->oy = u.uy;
X		/* Blind check added by GAN 02/18/87 */
X		if(Blind)  {
X#ifdef KAA
X			if(obj->olet != ')')
X#endif
X			    obj->dknown = index("/=!?*",obj->olet) ? 0 : 1;
X			obj->known = 0;
X		}
X		obj->nobj = fobj;
X		fobj = obj;
X		if(Invisible) newsym(u.ux,u.uy);
X		subfrombill(obj);
X		stackobj(obj);
X	}
X}
X
X/* drop several things */
Xdoddrop() {
X	return(ggetobj("drop", drop, 0));
X}
X
Xdodown()
X{
X	if(u.ux != xdnstair || u.uy != ydnstair) {
X		pline("You can't go down here.");
X		return(0);
X	}
X	if(u.ustuck) {
X		pline("You are being held, and cannot go down.");
X		return(1);
X	}
X	if(Levitation) {
X		pline("Your floating high above the stairs.");
X		return(0);
X	}
X
X	goto_level(dlevel+1, TRUE);
X	return(1);
X}
X
Xdoup()
X{
X	if(u.ux != xupstair || u.uy != yupstair) {
X		pline("You can't go up here.");
X		return(0);
X	}
X	if(u.ustuck) {
X		pline("You are being held, and cannot go up.");
X		return(1);
X	}
X	if(!Levitation && inv_weight() + 5 > 0) {
X		pline("Your load is too heavy to climb the stairs.");
X		return(1);
X	}
X
X	goto_level(dlevel-1, TRUE);
X	return(1);
X}
X
Xgoto_level(newlevel, at_stairs)
Xregister int newlevel;
Xregister boolean at_stairs;
X{
X	register fd;
X	register boolean up = (newlevel < dlevel);
X
X	if(newlevel <= 0) done("escaped");    /* in fact < 0 is impossible */
X	if(newlevel > MAXLEVEL) newlevel = MAXLEVEL;	/* strange ... */
X	if(newlevel == dlevel) return;	      /* this can happen */
X
X	glo(dlevel);
X#ifdef DGK
X	/* Use O_TRUNC to force the file to be shortened if it already
X	 * exists and is currently longer.
X	 */
X	fd = open(lock, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FMASK);
X#else
X	fd = creat(lock, FMASK);
X#endif
X	if(fd < 0) {
X		/*
X		 * This is not quite impossible: e.g., we may have
X		 * exceeded our quota. If that is the case then we
X		 * cannot leave this level, and cannot save either.
X		 * Another possibility is that the directory was not
X		 * writable.
X		 */
X#ifdef DGK
X		pline("Cannot create level file '%s'.", lock);
X#else
X		pline("A mysterious force prevents you from going %s.",
X			up ? "up" : "down");
X#endif
X		return;
X	}
X
X#ifdef DGK
X	if (!savelev(fd, dlevel, COUNT)) {
X		(void) close(fd);
X		(void) unlink(lock);
X		pline("HACK is out of disk space for making levels!");
X		pline("You can save, quit, or continue playing.");
X		return;
X	}
X#endif
X	if(Punished) unplacebc();
X	u.utrap = 0;				/* needed in level_tele */
X	u.ustuck = 0;				/* idem */
X	keepdogs();
X	seeoff(1);
X	if(u.uswallow)				/* idem */
X		u.uswldtim = u.uswallow = 0;
X	flags.nscrinh = 1;
X	u.ux = FAR;				/* hack */
X	(void) inshop();			/* probably was a trapdoor */
X
X#ifdef DGK
X	savelev(fd,dlevel, WRITE);
X#else
X	savelev(fd,dlevel);
X#endif
X	(void) close(fd);
X
X	dlevel = newlevel;
X	if(maxdlevel < dlevel)
X		maxdlevel = dlevel;
X	glo(dlevel);
X#ifdef MSDOS
X	/* If the level has no where yet, it hasn't been made
X	 */
X	if(!fileinfo[dlevel].where)
X#else
X	if(!level_exists[dlevel])
X#endif
X		mklev();
X	else {
X		extern int hackpid;
X#ifdef DGK
X		/* If not currently accessible, swap it in.
X		 */
X		if (fileinfo[dlevel].where != ACTIVE)
X			swapin_file(dlevel);
X
X		if((fd = open(lock, O_RDONLY | O_BINARY)) < 0) {
X#else
X		if((fd = open(lock,0)) < 0) {
X#endif
X			pline("Cannot open %s .", lock);
X			pline("Probably someone removed it.");
X			done("tricked");
X		}
X		getlev(fd, hackpid, dlevel);
X		(void) close(fd);
X	}
X
X	if(at_stairs) {
X	    if(up) {
X		u.ux = xdnstair;
X		u.uy = ydnstair;
X		if(!u.ux) {		/* entering a maze from below? */
X		    u.ux = xupstair;	/* this will confuse the player! */
X		    u.uy = yupstair;
X		}
X/* Remove bug which crashes with levitation/punishment  KAA */
X		if(Punished) {
X		    if(!Levitation) 
X			pline("With great effort you climb the stairs.");
X		    placebc(1);
X		}
X	    } else {
X		u.ux = xupstair;
X		u.uy = yupstair;
X		if(inv_weight() + 5 > 0 || Punished){
X			pline("You fall down the stairs.");	/* %% */
X			losehp(rnd(3), "fall");
X			if(Punished) {
X			    if(uwep != uball && rn2(3)){
X				pline("... and are hit by the iron ball.");
X				losehp(rnd(20), "iron ball");
X			    }
X			    placebc(1);
X			}
X			selftouch("Falling, you");
X		}
X	    }
X	    { register struct monst *mtmp = m_at(u.ux, u.uy);
X	      if(mtmp)
X		mnexto(mtmp);
X	    }
X	} else {	/* trapdoor or level_tele */
X	    do {
X		u.ux = rnd(COLNO-1);
X		u.uy = rn2(ROWNO);
X	    } while(levl[u.ux][u.uy].typ != ROOM ||
X			m_at(u.ux,u.uy));
X	    if(Punished){
X		if(uwep != uball && !up /* %% */ && rn2(5)){
X			pline("The iron ball falls on your head.");
X			losehp(rnd(25), "iron ball");
X		}
X		placebc(1);
X	    }
X	    selftouch("Falling, you");
X	}
X	(void) inshop();
X	initrack();
X
X	losedogs();
X	{ register struct monst *mtmp;
X	  if(mtmp = m_at(u.ux, u.uy)) mnexto(mtmp);	/* riv05!a3 */
X	}
X	flags.nscrinh = 0;
X	setsee();
X	seeobjs();	/* make old cadavers disappear - riv05!a3 */
X	docrt();
X	pickup(1);
X	read_engr_at(u.ux,u.uy);
X}
X
Xdonull() {
X	return(1);	/* Do nothing, but let other things happen */
X}
X
X#if defined(KAA) && defined(KOPS)
Xwipeoff()
X{
X	if(u.ucreamed < 4)	u.ucreamed = 0;
X	else			u.ucreamed -= 4;
X	if(u.ucreamed > 0)  {
X		Blinded -= 4;
X		if(Blind <= 1) {
X			pline("You've got the glop off.");
X			u.ucreamed = 0;
X			Blinded = 1;
X			return(0);
X		}
X		return(1);		/* still busy */
X	}
X	pline("Your face feels clean now.");
X	u.ucreamed = 0;
X	return(0);
X}
X	
Xdowipe()
X{
X	if(u.ucreamed)  {
X#ifdef DGKMOD
X		set_occupation(wipeoff, "wiping off your face", 0);
X#else
X		occupation = wipeoff;
X		occtxt = "wiping off your face";
X#endif
X		return(1);
X	}
X	pline("Your face is already clean.");
X	return(1);
X}
X#endif
X
X/* split obj so that it gets size num */
X/* remainder is put in the object structure delivered by this call */
Xstruct obj *
Xsplitobj(obj, num) register struct obj *obj; register int num; {
Xregister struct obj *otmp;
X	otmp = newobj(0);
X	*otmp = *obj;		/* copies whole structure */
X	otmp->o_id = flags.ident++;
X	otmp->onamelth = 0;
X	obj->quan = num;
X	obj->owt = weight(obj);
X	otmp->quan -= num;
X	otmp->owt = weight(otmp);	/* -= obj->owt ? */
X	obj->nobj = otmp;
X	if(obj->unpaid) splitbill(obj,otmp);
X	return(otmp);
X}
X
Xmore_experienced(exp,rexp)
Xregister int exp, rexp;
X{
X	extern char pl_character[];
X
X	u.uexp += exp;
X	u.urexp += 4*exp + rexp;
X	if(exp) flags.botl = 1;
X	if(u.urexp >= ((pl_character[0] == 'W') ? 1000 : 2000))
X		flags.beginner = 0;
X}
X
Xset_wounded_legs(side, timex)
Xregister long side;
Xregister int timex;
X{
X	if(!Wounded_legs || (Wounded_legs & TIMEOUT))
X		Wounded_legs |= side + timex;
X	else
X		Wounded_legs |= side;
X}
X
Xheal_legs()
X{
X	if(Wounded_legs) {
X		if((Wounded_legs & BOTH_SIDES) == BOTH_SIDES)
X			pline("Your legs feel somewhat better.");
X		else
X			pline("Your leg feels somewhat better.");
X		Wounded_legs = 0;
X	}
X}
END_OF_do.c
if test 8810 -ne `wc -c <do.c`; then
    echo shar: \"do.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f do_name.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"do_name.c\"
else
echo shar: Extracting \"do_name.c\" \(7416 characters\)
sed "s/^X//" >do_name.c <<'END_OF_do_name.c'
X/*	SCCS Id: @(#)do_name.c	2.1	87/11/09
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X
X#include <stdio.h>
X#include "hack.h"
Xextern char plname[];
Xextern char *rndmonnam();
X
Xgetpos(cc,force,goal)
Xcoord	*cc;
Xint force; char *goal;
X{
Xregister cx,cy,i,c;
Xextern char sdir[];		/* defined in hack.c */
Xextern schar xdir[], ydir[];	/* idem */
Xextern char *visctrl();		/* see below */
X	pline("(For instructions type a ?)");
X	cx = u.ux;
X	cy = u.uy;
X	curs(cx,cy+2);
X	while((c = readchar()) != '.'){
X		for(i=0; i<8; i++) if(sdir[i] == c){
X			if(1 <= cx + xdir[i] && cx + xdir[i] <= COLNO)
X				cx += xdir[i];
X			if(0 <= cy + ydir[i] && cy + ydir[i] <= ROWNO-1)
X				cy += ydir[i];
X			goto nxtc;
X		}
X		if(c == '?'){
X			pline("Use [hjkl] to move the cursor to %s.", goal);
X			pline("Type a . when you are at the right place.");
X		} else {
X			pline("Unknown direction: '%s' (%s).",
X				visctrl(c),
X				force ? "use hjkl or ." : "aborted");
X			if(force) goto nxtc;
X			cc->x = -1;
X			cc->y = 0;
X			return(0);
X		}
X	nxtc:	;
X		curs(cx,cy+2);
X	}
X	cc->x = cx;
X	cc->y = cy;
X	return(0);
X}
X
Xdo_mname(){
Xchar buf[BUFSZ];
Xcoord cc;
Xregister int cx,cy,lth,i;
Xregister struct monst *mtmp, *mtmp2;
Xextern char *lmonnam();
X	getpos(&cc, 0, "the monster you want to name");
X	cx = cc.x;
X	cy = cc.y;
X	if(cx < 0) return(0);
X#ifdef DGKMOD
X	if (cx == u.ux && cy == u.uy) {
X		pline("This ugly monster is called %s and cannot be renamed.",
X		plname);
X		return(1);
X	}
X	if (!cansee(cx, cy) || !(mtmp = m_at(cx, cy)) || mtmp->mimic) {
X		pline("I see no monster there.");
X		return(1);
X	}
X#else
X	mtmp = m_at(cx,cy);
X	if(!mtmp){
X	    if(cx == u.ux && cy == u.uy)
X		pline("This ugly monster is called %s and cannot be renamed.",
X		    plname);
X	    else
X		pline("There is no monster there.");
X	    return(1);
X	}
X	if(mtmp->mimic){
X	    pline("I see no monster there.");
X	    return(1);
X	}
X	if(!cansee(cx,cy)) {
X	    pline("I cannot see a monster there.");
X	    return(1);
X	}
X#endif
X	pline("What do you want to call %s? ", lmonnam(mtmp));
X	getlin(buf);
X	clrlin();
X	if(!*buf || *buf == '\033')
X		return(1);
X	lth = strlen(buf)+1;
X	if(lth > 63){
X		buf[62] = 0;
X		lth = 63;
X	}
X	mtmp2 = newmonst(mtmp->mxlth + lth);
X	*mtmp2 = *mtmp;
X	for(i=0; i<mtmp->mxlth; i++)
X		((char *) mtmp2->mextra)[i] = ((char *) mtmp->mextra)[i];
X	mtmp2->mnamelth = lth;
X	(void) strcpy(NAME(mtmp2), buf);
X	replmon(mtmp,mtmp2);
X	return(1);
X}
X
X/*
X * This routine changes the address of  obj . Be careful not to call it
X * when there might be pointers around in unknown places. For now: only
X * when  obj  is in the inventory.
X */
Xdo_oname(obj)
X	register struct obj *obj;
X{
X	char buf[BUFSZ];
X
X	pline("What do you want to name %s? ", doname(obj));
X	getlin(buf);
X	clrlin();
X	if(!*buf || *buf == '\033')	return;
X#ifdef RPH
X	if(!strcmp(buf, "Excalibur")) {
X		pline("Somehow you can't seem to engrave that word.");
X		return;
X	}
X#endif
X	oname(obj, buf);
X}
X
Xoname(obj, buf)
X	register struct obj *obj;
X	char	*buf;
X{
Xregister struct obj *otmp, *otmp2;
Xregister int	lth;
X
X	lth = strlen(buf)+1;
X	if(lth > 63){
X		buf[62] = 0;
X		lth = 63;
X	}
X	otmp2 = newobj(lth);
X	*otmp2 = *obj;
X	otmp2->onamelth = lth;
X	(void) strcpy(ONAME(otmp2), buf);
X
X	setworn((struct obj *) 0, obj->owornmask);
X	setworn(otmp2, otmp2->owornmask);
X
X	/* do freeinv(obj); etc. by hand in order to preserve
X	   the position of this object in the inventory */
X	if(obj == invent) invent = otmp2;
X	else for(otmp = invent; ; otmp = otmp->nobj){
X		if(!otmp)
X			panic("oname: cannot find obj.");
X		if(otmp->nobj == obj){
X			otmp->nobj = otmp2;
X			break;
X		}
X	}
X	/* obfree(obj, otmp2);	/* now unnecessary: no pointers on bill */
X	free((char *) obj);	/* let us hope nobody else saved a pointer */
X}
X
Xddocall()
X{
X	register struct obj *obj;
X	char	ch;
X
X#ifdef REDO
X	if (!in_doagain)
X#endif
X		pline("Do you want to name an individual object? [ny] ");
X	switch(ch = readchar()) {
X	case '\033':
X		break;
X	case 'y':
X#ifdef REDO
X		savech(ch);
X#endif
X		obj = getobj("#", "name");
X		if(obj) do_oname(obj);
X		break;
X	default:
X#ifdef REDO
X		savech(ch);
X#endif
X#ifdef KAA
X		obj = getobj("?!=/*", "call");
X#else
X		obj = getobj("?!=/", "call");
X#endif
X		if(obj) docall(obj);
X	}
X	return(0);
X}
X
Xdocall(obj)
Xregister struct obj *obj;
X{
X	char buf[BUFSZ];
X	struct obj otemp;
X	register char **str1;
X	extern char *xname();
X	register char *str;
X
X	otemp = *obj;
X	otemp.quan = 1;
X	otemp.onamelth = 0;
X	str = xname(&otemp);
X	pline("Call %s %s: ", index(vowels,*str) ? "an" : "a", str);
X	getlin(buf);
X	clrlin();
X	if(!*buf || *buf == '\033')
X		return;
X	str = newstring(strlen(buf)+1);
X	(void) strcpy(str,buf);
X	str1 = &(objects[obj->otyp].oc_uname);
X	if(*str1) free(*str1);
X	*str1 = str;
X}
X
Xchar *ghostnames[] = {		/* these names should have length < PL_NSIZ */
X	/* Capitalize the names for asthetics -dgk
X	 */
X	"Adri", "Andries", "Andreas", "Bert", "David", "Dirk", "Emile",
X	"Frans", "Fred", "Greg", "Hether", "Jay", "John", "Jon", "Karnov",
X	"Kay", "Kenny", "Kevin", "Maud", "Michiel", "Mike", "Peter", "Robert",
X	"Ron", "Tom", "Wilmar", "Nick Danger", "Phoenix", "Miracleman",
X	"Stephan"
X};
X
Xchar *
Xxmonnam(mtmp, vb) register struct monst *mtmp; int vb; {
Xstatic char buf[BUFSZ];		/* %% */
Xextern char *shkname();
X	if(mtmp->mnamelth && !vb) {
X		(void) strcpy(buf, NAME(mtmp));
X		return(buf);
X	}
X	switch(mtmp->data->mlet) {
X	case ' ':
X		{ register char *gn = (char *) mtmp->mextra;
X		  if(!*gn) {		/* might also look in scorefile */
X		    gn = ghostnames[rn2(SIZE(ghostnames))];
X		    if(!rn2(2)) (void)
X		      strcpy((char *) mtmp->mextra, !rn2(5) ? plname : gn);
X		  }
X		  (void) sprintf(buf, "%s's ghost", gn);
X		}
X		break;
X	case '@':
X		if(mtmp->isshk) {
X			(void) strcpy(buf, shkname(mtmp));
X			break;
X		}
X		/* fall into next case */
X	default:
X		(void) sprintf(buf, "the %s%s",
X			mtmp->minvis ? "invisible " : "",
X			(Hallucination ? rndmonnam() : mtmp->data->mname));
X	}
X	if(vb && mtmp->mnamelth) {
X		(void) strcat(buf, " called ");
X		(void) strcat(buf, NAME(mtmp));
X	}
X	return(buf);
X}
X
Xchar *
Xlmonnam(mtmp) register struct monst *mtmp; {
X	return(xmonnam(mtmp, 1));
X}
X
Xchar *
Xmonnam(mtmp) register struct monst *mtmp; {
X	return(xmonnam(mtmp, 0));
X}
X
Xchar *
XMonnam(mtmp) register struct monst *mtmp; {
Xregister char *bp = monnam(mtmp);
X	if('a' <= *bp && *bp <= 'z') *bp += ('A' - 'a');
X	return(bp);
X}
X
Xchar *
Xamonnam(mtmp,adj)
Xregister struct monst *mtmp;
Xregister char *adj;
X{
X	register char *bp = monnam(mtmp);
X	static char buf[BUFSZ];		/* %% */
X
X	if(!strncmp(bp, "the ", 4)) bp += 4;
X	(void) sprintf(buf, "the %s %s", adj, bp);
X	return(buf);
X}
X
Xchar *
XAmonnam(mtmp, adj)
Xregister struct monst *mtmp;
Xregister char *adj;
X{
X	register char *bp = amonnam(mtmp,adj);
X
X	*bp = 'T';
X	return(bp);
X}
X
Xchar *
XXmonnam(mtmp) register struct monst *mtmp; {
Xregister char *bp = Monnam(mtmp);
X	if(!strncmp(bp, "The ", 4)) {
X#ifdef KAA
X		if(index("AEIOUaeio",*(bp+4))) {
X			bp += 1; *(bp+1) = 'n';
X		} else
X#endif
X			bp += 2;
X		*bp = 'A';
X	}
X	return(bp);
X}
X
Xchar *
Xdefmonnam(mtmp) register struct monst *mtmp; {
Xregister char *bp = Xmonnam(mtmp);
X	if (!strncmp(bp,"A ",2) || !strncmp(bp,"An ",3))
X		*bp = 'a';
X	return(bp);
X}
X
Xchar *
Xrndmonnam() {  /* Random name of monster type, if hallucinating */
Xint x;
X	if ((x=rn2(CMNUM+2)) != CMNUM+1) return (&mons[x])->mname;
X	return("giant eel");
X}
X
Xchar *
Xvisctrl(c)
Xchar c;
X{
Xstatic char ccc[3];
X	if(c < 040) {
X		ccc[0] = '^';
X		ccc[1] = c + 0100;
X		ccc[2] = 0;
X	} else {
X		ccc[0] = c;
X		ccc[1] = 0;
X	}
X	return(ccc);
X}
END_OF_do_name.c
if test 7416 -ne `wc -c <do_name.c`; then
    echo shar: \"do_name.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f end.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"end.c\"
else
echo shar: Extracting \"end.c\" \(8789 characters\)
sed "s/^X//" >end.c <<'END_OF_end.c'
X/*	SCCS Id: @(#)end.c	2.1	87/10/07
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X
X#include <stdio.h>
X#include <signal.h>
X#include "hack.h"
X#define	Sprintf	(void) sprintf
Xextern char plname[], pl_character[], SAVEF[];
X
Xxchar maxdlevel = 1;
Xint done_stopprint;
Xint done_hup;
X
X
Xdone1()
X{
X	(void) signal(SIGINT,SIG_IGN);
X#if defined(WIZARD) && defined(UNIX) && !defined(KJSMODS)
X	if(wizard) {
X	    pline("Dump core?");
X	    if(readchar() == 'y') {
X		(void) signal(SIGINT,done1);
X		abort();
X	    }
X	}
X#endif
X	pline("Really quit?");
X	if(readchar() != 'y') {
X		(void) signal(SIGINT,done1);
X		clrlin();
X		(void) fflush(stdout);
X		if(multi > 0) nomul(0);
X		return(0);
X	}
X	done("quit");
X	/* NOTREACHED */
X}
X
Xdone_intr(){
X	done_stopprint++;
X	(void) signal(SIGINT, SIG_IGN);
X#ifdef UNIX
X	(void) signal(SIGQUIT, SIG_IGN);
X#endif
X}
X
X#ifdef UNIX
Xdone_hangup(){
X	done_hup++;
X	(void) signal(SIGHUP, SIG_IGN);
X	done_intr();
X}
X#endif
X
Xdone_in_by(mtmp)
Xregister struct monst *mtmp;
X{
X	char *hallmon();
X	static char buf[BUFSZ], *prefix;
X	extern char *eos(), *shkname();
X	pline("You die ...");
X	if (Hallucination) { 
X		Sprintf(buf, "hallucinated %s (actually ", hallmon()); 
X		prefix = (index("aeiou",*mtmp->data->mname) ? "an" : "a");
X	}
X	if(mtmp->data->mlet == ' ') {
X		if (Hallucination) Sprintf(eos(buf), "the ghost of %s)",
X					   (char *) mtmp->mextra);
X		else Sprintf(buf, "the ghost of %s", (char *) mtmp->mextra);
X	} else if(mtmp->mnamelth) {
X		if (Hallucination) Sprintf(eos(buf), "%s %s called %s)",
X					   prefix, mtmp->data->mname,
X					   NAME(mtmp));
X		else Sprintf(buf, "%s called %s",
X			     mtmp->data->mname, NAME(mtmp));
X	} else if(mtmp->minvis) {
X		if (Hallucination) Sprintf(eos(buf), "an invisible %s)",
X					   mtmp->data->mname);
X		else Sprintf(buf, "invisible %s", mtmp->data->mname);
X	} else if(mtmp->isshk) {
X		if (Hallucination) Sprintf(eos(buf), "%s %s the shopkeeper)",
X					   rn2(2) ? "Mr." : "Ms.",
X					   shkname(mtmp));
X		else Sprintf(buf, "%s %s, the shopkeeper!",
X			     rn2(2) ? "Mr." : "Ms.", shkname(mtmp));
X	} else {
X		if (Hallucination) Sprintf(eos(buf), "%s %s)",
X					   prefix, mtmp->data->mname);
X		else Sprintf(buf, "%s", mtmp->data->mname);
X	}
X	killer = buf;
X	done("died");
X}
X
X/*VARARGS1*/
Xboolean panicking;
X
Xpanic(str,a1,a2,a3,a4,a5,a6)
Xchar *str;
X{
X	if(panicking++) abort();    /* avoid loops - this should never happen*/
X				    /* was exit(1) */
X	home(); cls();
X	puts(" Suddenly, the dungeon collapses.");
X#ifdef WIZARD
X	pline("Report error to %s and it may be possible to rebuild.",WIZARD);
X	more();
X	(void) sprintf (SAVEF, "%s.e", SAVEF);
X	dosave0(0);
X#endif	
X	fputs(" ERROR:  ", stdout);
X	printf(str,a1,a2,a3,a4,a5,a6);
X	more();				/* contains a fflush() */
X#ifdef WIZARD
X# ifdef UNIX
X	if (wizard)	abort();	/* generate core dump */
X# endif
X#endif
X	done("panicked");
X}
X
X/* called with arg "died", "drowned", "escaped", "quit", "choked", "panicked",
X   "burned", "starved" or "tricked" */
X/* Be careful not to call panic from here! */
Xdone(st1)
Xregister char *st1;
X{
X#ifdef DIAGS
X	char	c;
X#endif
X#ifdef WIZARD
X	extern char	*nomovemsg;
X
X	if(wizard && index("bcds", *st1)){
X		char buf[BUFSZ];
X		pline("Die? ");
X		getlin(buf);
X		if(index("yY",buf[0])) goto die;
X		u.uswldtim = 0;
X		if(u.uhpmax < 0) u.uhpmax = 100;	/* arbitrary */
X		u.uhp = u.uhpmax;
X		pline("Ok, so you don't die.");
X		nomovemsg = "You survived that attempt on your life.";
X		flags.move = 0;
X		if(multi > 0) multi = 0; else multi = -1;
X		flags.botl = 1;
X		return;
X	}
X#endif /* WIZARD /**/
Xdie:
X	(void) signal(SIGINT, done_intr);
X#ifdef UNIX
X	(void) signal(SIGQUIT, done_intr);
X	(void) signal(SIGHUP, done_hangup);
X#endif
X	if(*st1 == 'q' && u.uhp < 1){
X		st1 = "died";
X		killer = "quit while already on Charon's boat";
X	}
X	if(*st1 == 's') killer = "starvation"; else
X	if(*st1 == 'd' && st1[1] == 'r') killer = "drowning"; else
X	if(*st1 == 'p') killer = "panic"; else
X	if(*st1 == 't') killer = "trickery"; else
X	if(!index("bcd", *st1)) killer = st1;
X	paybill();
X	clearlocks();
X	if(flags.toplin == 1) more();
X#ifdef DIAGS
X	pline("Do you want to have your possessions identified? [Yynq] ");
X	/* New dump format by maartenj@cs.vu.nl */
X	if ((c = readchar()) == 'y' || c == 'Y') {
X	    struct obj *obj;
X
X	    for(obj = invent; obj && !done_stopprint; obj = obj->nobj) {
X		objects[obj->otyp].oc_name_known = 1;
X# ifdef KAA
X		obj->known = 1;
X		if (obj->olet != WEAPON_SYM) obj->dknown = 1;
X# else
X		obj->known = obj->dknown = 1;
X# endif /* KAA */
X	    }
X	    doinv((char *) 0);
X	}
X	if (c == 'q' || c == 'Y')  done_stopprint++;
X#endif
X	if(index("bcds", *st1)){
X#ifdef WIZARD
X	    if(wizard) {
X		char buf[BUFSZ];
X		pline("Save bones? ");
X		getlin(buf);
X		if(buf[0] == 'y') savebones();
X	    }  else
X#endif
X		savebones();
X		if(!flags.notombstone) outrip();
X	}
X	if(*st1 == 'c') killer = st1;		/* after outrip() */
X#ifdef KJSMODS
X	if(with_amulet()) (void) strcat(killer," (with amulet)");
X#endif 
X	settty((char *) 0);	/* does a clear_screen() */
X	if(!done_stopprint)
X		printf("Goodbye %s %s...\n\n", pl_character, plname);
X	{ long int tmp;
X	  tmp = u.ugold - u.ugold0;
X	  if(tmp < 0)
X		tmp = 0;
X	  if(*st1 == 'd' || *st1 == 'b')
X		tmp -= tmp/10;
X	  u.urexp += tmp;
X	  u.urexp += 50 * maxdlevel;
X	  if(maxdlevel > 20)
X		u.urexp += 1000*((maxdlevel > 30) ? 10 : maxdlevel - 20);
X	}
X	if(*st1 == 'e') {
X		extern struct monst *mydogs;
X		register struct monst *mtmp;
X		register struct obj *otmp;
X#ifdef DGKMOD
X		long i;
X#else
X		register int i;
X#endif
X		register unsigned worthlessct = 0;
X		boolean has_amulet = FALSE;
X
X		killer = st1;
X		keepdogs();
X		mtmp = mydogs;
X		if(mtmp) {
X			if(!done_stopprint) printf("You");
X			while(mtmp) {
X				if(!done_stopprint)
X					printf(" and %s", monnam(mtmp));
X				if(mtmp->mtame)
X					u.urexp += mtmp->mhp;
X				mtmp = mtmp->nmon;
X			}
X			if(!done_stopprint)
X		    printf("\nescaped from the dungeon with %ld points,\n",
X			u.urexp);
X		} else
X		if(!done_stopprint)
X		  printf("You escaped from the dungeon with %ld points,\n",
X		    u.urexp);
X		for(otmp = invent; otmp; otmp = otmp->nobj) {
X			if(otmp->olet == GEM_SYM){
X				objects[otmp->otyp].oc_name_known = 1;
X#ifdef DGKMOD
X				i = (long) otmp->quan *
X					objects[otmp->otyp].g_val;
X#else
X				i = otmp->quan*objects[otmp->otyp].g_val;
X#endif
X				if(i == 0) {
X					worthlessct += otmp->quan;
X					continue;
X				}
X				u.urexp += i;
X#ifndef DGKMOD
X				if(!done_stopprint)
X				  printf("\t%s (worth %d Zorkmids),\n",
X#else
X				printf("        %s (worth %ld Zorkmids),\n",
X#endif
X				    doname(otmp), i);
X			} else if(otmp->olet == AMULET_SYM) {
X				otmp->known = 1;
X				i = (otmp->spe < 0) ? 2 : 5000;
X				u.urexp += i;
X#ifndef DGKMOD
X				if(!done_stopprint)
X				  printf("\t%s (worth %d Zorkmids),\n",
X#else
X				printf("        %s (worth %d Zorkmids),\n",
X#endif
X				    doname(otmp), i);
X				if(otmp->spe >= 0) {
X					has_amulet = TRUE;
X					killer = "escaped (with amulet)";
X				}
X			}
X		}
X		if(worthlessct)
X#ifndef DGKMOD
X		  if(!done_stopprint)
X		    printf("\t%u worthless piece%s of colored glass,\n",
X#else
X		  printf("        %u worthless piece%s of colored glass,\n",
X#endif
X			worthlessct, plur(worthlessct));
X		if(has_amulet) u.urexp *= 2;
X	} else
X		if(!done_stopprint)
X		  printf("You %s on dungeon level %d with %ld points,\n",
X		    st1, dlevel, u.urexp);
X	if(!done_stopprint)
X	  printf("and %ld piece%s of gold, after %ld move%s.\n",
X	    u.ugold, plur(u.ugold), moves, plur(moves));
X	if(!done_stopprint)
X  printf("You were level %u with a maximum of %d hit points when you %s.\n",
X	    u.ulevel, u.uhpmax, st1);
X	if(*st1 == 'e' && !done_stopprint){
X		getret();	/* all those pieces of coloured glass ... */
X		cls();
X	}
X#ifdef WIZARD
X	if(!wizard)
X#endif
X		topten();
X	if(done_stopprint) printf("\n\n");
X#ifdef APOLLO
X	getret();
X#endif
X#ifdef MSDOSCOLOR
X	getret();
X	end_screen();
X#endif
X	exit(0);
X}
Xclearlocks(){
X#ifdef DGK
X	eraseall(levels, alllevels);
X	if (ramdisk)
X		eraseall(permbones, alllevels);
X#else
X# ifdef UNIX
Xregister x;
X	(void) signal(SIGHUP,SIG_IGN);
X	for(x = maxdlevel; x >= 0; x--) {
X		glo(x);
X		(void) unlink(lock);	/* not all levels need be present */
X	}
X# endif
X#endif
X}
X
X#ifdef NOSAVEONHANGUP
Xhangup()
X{
X	(void) signal(SIGINT, SIG_IGN);
X	clearlocks();
X	exit(1);
X}
X#endif
X
X/* it is the callers responsibility to check that there is room for c */
Xcharcat(s,c) register char *s, c; {
X	while(*s) s++;
X	*s++ = c;
X	*s = 0;
X}
X
Xchar *
Xhallmon()
X{
X	register char let;
X	register int ct;
X	register struct permonst *ptr;
X
X	let = rndmonsym();
X	for(ct = 0; ct < CMNUM+1 ; ct++) {
X		ptr = &mons[ct];
X		if(ptr->mlet == let) return(ptr->mname);
X			
X	}
X	return("giant eel");
X}
X
X#ifdef KJSMODS
Xwith_amulet()
X{
X	register struct obj *otmp;
X	for(otmp = invent; otmp; otmp = otmp->nobj) {
X		if(otmp->olet == AMULET_SYM) { 
X			if(otmp->spe >= 0) return(1);
X		}
X	}
X	return(0);
X}
X#endif 
END_OF_end.c
if test 8789 -ne `wc -c <end.c`; then
    echo shar: \"end.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f makemon.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"makemon.c\"
else
echo shar: Extracting \"makemon.c\" \(8401 characters\)
sed "s/^X//" >makemon.c <<'END_OF_makemon.c'
X/*	SCCS Id: @(#)makemon.c	2.2	87/11/29
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X
X#include	"hack.h"
Xextern char fut_geno[];
Xextern char *index();
Xextern struct obj *mkobj_at(), *mksobj(), *mkobj();
Xstruct monst zeromonst;
Xextern boolean in_mklev;
X
X#ifdef HARD		/* used in hell for bigger, badder demons! */
X
Xstruct permonst d_lord   = { "demon lord",	'&',12,13,-5,50,1,5,0 },
X		d_prince = { "demon prince",	'&',14,14,-6,70,1,6,0 };
X#endif
X#ifdef KJSMODS
X# ifdef KOPS
Xstruct permonst kobold = { "kobold",'K',1,6,7,0,1,4,0 };
X# endif
X# ifdef ROCKMOLE
Xstruct permonst giant_rat = { "giant rat",'r',0,12,7,0,1,3,0 };
X# endif
X#endif /* KJSMODS /**/
X
X/*
X * called with [x,y] = coordinates;
X *	[0,0] means anyplace
X *	[u.ux,u.uy] means: call mnexto (if !in_mklev)
X *
X *	In case we make an Orc or killer bee, we make an entire horde
X *	(swarm); note that in this case we return only one of them
X *	(the one at [x,y]).
X */
Xstruct monst *
Xmakemon(ptr,x,y)
Xregister struct permonst *ptr;
X{
X	register struct monst *mtmp;
X	register nleft, deep, ct;
X	boolean anything = (!ptr);
X	int zlevel = dlevel;
X#ifdef BVH
X	if(has_amulet()) zlevel = 40;
X#endif
X	/* if a monster already exists at the position, return */
X	if(x != 0 || y != 0) if(m_at(x,y)) return((struct monst *) 0);
X	if(ptr){
X		/* if you are to make a specific monster and it has 
X		   already been genocided, return */
X		if(index(fut_geno, ptr->mlet)) return((struct monst *) 0);
X	} else {
X		/* make a random (common) monster. */
X		nleft = CMNUM - strlen(fut_geno);
X		if(index(fut_geno, 'm')) nleft++;  /* only 1 minotaur */
X		if(index(fut_geno, '@')) nleft++;
X		if(nleft <= 0)
X		    return((struct monst *) 0);	/* no more monsters! */
X
X		/* determine the strongest monster to make. */
X#ifdef ROCKMOLE
X		deep = rn2(nleft*zlevel/24 + 6);
X#else
X		deep = rn2(nleft*zlevel/24 + 7);
X#endif
X		if(deep < zlevel - 4) deep = rn2(nleft*zlevel/24 + 12);
X		/* if deep is greater than the number of monsters left 
X		   to create, set deep to a random number between half 
X		   the number left and the number left. */
X		if(deep >= nleft) deep = rn1(nleft - nleft/2, nleft/2);
X
X		for(ct = 0 ; ct < CMNUM ; ct++){
X			ptr = &mons[ct];
X			if(index(fut_geno, ptr->mlet)) continue;
X#ifdef KOPS
X			if(ptr->mlet == 'K') {
X# ifdef KJSMODS
X				/* since this is a random monster, make 
X				   a Kobold instead of a Kop. */
X				ptr = &kobold;
X# else
X				deep--;
X# endif
X				continue;
X			}
X#endif /* KOPS /**/
X			if(deep-- <= 0) goto gotmon;
X		}
X		/* this can happen if you are deep in the dungeon and 
X		   mostly weak monsters have been genocided. */
X		return((struct monst *) 0);
X	}
Xgotmon:
X#if defined(KJSMODS) && defined(ROCKMOLE)
X	/* make a giant rat */
X	if((zlevel < 4 && ptr->mlet == 'r')
X	   || (zlevel == 1 && (ptr->mlet == 'h' || ptr->mlet == 'i'))
X	   || (zlevel == 2 && (ptr->mlet == 'o' || ptr->mlet == 'y'))
X	) ptr = &giant_rat;
X#endif
X	mtmp = newmonst(ptr->pxlth);
X	*mtmp = zeromonst;	/* clear all entries in structure */
X	for(ct = 0; ct < ptr->pxlth; ct++)
X		((char *) &(mtmp->mextra[0]))[ct] = 0;
X	mtmp->nmon = fmon;
X	fmon = mtmp;
X	mtmp->m_id = flags.ident++;
X	mtmp->data = ptr;
X	mtmp->mxlth = ptr->pxlth;
X	if(ptr->mlet == 'D') mtmp->mhpmax = mtmp->mhp = 80;
X	else if(!ptr->mlevel) mtmp->mhpmax = mtmp->mhp = rnd(4);
X	else mtmp->mhpmax = mtmp->mhp = d(ptr->mlevel, 8);
X	mtmp->mx = x;
X	mtmp->my = y;
X	mtmp->mcansee = 1;
X	if(ptr->mlet == 'M'){
X		mtmp->mimic = 1;
X		mtmp->mappearance = ']';
X	}
X	if(!in_mklev) {
X		if(x == u.ux && y == u.uy && ptr->mlet != ' ')
X			mnexto(mtmp);
X		if(x == 0 && y == 0)
X			rloc(mtmp);
X	}
X	if(ptr->mlet == 's' || ptr->mlet == 'S') {
X		mtmp->mhide = mtmp->mundetected = 1;
X		if(in_mklev)
X		if(mtmp->mx && mtmp->my)
X			(void) mkobj_at(0, mtmp->mx, mtmp->my);
X	}
X	if(ptr->mlet == ':') {
X#ifdef DGKMOD
X		/* If you're protected with a ring, don't create
X		 * any shape-changing chameleons -dgk
X		 */
X		if (Protection_from_shape_changers)
X			mtmp->cham = 0;
X		else {
X			mtmp->cham = 1;
X			(void) newcham(mtmp,
X				&mons[zlevel+14+rn2(CMNUM-14-zlevel)]);
X		}
X#else
X		mtmp->cham = 1;
X		(void) newcham(mtmp, &mons[zlevel+14+rn2(CMNUM-14-zlevel)]);
X#endif
X	}
X	if(ptr->mlet == 'I' || ptr->mlet == ';')
X		mtmp->minvis = 1;
X	if(ptr->mlet == 'L' || ptr->mlet == 'N'
X	    || (in_mklev && index("&w;", ptr->mlet) && rn2(5))
X	) mtmp->msleep = 1;
X#ifdef HARD
X	if(ptr->mlet == '&' && (Inhell || u.udemigod)) {
X
X		if(!rn2(3 + !Inhell + !u.udemigod)) {
X		    if (rn2(3 + Inhell)) mtmp->data = &d_lord;
X		    else  {
X			mtmp->data = &d_prince;
X			mtmp->mpeaceful = 1;
X			mtmp->minvis = 1;
X		    }
X		}
X#ifdef RPH
X		if(uwep)
X		    if(!strcmp(ONAME(uwep), "Excalibur"))
X			mtmp->mpeaceful = mtmp->mtame = 0;
X#endif
X	}
X#endif /* HARD /**/
X#ifndef NOWORM
X	if(ptr->mlet == 'w' && getwn(mtmp))  initworm(mtmp);
X#endif
X
X	if(anything)
X	    if(ptr->mlet == 'O' || ptr->mlet == 'k'
X#ifdef SAC
X	       || ptr->mlet == '3'
X#endif /* SAC /**/
X				  ) {
X
X		coord mm;
X		register int cnt = rnd(10);
X		mm.x = x;
X		mm.y = y;
X		while(cnt--) {
X			enexto(&mm, mm.x, mm.y);
X			(void) makemon(ptr, mm.x, mm.y);
X		}
X	}
X#ifdef DGKMOD
X	m_initinv(mtmp);
X#endif
X	return(mtmp);
X}
X
X#ifdef DGKMOD
X/* Give some monsters an initial inventory to use */
Xm_initinv(mtmp)
Xstruct monst *mtmp;
X{
X	struct obj *otmp;
X
X	switch (mtmp->data->mlet) {
X# ifdef KAA
X	case '9':
X		if (rn2(2)) {
X			otmp = mksobj(ENORMOUS_ROCK);
X			mpickobj(mtmp, otmp);
X		}
X# endif
X# ifdef SAC
X	case '3':			/* Outfit the troops */
X		if (!rn2(4)) {
X			otmp = mksobj(HELMET);
X			mpickobj(mtmp, otmp); }
X		if (!rn2(4)) {
X			otmp = mksobj(CHAIN_MAIL);
X			mpickobj(mtmp, otmp); }
X		if (!rn2(3)) {
X			otmp = mksobj(DAGGER);
X			mpickobj(mtmp, otmp); }
X		if (!rn2(6)) {
X			otmp = mksobj(SPEAR);
X			mpickobj(mtmp, otmp); }
X		if (!rn2(2)) {
X			otmp = mksobj(TIN);
X			mpickobj(mtmp, otmp); }
X# endif /* SAC /**/
X# ifdef KOPS
X	case 'K':		/* create Keystone Kops with cream pies to
X				 * throw. As suggested by KAA.	   [MRS]
X				 */
X		if (!rn2(4)
X#  ifdef KJSMODS
X  		    && !strcmp(mtmp->data->mname, "Keystone Kop")
X#  endif
X								) {
X			otmp = mksobj(CREAM_PIE);
X			otmp->quan = 2 + rnd(2);
X			otmp->owt = weight(otmp);
X			mpickobj(mtmp, otmp);
X		}
X		break;
X	case 'O':
X# else
X	case 'K':
X# endif
X		if (!rn2(4)) {
X			otmp = mksobj(DART);
X			otmp->quan = 2 + rnd(12);
X			otmp->owt = weight(otmp);
X			mpickobj(mtmp, otmp);
X		}
X		break;
X
X	case 'C':
X		if (rn2(2)) {
X			otmp = mksobj(CROSSBOW);
X			otmp->cursed = rn2(2);
X			mpickobj(mtmp, otmp);
X			otmp = mksobj(CROSSBOW_BOLT);
X			otmp->quan = 2 + rnd(12);
X			otmp->owt = weight(otmp);
X			mpickobj(mtmp, otmp);
X		}
X		break;
X	default:
X		break;
X	}
X}
X#endif
X
Xenexto(cc, xx,yy)
Xcoord	*cc;
Xregister xchar xx,yy;
X{
X	register xchar x,y;
X	coord foo[15], *tfoo;
X	int range, i;
X
X	tfoo = foo;
X	range = 1;
X	do {	/* full kludge action. */
X		for(x = xx-range; x <= xx+range; x++)
X			if(goodpos(x, yy-range)) {
X				tfoo->x = x;
X				(tfoo++)->y = yy-range;
X				if(tfoo == &foo[15]) goto foofull;
X			}
X		for(x = xx-range; x <= xx+range; x++)
X			if(goodpos(x,yy+range)) {
X				tfoo->x = x;
X				(tfoo++)->y = yy+range;
X				if(tfoo == &foo[15]) goto foofull;
X			}
X		for(y = yy+1-range; y < yy+range; y++)
X			if(goodpos(xx-range,y)) {
X				tfoo->x = xx-range;
X				(tfoo++)->y = y;
X				if(tfoo == &foo[15]) goto foofull;
X			}
X		for(y = yy+1-range; y < yy+range; y++)
X			if(goodpos(xx+range,y)) {
X				tfoo->x = xx+range;
X				(tfoo++)->y = y;
X				if(tfoo == &foo[15]) goto foofull;
X			}
X		range++;
X	} while(tfoo == foo);
Xfoofull:
X	i = rn2(tfoo - foo);
X	cc->x = foo[i].x;
X	cc->y = foo[i].y;
X	return(0);
X}
X
Xgoodpos(x,y)	/* used only in mnexto and rloc */
X{
X	return(
X	! (x < 1 || x > COLNO-2 || y < 1 || y > ROWNO-2 ||
X	   m_at(x,y) || !ACCESSIBLE(levl[x][y].typ)
X	   || (x == u.ux && y == u.uy)
X	   || sobj_at(ENORMOUS_ROCK, x, y)
X	));
X}
X
Xrloc(mtmp)
Xstruct monst *mtmp;
X{
X	register tx,ty;
X	register char ch = mtmp->data->mlet;
X
X#ifndef NOWORM
X	if(ch == 'w' && mtmp->mx) return;	/* do not relocate worms */
X#endif
X	do {
X		tx = rn1(COLNO-3,2);
X		ty = rn2(ROWNO);
X	} while(!goodpos(tx,ty));
X	mtmp->mx = tx;
X	mtmp->my = ty;
X	if(u.ustuck == mtmp){
X		if(u.uswallow) {
X			u.ux = tx;
X			u.uy = ty;
X			docrt();
X		} else	u.ustuck = 0;
X	}
X	pmon(mtmp);
X}
X
Xstruct monst *
Xmkmon_at(let,x,y)
Xchar let;
Xregister int x,y;
X{
X	register int ct;
X	register struct permonst *ptr;
X
X	for(ct = 0; ct < CMNUM; ct++) {
X		ptr = &mons[ct];
X		if(ptr->mlet == let)
X			return(makemon(ptr,x,y));
X	}
X	return((struct monst *)0);
X}
END_OF_makemon.c
if test 8401 -ne `wc -c <makemon.c`; then
    echo shar: \"makemon.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f onames.h -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"onames.h\"
else
echo shar: Extracting \"onames.h\" \(8681 characters\)
sed "s/^X//" >onames.h <<'END_OF_onames.h'
X#define	STRANGE_OBJECT	0
X#define	AMULET_OF_YENDOR	1
X#define	FOOD_RATION	2
X#define	TRIPE_RATION	3
X#define	PANCAKE	4
X#define	DEAD_LIZARD	5
X#define	FORTUNE_COOKIE	6
X#define	CARROT	7
X#define	SLICE_OF_PIZZA	8
X#define	CREAM_PIE	9
X#define	TIN	10
X#define	ORANGE	11
X#define	APPLE	12
X#define	PEAR	13
X#define	MELON	14
X#define	BANANA	15
X#define	CANDY_BAR	16
X#define	EGG	17
X#define	CLOVE_OF_GARLIC	18
X#define	LUMP_OF_ROYAL_JELLY	19
X#define	DEAD_HUMAN	20
X#define	DEAD_GIANT_ANT	21
X#define	DEAD_GIANT_BAT	22
X#define	DEAD_CENTAUR	23
X#define	DEAD_DRAGON	24
X#define	DEAD_FLOATING_EYE	25
X#define	DEAD_FREEZING_SPHERE	26
X#define	DEAD_GNOME	27
X#define	DEAD_HOBGOBLIN	28
X#define	DEAD_STALKER	29
X#define	DEAD_JACKAL	30
X#define	DEAD_KOBOLD	31
X#define	DEAD_LEPRECHAUN	32
X#define	DEAD_MIMIC	33
X#define	DEAD_NYMPH	34
X#define	DEAD_ORC	35
X#define	DEAD_PURPLE_WORM	36
X#define	DEAD_QUANTUM_MECHANIC	37
X#define	DEAD_RUST_MONSTER	38
X#define	DEAD_SNAKE	39
X#define	DEAD_TROLL	40
X#define	DEAD_UMBER_HULK	41
X#define	DEAD_VAMPIRE	42
X#define	DEAD_WRAITH	43
X#define	DEAD_XORN	44
X#define	DEAD_YETI	45
X#define	DEAD_ZOMBIE	46
X#define	DEAD_ACID_BLOB	47
X#define	DEAD_GIANT_BEETLE	48
X#define	DEAD_COCKATRICE	49
X#define	DEAD_DOG	50
X#define	DEAD_ETTIN	51
X#define	DEAD_FOG_CLOUD	52
X#define	DEAD_GELATINOUS_CUBE	53
X#define	DEAD_HOMUNCULUS	54
X#define	DEAD_IMP	55
X#define	DEAD_JAGUAR	56
X#define	DEAD_KILLER_BEE	57
X#define	DEAD_LEOCROTTA	58
X#define	DEAD_MINOTAUR	59
X#define	DEAD_NURSE	60
X#define	DEAD_OWLBEAR	61
X#define	DEAD_PIERCER	62
X#define	DEAD_QUIVERING_BLOB	63
X#define	DEAD_GIANT_RAT	64
X#define	DEAD_GIANT_SCORPION	65
X#define	DEAD_TENGU	66
X#define	DEAD_UNICORN	67
X#define	DEAD_VIOLET_FUNGUS	68
X#define	DEAD_LONG_WORM	69
X#define	DEAD_XAN	70
X#define	DEAD_YELLOW_LIGHT	71
X#define	DEAD_ZRUTY	72
X#define	DEAD_SOLDIER	73
X#define	DEAD_GIANT	74
X#define	DEAD_DEMON	75
X#define	ARROW	76
X#define	SLING_BULLET	77
X#define	CROSSBOW_BOLT	78
X#define	DART	79
X#define	SHURIKEN	80
X#define	ROCK	81
X#define	BOOMERANG	82
X#define	MACE	83
X#define	AXE	84
X#define	FLAIL	85
X#define	LONG_SWORD	86
X#define	TWO_HANDED_SWORD	87
X#define	DAGGER	88
X#define	WORM_TOOTH	89
X#define	CRYSKNIFE	90
X#define	AKLYS	91
X#define	BARDICHE	92
X#define	BEC_DE_CORBIN	93
X#define	BILL_GUISARME	94
X#define	CLUB	95
X#define	FAUCHARD	96
X#define	GLAIVE	97
X#define	GUISARME	98
X#define	HALBERD	99
X#define	LUCERN_HAMMER	100
X#define	JAVELIN	101
X#define	KATANA	102
X#define	LANCE	103
X#define	MORNING_STAR	104
X#define	PARTISAN	105
X#define	RANSEUR	106
X#define	SCIMITAR	107
X#define	SPETUM	108
X#define	BROAD_SWORD	109
X#define	SHORT_SWORD	110
X#define	TRIDENT	111
X#define	VOULGE	112
X#define	SPEAR	113
X#define	BOW	114
X#define	SLING	115
X#define	CROSSBOW	116
X#define	WHISTLE	117
X#define	LEASH	118
X#define	MAGIC_WHISTLE	119
X#define	BLINDFOLD	120
X#define	MIRROR	121
X#define	EXPENSIVE_CAMERA	122
X#define	ICE_BOX	123
X#define	PICK_AXE	124
X#define	MAGIC_MARKER	125
X#define	STETHOSCOPE	126
X#define	CAN_OPENER	127
X#define	HEAVY_IRON_BALL	128
X#define	IRON_CHAIN	129
X#define	ENORMOUS_ROCK	130
X#define	HELMET	131
X#define	PLATE_MAIL	132
X#define	SPLINT_MAIL	133
X#define	BANDED_MAIL	134
X#define	CHAIN_MAIL	135
X#define	SCALE_MAIL	136
X#define	RING_MAIL	137
X#define	STUDDED_LEATHER_ARMOR	138
X#define	ELFIN_CHAIN_MAIL	139
X#define	BRONZE_PLATE_MAIL	140
X#define	CRYSTAL_PLATE_MAIL	141
X#define	LEATHER_ARMOR	142
X#define	ELVEN_CLOAK	143
X#define	SHIELD	144
X#define	PAIR_OF_GLOVES	145
X#define	POT_RESTORE_STRENGTH	146
X#define	POT_GAIN_ENERGY	147
X#define	POT_BOOZE	148
X#define	POT_INVISIBILITY	149
X#define	POT_FRUIT_JUICE	150
X#define	POT_HEALING	151
X#define	POT_PARALYSIS	152
X#define	POT_MONSTER_DETECTION	153
X#define	POT_OBJECT_DETECTION	154
X#define	POT_SICKNESS	155
X#define	POT_CONFUSION	156
X#define	POT_GAIN_STRENGTH	157
X#define	POT_SPEED	158
X#define	POT_BLINDNESS	159
X#define	POT_GAIN_LEVEL	160
X#define	POT_EXTRA_HEALING	161
X#define	POT_LEVITATION	162
X#define	POT_HALLUCINATION	163
X#define	POT_HOLY_WATER	164
X#define	SCR_MAIL	167
X#define	SCR_ENCHANT_ARMOR	168
X#define	SCR_DESTROY_ARMOR	169
X#define	SCR_CONFUSE_MONSTER	170
X#define	SCR_SCARE_MONSTER	171
X#define	SCR_BLANK_PAPER	172
X#define	SCR_REMOVE_CURSE	173
X#define	SCR_ENCHANT_WEAPON	174
X#define	SCR_DAMAGE_WEAPON	175
X#define	SCR_CREATE_MONSTER	176
X#define	SCR_TAMING	177
X#define	SCR_GENOCIDE	178
X#define	SCR_LIGHT	179
X#define	SCR_TELEPORTATION	180
X#define	SCR_GOLD_DETECTION	181
X#define	SCR_FOOD_DETECTION	182
X#define	SCR_IDENTIFY	183
X#define	SCR_MAGIC_MAPPING	184
X#define	SCR_AMNESIA	185
X#define	SCR_FIRE	186
X#define	SCR_PUNISHMENT	187
X#define	WAN_LIGHT	192
X#define	WAN_SECRET_DOOR_DETECTION	193
X#define	WAN_CREATE_MONSTER	194
X#define	WAN_WISHING	195
X#define	WAN_STRIKING	196
X#define	WAN_NOTHING	197
X#define	WAN_SLOW_MONSTER	198
X#define	WAN_SPEED_MONSTER	199
X#define	WAN_UNDEAD_TURNING	200
X#define	WAN_POLYMORPH	201
X#define	WAN_CANCELLATION	202
X#define	WAN_TELEPORTATION	203
X#define	WAN_MAKE_INVISIBLE	204
X#define	WAN_PROBING	205
X#define	WAN_DIGGING	206
X#define	WAN_MAGIC_MISSILE	207
X#define	WAN_FIRE	208
X#define	WAN_SLEEP	209
X#define	WAN_COLD	210
X#define	WAN_DEATH	211
X#define	SPE_MAGIC_MISSILE	214
X#define	SPE_FIREBALL	215
X#define	SPE_SLEEP	216
X#define	SPE_CONE_OF_COLD	217
X#define	SPE_FINGER_OF_DEATH	218
X#define	SPE_HEALING	219
X#define	SPE_DETECT_MONSTERS	220
X#define	SPE_FORCE_BOLT	221
X#define	SPE_LIGHT	222
X#define	SPE_CONFUSE_MONSTER	223
X#define	SPE_CURE_BLINDNESS	224
X#define	SPE_SLOW_MONSTER	225
X#define	SPE_CREATE_MONSTER	226
X#define	SPE_DETECT_FOOD	227
X#define	SPE_HASTE_SELF	228
X#define	SPE_CAUSE_FEAR	229
X#define	SPE_CURE_SICKNESS	230
X#define	SPE_DETECT_UNSEEN	231
X#define	SPE_EXTRA_HEALING	232
X#define	SPE_CHARM_MONSTER	233
X#define	SPE_LEVITATION	234
X#define	SPE_RESTORE_STRENGTH	235
X#define	SPE_INVISIBILITY	236
X#define	SPE_DETECT_TREASURE	237
X#define	SPE_DIG	238
X#define	SPE_REMOVE_CURSE	239
X#define	SPE_MAGIC_MAPPING	240
X#define	SPE_IDENTIFY	241
X#define	SPE_TURN_UNDEAD	242
X#define	SPE_POLYMORPH	243
X#define	SPE_CREATE_FAMILIAR	244
X#define	SPE_TELEPORT_AWAY	245
X#define	SPE_CANCELLATION	246
X#define	SPE_GENOCIDE	247
X#define	Adornment	u.uprops[0].p_flgs
X#define	RIN_ADORNMENT	252
X#define	HTeleportation	u.uprops[1].p_flgs
X#define	Teleportation	((HTeleportation) || index("LNt", u.usym))
X#define	RIN_TELEPORTATION	253
X#define	HRegeneration	u.uprops[2].p_flgs
X#define	Regeneration	((HRegeneration) || index("TVi", u.usym))
X#define	RIN_REGENERATION	254
X#define	Searching	u.uprops[3].p_flgs
X#define	RIN_SEARCHING	255
X#define	HSee_invisible	u.uprops[4].p_flgs
X#define	See_invisible	((HSee_invisible) || index("I", u.usym))
X#define	RIN_SEE_INVISIBLE	256
X#define	Stealth	u.uprops[5].p_flgs
X#define	RIN_STEALTH	257
X#define	Levitation	u.uprops[6].p_flgs
X#define	RIN_LEVITATION	258
X#define	HPoison_resistance	u.uprops[7].p_flgs
X#define	Poison_resistance	((HPoison_resistance) || index("abcghikqsuvxyADFQSVWXZ&", u.usym))
X#define	RIN_POISON_RESISTANCE	259
X#define	Aggravate_monster	u.uprops[8].p_flgs
X#define	RIN_AGGRAVATE_MONSTER	260
X#define	Hunger	u.uprops[9].p_flgs
X#define	RIN_HUNGER	261
X#define	HFire_resistance	u.uprops[10].p_flgs
X#define	Fire_resistance	((HFire_resistance) || index("gD&", u.usym))
X#define	RIN_FIRE_RESISTANCE	262
X#define	HCold_resistance	u.uprops[11].p_flgs
X#define	Cold_resistance	((HCold_resistance) || index("gFY", u.usym))
X#define	RIN_COLD_RESISTANCE	263
X#define	Protection_from_shape_changers	u.uprops[12].p_flgs
X#define	RIN_PROTECTION_FROM_SHAPE_CHAN	264
X#define	Conflict	u.uprops[13].p_flgs
X#define	RIN_CONFLICT	265
X#define	Gain_strength	u.uprops[14].p_flgs
X#define	RIN_GAIN_STRENGTH	266
X#define	Increase_damage	u.uprops[15].p_flgs
X#define	RIN_INCREASE_DAMAGE	267
X#define	Protection	u.uprops[16].p_flgs
X#define	RIN_PROTECTION	268
X#define	Warning	u.uprops[17].p_flgs
X#define	RIN_WARNING	269
X#define	HTeleport_control	u.uprops[18].p_flgs
X#define	Teleport_control	((HTeleport_control) || index("t", u.usym))
X#define	RIN_TELEPORT_CONTROL	270
X#define	Polymorph	u.uprops[19].p_flgs
X#define	RIN_POLYMORPH	271
X#define	Polymorph_control	u.uprops[20].p_flgs
X#define	RIN_POLYMORPH_CONTROL	272
X#define	DILITHIUM_CRYSTAL	275
X#define	DIAMOND	276
X#define	RUBY	277
X#define	SAPPHIRE	278
X#define	EMERALD	279
X#define	TURQUOISE	280
X#define	AQUAMARINE	281
X#define	TOURMALINE	282
X#define	TOPAZ	283
X#define	OPAL	284
X#define	GARNET	285
X#define	AMETHYST	286
X#define	AGATE	287
X#define	ONYX	288
X#define	JASPER	289
X#define	JADE	290
X/* #define	WORTHLESS_PIECE_OF_BLUE_GLASS	291 */
X/* #define	WORTHLESS_PIECE_OF_RED_GLASS	292 */
X/* #define	WORTHLESS_PIECE_OF_YELLOW_GLASS	293 */
X/* #define	WORTHLESS_PIECE_OF_GREEN_GLASS	294 */
X
X#define	CORPSE		DEAD_HUMAN
X#define	DEAD_KOP		DEAD_KOBOLD
X#define	DEAD_GIANT_SPIDER	DEAD_GIANT_SCORPION
X#define	DEAD_ROCKMOLE		DEAD_GIANT_RAT
X#define	LAST_GEM	(JADE+1)
X#define	LAST_RING	21
X#define MAXSPELL	35
X#define	NROFOBJECTS	294
END_OF_onames.h
if test 8681 -ne `wc -c <onames.h`; then
    echo shar: \"onames.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f unixtty.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"unixtty.c\"
else
echo shar: Extracting \"unixtty.c\" \(8711 characters\)
sed "s/^X//" >unixtty.c <<'END_OF_unixtty.c'
X/*	SCCS Id: @(#)unixtty.c	2.1	87/11/09
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* tty.c - (Unix) version */
X
X/* With thanks to the people who sent code for SYSV - hpscdi!jon,
X * arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others.
X */
X
X#include	<stdio.h>
X#include	"extern.h"
X#include	"hack.h"
X#include	"func_tab.h"
X
X#define	ON	1
X#define OFF	0
X
X/*
X * The distinctions here are not BSD - rest but rather USG - rest, as
X * BSD still has the old sgttyb structure, but SYSV has termio. Thus:
X */
X#ifdef BSD
X#define	V7
X#else
X#define USG
X#endif
X
X/*
X * Some systems may have getchar() return EOF for various reasons, and
X * we should not quit before seeing at least NR_OF_EOFS consecutive EOFs.
X */
X#ifndef BSD
X#define	NR_OF_EOFS	20
X#endif
X
X
X#ifdef USG
X
X#include	<termio.h>
X#define termstruct	termio
X#define kill_sym	c_cc[VKILL]
X#define erase_sym	c_cc[VERASE]
X#define EXTABS		TAB3
X#define tabflgs		c_oflag
X#define echoflgs	c_lflag
X#define cbrkflgs	c_lflag
X#define CBRKMASK	ICANON
X#define CBRKON		! /* reverse condition */
X#define OSPEED(x)	((x).c_cflag & CBAUD)
X#define GTTY(x)		(ioctl(0, TCGETA, x))
X/* STTY now modified to run under Sys V R3.	- may have to be #ifdef'ed */
X#define STTY(x)		(ioctl(0, TCSETAW, x))	/* TCSETAF? TCSETAW? */
X
X#else	/* V7 */
X
X#include	<sgtty.h>
X#define termstruct	sgttyb
X#define	kill_sym	sg_kill
X#define	erase_sym	sg_erase
X#define EXTABS		XTABS
X#define tabflgs		sg_flags
X#define echoflgs	sg_flags
X#define cbrkflgs	sg_flags
X#define CBRKMASK	CBREAK
X#define CBRKON		/* empty */
X#define OSPEED(x)	(x).sg_ospeed
X#define GTTY(x)		(gtty(0, x))
X#define STTY(x)		(stty(0, x))
X
X#endif
X
Xextern short ospeed;
Xstatic char erase_char, kill_char;
Xstatic boolean settty_needed = FALSE;
Xstruct termstruct inittyb, curttyb;
X
X/*
X * Get initial state of terminal, set ospeed (for termcap routines)
X * and switch off tab expansion if necessary.
X * Called by startup() in termcap.c and after returning from ! or ^Z
X */
Xgettty(){
X	if(GTTY(&inittyb) < 0)
X		perror("Hack (gettty)");
X	curttyb = inittyb;
X	ospeed = OSPEED(inittyb);
X	erase_char = inittyb.erase_sym;
X	kill_char = inittyb.kill_sym;
X	getioctls();
X
X	/* do not expand tabs - they might be needed inside a cm sequence */
X	if(curttyb.tabflgs & EXTABS) {
X		curttyb.tabflgs &= ~EXTABS;
X		setctty();
X	}
X	settty_needed = TRUE;
X}
X
X/* reset terminal to original state */
Xsettty(s) char *s; {
X	clear_screen();
X	end_screen();
X	if(s) printf(s);
X	(void) fflush(stdout);
X	if(STTY(&inittyb) < 0)
X		perror("Hack (settty)");
X	flags.echo = (inittyb.echoflgs & ECHO) ? ON : OFF;
X	flags.cbreak = (CBRKON(inittyb.cbrkflgs & CBRKMASK)) ? ON : OFF;
X	setioctls();
X}
X
Xsetctty(){
X	if(STTY(&curttyb) < 0)
X		perror("Hack (setctty)");
X}
X
X
Xsetftty(){
Xregister int ef = 0;			/* desired value of flags & ECHO */
Xregister int cf = CBRKON(CBRKMASK);	/* desired value of flags & CBREAK */
Xregister int change = 0;
X	flags.cbreak = ON;
X	flags.echo = OFF;
X	/* Should use (ECHO|CRMOD) here instead of ECHO */
X	if((curttyb.echoflgs & ECHO) != ef){
X		curttyb.echoflgs &= ~ECHO;
X/*		curttyb.echoflgs |= ef;					*/
X		change++;
X	}
X	if((curttyb.cbrkflgs & CBRKMASK) != cf){
X		curttyb.cbrkflgs &= ~CBRKMASK;
X		curttyb.cbrkflgs |= cf;
X#ifdef USG
X		/* be satisfied with one character; no timeout */
X		curttyb.c_cc[VMIN] = 1;		/* was VEOF */
X		curttyb.c_cc[VTIME] = 0;	/* was VEOL */
X#endif
X		change++;
X	}
X	if(change){
X		setctty();
X	}
X	start_screen();
X}
X
X
X/* fatal error */
X/*VARARGS1*/
Xerror(s,x,y) char *s; {
X	if(settty_needed)
X		settty((char *) 0);
X	printf(s,x,y);
X	putchar('\n');
X	exit(1);
X}
X
X/*
X * Read a line closed with '\n' into the array char bufp[BUFSZ].
X * (The '\n' is not stored. The string is closed with a '\0'.)
X * Reading can be interrupted by an escape ('\033') - now the
X * resulting string is "\033".
X */
Xgetlin(bufp)
Xregister char *bufp;
X{
X	register char *obufp = bufp;
X	register int c;
X
X	flags.toplin = 2;		/* nonempty, no --More-- required */
X	for(;;) {
X		(void) fflush(stdout);
X		if((c = getchar()) == EOF) {
X			*bufp = 0;
X			return;
X		}
X		if(c == '\033') {
X			*obufp = c;
X			obufp[1] = 0;
X			return;
X		}
X		if(c == erase_char || c == '\b') {
X			if(bufp != obufp) {
X				bufp--;
X				putstr("\b \b"); /* putsym converts \b */
X			} else	bell();
X		} else if(c == '\n') {
X			*bufp = 0;
X			return;
X		} else if(' ' <= c && c < '\177') {
X				/* avoid isprint() - some people don't have it
X				   ' ' is not always a printing char */
X			*bufp = c;
X			bufp[1] = 0;
X			putstr(bufp);
X			if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
X				bufp++;
X		} else if(c == kill_char || c == '\177') { /* Robert Viduya */
X				/* this test last - @ might be the kill_char */
X			while(bufp != obufp) {
X				bufp--;
X				putstr("\b \b");
X			}
X		} else
X			bell();
X	}
X}
X
Xgetret() {
X	cgetret("");
X}
X
Xcgetret(s)
Xregister char *s;
X{
X	putsym('\n');
X	if(flags.standout)
X		standoutbeg();
X	putstr("Hit ");
X	putstr(flags.cbreak ? "space" : "return");
X	putstr(" to continue: ");
X	if(flags.standout)
X		standoutend();
X	xwaitforspace(s);
X}
X
Xchar morc;	/* tell the outside world what char he used */
X
Xxwaitforspace(s)
Xregister char *s;	/* chars allowed besides space or return */
X{
Xregister int c;
X
X	morc = 0;
X
X	while((c = readchar()) != '\n') {
X	    if(flags.cbreak) {
X		if(c == ' ') break;
X		if(s && index(s,c)) {
X			morc = c;
X			break;
X		}
X		bell();
X	    }
X	}
X}
X
Xstatic int last_multi;
X
Xchar *
Xparse()
X{
X	static char inline[COLNO];
X	register foo;
X
X	multi = 0;
X	flags.move = 1;
X	if(!Invisible) curs_on_u(); else home();
X	while((foo = readchar()) >= '0' && foo <= '9') {
X		multi = 10*multi+foo-'0';
X#ifdef DGKMOD
X		if (multi < 0 || multi > LARGEST_INT)
X			multi = LARGEST_INT;
X		if (multi > 9) {
X			remember_topl();
X			home();
X			cl_end();
X			printf("Count: %d", multi);
X		}
X#endif
X		last_multi = multi;
X	}
X# ifdef REDO
X	if (foo == DOAGAIN || in_doagain)
X		multi = last_multi;
X	else {
X		savech(0);	/* reset input queue */
X		savech(foo);
X	}
X# endif
X	if(multi) {
X		multi--;
X		save_cm = inline;
X	}
X	inline[0] = foo;
X	inline[1] = 0;
X	if(foo == 'g' || foo == 'G'){
X		inline[1] = getchar();
X#ifdef QUEST
X		if(inline[1] == foo) inline[2] = getchar(); else
X#endif
X		inline[2] = 0;
X	}
X	if(foo == 'm' || foo == 'M'){
X		inline[1] = getchar();
X		inline[2] = 0;
X	}
X	clrlin();
X	return(inline);
X}
X
Xchar
Xreadchar() {
X	register int sym;
X
X	(void) fflush(stdout);
X	if((sym = getchar()) == EOF)
X#ifdef NR_OF_EOFS
X	{ /*
X	   * Some SYSV systems seem to return EOFs for various reasons
X	   * (?like when one hits break or for interrupted systemcalls?),
X	   * and we must see several before we quit.
X	   */
X		register int cnt = NR_OF_EOFS;
X		while (cnt--) {
X		    clearerr(stdin);	/* omit if clearerr is undefined */
X		    if((sym = getchar()) != EOF) goto noteof;
X		}
X		end_of_input();
X	     noteof:	;
X	}
X#else
X		end_of_input();
X#endif /* NR_OF_EOFS /**/
X	if(flags.toplin == 1)
X		flags.toplin = 2;
X	return((char) sym);
X}
X
Xend_of_input()
X{
X	settty("End of input?\n");
X	clearlocks();
X	exit(0);
X}
X
X#ifdef COM_COMPL
X/* Read in an extended command - doing command line completion for
X * when enough character have been entered to make a unique command.
X * This is just a modified getlin().   -jsb
X */
Xget_ext_cmd(bufp)
Xregister char *bufp;
X{
X	register char *obufp = bufp;
X	register int c;
X	int com_index, index;
X
X	flags.toplin = 2;		/* nonempty, no --More-- required */
X
X	for(;;) {
X		(void) fflush(stdout);
X		if((c = readchar()) == EOF) {
X			*bufp = 0;
X			return;
X		}
X		if(c == '\033') {
X			*obufp = c;
X			obufp[1] = 0;
X			return;
X		}
X		if(c == erase_char || c == '\b') {
X			if(bufp != obufp) {
X				bufp--;
X				putstr("\b \b"); /* putsym converts \b */
X			} else	bell();
X		} else if(c == '\n') {
X			*bufp = 0;
X			return;
X		} else if(' ' <= c && c < '\177') {
X				/* avoid isprint() - some people don't have it
X				   ' ' is not always a printing char */
X			*bufp = c;
X			bufp[1] = 0;
X			index = 0;
X			com_index = -1;
X
X			while(extcmdlist[index].ef_txt != (char *) 0){
X				if(!strncmp(obufp, extcmdlist[index].ef_txt,
X				strlen(obufp)))
X					if(com_index == -1) /* No matches yet*/
X					    com_index = index;
X					else /* More than 1 match */
X					    com_index = -2;
X				index++;
X			}
X			if(com_index >= 0){
X				strcpy(obufp,
X				extcmdlist[com_index].ef_txt);
X				/* finish print our string */
X				putstr(bufp);
X				bufp = obufp; /* reset it */
X				if(strlen(obufp) < BUFSIZ-1 &&
X				 strlen(obufp) < COLNO)
X					/* set bufp at the end of our
X					 * string
X					 */
X					bufp += strlen(obufp);
X			} else {
X				putstr(bufp);
X				if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
X					bufp++;
X			}
X		} else if(c == kill_char || c == '\177') { /* Robert Viduya */
X				/* this test last - @ might be the kill_char */
X			while(bufp != obufp) {
X				bufp--;
X				putstr("\b \b");
X			}
X		} else
X			bell();
X	}
X
X}
X#endif COM_COMPL
END_OF_unixtty.c
if test 8711 -ne `wc -c <unixtty.c`; then
    echo shar: \"unixtty.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 15 \(of 20\).
cp /dev/null ark15isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 20 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0