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

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

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



#! /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 8 (of 20)."
# Contents:  apply.c edog.h fight.c read.c
# Wrapped by billr@tekred on Tue Dec  1 16:24:56 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f apply.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"apply.c\"
else
echo shar: Extracting \"apply.c\" \(17145 characters\)
sed "s/^X//" >apply.c <<'END_OF_apply.c'
X/*	SCCS Id: @(#)apply.c	2.1	87/09/23
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X
X#include	"hack.h"
X#include	"edog.h"
X#include	"mkroom.h"
Xstatic struct monst *bchit();
Xextern struct obj *addinv();
Xextern struct trap *maketrap();
Xextern int (*occupation)();
Xextern char *occtxt;
Xextern char quitchars[];
Xextern char pl_character[];
X
X#ifdef KAA
Xextern boolean unweapon;
X#endif
Xstatic use_camera(), use_ice_box(), use_whistle();
Xstatic use_magic_whistle(), use_pick_axe();
X#ifdef MARKER
Xextern int dowrite();
X#endif
X#ifdef RPH
Xstatic use_mirror();
X#endif
X
Xdoapply() {
X	register struct obj *obj;
X	register int res = 1;
X
X	obj = getobj("(", "use or apply");
X	if(!obj) return(0);
X
X	switch(obj->otyp){
X	case EXPENSIVE_CAMERA:
X		use_camera(obj); break;
X	case ICE_BOX:
X		use_ice_box(obj); break;
X	case PICK_AXE:
X		res = use_pick_axe(obj);
X		break;
X
X	case MAGIC_WHISTLE:
X		if(pl_character[0] == 'W' || u.ulevel > 9) {
X			use_magic_whistle(obj);
X			break;
X		}
X		/* fall into next case */
X	case WHISTLE:
X		use_whistle(obj);
X		break;
X#ifdef RPH
X	case MIRROR:
X		use_mirror(obj);
X		break;
X#endif
X#ifdef WALKIES
X	case LEASH:
X		use_leash(obj);
X		break;
X#endif
X#ifdef MARKER
X	case MAGIC_MARKER:
X		dowrite(obj);
X		break;
X#endif
X	case CAN_OPENER:
X		if(!carrying(TIN)) {
X			pline("You have no can to open.");
X			goto xit;
X		}
X		pline("You cannot open a tin without eating its contents.");
X		pline("In order to eat, use the 'e' command.");
X		if(obj != uwep)
X    pline("Opening the tin will be much easier if you wield the can-opener.");
X		goto xit;
X
X#ifdef KAA
X	case STETHOSCOPE:
X		res = use_stethoscope();
X		break;
X#endif
X	case BLINDFOLD:
X		if (Blindfolded) {
X		    Blindfolded = 0;
X		    if (!Blinded)	Blinded = 1;	/* see on next move */
X		    else		pline("You still cannot see.");
X		} else {
X		    Blindfolded = 1;
X		    seeoff(0);
X		}
X		break;
X	default:
X		pline("Sorry, I don't know how to use that.");
X	xit:
X		nomul(0);
X		return(0);
X	}
X	nomul(0);
X	return(res);
X}
X
X/* ARGSUSED */
Xstatic
Xuse_camera(obj) /* register */ struct obj *obj; {
Xregister struct monst *mtmp;
X	if(!getdir(1)){		/* ask: in what direction? */
X		flags.move = multi = 0;
X		return;
X	}
X	if(u.uswallow) {
X		pline("You take a picture of %s's stomach.", monnam(u.ustuck));
X		return;
X	}
X	if(u.dz) {
X		pline("You take a picture of the %s.",
X			(u.dz > 0) ? "floor" : "ceiling");
X		return;
X	}
X#ifdef KAA
X	if(!u.dx && !u.dy && !u.dz) {
X		if(!Blind) {
X			pline("You are blinded by the flash!");
X			Blinded += rnd(25);
X			seeoff(0);
X		}
X		return;
X	}
X#endif
X	if(mtmp = bchit(u.dx, u.dy, COLNO, '!')) {
X		if(mtmp->msleep){
X			mtmp->msleep = 0;
X			pline("The flash awakens %s.", monnam(mtmp)); /* a3 */
X		} else
X		if(mtmp->data->mlet != 'y')
X		if(mtmp->mcansee || mtmp->mblinded){
X			register int tmp = dist(mtmp->mx,mtmp->my);
X			register int tmp2;
X			if(cansee(mtmp->mx,mtmp->my))
X			  pline("%s is blinded by the flash!", Monnam(mtmp));
X			setmangry(mtmp);
X			if(tmp < 9 && !mtmp->isshk && rn2(4)) {
X				mtmp->mflee = 1;
X				if(rn2(4)) mtmp->mfleetim = rnd(100);
X			}
X			if(tmp < 3) mtmp->mcansee  = mtmp->mblinded = 0;
X			else {
X				tmp2 = mtmp->mblinded;
X				tmp2 += rnd(1 + 50/tmp);
X				if(tmp2 > 127) tmp2 = 127;
X				mtmp->mblinded = tmp2;
X				mtmp->mcansee = 0;
X			}
X		}
X	}
X}
X
X#ifdef KAA
X/* Strictly speaking it makes no sense for usage of a stethoscope to
X   not take any time; however, unless it did, the stethoscope would be
X   almost useless. */
Xstatic use_stethoscope() {
Xregister struct monst *mtmp;
Xregister struct rm *lev;
Xregister int rx, ry;
X	if(!freehand()) {
X		pline("You have no free hand!");
X		return(1);
X	}
X	if (!getdir(1)) {
X		flags.move=multi=0;
X		return(0);
X	}
X	if(u.dz < 0 || (u.dz && Levitation)) {
X		pline("You can't reach the %s!", u.dz<0 ? "ceiling" : "floor");
X		return(1);
X	}
X	if(u.dz) {
X		pline("The floor seems healthy enough.");
X		return(0);
X	}
X	if (Confusion) confdir();
X	rx = u.ux + u.dx; ry = u.uy + u.dy;
X	if(u.uswallow) {
X		mstatusline(u.ustuck);
X		return(0);
X	}
X	if(mtmp=m_at(rx,ry)) {
X		mstatusline(mtmp);
X		return(0);
X	}
X	if (!isok(rx,ry)) {
X		pline("You hear the sounds at the end of the universe.");
X		return(0);
X	}
X	lev = &levl[rx][ry];
X	if(lev->typ == SDOOR) {
X		pline("You hear a hollow sound!  This must be a secret door!");
X		lev->typ = DOOR;
X		atl(rx, ry, DOOR_SYM);
X		return(0);
X	}
X	if(lev->typ == SCORR) {
X		pline("You hear a hollow sound!  This must be a secret passage!");
X		lev->typ = CORR;
X		atl(rx, ry, CORR_SYM);
X		return(0);
X	}
X	pline("You hear nothing special.");
X	return(0);
X}
X#endif	
X	
Xstatic
Xstruct obj *current_ice_box;	/* a local variable of use_ice_box, to be
X				used by its local procedures in/ck_ice_box */
Xstatic
Xin_ice_box(obj) register struct obj *obj; {
X	if(obj == current_ice_box ||
X		(Punished && (obj == uball || obj == uchain))){
X		pline("You must be kidding.");
X		return(0);
X	}
X	if(obj->owornmask & (W_ARMOR | W_RING)) {
X		pline("You cannot refrigerate something you are wearing.");
X		return(0);
X	}
X	if(obj->owt + current_ice_box->owt > 70) {
X		pline("It won't fit.");
X		return(1);	/* be careful! */
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	current_ice_box->owt += obj->owt;
X	freeinv(obj);
X	obj->o_cnt_id = current_ice_box->o_id;
X	obj->nobj = fcobj;
X	fcobj = obj;
X	obj->age = moves - obj->age;	/* actual age */
X	return(1);
X}
X
Xstatic
Xck_ice_box(obj) register struct obj *obj; {
X	return(obj->o_cnt_id == current_ice_box->o_id);
X}
X
Xstatic
Xout_ice_box(obj) register struct obj *obj; {
Xregister struct obj *otmp;
X	if(obj == fcobj) fcobj = fcobj->nobj;
X	else {
X		for(otmp = fcobj; otmp->nobj != obj; otmp = otmp->nobj)
X			if(!otmp->nobj) panic("out_ice_box");
X		otmp->nobj = obj->nobj;
X	}
X	current_ice_box->owt -= obj->owt;
X	obj->age = moves - obj->age;	/* simulated point of time */
X	(void) addinv(obj);
X}
X
Xstatic
Xuse_ice_box(obj) register struct obj *obj; {
Xregister int cnt = 0;
Xregister struct obj *otmp;
X	current_ice_box = obj;	/* for use by in/out_ice_box */
X	for(otmp = fcobj; otmp; otmp = otmp->nobj)
X		if(otmp->o_cnt_id == obj->o_id)
X			cnt++;
X	if(!cnt) pline("Your ice-box is empty.");
X	else {
X	    pline("Do you want to take something out of the ice-box? [yn] ");
X	    if(readchar() == 'y')
X		if(askchain(fcobj, (char *) 0, 0, out_ice_box, ck_ice_box, 0))
X		    return;
X		pline("That was all. Do you wish to put something in? [yn] ");
X		if(readchar() != 'y') return;
X	}
X	/* call getobj: 0: allow cnt; #: allow all types; %: expect food */
X	otmp = getobj("0#%", "put in");
X	if(!otmp || !in_ice_box(otmp))
X		flags.move = multi = 0;
X}
X
Xstatic
Xstruct monst *
Xbchit(ddx,ddy,range,sym) register int ddx,ddy,range; char sym; {
X	register struct monst *mtmp = (struct monst *) 0;
X	register int bchx = u.ux, bchy = u.uy;
X
X	if(sym) Tmp_at(-1, sym);	/* open call */
X	while(range--) {
X		bchx += ddx;
X		bchy += ddy;
X		if(mtmp = m_at(bchx,bchy))
X			break;
X		if(!ZAP_POS(levl[bchx][bchy].typ)) {
X			bchx -= ddx;
X			bchy -= ddy;
X			break;
X		}
X		if(sym) Tmp_at(bchx, bchy);
X	}
X	if(sym) Tmp_at(-1, -1);
X	return(mtmp);
X}
X
X/* ARGSUSED */
Xstatic
Xuse_whistle(obj) struct obj *obj; {
Xregister struct monst *mtmp = fmon;
X	pline("You produce a high whistling sound.");
X	while(mtmp) {
X		if(dist(mtmp->mx,mtmp->my) < u.ulevel*20) {
X			if(mtmp->msleep)
X				mtmp->msleep = 0;
X			if(mtmp->mtame)
X				EDOG(mtmp)->whistletime = moves;
X		}
X		mtmp = mtmp->nmon;
X	}
X}
X
X/* ARGSUSED */
Xstatic
Xuse_magic_whistle(obj) struct obj *obj; {
Xregister struct monst *mtmp = fmon;
X	pline("You produce a strange whistling sound.");
X	while(mtmp) {
X		if(mtmp->mtame) mnexto(mtmp);
X		mtmp = mtmp->nmon;
X	}
X}
X
X#ifdef WALKIES
X/* ARGSUSED */
Xstatic
Xuse_leash(obj) struct obj *obj; {
Xregister struct monst *mtmp = fmon;
X
X	while(mtmp && !mtmp->mleashed) mtmp = mtmp->nmon;
X
X	if(mtmp) {
X
X		if (next_to(mtmp))  {
X
X			mtmp->mleashed = 0;
X			pline("You remove the leash from your %s.",
X#ifdef RPH
X		/* a hack to include the dogs full name.  +4 elminates */
X		/* the 'the' at the start of the name */
X				 lmonnam(mtmp) + 4);
X#else
X				 mtmp->data->mname);
X#endif
X		} else	pline("You must be next to your %s to unleash him.",
X#ifdef RPH
X				lmonnam(mtmp)+4);
X#else
X				 mtmp->data->mname);
X#endif
X	} else {
X
X	    for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
X
X		if(mtmp->mtame && next_to(mtmp)) {
X
X			pline("You slip the leash around your %s.", mtmp->data->mname);
X			mtmp->mleashed = 1;
X			if(mtmp->msleep)  mtmp->msleep = 0;
X			return(0);
X		}
X	    }
X	    pline("There's nothing here to put a leash on.");
X	}
X	return(0);
X}
X
Xnext_to(mtmp) register struct monst *mtmp; {
X
X	return((abs(u.ux - mtmp->mx) <= 1) && (abs(u.uy - mtmp->my) <= 1));
X}
X#endif
X
Xstatic int dig_effort;	/* effort expended on current pos */
Xstatic uchar dig_level;
Xstatic coord dig_pos;
Xstatic boolean dig_down;
X
Xstatic
Xdig() {
X	register struct rm *lev;
X	register dpx = dig_pos.x, dpy = dig_pos.y;
X
X	/* perhaps a nymph stole his pick-axe while he was busy digging */
X	/* or perhaps he teleported away */
X	if(u.uswallow || !uwep || uwep->otyp != PICK_AXE ||
X	    dig_level != dlevel ||
X	    ((dig_down && (dpx != u.ux || dpy != u.uy)) ||
X	     (!dig_down && dist(dpx,dpy) > 2)))
X		return(0);
X
X	dig_effort += 10 + abon() + uwep->spe + rn2(5);
X	if(dig_down) {
X		if(!xdnstair) {
X			pline("The floor here seems too hard to dig in.");
X			return(0);
X		}
X		if(dig_effort > 250) {
X			dighole();
X			return(0);	/* done with digging */
X		}
X		if(dig_effort > 50) {
X			register struct trap *ttmp = t_at(dpx,dpy);
X
X			if(!ttmp) {
X				ttmp = maketrap(dpx,dpy,PIT);
X				ttmp->tseen = 1;
X				pline("You have dug a pit.");
X				u.utrap = rn1(4,2);
X				u.utraptype = TT_PIT;
X				return(0);
X			}
X		}
X	} else
X	if(dig_effort > 100) {
X		register char *digtxt;
X		register struct obj *obj;
X
X		lev = &levl[dpx][dpy];
X		if(obj = sobj_at(ENORMOUS_ROCK, dpx, dpy)) {
X			fracture_rock(obj);
X			digtxt = "The rock falls apart.";
X		} else if(!lev->typ || lev->typ == SCORR) {
X			lev->typ = CORR;
X			digtxt = "You succeeded in cutting away some rock.";
X		} else if(lev->typ == HWALL || lev->typ == VWALL
X					    || lev->typ == SDOOR) {
X			lev->typ = xdnstair ? DOOR : ROOM;
X			digtxt = "You just made an opening in the wall.";
X		} else
X		  digtxt = "Now what exactly was it that you were digging in?";
X		mnewsym(dpx, dpy);
X		prl(dpx, dpy);
X		pline(digtxt);		/* after mnewsym & prl */
X		return(0);
X	} else {
X		if(IS_WALL(levl[dpx][dpy].typ)) {
X			register int rno = inroom(dpx,dpy);
X
X			if(rno >= 0 && rooms[rno].rtype >= SHOPBASE) {
X			  pline("This wall seems too hard to dig into.");
X			  return(0);
X			}
X		}
X		pline("You hit the rock with all your might.");
X	}
X	return(1);
X}
X
X/* When will hole be finished? Very rough indication used by shopkeeper. */
Xholetime() {
X	return( (occupation == dig) ? (250 - dig_effort)/20 : -1);
X}
X
Xdighole()
X{
X	register struct trap *ttmp = t_at(u.ux, u.uy);
X
X	if(!xdnstair) {
X		pline("The floor here seems too hard to dig in.");
X	} else {
X		if(ttmp)
X			ttmp->ttyp = TRAPDOOR;
X		else
X			ttmp = maketrap(u.ux, u.uy, TRAPDOOR);
X		ttmp->tseen = 1;
X		pline("You've made a hole in the floor.");
X		if(!u.ustuck && !Levitation) {			/* KAA */
X			if(inshop())
X				shopdig(1);
X			pline("You fall through ...");
X			if(u.utraptype == TT_PIT) {
X				u.utrap = 0;
X				u.utraptype = 0;
X			}
X			goto_level(dlevel+1, FALSE);
X		}
X	}
X}
X
Xstatic
Xuse_pick_axe(obj)
Xstruct obj *obj;
X{
X	char dirsyms[12];
X	extern char sdir[];
X	register char *dsp = dirsyms, *sdp = sdir;
X	register struct monst *mtmp;
X	register struct rm *lev;
X	register int rx, ry, res = 0;
X
X#ifndef FREEHAND
X	/* edited by GAN 10/20/86 so that you can't apply the
X	 * pick-axe while wielding a cursed weapon
X	 */
X	if(!freehand())  {
X		pline("You have no free hand to dig with!");
X		return(0);
X	}
X# ifdef KAA
X	if(cantwield(u.usym)) {
X		pline("You can't hold it strongly enough.");
X		return(0);
X	}
X# endif
X#else
X	if(obj != uwep) {
X		if(uwep && uwep->cursed) {
X			/* Andreas Bormann - ihnp4!decvax!mcvax!unido!ab */
X			pline("Since your weapon is welded to your hand,");
X			pline("you cannot use that pick-axe.");
X			return(0);
X		}
X# ifdef KAA
X		if(cantwield(u.usym)) {
X			pline("You can't hold it strongly enough.");
X			return(0);
X		}
X		unweapon = TRUE;
X# endif
X		pline("You now wield %s.", doname(obj));
X		setuwep(obj);
X		res = 1;
X	}
X#endif
X	while(*sdp) {
X		(void) movecmd(*sdp);	/* sets u.dx and u.dy and u.dz */
X		rx = u.ux + u.dx;
X		ry = u.uy + u.dy;
X		if(u.dz > 0 || (u.dz == 0 && isok(rx, ry) &&
X		    (IS_ROCK(levl[rx][ry].typ)
X		    || sobj_at(ENORMOUS_ROCK, rx, ry))))
X			*dsp++ = *sdp;
X		sdp++;
X	}
X	*dsp = 0;
X	pline("In what direction do you want to dig? [%s] ", dirsyms);
X	if(!getdir(0))		/* no txt */
X		return(res);
X	if(u.uswallow && attack(u.ustuck)) /* return(1) */;
X	else
X	if(u.dz < 0)
X		pline("You cannot reach the ceiling.");
X	else
X#ifdef KAA
X	if(!u.dx && !u.dy && !u.dz) {
X		pline("You hit yourself with your own pick-axe.");
X		losehp(rnd(2)+dbon(), "self-inflicted wound");
X		flags.botl=1;
X		return(1);
X	}
X#endif
X	if(u.dz == 0) {
X		if(Confusion)
X			confdir();
X		rx = u.ux + u.dx;
X		ry = u.uy + u.dy;
X		if((mtmp = m_at(rx, ry)) && attack(mtmp))
X			return(1);
X		if(!isok(rx, ry)) {
X			pline("Clash!");
X			return(1);
X		}
X		lev = &levl[rx][ry];
X		if(lev->typ == DOOR)
X			pline("Your %s against the door.",
X				aobjnam(obj, "clang"));
X		else if(!IS_ROCK(lev->typ)
X		     && !sobj_at(ENORMOUS_ROCK, rx, ry)) {
X			/* ACCESSIBLE or POOL */
X			pline("You swing your %s through thin air.",
X				aobjnam(obj, (char *) 0));
X		} else {
X			if(dig_pos.x != rx || dig_pos.y != ry
X			    || dig_level != dlevel || dig_down) {
X				dig_down = FALSE;
X				dig_pos.x = rx;
X				dig_pos.y = ry;
X				dig_level = dlevel;
X				dig_effort = 0;
X				pline("You start digging.");
X			} else
X				pline("You continue digging.");
X#ifdef DGKMOD
X			set_occupation(dig, "digging", 0);
X#else
X			occupation = dig;
X			occtxt = "digging";
X#endif
X		}
X	} else if(Levitation) {
X		pline("You cannot reach the floor.");
X	} else {
X		if(dig_pos.x != u.ux || dig_pos.y != u.uy
X		    || dig_level != dlevel || !dig_down) {
X			dig_down = TRUE;
X			dig_pos.x = u.ux;
X			dig_pos.y = u.uy;
X			dig_level = dlevel;
X			dig_effort = 0;
X			pline("You start digging in the floor.");
X			if(inshop())
X				shopdig(0);
X		} else
X			pline("You continue digging in the floor.");
X#ifdef DGKMOD
X		set_occupation(dig, "digging", 0);
X#else
X		occupation = dig;
X		occtxt = "digging";
X#endif
X	}
X	return(1);
X}
X
X#ifdef RPH
Xstatic
Xuse_mirror(obj)
Xstruct obj *obj;
X{
X     register struct monst *mtmp;
X     register char mlet;
X     extern mpickobj(), freeinv(), rloc();
X
X	if(!getdir(1)){		/* ask: in what direction? */
X		flags.move = multi = 0;
X		return;
X	}
X	if(u.uswallow) {
X		pline("You reflect %s's stomach.", monnam(u.ustuck));
X		return;
X	}
X	if(u.dz) {
X		pline("You reflect the %s.",
X			(u.dz > 0) ? "floor" : "ceiling");
X		return;
X	}
X	if(!u.dx && !u.dy && !u.dz) {
X		if(!Blind) 
X		    pline ("You look as ugly as ever.");
X		else {
X		    if (rn2(4-u.uluck/3) || !HTelepat) 
X		        pline ("You can't see your ugly face.");
X		    else {
X			char *tm, *tl; int ll;
X			if (rn2(4)) {
X			    tm = "ugly monster";
X			    ll = dlevel - u.medusa_level;
X			}
X			else {
X			    tm = "intelligent being";
X			    ll = dlevel - u.wiz_level;
X			}
X			if (ll < -10) tl = "far below you";
X			else if (ll < -1) tl = "below you";
X			else if (ll == -1) tl = "under your feet";
X			else if (ll == 0)  tl = "very close to you";
X			else if (ll == 1) tl = "above your head";
X			else if (ll > 10) tl = "far above you";
X			else tl = "above you";
X			pline ("You get an impression that an %s lives %s.",
X				tm, tl);
X		    }
X		}
X		return;
X	}
X	if(mtmp = bchit(u.dx, u.dy, COLNO, 0)) {
X	    mlet = mtmp->data->mlet;
X	    if(mtmp->msleep){
X	        pline ("%s is tired and doesn't look at your mirror.",
X	        	    Monnam(mtmp));
X	        mtmp->msleep = 0;
X	    } else
X	    if (!mtmp->mcansee) {
X	        pline("%s can't see anything at the moment.",
X	        	Monnam(mtmp));
X	    }
X	    /* some monsters do special things */
X	    else if (!mtmp->mcan && index("EUN8",mlet))
X	     switch (mlet) {
X	      case '8':
X	      	    pline("%s is turned to stone!", Monnam(mtmp));
X		    killed(mtmp);
X		    break;
X	      case 'E':
X	            pline("%s is frozen by its reflection.",Monnam(mtmp));
X	            mtmp->mfroz = 1;
X	    	    break;
X	      case 'U':
X	    	    pline ("%s has confused itself!", Monnam(mtmp));
X	    	    mtmp->mconf = 1;
X		    break;
X	      case 'N':
X	    	    pline ("%s looks beautiful in your mirror.",Monnam(mtmp));
X	    	    pline ("She decides to take it!");
X	    	    freeinv(obj);
X	    	    mpickobj(mtmp,obj);
X	    	    rloc(mtmp);
X	    	    break;
X	      default:
X	      	    break;
X	     }
X	    else if (mlet == 'V' || mlet == '&') 
X	        pline ("%s doesn't seem to reflect anything.", Monnam(mtmp));
X	    else if (!index("agquv1N", mlet) && rn2(5)) {
X	        pline ("%s is frightened by its reflection.",
X	        	    Monnam(mtmp));
X	        mtmp->mflee = 1;
X	        mtmp->mfleetim += d(2,4);
X	    }
X	    else
X	        pline ("%s doesn't seem to mind %s refection.",
X	    	    Monnam(mtmp),
X	    	    (mlet=='1'?"his":(mlet=='N'?"her":"its")));
X	}/* if monster hit with mirror */
X}/* use_mirror */
X
X#endif
END_OF_apply.c
if test 17145 -ne `wc -c <apply.c`; then
    echo shar: \"apply.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f edog.h -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"edog.h\"
else
echo shar: Extracting \"edog.h\" \(670 characters\)
sed "s/^X//" >edog.h <<'END_OF_edog.h'
X/*	SCCS Id: @(#)edog.h	1.4	87/08/08
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* edog.h - version 1.0.2 */
X
X/*	various types of food, the lower, the better liked.	*/
X
X#define	DOGFOOD	0
X#define	CADAVER	1
X#define	ACCFOOD	2
X#define	MANFOOD	3
X#define	APPORT	4
X#define	POISON	5
X#define	UNDEF	6
X
Xstruct edog {
X	long hungrytime;	/* at this time dog gets hungry */
X	long eattime;		/* dog is eating */
X	long droptime;		/* moment dog dropped object */
X	unsigned dropdist;		/* dist of drpped obj from @ */
X	unsigned apport;		/* amount of training */
X	long whistletime;		/* last time he whistled */
X};
X#define	EDOG(mp)	((struct edog *)(&(mp->mextra[0])))
END_OF_edog.h
if test 670 -ne `wc -c <edog.h`; then
    echo shar: \"edog.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f fight.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"fight.c\"
else
echo shar: Extracting \"fight.c\" \(16202 characters\)
sed "s/^X//" >fight.c <<'END_OF_fight.c'
X/*	SCCS Id: @(#)fight.c	2.1	87/10/17
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X
X#include	<stdio.h>
X#include	"hack.h"
X
Xextern struct permonst li_dog, dog, la_dog;
Xextern char *exclam(), *hcolor(), *xname();
Xextern struct obj *mkobj_at();
X#ifdef KAA
Xextern boolean stoned;
Xextern boolean unweapon;
Xextern char *nomovemsg, *defmonnam();
Xextern struct monst *mkmon_at();
X#endif
X#ifdef RPH
Xextern struct obj *mk_named_obj();
X#endif
X
Xstatic boolean far_noise;
Xstatic long noisetime;
X
X/* hitmm returns 0 (miss), 1 (hit), or 2 (kill) */
Xhitmm(magr,mdef) register struct monst *magr,*mdef; {
Xregister struct permonst *pa = magr->data, *pd = mdef->data;
Xint hit;
Xschar tmp;
Xboolean vis;
X	if(!magr || !mdef) return(0);		/* mike@genat */
X	if(index("Eauy", pa->mlet)) return(0);
X	if(magr->mfroz) return(0);		/* riv05!a3 */
X	tmp = pd->ac + pa->mlevel;
X	if(mdef->mconf || mdef->mfroz || mdef->msleep){
X		tmp += 4;
X		if(mdef->msleep) mdef->msleep = 0;
X	}
X	hit = (tmp > rnd(20));
X	if(hit) mdef->msleep = 0;
X	vis = (cansee(magr->mx,magr->my) && cansee(mdef->mx,mdef->my));
X	if(vis){
X		char buf[BUFSZ];
X		if(mdef->mimic) seemimic(mdef);
X		if(magr->mimic) seemimic(magr);
X		(void) sprintf(buf,"%s %s", Monnam(magr),
X			hit ? "hits" : "misses");
X		pline("%s %s.", buf, monnam(mdef));
X	} else {
X		boolean farq = (dist(magr->mx, magr->my) > 15);
X		if(farq != far_noise || moves-noisetime > 10) {
X			far_noise = farq;
X			noisetime = moves;
X			pline("You hear some noises%s.",
X				farq ? " in the distance" : "");
X		}
X	}
X	if(hit){
X		if(magr->data->mlet == 'c' && !magr->cham) {
X			magr->mhpmax += 3;
X			if(vis) pline("%s is turned to stone!", Monnam(mdef));
X			else if(mdef->mtame)
X     pline("You have a peculiarly sad feeling for a moment, then it passes.");
X			monstone(mdef);
X			hit = 2;
X		} else
X		if((mdef->mhp -= d(pa->damn,pa->damd)) < 1) {
X			magr->mhpmax += 1 + rn2(pd->mlevel+1);
X			if(magr->mtame && magr->mhpmax > 8*pa->mlevel){
X				if(pa == &li_dog) magr->data = pa = &dog;
X				else if(pa == &dog) magr->data = pa = &la_dog;
X			}
X			if(vis) pline("%s is killed!", Monnam(mdef));
X			else if(mdef->mtame)
X		pline("You have a sad feeling for a moment, then it passes.");
X			mondied(mdef);
X			hit = 2;
X		}
X		/* fixes a bug where max monster hp could overflow. */
X		if(magr->mhpmax <= 0) magr->mhpmax = 127;
X	}
X#ifdef KAA
X	if(hit == 1 && magr->data->mlet == 'Q') {
X		rloc(mdef);
X		if(vis && !cansee(mdef->mx,mdef->my))
X			pline("%s suddenly disappears!",Monnam(mdef));
X	}
X#endif
X	return(hit);
X}
X
X/* drop (perhaps) a cadaver and remove monster */
Xmondied(mdef) register struct monst *mdef; {
Xregister struct permonst *pd = mdef->data;
X#ifdef KOPS
X	if(pd->mlet != 'K')
X#endif
X	{
X#if defined(ROCKMOLE) && defined(KJSMODS)
X	    /* if a giant rat is killed by a monster, do not make a 
X	     * corpse (like Keystone Kops above). */
X	    if(!(pd->mlet == 'r' && dlevel < 4))
X#endif
X		if(letter(pd->mlet) && rn2(3)) {
X		    if (pd->mlet == '1') panic("mondied: making obj '1'");
X#ifndef RPH
X		    (void) mkobj_at(pd->mlet,mdef->mx,mdef->my);
X#else
X		    (void) mk_named_obj_at(pd->mlet,mdef->mx,mdef->my,
X					   NAME(mdef), mdef->mnamelth);
X#endif
X		    if(cansee(mdef->mx,mdef->my)){
X			unpmon(mdef);
X			atl(mdef->mx,mdef->my,fobj->olet);
X		    }
X		    stackobj(fobj);
X		}
X		mondead(mdef);
X	}
X}
X
X/* drop a rock and remove monster */
Xmonstone(mdef)
X	register struct monst *mdef;
X{
X	extern char mlarge[];
X	if(index(mlarge, mdef->data->mlet))
X		mksobj_at(ENORMOUS_ROCK, mdef->mx, mdef->my);
X	else
X		mksobj_at(ROCK, mdef->mx, mdef->my);
X	if(cansee(mdef->mx, mdef->my)){
X		unpmon(mdef);
X		atl(mdef->mx,mdef->my,fobj->olet);
X	}
X	mondead(mdef);
X}
X		
X
Xfightm(mtmp)
X	register struct monst *mtmp;
X{
Xregister struct monst *mon;
X
X	for(mon = fmon; mon; mon = mon->nmon)
X	    if(mon != mtmp) {
X		if(DIST(mon->mx,mon->my,mtmp->mx,mtmp->my) < 3)
X		    if(rn2(4))  return(hitmm(mtmp,mon));
X	    }
X	return(-1);
X}
X
X/* u is hit by sth, but not a monster */
Xthitu(tlev,dam,name)
X	register tlev,dam;
X	register char *name;
X{
X	char buf[BUFSZ];
X
X	setan(name,buf);
X	if(u.uac + tlev <= rnd(20)) {
X		if(Blind) pline("It misses.");
X		else pline("You are almost hit by %s!", buf);
X		return(0);
X	} else {
X		if(Blind) pline("You are hit!");
X		else pline("You are hit by %s!", buf);
X		losehp(dam,name);
X		return(1);
X	}
X}
X
X#ifdef KAA
Xchar mlarge[] = "bCDdegIlmnoPSsTUwY',&9";
X#else
Xchar mlarge[] = "bCDdegIlmnoPSsTUwY',&";
X#endif
X
Xboolean
Xhmon(mon,obj,thrown)	/* return TRUE if mon still alive */
Xregister struct monst *mon;
Xregister struct obj *obj;
Xregister thrown;
X{
X	register tmp;
X	boolean hittxt = FALSE;
X
X#ifdef KAA
X	stoned = FALSE;		/* this refers to the thing hit, not you */
X#endif
X	if(!obj){
X#ifdef KAA
X/* Note that c, y, and F can never wield weapons anyway */
X	  if (u.usym == 'c' && mon->data->mlet != 'c') {
X	       pline("You turn %s to stone!", monnam(mon));
X	       stoned = TRUE;
X	       xkilled(mon,0);
X	       return(FALSE);
X	  } else if (u.usym == 'y' && mon->data->mlet != 'y') {
X	       pline("%s is blinded by your flash of light!",Monnam(mon));
X	       if (!mon->mblinded) {
X		    mon->mblinded += rn2(25);
X		    mon->mcansee = 0;
X	       }
X	       rehumanize();
X	       return(TRUE);
X	  } else if (u.usym == 'F') {
X	       pline("You explode!");
X	       if (!index("gFY",mon->data->mlet)) {
X		    pline("%s gets blasted!", Monnam(mon));
X		    mon->mhp -= d(6,6);
X		    rehumanize();
X		    if (mon->mhp <= 0) {
X			 killed(mon);
X			 return(FALSE);
X		    } else return(TRUE);
X	       } else {
X		    pline("The blast doesn't seem to affect %s.", monnam(mon));
X		    rehumanize();
X		    return(TRUE);
X	       }
X	  } else if (index("P,'", u.usym) && u.uhunger < 1500
X		  && !u.uswallow && mon->data->mlet != 'c') {
X	       static char msgbuf[BUFSZ];
X	       pline("You swallow %s whole!", monnam(mon));
X	       u.uhunger += 20*mon->mhpmax;
X	       newuhs(FALSE);
X	       xkilled(mon,2);
X	       if (tmp = mon->mhpmax/5) {
X		    nomul(-tmp);
X		    (void)sprintf(msgbuf, "You finished digesting %s.",
X			 monnam(mon));
X		    nomovemsg = msgbuf;
X	       }
X	       return(FALSE);
X	  } else if (u.usym != '@') {
X	       if (u.usym == '&' && !rn2(5)) {
X		    struct monst *dtmp;
X		    pline("Some hell-p has arrived!");
X		    if((dtmp = mkmon_at('&',u.ux,u.uy)))
X			(void)tamedog(dtmp,(struct obj *)0);
X	       }
X	       tmp = d(mons[u.umonnum].damn, mons[u.umonnum].damd);
X	  } else
X#endif
X		tmp = rnd(2);	/* attack with bare hands */
X#ifdef KAA
X		if (mon->data->mlet == 'c' && !uarmg && u.usym != 'c'){
X#else
X		if(mon->data->mlet == 'c' && !uarmg){
X#endif
X			pline("You hit the cockatrice with your bare hands.");
X			pline("You turn to stone ...");
X			done_in_by(mon);
X		}
X	} else if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE) {
X	    if(obj == uwep && (obj->otyp > SPEAR || obj->otyp < BOOMERANG))
X		tmp = rnd(2);
X	    else {
X		if(index(mlarge, mon->data->mlet)) {
X		    tmp = rnd(objects[obj->otyp].wldam);
X		    switch (obj->otyp) {
X			case SLING_BULLET:
X			case CROSSBOW_BOLT:
X			case MORNING_STAR:
X			case PARTISAN:
X			case BROAD_SWORD:	tmp += 1; break;
X
X			case FLAIL:
X			case RANSEUR:
X			case VOULGE:		tmp += rnd(4); break;
X
X			case HALBERD:
X			case SPETUM:		tmp += rnd(6); break;
X
X			case BARDICHE:
X			case TRIDENT:		tmp += d(2,4); break;
X
X			case TWO_HANDED_SWORD: 
X			case KATANA: 		tmp += d(2,6); break;
X		    }
X		} else {
X		    tmp = rnd(objects[obj->otyp].wsdam);
X		    switch (obj->otyp) {
X			case SLING_BULLET:
X			case CROSSBOW_BOLT:
X			case MACE:
X			case FLAIL:
X			case SPETUM:
X			case TRIDENT:		tmp += 1; break;
X
X			case BARDICHE:
X			case BILL_GUISARME:
X			case GUISARME:
X			case LUCERN_HAMMER:
X			case MORNING_STAR:
X			case RANSEUR:
X			case BROAD_SWORD:
X			case VOULGE:		tmp += rnd(4); break;
X		    }
X		}
X		tmp += obj->spe;
X#ifdef KAA
X		if(obj->olet == WEAPON_SYM && obj->dknown && index("VWZ &",
X				mon->data->mlet)) tmp += rn2(4);
X#endif
X		if(!thrown && obj == uwep && obj->otyp == BOOMERANG
X		 && !rn2(3)){
X		  pline("As you hit %s, the boomerang breaks into splinters.",
X				monnam(mon));
X			freeinv(obj);
X			setworn((struct obj *) 0, obj->owornmask);
X			obfree(obj, (struct obj *) 0);
X			tmp++;
X		}
X	    }
X#ifdef BVH
X	    if(!strcmp(ONAME(obj), "Excalibur")) tmp += rnd(10);
X	    else
X#endif
X		if(obj->otyp == KATANA
X		   && !strcmp(ONAME(obj), "Snickersnee")) tmp += rnd(5);
X
X	    else if(mon->data->mlet == 'O' && obj->otyp == TWO_HANDED_SWORD
X		    && !strcmp(ONAME(obj), "Orcrist"))	tmp += rnd(10);
X
X	} else	switch(obj->otyp) {
X		case HEAVY_IRON_BALL:
X			tmp = rnd(25); break;
X		case ENORMOUS_ROCK:
X			tmp = rnd(20); break;
X#ifdef RPH
X		case MIRROR:
X			pline("You break your mirror.  That's bad luck!");
X		        u.uluck -= 2;
X		        if ((int)u.uluck < LUCKMIN) u.uluck = LUCKMIN;
X			freeinv(obj);
X			if(obj->owornmask)
X				setworn((struct obj *) 0, obj->owornmask);
X			obfree(obj, (struct obj *) 0);
X			return(TRUE);
X#endif
X		case EXPENSIVE_CAMERA:
X	pline("You succeed in destroying your camera. Congratulations!");
X			freeinv(obj);
X			if(obj->owornmask)
X				setworn((struct obj *) 0, obj->owornmask);
X			obfree(obj, (struct obj *) 0);
X			return(TRUE);
X		case DEAD_COCKATRICE:	/* fixed by polder@cs.vu.nl */
X			pline("You hit %s with the cockatrice corpse.",
X				monnam(mon));
X			if(mon->data->mlet == 'c') {
X				tmp = 1;
X				hittxt = TRUE;
X				break;
X			}
X			pline ("%s is turned to stone!", Monnam(mon));
X#ifdef KAA
X			stoned = TRUE;
X			xkilled(mon,0);
X#else
X			killed(mon);
X#endif
X			return(FALSE);
X		case CLOVE_OF_GARLIC:		/* no effect against demons */
X			if(index(UNDEAD, mon->data->mlet))
X				mon->mflee = 1;
X			tmp = 1;
X			break;
X		default:
X			/* non-weapons can damage because of their weight */
X			/* (but not too much) */
X			tmp = obj->owt/10;
X			if(tmp < 1) tmp = 1;
X			else tmp = rnd(tmp);
X			if(tmp > 6) tmp = 6;
X		}
X
X	/****** NOTE: perhaps obj is undefined!! (if !thrown && BOOMERANG) */
X
X	tmp += u.udaminc + dbon();
X	if(u.uswallow) {
X		if((tmp -= u.uswldtim) <= 0) {
X			pline("Your arms are no longer able to hit.");
X			return(TRUE);
X		}
X	}
X	if(tmp < 1) tmp = 1;
X	mon->mhp -= tmp;
X	if(mon->mhp < 1) {
X		killed(mon);
X		return(FALSE);
X	}
X	if(mon->mtame && (!mon->mflee || mon->mfleetim)) {
X		mon->mflee = 1;			/* Rick Richardson */
X		mon->mfleetim += 10*rnd(tmp);
X	}
X
X	if(!hittxt) {
X		if(thrown)
X			/* this assumes that we cannot throw plural things */
X			hit( xname(obj)  /* or: objects[obj->otyp].oc_name */,
X				mon, exclam(tmp) );
X		else if(Blind)
X			pline("You hit it.");
X		else
X			pline("You hit %s%s", monnam(mon), exclam(tmp));
X	}
X
X	if(u.umconf && !thrown) {
X		if(!Blind) {
X			pline("Your hands stop glowing %s.",
X			Hallucination ? hcolor() : "blue");
X		}
X		if (!resist(mon, '+', 0, NOTELL)) mon->mconf = 1;
X		if(!mon->mfroz && !mon->msleep && !Blind && mon->mconf)
X			pline("%s appears confused.",Monnam(mon));
X		u.umconf = 0;
X	}
X	if(!thrown && rn2(2) && index("VW",u.usym) &&
X	   !index("VW",mon->data->mlet)){
X		int tmp=d(2,6);
X		pline("%s suddenly seems weaker!",Monnam(mon));
X		mon->mhpmax -= tmp;
X		if ((mon->mhp -= tmp) <= 0) {
X			pline("%s dies!",Monnam(mon));
X			xkilled(mon,0);
X			return(FALSE);
X		}
X	}
X	return(TRUE);	/* mon still alive */
X}
X
X/* try to attack; return FALSE if monster evaded */
X/* u.dx and u.dy must be set */
Xattack(mtmp)
Xregister struct monst *mtmp;
X{
X	schar tmp;
X	boolean malive = TRUE;
X	register struct permonst *mdat;
X	mdat = mtmp->data;
X
X#ifdef KAA
X	if(unweapon) {
X		unweapon=FALSE;
X		if(uwep)
X			pline("You begin bashing monsters with your %s.",
X				aobjnam(uwep,(char *)0));
X	}
X#endif
X	u_wipe_engr(3);   /* andrew@orca: prevent unlimited pick-axe attacks */
X
X	if(mdat->mlet == 'L' && !mtmp->mfroz && !mtmp->msleep &&
X	   !mtmp->mconf && mtmp->mcansee && !rn2(7) &&
X	   (m_move(mtmp, 0) == 2 /* he died */ || /* he moved: */
X		mtmp->mx != u.ux+u.dx || mtmp->my != u.uy+u.dy))
X		return(FALSE);
X#ifdef SAFE_ATTACK
X	/* This section of code provides protection against accidentally
X	 * hitting peaceful (like '@') and tame (like 'd') monsters.
X	 * There is protection only if you're not blind, confused or
X	 * invisible.
X	 */
X	/*  changes by wwp 5/16/85 */
X	if (!Blind && !Confusion && !Hallucination
X	    && mdat->mlet == 'd' && mtmp->mtame) {
X		char *dname;		/* added by Janet Walz (walz@mimsy) */
X		mtmp->mflee = 1;
X		mtmp->mfleetim = rnd(6);
X		if (dname = NAME(mtmp))
X		    pline("You stop to avoid hitting %s.",dname);
X		else
X		    pline("You stop to avoid hitting your dog.");
X		return(TRUE);
X	}
X	if (flags.confirm && (mtmp->mpeaceful || mtmp->mtame) && ! Confusion
X	    && !Hallucination && !Invisible)
X
X		if (Blind ? Telepat : (!mtmp->minvis || See_invisible)) {
X			pline("Really attack %s?", monnam(mtmp));
X			(void) fflush(stdout);
X			if (readchar() != 'y') {
X				flags.move = 0;
X				return(TRUE);
X			}
X		}
X#endif /* SAFE_ATTACK /**/
X
X	if(mtmp->mimic){
X		if(!u.ustuck && !mtmp->mflee) u.ustuck = mtmp;
X		if (levl[u.ux+u.dx][u.uy+u.dy].scrsym == DOOR_SYM)
X		{
X		    if (okdoor(u.ux+u.dx, u.uy+u.dy))
X			pline("The door actually was %s.", defmonnam(mtmp));
X		    else
X			pline("That spellbook was %s.", defmonnam(mtmp));
X		}
X		else if (levl[u.ux+u.dx][u.uy+u.dy].scrsym == GOLD_SYM)
X			pline("The chest was %s!", defmonnam(mtmp));
X		else
X			pline("Wait! That's %s!",defmonnam(mtmp));
X		wakeup(mtmp);	/* clears mtmp->mimic */
X		return(TRUE);
X	}
X
X	wakeup(mtmp);
X
X	if(mtmp->mhide && mtmp->mundetected){
X		register struct obj *obj;
X
X		mtmp->mundetected = 0;
X		if((obj = o_at(mtmp->mx,mtmp->my)) && !Blind)
X			pline("Wait! There's %s hiding under %s!",
X				defmonnam(mtmp), doname(obj));
X		return(TRUE);
X	}
X#ifdef KAA
X	tmp = u.uluck + (u.mtimedone ? mons[u.umonnum].mlevel : u.ulevel) +
X			mdat->ac + abon();
X	if (u.usym=='y' || u.usym=='F') tmp=100;
X	if (index("uEa",u.usym)) return(TRUE);
X#else
X	tmp = u.uluck + u.ulevel + mdat->ac + abon();
X#endif
X	if(uwep) {
X#ifdef KAA	/* Blessed weapons used against undead or demons */
X		if(uwep->olet == WEAPON_SYM && uwep->dknown && index("VWZ &",
X			mtmp->data->mlet)) tmp += 2;
X#endif
X		if(uwep->olet == WEAPON_SYM || uwep->otyp == PICK_AXE)
X			tmp += uwep->spe;
X#ifdef  BVH
X		if(!strcmp(ONAME(uwep),"Excalibur")) tmp += 5;
X#endif
X		if(uwep->otyp == TWO_HANDED_SWORD) tmp -= 1;
X		else if(uwep->otyp == KATANA) tmp += 1;
X		else if(uwep->otyp == DAGGER ||
X			uwep->otyp == SHURIKEN) tmp += 2;
X		else if(uwep->otyp == CRYSKNIFE) tmp += 3;
X		else if(uwep->otyp == SPEAR &&
X			index("XDne", mdat->mlet)) tmp += 2;
X	}
X	if(mtmp->msleep) {
X		mtmp->msleep = 0;
X		tmp += 2;
X	}
X	if(mtmp->mfroz) {
X		tmp += 4;
X		if(!rn2(10)) mtmp->mfroz = 0;
X	}
X	if(mtmp->mflee) tmp += 2;
X	if(u.utrap) tmp -= 3;
X
X	/* with a lot of luggage, your agility diminishes */
X	tmp -= (inv_weight() + 40)/20;
X
X	if(tmp <= rnd(20) && !u.uswallow){
X		if(Blind) pline("You miss it.");
X		else pline("You miss %s.",monnam(mtmp));
X	} else {
X		/* we hit the monster; be careful: it might die! */
X
X		if((malive = hmon(mtmp,uwep,0)) == TRUE) {
X		/* monster still alive */
X			if(!rn2(25) && mtmp->mhp < mtmp->mhpmax/2) {
X				mtmp->mflee = 1;
X				if(!rn2(3)) mtmp->mfleetim = rnd(100);
X				if(u.ustuck == mtmp && !u.uswallow)
X					u.ustuck = 0;
X			}
X#ifndef NOWORM
X			if(mtmp->wormno)
X				cutworm(mtmp, u.ux+u.dx, u.uy+u.dy,
X					uwep ? uwep->otyp : 0);
X#endif
X		}
X		if(mdat->mlet == 'a') {
X			if(rn2(2)) {
X				if (Blind) pline("You are splashed!");
X				else	   pline("You are splashed by %s's acid!",monnam(mtmp));
X				if (u.usym != 'a') {
X					losehp_m(rnd(6), mtmp);
X					if(!rn2(30)) corrode_armor();
X				}
X			}
X			if(!rn2(6)) corrode_weapon();
X		}
X	}
X#ifdef KAA
X	if (malive) if (u.usym=='N' && mtmp->minvent) {
X		struct obj *otmp, *addinv();
X		otmp = mtmp->minvent;
X		mtmp->minvent = otmp->nobj;
X		otmp = addinv(otmp);
X		pline("You steal:");
X		prinv(otmp);
X	} else if (u.usym=='L' && mtmp->mgold) {
X		u.ugold += mtmp->mgold;
X		mtmp->mgold = 0;
X		pline("Your purse feels heavier.");
X	} else if (u.usym=='Q') rloc(mtmp);
X#endif
X	if(malive && mdat->mlet == 'E' && canseemon(mtmp)
X	   && !mtmp->mcan && rn2(3)) {
X	    if(mtmp->mcansee) {
X	      pline("You are frozen by %s's gaze!",monnam(mtmp));
X	      nomul((u.ulevel > 6 || rn2(4)) ? rn1(20,-21) : -200);
X	    } else {
X	      pline("%s cannot defend itself.", Amonnam(mtmp,"blinded"));
X	      if(!rn2(500)) if((int)u.uluck > LUCKMIN) u.uluck--;
X	    }
X	}
X	return(TRUE);
X}
END_OF_fight.c
if test 16202 -ne `wc -c <fight.c`; then
    echo shar: \"fight.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f read.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"read.c\"
else
echo shar: Extracting \"read.c\" \(16984 characters\)
sed "s/^X//" >read.c <<'END_OF_read.c'
X/*	SCCS Id: @(#)read.c	2.2	87/11/29
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X
X#include "hack.h"
X
Xextern struct monst *makemon();
Xextern struct permonst pm_eel;
Xextern struct obj *mkobj_at();
Xchar *hcolor();
Xboolean	known; 
Xint identify();
X
Xdoread() {
X	register struct obj *scroll;
X	register boolean confused = (Confusion != 0);
X
X	known = FALSE;
X	scroll = getobj("#-?", "read");	/*  "#-" added by GAN 10/22/86 */
X	if(!scroll) return(0);
X	
X	/* below added to allow reading of fortune cookies */
X	if(scroll->otyp == FORTUNE_COOKIE) {
X		if(Blind) {
X			pline("This cookie has a scrap of paper inside!");
X			pline("What a pity, that you cannot read it!");
X		} else
X			outrumor();
X		useup(scroll);
X		return(1);
X	}  else
X		if(scroll->olet != SCROLL_SYM) {
X			pline("That is a silly thing to read.");
X			return(0);
X		}
X
X	if(!scroll->dknown && Blind) {
X	    pline("Being blind, you cannot read the formula on the scroll.");
X	    return(0);
X	}
X	if(Blind)
X	  pline("As you pronounce the formula on it, the scroll disappears.");
X	else
X	  pline("As you read the scroll, it disappears.");
X	if(confused) {
X	  if (Hallucination)
X	      pline("Being so trippy, you screw up ... ");
X	  else
X	      pline("Being confused, you mispronounce the magic words ... ");
X	}
X	if(!seffects(scroll))  {
X		if(!objects[scroll->otyp].oc_name_known) {
X		    if(known && !confused) {
X			objects[scroll->otyp].oc_name_known = 1;
X			more_experienced(0,10);
X		    } else if(!objects[scroll->otyp].oc_uname)
X			docall(scroll);
X		}
X#ifdef MARKER
X		if(!(scroll->otyp == SCR_BLANK_PAPER) || confused)
X#endif
X			useup(scroll);
X	}
X	return(1);
X}
X
Xseffects(sobj)
X	register struct obj	*sobj;
X{
X	extern struct obj *some_armor();
X	register boolean confused = (Confusion != 0);
X
X	switch(sobj->otyp) {
X#ifdef MAIL
X	case SCR_MAIL:
X		readmail(/* scroll */);
X		break;
X#endif
X	case SCR_ENCHANT_ARMOR:
X	    {
X		register struct obj *otmp = some_armor();
X		if(!otmp) {
X			strange_feeling(sobj,"Your skin glows then fades.");
X			return(1);
X		}
X		if(confused) {
X			pline("Your %s is covered by a shimmering %s %s!",
X				objects[otmp->otyp].oc_name, Hallucination ? hcolor() :
X				"gold", (otmp->otyp == SHIELD ? "layer" : "shield"));
X			otmp->rustfree = 1;
X			break;
X		}
X#ifdef KAA
X		if(otmp->spe > (otmp->otyp == ELFIN_CHAIN_MAIL ? 5 : 3)
X				&& rn2(otmp->spe)) {
X#else
X		if(otmp->spe > 3 && rn2(otmp->spe)) {
X#endif
X		pline("Your %s glows violently %s for a while, then evaporates.",
X			objects[otmp->otyp].oc_name,
X			Hallucination ? hcolor() : "green");
X			useup(otmp);
X			break;
X		}
X		pline("Your %s glows %s for a moment.",
X			objects[otmp->otyp].oc_name,
X			Hallucination ? hcolor() : "green");
X		otmp->cursed = 0;
X		otmp->spe++;
X		break;
X	    }
X	case SCR_DESTROY_ARMOR:
X		if(confused) {
X			register struct obj *otmp = some_armor();
X			if(!otmp) {
X				strange_feeling(sobj,"Your bones itch.");
X				return(1);
X			}
X			pline("Your %s glows %s for a moment.",
X				objects[otmp->otyp].oc_name,
X				Hallucination ? hcolor() : "purple");
X			otmp->rustfree = 0;
X			break;
X		}
X		if(!destroy_arm()) {
X			strange_feeling(sobj,"Your skin itches.");
X			return(1);
X		}
X		break;
X	case SCR_CONFUSE_MONSTER:
X#ifdef SPELLS
X	case SPE_CONFUSE_MONSTER:
X#endif
X		if(u.usym != '@') {
X			pline("You feel confused.");
X			HConfusion += rnd(100);
X		} else  if(confused) {
X			pline("Your hands begin to glow %s.",
X			Hallucination ? hcolor() : "purple");
X			HConfusion += rnd(100);
X		} else {
X			pline("Your hands begin to glow %s.",
X			Hallucination ? hcolor() : "blue");
X			u.umconf = 1;
X		}
X		break;
X	case SCR_SCARE_MONSTER:
X#ifdef SPELLS
X	case SPE_CAUSE_FEAR:
X#endif
X	    {	register int ct = 0;
X		register struct monst *mtmp;
X
X		for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X		    if(cansee(mtmp->mx,mtmp->my)) {
X			if(confused)
X			    mtmp->mflee = mtmp->mfroz = mtmp->msleep = 0;
X			else
X			    if (! resist(mtmp, sobj->olet, 0, NOTELL))
X				mtmp->mflee = 1;
X			ct++;
X		    }
X		if(!ct)
X		    pline("You hear %s in the distance.",
X			  (confused) ? "sad wailing" : "maniacal laughter");
X#ifdef KAA
X# ifdef SPELLS
X		    else if(sobj->otyp == SCR_SCARE_MONSTER)
X# endif
X			pline ("You hear %s close by.",
X			       (confused) ? "sad wailing" : "maniacal laughter");
X#endif
X		break;
X	    }
X	case SCR_BLANK_PAPER:
X		if(confused)
X		    pline("You see strange patterns on this scroll.");
X		else  {
X		    pline("This scroll seems to be blank.");
X#ifdef MARKER
X		    pline("No, wait...");
X		    known = TRUE;
X#endif
X		}
X		break;
X	case SCR_REMOVE_CURSE:
X#ifdef SPELLS
X	case SPE_REMOVE_CURSE:
X#endif
X	    {	register struct obj *obj;
X		if(confused)
X		    if (Hallucination)
X			pline("You feel the power of the Force against you!");
X		    else
X			pline("You feel like you need some help.");
X		else
X		    if (Hallucination)
X			pline("You feel in touch with the Universal Oneness.");
X		    else
X			pline("You feel like someone is helping you.");
X		for(obj = invent; obj ; obj = obj->nobj)
X			if(obj->owornmask)
X				obj->cursed = confused;
X		if(Punished && !confused) {
X			Punished = 0;
X			freeobj(uchain);
X			unpobj(uchain);
X			free((char *) uchain);
X			uball->spe = 0;
X			uball->owornmask &= ~W_BALL;
X			uchain = uball = (struct obj *) 0;
X		}
X		break;
X	    }
X	case SCR_CREATE_MONSTER:
X#ifdef SPELLS
X	case SPE_CREATE_MONSTER:
X#endif
X	    {	register int cnt = 1;
X
X		if(!rn2(73)) cnt += rnd(4);
X		if(confused) cnt += 12;
X		while(cnt--)
X#ifdef WIZARD
X			if(wizard)  {
X				char buf[BUFSZ], cmlet;
X				struct permonst *crmonst;
X				
X				do {
X					pline("What monster to create? ");
X					getlin(buf);
X				} while(strlen(buf) != 1);
X				cmlet = buf[0];
X				for(crmonst = mons; crmonst->mlet != cmlet &&
X					crmonst != PM_EEL; crmonst++) ;
X				(void) makemon(crmonst, u.ux, u.uy);
X			} else
X#endif /* WIZARD /**/
X				(void) makemon(confused ? PM_ACID_BLOB :
X					(struct permonst *) 0, u.ux, u.uy);
X		break;
X	    }
X	case SCR_ENCHANT_WEAPON:
X		if(uwep && uwep->olet == WEAPON_SYM && confused) {
X		/* olet check added 10/25/86 GAN */
X			pline("Your %s covered by a shimmering %s shield!",
X				aobjnam(uwep, "are"),
X				Hallucination ? hcolor() : "gold");
X			uwep->rustfree = 1;
X		} else
X			if(!chwepon(sobj, 1))		/* tests for !uwep */
X				return(1);
X		break;
X	case SCR_DAMAGE_WEAPON:
X		if(uwep && uwep->olet == WEAPON_SYM && confused) {
X		/* olet check added 10/25/86 GAN */
X			pline("Your %s %s for a moment.",
X				aobjnam(uwep,"glow"),
X				Hallucination ? hcolor() : "purple");
X			uwep->rustfree = 0;
X		} else
X			if(!chwepon(sobj, -1))	/* tests for !uwep */
X				return(1);
X		break;
X	case SCR_TAMING:
X#ifdef SPELLS
X	case SPE_CHARM_MONSTER:
X#endif
X	    {	register int i,j;
X		register int bd = confused ? 5 : 1;
X		register struct monst *mtmp;
X
X		for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++)
X		if(mtmp = m_at(u.ux+i, u.uy+j))
X		    if(!resist(mtmp, sobj->olet, 0, NOTELL))
X			(void) tamedog(mtmp, (struct obj *) 0);
X		break;
X	    }
X	case SCR_GENOCIDE:
X		pline("You have found a scroll of genocide!");
X#ifdef SPELLS
X	case SPE_GENOCIDE:
X#endif
X		known = TRUE;
X		do_genocide();
X		break;
X	case SCR_LIGHT:
X		if(!Blind) known = TRUE;
X		litroom(!confused);
X		break;
X	case SCR_TELEPORTATION:
X		if(confused)
X			level_tele();
X		else {
X#ifdef QUEST
X			register int oux = u.ux, ouy = u.uy;
X			tele();
X			if(dist(oux, ouy) > 100) known = TRUE;
X#else
X			register int uroom = inroom(u.ux, u.uy);
X			tele();
X			if(uroom != inroom(u.ux, u.uy)) known = TRUE;
X#endif
X			if(Teleport_control)
X				known = TRUE;
X		}
X		break;
X	case SCR_GOLD_DETECTION:
X	    /* Unfortunately this code has become slightly less elegant,
X	       now that gold and traps no longer are of the same type. */
X	    if(confused) {
X		register struct trap *ttmp;
X
X		if(!ftrap) {
X			strange_feeling(sobj, "Your toes stop itching.");
X			return(1);
X		} else {
X			for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
X				if(ttmp->tx != u.ux || ttmp->ty != u.uy)
X					goto outtrapmap;
X			/* only under me - no separate display required */
X			pline("Your toes itch!");
X			break;
X		outtrapmap:
X			cls();
X			for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
X				at(ttmp->tx, ttmp->ty, Hallucination ? rndobjsym() : GOLD_SYM);
X			prme();
X			pline("You feel very greedy!");
X		}
X	    } else {
X		register struct gold *gtmp;
X
X		if(!fgold) {
X			strange_feeling(sobj, "You feel materially poor.");
X			return(1);
X		} else {
X			known = TRUE;
X			for(gtmp = fgold; gtmp; gtmp = gtmp->ngold)
X				if(gtmp->gx != u.ux || gtmp->gy != u.uy)
X					goto outgoldmap;
X			/* only under me - no separate display required */
X			pline("You notice some gold between your feet.");
X			break;
X		outgoldmap:
X			cls();
X			for(gtmp = fgold; gtmp; gtmp = gtmp->ngold)
X				at(gtmp->gx, gtmp->gy, Hallucination ? rndobjsym() : GOLD_SYM);
X			prme();
X			pline("You feel very greedy, and sense gold!");
X		}
X	    }
X		/* common sequel */
X		more();
X		docrt();
X		break;
X	case SCR_FOOD_DETECTION:
X#ifdef SPELLS
X	case SPE_DETECT_FOOD:
X#endif
X	    {	register ct = 0, ctu = 0;
X		register struct obj *obj;
X		register char foodsym = confused ? POTION_SYM : FOOD_SYM;
X
X		for(obj = fobj; obj; obj = obj->nobj)
X			if(obj->olet == foodsym) {
X				if(obj->ox == u.ux && obj->oy == u.uy) ctu++;
X				else ct++;
X			}
X		if(!ct && !ctu) {
X			strange_feeling(sobj,"Your nose twitches.");
X			return(1);
X		} else if(!ct) {
X			known = TRUE;
X			pline("You smell %s close nearby.",
X				confused ? "something" : "food");
X			
X		} else {
X			known = TRUE;
X			cls();
X			for(obj = fobj; obj; obj = obj->nobj)
X			    if(obj->olet == foodsym)
X				at(obj->ox, obj->oy, Hallucination ? rndobjsym() :
X				 FOOD_SYM);
X			prme();
X			pline("Your nose tingles and you smell %s!",
X				confused ? "something" : "food");
X			more();
X			docrt();
X		}
X		break;
X	    }
X	case SCR_IDENTIFY:
X		/* known = TRUE; */
X		if(confused)
X			pline("You identify this as an identify scroll.");
X		else
X			pline("This is an identify scroll.");
X		useup(sobj);
X		objects[SCR_IDENTIFY].oc_name_known = 1;
X#ifdef SPELLS
X	case SPE_IDENTIFY:
X#endif
X		if(!confused)
X		    while(!ggetobj("identify", identify, rn2(5) ? 1 : rn2(5)) && invent);
X		return(1);
X	case SCR_MAGIC_MAPPING:
X		known = TRUE;
X		pline("On this scroll %s a map!", confused ? "was" : "is");
X#ifdef SPELLS
X	case SPE_MAGIC_MAPPING:
X#endif
X		do_mapping();
X		break;
X	case SCR_AMNESIA:
X	    {	register int zx, zy;
X
X		known = TRUE;
X		for(zx = 0; zx < COLNO; zx++) for(zy = 0; zy < ROWNO; zy++)
X		    if(!confused || rn2(7))
X			if(!cansee(zx,zy))
X			    levl[zx][zy].seen = 0;
X		docrt();
X		pline("Who was that Maude person anyway?");
X#ifdef SPELLS
X		losespells();
X#endif
X		break;
X	    }
X	case SCR_FIRE:
X	    {	register int num;
X		register struct monst *mtmp;
X
X/* 
X * Note: This case was modified 11/4/86 by DKC to eliminate the problem with
X * reading a scroll of fire while confused or resistant to fire.  Formerly,
X * the code failed to initialize the variable "num" in these cases, resulting
X * in monsters being hit for a possibly large (and possibly negative) damage.
X * The actions taken now are: 
X * 				If the player is fire resistant, monsters
X * take the normal damage (1-6 except for Y's and F's), and the player is
X * unaffected.
X */
X		known = TRUE;
X		if(confused) {
X		    if(Fire_resistance)
X			pline("Oh look, what a pretty fire in your hands.");
X		    else {
X			pline("The scroll catches fire and you burn your hands.");
X			losehp(1, "scroll of fire");
X		    }
X		    break;
X		}
X		pline("The scroll erupts in a tower of flame!");
X		num = rnd(6);
X		if(Fire_resistance)
X			pline("You are uninjured.");
X		else {
X			u.uhpmax -= num;
X			losehp(num, "scroll of fire");
X		}
X		num = (2*num + 1)/3;
X		for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
X		    if(dist(mtmp->mx,mtmp->my) < 3) {
X			mtmp->mhp -= num;		/* No saving throw! */
X			if(index("FY", mtmp->data->mlet))
X			    mtmp->mhp -= 3*num;	/* this might well kill 'F's */
X			if(mtmp->mhp < 1) {
X			    killed(mtmp);
X			    break;		/* primitive */
X			}
X		    }
X		}
X		break;
X	    }
X	case SCR_PUNISHMENT:
X		known = TRUE;
X		if(confused) {
X			pline("You feel guilty.");
X			break;
X		}
X		pline("You are being punished for your misbehavior!");
X		if(Punished){
X			pline("Your iron ball gets heavier.");
X			uball->owt += 15;
X			break;
X		}
X		Punished = INTRINSIC;
X		setworn(mkobj_at(CHAIN_SYM, u.ux, u.uy), W_CHAIN);
X		setworn(mkobj_at(BALL_SYM, u.ux, u.uy), W_BALL);
X		uball->spe = 1;		/* special ball (see save) */
X		break;
X	default:
X		impossible("What weird effect is this? (%u)", sobj->otyp);
X	}
X	return(0);
X}
X
Xidentify(otmp)		/* also called by newmail() */
Xregister struct obj *otmp;
X{
X	objects[otmp->otyp].oc_name_known = 1;
X#ifdef KAA
X	otmp->known = 1;
X	if (otmp->olet != WEAPON_SYM) otmp->dknown = 1;
X/* Now, the dknown field is special for weapons, indicating blessing. */
X#else
X	otmp->known = otmp->dknown = 1;
X#endif
X	prinv(otmp);
X	return(1);
X}
X
Xlitroom(on)
Xregister boolean on;
X{
X	register num,zx,zy;
X
X	/* first produce the text (provided he is not blind) */
X	if(Blind) goto do_it;
X	if(!on) {
X		if(u.uswallow || !xdnstair || levl[u.ux][u.uy].typ == CORR ||
X		    !levl[u.ux][u.uy].lit) {
X			pline("It seems even darker in here than before.");
X			return;
X		} else
X			pline("It suddenly becomes dark in here.");
X	} else {
X		if(u.uswallow){
X			pline("%s's stomach is lit.", Monnam(u.ustuck));
X			return;
X		}
X		if(!xdnstair){
X			pline("Nothing Happens.");
X			return;
X		}
X#ifdef QUEST
X		pline("The cave lights up around you, then fades.");
X		return;
X#else
X		if(levl[u.ux][u.uy].typ == CORR) {
X		    pline("The corridor lights up around you, then fades.");
X		    return;
X		} else if(levl[u.ux][u.uy].lit) {
X		    pline("The light here seems better now.");
X		    return;
X		} else
X		    pline("The room is lit.");
X#endif
X	}
X
Xdo_it:
X#ifdef QUEST
X	return;
X#else
X	if(levl[u.ux][u.uy].lit == on)
X		return;
X	if(levl[u.ux][u.uy].typ == DOOR) {
X		if(IS_ROOM(levl[u.ux][u.uy+1].typ)) zy = u.uy+1;
X		else if(IS_ROOM(levl[u.ux][u.uy-1].typ)) zy = u.uy-1;
X		else zy = u.uy;
X		if(IS_ROOM(levl[u.ux+1][u.uy].typ)) zx = u.ux+1;
X		else if(IS_ROOM(levl[u.ux-1][u.uy].typ)) zx = u.ux-1;
X		else zx = u.ux;
X	} else {
X		zx = u.ux;
X		zy = u.uy;
X	}
X	for(seelx = u.ux; (num = levl[seelx-1][zy].typ) != CORR && num != 0;
X		seelx--);
X	for(seehx = u.ux; (num = levl[seehx+1][zy].typ) != CORR && num != 0;
X		seehx++);
X	for(seely = u.uy; (num = levl[zx][seely-1].typ) != CORR && num != 0;
X		seely--);
X	for(seehy = u.uy; (num = levl[zx][seehy+1].typ) != CORR && num != 0;
X		seehy++);
X	for(zy = seely; zy <= seehy; zy++)
X		for(zx = seelx; zx <= seehx; zx++) {
X			levl[zx][zy].lit = on;
X			if(!Blind && dist(zx,zy) > 2)
X				if(on) prl(zx,zy); else nosee(zx,zy);
X		}
X	if(!on) seehx = 0;
X#endif
X}
X
X/* Test whether we may genocide all monsters with symbol  ch  */
Xmonstersym(ch)				/* arnold@ucsfcgl */
Xregister char ch;
X{
X	register struct permonst *mp;
X
X	/*
X	 * can't genocide certain monsters
X	 */
X#ifdef SAC
X	if (index("123 &:", ch)) return FALSE;
X#else
X	if (index("12 &:", ch))  return FALSE;
X#endif
X	if (ch == pm_eel.mlet)	return TRUE;
X	for (mp = mons; mp < &mons[CMNUM+2]; mp++)
X		if (mp->mlet == ch) return TRUE;
X
X	return FALSE;
X}
X
Xdo_genocide() {
X	extern char genocided[], fut_geno[];
X	char buf[BUFSZ];
X	register struct monst *mtmp, *mtmp2;
X
X	if(Confusion != 0)  *buf = u.usym;
X	else do {
X	    pline("What monster do you want to genocide (Type the letter)? ");
X	    getlin(buf);
X	}
X
X	while(strlen(buf) != 1 || !monstersym(*buf));
X
X	if(!index(fut_geno, *buf))  charcat(fut_geno, *buf);
X	if(!index(genocided, *buf)) charcat(genocided, *buf);
X	else {
X		pline("Such monsters do not exist in this world.");
X		return;
X	}
X	for(mtmp = fmon; mtmp; mtmp = mtmp2){
X		mtmp2 = mtmp->nmon;
X		if(mtmp->data->mlet == *buf)
X			mondead(mtmp);
X	}
X	pline("Wiped out all %c's.", Hallucination ? '@' : *buf);
X	/* Scare the hallucinating player */
X	if(*buf == '@') {
X		u.uhp = -1;
X		killer = "scroll of genocide";
X	/* A polymorphed character will die as soon as he is rehumanized. */
X		if(u.usym != '@')	pline("You feel dead inside.");
X		else			done("died");
X	}
X#ifdef KAA
X	else if (*buf==u.usym) rehumanize();
X#endif
X}
X
Xdo_mapping()
X{
X	register struct rm *lev;
X	register int num, zx, zy;
X
X	for(zy = 0; zy < ROWNO; zy++)
X	    for(zx = 0; zx < COLNO; zx++) {
X
X		if((Confusion != 0) && rn2(7)) continue;
X		lev = &(levl[zx][zy]);
X		if((num = lev->typ) == 0)	continue;
X
X		if(num == SCORR) {
X			lev->typ = CORR;
X			lev->scrsym = CORR_SYM;
X		} else	if(num == SDOOR) {
X			lev->typ = DOOR;
X			lev->scrsym = DOOR_SYM;
X		/* do sth in doors ? */
X		} else if(lev->seen) continue;
X#ifndef QUEST
X		if(num != ROOM)
X#endif
X		{
X			lev->seen = lev->new = 1;
X			if(lev->scrsym == STONE_SYM || !lev->scrsym)
X				newsym(zx,zy);
X			else	on_scr(zx,zy);
X		}
X	    }
X}
X
Xdestroy_arm() {
X
X	if(uarm) {
X		pline("Your armor turns to dust and falls to the floor!");
X		useup(uarm);
X	} else if(uarmh) {
X		pline("Your helmet turns to dust and is blown away!");
X		useup(uarmh);
X	} else if(uarmg) {
X		pline("Your gloves vanish!");
X		useup(uarmg);
X		selftouch("You");
X	} else if(uarms) {
X		pline("Your shield crumbles away!");
X		useup(uarms);
X	} else  return(0);		/* could not destroy anything */
X
X	return(1);
X}
END_OF_read.c
if test 16984 -ne `wc -c <read.c`; then
    echo shar: \"read.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 8 \(of 20\).
cp /dev/null ark8isdone
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