games-request@tekred.TEK.COM (07/28/87)
Submitted by: mike@genat.UUCP (Mike Stephenson)
Comp.sources.games: Volume 2, Issue 12
Archive-name: nethack/Part12
#! /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 12 (of 16)."
# Contents: Makefile.xenix do.c do_wear.c gold.h mkshop.c pager.c
# prisym.c
# Wrapped by billr@tekred on Tue Jul 28 09:49:42 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f Makefile.xenix -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"Makefile.xenix\"
else
echo shar: Extracting \"Makefile.xenix\" \(8830 characters\)
sed "s/^X//" >Makefile.xenix <<'END_OF_Makefile.xenix'
X# Hack or Quest Makefile.
X# SCCS Id: @(#)Makefile.xenix 1.3 87/07/14
X
X# if you are cross-compiling (eg. from Xenix into a Dos enviornment)
X# you will have to redefine these filenames.
XMAIN = unixmain.c
XTTY = unixtty.c
XUNIX = unixunix.c
X
X# on some systems the termcap library is in -ltermcap
XTERMLIB = -ltermlib
X# TERMLIB = /lib/Llibtermlib.a
X# CRT0 = /lib/crt0.o
XCRT0 =
XLIBS = ${TERMLIB} -lc
X# LIBS = ${TERMLIB} /lib/Llibc.a
X
X# make NetHack
XGAME = nethack
XGAMEUID = games
XGAMEGRP = bin
XGAMEDIR = /usr/games/lib/$(GAME)dir
XSHELLDIR = /usr/games
XMANDIR = /usr/catman/man6
XCFLAGS = -O -Ml -c
XLFLAGS = -Ml
XHACKCSRC = apply.c bones.c decl.c\
X cmd.c do.c dothrow.c do_name.c do_wear.c dog.c dogmove.c eat.c end.c\
X engrave.c fight.c fountain.c hack.c invent.c ioctl.c lev.c main.c\
X makemon.c mhitu.c mklev.c mkmaze.c mkobj.c mkshop.c\
X mon.c monmove.c monst.c o_init.c objnam.c options.c\
X pager.c polyself.c potion.c pray.c pri.c prisym.c read.c rip.c\
X rumors.c save.c search.c shk.c shknam.c sit.c spell.c steal.c\
X termcap.c timeout.c topl.c topten.c track.c trap.c tty.c unix.c\
X u_init.c vault.c wield.c wizard.c worm.c worn.c write.c zap.c\
X version.c rnd.c alloc.c
X
XCSOURCES = $(HACKCSRC) makedefs.c
X
XHSOURCES = hack.h mfndpos.h config.h edog.h eshk.h extern.h\
X flag.h func_tab.h gold.h mkroom.h monst.h obj.h\
X objclass.h objects.h permonst.h rm.h spell.h trap.h wseg.h you.h
X
XSOURCES = $(CSOURCES) $(HSOURCES)
X
XAUX = help hh nethack.6 nethack.sh
XVARAUX = data rumors
X
XDISTR = $(SOURCES) $(AUX) $(VARAUX) README.OLD README\
X Makefile.unix Makefile.xenix Makefile.pc Make.ini
X
XHOBJ = apply.o bones.o decl.o cmd.o do.o dothrow.o do_name.o do_wear.o dog.o\
X dogmove.o eat.o end.o engrave.o fight.o fountain.o hack.o\
X invent.o ioctl.o lev.o main.o makemon.o mhitu.o mklev.o\
X mkmaze.o mkobj.o mkshop.o mon.o monmove.o monst.o\
X o_init.o objnam.o options.o pager.o polyself.o potion.o pray.o\
X pri.o prisym.o read.o rip.o rumors.o save.o search.o shk.o shknam.o\
X sit.o spell.o steal.o termcap.o timeout.o topl.o topten.o track.o\
X trap.o tty.o unix.o u_init.o vault.o wield.o wizard.o worm.o worn.o\
X write.o zap.o version.o rnd.o alloc.o
X
X$(GAME): specifics $(HOBJ) Makefile
X @echo "Loading ..."
X @cc $(LFLAGS) -o $(GAME) $(CRT0) $(HOBJ) $(LIBS)
X
Xall: $(GAME) lint
X @echo "Done."
X
Xmakedefs: makedefs.c alloc.o config.h
X cc ${CFLAGS} -o makedefs alloc.o makedefs.c
X
XRUMORFILES= rumors.base rumors.kaa rumors.mrx
X
Xrumors: config.h $(RUMORFILES) makedefs
X ./makedefs -r
X
Xdata: config.h data.base makedefs
X ./makedefs -d
X
Xdate.h: $(SOURCES) makedefs
X ./makedefs -D
X
Xtrap.h: config.h makedefs
X ./makedefs -t
X
Xonames.h: makedefs objects.h
X ./makedefs -o
X
Xspecifics: main.o tty.o unix.o
X
Xmain.o: main.c
X cc ${CFLAGS} -NT MAIN -ND DMAIN main.c
X
Xmain.c: unixmain.c hack.h
X cp ${MAIN} main.c
X
Xtty.o: tty.c
X cc ${CFLAGS} -NT MAIN -ND DMAIN tty.c
X
Xtty.c: unixtty.c extern.h
X cp ${TTY} tty.c
X
Xunix.o: unix.c
X cc ${CFLAGS} -NT MAIN -ND DMAIN unix.c
X
Xunix.c: unixunix.c hack.h mkroom.h
X cp ${UNIX} unix.c
X
Xlint:
X# lint cannot have -p here because (i) capitals are meaningful:
X# [Ww]izard, (ii) identifiers may coincide in the first six places:
X# doweararm() versus dowearring().
X# _flsbuf comes from <stdio.h>, a bug in the system libraries.
X @echo lint -axbh -DLINT ...
X @lint -axbh -DLINT $(HACKCSRC) | sed '/_flsbuf/d'
X
X
Xdiff:
X @- for i in $(SOURCES) $(AUX) ; do \
X cmp -s $$i $D/$$i || \
X ( echo diff $D/$$i $$i ; diff $D/$$i $$i ; echo ) ; done
X
Xdistribution: Makefile
X @- for i in READ_ME $(SOURCES) $(AUX) Makefile date.h onames.h\
X ; do \
X cmp -s $$i $D/$$i || \
X ( echo cp $$i $D ; cp $$i $D ) ; done
X# the distribution directory also contains the empty files perm and record.
X
Xinitial:
X -rm -rf $(GAMEDIR)
X -mkdir $(SHELLDIR)
X mkdir $(GAMEDIR) $(GAMEDIR)/save
X touch $(GAMEDIR)/perm
X touch $(GAMEDIR)/record
X chown $(GAMEUID) $(GAMEDIR) $(GAMEDIR)/*
X chgrp $(GAMEGRP) $(GAMEDIR) $(GAMEDIR)/*
X chmod 666 $(GAMEDIR)/*
X chmod 777 $(GAMEDIR) $(GAMEDIR)/save
X
Xinstall: $(VARAUX)
X -rm -f $(GAMEDIR)/$(GAME)
X -rm -f $(GAMEDIR)/bones*
X -rm -f $(GAMEDIR)/save/*
X cp help hh rumors data $(GAMEDIR)
X cp $(GAME).sh $(SHELLDIR)/$(GAME)
X cp $(GAME) $(GAMEDIR)/$(GAME)
X chown $(GAMEUID) $(SHELLDIR)/$(GAME) $(GAMEDIR)/*
X chgrp $(GAMEGRP) $(SHELLDIR)/$(GAME) $(GAMEDIR)/*
X chmod 0755 $(SHELLDIR)/$(GAME)
X chmod 04755 $(GAMEDIR)/$(GAME)
X -cp nethack.6 $(MANDIR)
X
Xclean:
X rm -f *.o
X
Xspotless: clean
X rm -f a.out core $(GAME) makedefs
X rm -f Makefile $(VARAUX) main.c tty.c unix.c
X
Xalloc.o:
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c alloc.c
Xbones.o: hack.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c bones.c
Xdecl.o: hack.h mkroom.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c decl.c
Xend.o: hack.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c end.c
Xhack.o: hack.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c hack.c
Xioctl.o: config.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c ioctl.c
Xo_init.o: config.h objects.h onames.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c o_init.c
Xobjnam.o: hack.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c objnam.c
Xrnd.o:
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c rnd.c
Xu_init.o: hack.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c u_init.c
Xversion.o: hack.h date.h
X cc ${CFLAGS} -NT MAIN -ND DMAIN -c version.c
Xapply.o: hack.h edog.h mkroom.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c apply.c
Xcmd.o: hack.h func_tab.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c cmd.c
Xdo.o: hack.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c do.c
Xdothrow.o: hack.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c dothrow.c
Xdo_name.o: hack.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c do_name.c
Xdo_wear.o: hack.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c do_wear.c
Xdog.o: hack.h edog.h mkroom.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c dog.c
Xdogmove.o: hack.h mfndpos.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c dogmove.c
Xeat.o: hack.h
X cc ${CFLAGS} -NT AUX1 -ND DAUX1 -c eat.c
Xengrave.o: hack.h
X cc ${CFLAGS} -NT AUX2 -ND DAUX2 -c engrave.c
Xfight.o: hack.h
X cc ${CFLAGS} -NT AUX2 -ND DAUX2 -c fight.c
Xfountain.o: hack.h
X cc ${CFLAGS} -NT AUX2 -ND DAUX2 -c fountain.c
Xinvent.o: hack.h wseg.h
X cc ${CFLAGS} -NT AUX2 -ND DAUX2 -c invent.c
Xlev.o: hack.h mkroom.h wseg.h
X cc ${CFLAGS} -NT AUX2 -ND DAUX2 -c lev.c
Xmakemon.o: hack.h
X cc ${CFLAGS} -NT AUX2 -ND DAUX2 -c makemon.c
Xmhitu.o: hack.h
X cc ${CFLAGS} -NT AUX2 -ND DAUX2 -c mhitu.c
Xmklev.o: hack.h mkroom.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c mklev.c
Xmkmaze.o: hack.h mkroom.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c mkmaze.c
Xmkobj.o: hack.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c mkobj.c
Xmkshop.o: hack.h mkroom.h eshk.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c mkshop.c
Xmon.o: hack.h mfndpos.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c mon.c
Xmonmove.o: hack.h mfndpos.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c monmove.c
Xmonst.o: hack.h eshk.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c monst.c
Xoptions.o: config.h hack.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c options.c
Xpager.o: hack.h
X cc ${CFLAGS} -NT AUX3 -ND DAUX3 -c pager.c
Xpolyself.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c polyself.c
Xpotion.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c potion.c
Xpray.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c pray.c
Xpri.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c pri.c
Xprisym.o: hack.h wseg.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c prisym.c
Xread.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c read.c
Xrip.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c rip.c
Xrumors.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c rumors.c
Xsave.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c save.c
Xsearch.o: hack.h
X cc ${CFLAGS} -NT AUX4 -ND DAUX4 -c search.c
Xshk.o: hack.h mfndpos.h mkroom.h eshk.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c shk.c
Xshknam.o: hack.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c shknam.c
Xsit.o: hack.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c sit.c
Xspell.o: hack.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c spell.c
Xsteal.o: hack.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c steal.c
Xtermcap.o: config.h flag.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c termcap.c
Xtimeout.o: hack.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c timeout.c
Xtopl.o: hack.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c topl.c
Xtopten.o: hack.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c topten.c
Xtrack.o: hack.h
X cc ${CFLAGS} -NT AUX5 -ND DAUX5 -c track.c
Xtrap.o: hack.h mkroom.h
X cc ${CFLAGS} -NT AUX6 -ND DAUX6 -c trap.c
Xvault.o: hack.h mkroom.h
X cc ${CFLAGS} -NT AUX6 -ND DAUX6 -c vault.c
Xwield.o: hack.h
X cc ${CFLAGS} -NT AUX6 -ND DAUX6 -c wield.c
Xwizard.o: hack.h
X cc ${CFLAGS} -NT AUX6 -ND DAUX6 -c wizard.c
Xworm.o: hack.h wseg.h
X cc ${CFLAGS} -NT AUX6 -ND DAUX6 -c worm.c
Xworn.o: hack.h
X cc ${CFLAGS} -NT AUX6 -ND DAUX6 -c worn.c
Xwrite.o: hack.h
X cc ${CFLAGS} -NT AUX6 -ND DAUX6 -c write.c
Xzap.o: hack.h
X cc ${CFLAGS} -NT AUX6 -ND DAUX6 -c zap.c
Xextern.h: config.h
X touch extern.h
Xhack.h: config.h objclass.h monst.h gold.h trap.h obj.h flag.h rm.h permonst.h spell.h onames.h extern.h you.h
X touch hack.h
Xobjects.h: config.h objclass.h
X touch objects.h
END_OF_Makefile.xenix
if test 8830 -ne `wc -c <Makefile.xenix`; then
echo shar: \"Makefile.xenix\" unpacked with wrong size!
fi
# end of overwriting check
fi
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\" \(8441 characters\)
sed "s/^X//" >do.c <<'END_OF_do.c'
X/* SCCS Id: @(#)do.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* do.c - version 1.0.3 */
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 return(drop(getobj("0$#", "drop")));
X}
X
Xstatic
Xdrop(obj) register struct obj *obj; {
X if(!obj) return(0);
X if(obj->olet == '$') { /* 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 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("You're 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 if (!Blind) 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 u.ucreamed -= 4;
X if(u.ucreamed > 0) {
X Blind -= 4;
X if(Blind <= 1) {
X pline("You've got the glop off.");
X u.ucreamed = 0;
X Blind = 1;
X return(0);
X }
X return(1); /* still busy */
X }
X pline("You're 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("You're 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 8441 -ne `wc -c <do.c`; then
echo shar: \"do.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f do_wear.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"do_wear.c\"
else
echo shar: Extracting \"do_wear.c\" \(8787 characters\)
sed "s/^X//" >do_wear.c <<'END_OF_do_wear.c'
X/* SCCS Id: @(#)do_wear.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* do_wear.c - version 1.0.3 */
X
X#include <stdio.h>
X#include "hack.h"
Xextern char *nomovemsg;
Xextern char quitchars[];
Xextern char *Doname();
X
Xoff_msg(otmp) register struct obj *otmp; {
X pline("You were wearing %s.", doname(otmp));
X}
X
Xdoremarm() {
X register struct obj *otmp;
X if(!uarm && !uarmh && !uarms && !uarmg) {
X pline("Not wearing any armor.");
X return(0);
X }
X otmp = (!uarmh && !uarms && !uarmg) ? uarm :
X (!uarms && !uarm && !uarmg) ? uarmh :
X (!uarmh && !uarm && !uarmg) ? uarms :
X (!uarmh && !uarm && !uarms) ? uarmg :
X getobj("[", "take off");
X if(!otmp) return(0);
X if(!(otmp->owornmask & (W_ARMOR - W_ARM2))) {
X pline("You can't take that off.");
X return(0);
X }
X if( otmp == uarmg && uwep && uwep->cursed ) { /* myers@uwmacc */
X pline("You seem not able to take off the gloves while holding your weapon.");
X return(0);
X }
X (void) armoroff(otmp);
X return(1);
X}
X
Xdoremring() {
X if(!uleft && !uright){
X pline("Not wearing any ring.");
X return(0);
X }
X if(!uleft)
X return(dorr(uright));
X if(!uright)
X return(dorr(uleft));
X if(uleft && uright) while(1) {
X char answer;
X
X pline("What ring, Right or Left? [ rl?]");
X if(index(quitchars, (answer = readchar())))
X return(0);
X switch(answer) {
X case 'l':
X case 'L':
X return(dorr(uleft));
X case 'r':
X case 'R':
X return(dorr(uright));
X case '?':
X (void) doprring();
X /* might look at morc here %% */
X }
X }
X /* NOTREACHED */
X#ifdef lint
X return(0);
X#endif
X}
X
Xdorr(otmp) register struct obj *otmp; {
X if(cursed(otmp)) return(0);
X ringoff(otmp);
X off_msg(otmp);
X return(1);
X}
X
Xcursed(otmp) register struct obj *otmp; {
X if(otmp->cursed){
X pline("You can't. It appears to be cursed.");
X return(1);
X }
X return(0);
X}
X
Xarmoroff(otmp) register struct obj *otmp; {
Xregister int delay = -objects[otmp->otyp].oc_delay;
X if(cursed(otmp)) return(0);
X setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
X if(delay) {
X nomul(delay);
X switch(otmp->otyp) {
X case HELMET:
X nomovemsg = "You finished taking off your helmet.";
X break;
X case PAIR_OF_GLOVES:
X nomovemsg = "You finished taking off your gloves";
X break;
X default:
X nomovemsg = "You finished taking off your suit.";
X }
X } else {
X off_msg(otmp);
X }
X return(1);
X}
X
Xdoweararm() {
X register struct obj *otmp;
X register int delay;
X register int err = 0;
X long mask = 0;
X
X#ifdef KAA
X if(!index("@enozCGHIKLNOTUVWXYZ&",u.usym)) {
X pline("Don't even bother.");
X return(0);
X }
X#endif
X otmp = getobj("[", "wear");
X if(!otmp) return(0);
X if(otmp->owornmask & W_ARMOR) {
X pline("You are already wearing that!");
X return(0);
X }
X if(otmp->otyp == HELMET){
X if(uarmh) {
X pline("You are already wearing a helmet.");
X err++;
X } else
X mask = W_ARMH;
X } else if(otmp->otyp == SHIELD){
X if(uarms) pline("You are already wearing a shield."), err++;
X if(uwep && uwep->otyp == TWO_HANDED_SWORD)
X pline("You cannot wear a shield and wield a two handed sword."), err++;
X if(!err) mask = W_ARMS;
X } else if(otmp->otyp == PAIR_OF_GLOVES) {
X if(uarmg) {
X pline("You are already wearing gloves.");
X err++;
X } else
X if(uwep && uwep->cursed) {
X pline("You cannot wear gloves over your weapon.");
X err++;
X } else
X mask = W_ARMG;
X } else {
X#ifdef KAA
X if(cantweararm(u.usym)) {
X pline("You can't wear armor!");
X return(0);
X }
X#endif
X if(uarm) {
X if(otmp->otyp != ELVEN_CLOAK || uarm2) {
X pline("You are already wearing some armor.");
X err++;
X }
X }
X if(!err) mask = W_ARM;
X }
X if(welded(otmp)) {
X if(!err++)
X pline("%s is welded to your hand.", Doname(uwep));
X }
X if(err) return(0);
X setworn(otmp, mask);
X if(otmp == uwep)
X setuwep((struct obj *) 0);
X delay = -objects[otmp->otyp].oc_delay;
X if(delay){
X nomul(delay);
X nomovemsg = "You finished your dressing manoeuvre.";
X }
X otmp->known = 1;
X return(1);
X}
X
Xdowearring() {
X register struct obj *otmp;
X long mask = 0;
X long oldprop;
X
X if(uleft && uright){
X pline("There are no more ring-fingers to fill.");
X return(0);
X }
X otmp = getobj("=", "wear");
X if(!otmp) return(0);
X if(otmp->owornmask & W_RING) {
X pline("You are already wearing that!");
X return(0);
X }
X if(otmp == uleft || otmp == uright) {
X pline("You are already wearing that.");
X return(0);
X }
X if(welded(otmp)) {
X pline("%s is welded to your hand.", Doname(uwep));
X return(0);
X }
X if(uleft) mask = RIGHT_RING;
X else if(uright) mask = LEFT_RING;
X else do {
X char answer;
X
X pline("What ring-finger, Right or Left? ");
X if(index(quitchars, (answer = readchar())))
X return(0);
X switch(answer){
X case 'l':
X case 'L':
X mask = LEFT_RING;
X break;
X case 'r':
X case 'R':
X mask = RIGHT_RING;
X break;
X }
X } while(!mask);
X setworn(otmp, mask);
X if(otmp == uwep)
X setuwep((struct obj *) 0);
X oldprop = u.uprops[PROP(otmp->otyp)].p_flgs;
X u.uprops[PROP(otmp->otyp)].p_flgs |= mask;
X switch(otmp->otyp){
X case RIN_LEVITATION:
X if(!oldprop) float_up();
X break;
X case RIN_GAIN_STRENGTH:
X u.ustr += otmp->spe;
X u.ustrmax += otmp->spe;
X if(u.ustr > 118) u.ustr = 118;
X if(u.ustrmax > 118) u.ustrmax = 118;
X flags.botl = 1;
X break;
X case RIN_INCREASE_DAMAGE:
X u.udaminc += otmp->spe;
X break;
X case RIN_PROTECTION_FROM_SHAPE_CHAN:
X#ifdef DGKMOD
X /* If you're no longer protected, let the chameleons
X * change shape again -dgk
X */
X restartcham();
X#else
X rescham();
X#endif /* DGKMOD /**/
X break;
X }
X prinv(otmp);
X return(1);
X}
X
Xringoff(obj)
Xregister struct obj *obj;
X{
Xregister long mask;
X mask = obj->owornmask & W_RING;
X setworn((struct obj *) 0, obj->owornmask);
X if(!(u.uprops[PROP(obj->otyp)].p_flgs & mask))
X impossible("Strange... I didnt know you had that ring.");
X u.uprops[PROP(obj->otyp)].p_flgs &= ~mask;
X switch(obj->otyp) {
X case RIN_FIRE_RESISTANCE:
X /* Bad luck if the player is in hell... --jgm */
X if (!Fire_resistance && dlevel >= 30) {
X pline("The flames of Hell burn you to a crisp.");
X killer = "stupidity in hell";
X done("burned");
X }
X break;
X case RIN_LEVITATION:
X if(!Levitation) { /* no longer floating */
X float_down();
X }
X break;
X case RIN_GAIN_STRENGTH:
X u.ustr -= obj->spe;
X u.ustrmax -= obj->spe;
X if(u.ustr > 118) u.ustr = 118;
X if(u.ustrmax > 118) u.ustrmax = 118;
X flags.botl = 1;
X break;
X case RIN_INCREASE_DAMAGE:
X u.udaminc -= obj->spe;
X break;
X }
X}
X
Xfind_ac(){
Xregister int uac = 10;
X#ifdef KAA
X if (u.mtimedone) uac = mons[u.umonnum].ac;
X#endif
X if(uarm) uac -= ARM_BONUS(uarm);
X if(uarm2) uac -= ARM_BONUS(uarm2);
X if(uarmh) uac -= ARM_BONUS(uarmh);
X if(uarms) uac -= ARM_BONUS(uarms);
X if(uarmg) uac -= ARM_BONUS(uarmg);
X if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe;
X if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe;
X#ifdef PRAYERS
X if (Protection & INTRINSIC) uac -= u.ublessed;
X#endif
X if(uac != u.uac){
X u.uac = uac;
X flags.botl = 1;
X }
X}
X
Xglibr(){
Xregister struct obj *otmp;
Xint xfl = 0;
X if(!uarmg) if(uleft || uright) {
X /* Note: at present also cursed rings fall off */
X /* changed 10/30/86 by GAN */
X pline("Your %s off your fingers.",
X#ifdef HARD
X ((uleft && !uleft->cursed) && (uright && !uright->cursed)) ? "rings slip" : "ring slips");
X#else
X (uleft && uright) ? "rings slip" : "ring slips");
X#endif
X xfl++;
X if((otmp = uleft) != Null(obj)){
X ringoff(uleft);
X dropx(otmp);
X }
X if((otmp = uright) != Null(obj)){
X ringoff(uright);
X dropx(otmp);
X }
X }
X if(((otmp = uwep) != Null(obj))
X#ifdef HARD
X && !otmp->cursed
X#endif
X ) {
X /* Note: at present also cursed weapons fall */
X /* changed 10/30/86 by GAN */
X setuwep((struct obj *) 0);
X dropx(otmp);
X pline("Your weapon %sslips from your hands.",
X xfl ? "also " : "");
X }
X}
X
Xstruct obj *
Xsome_armor(){
Xregister struct obj *otmph = uarm;
X if(uarmh && (!otmph || !rn2(4))) otmph = uarmh;
X if(uarmg && (!otmph || !rn2(4))) otmph = uarmg;
X if(uarms && (!otmph || !rn2(4))) otmph = uarms;
X return(otmph);
X}
X
Xcorrode_armor(){
Xregister struct obj *otmph = some_armor();
X if(otmph){
X if(otmph->rustfree ||
X otmph->otyp == CRYSTAL_PLATE_MAIL ||
X otmph->otyp == ELVEN_CLOAK ||
X otmph->otyp == LEATHER_ARMOR ||
X otmph->otyp == STUDDED_LEATHER_ARMOR) {
X pline("Your %s not affected!",
X aobjnam(otmph, "are"));
X return;
X }
X pline("Your %s!", aobjnam(otmph, "corrode"));
X otmph->spe--;
X }
X}
X
Xstatic
Xremarm(obj) register struct obj *obj; {
X if(!obj || obj->olet != '[')
X return(0);
X (void) marmoroff(obj);
X return(1);
X}
X
Xstatic
Xmarmoroff(otmp) register struct obj *otmp; {
Xregister int delay = -objects[otmp->otyp].oc_delay;
X if(cursed(otmp)) return(0);
X setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
X if(delay)
X nomul(delay);
X off_msg(otmp);
X nomovemsg = "You finished taking off your armor.";
X return(1);
X}
X
Xdoddoremarm() {
X return(ggetobj("take off",remarm,0));
X}
END_OF_do_wear.c
if test 8787 -ne `wc -c <do_wear.c`; then
echo shar: \"do_wear.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f gold.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"gold.h\"
else
echo shar: Extracting \"gold.h\" \(311 characters\)
sed "s/^X//" >gold.h <<'END_OF_gold.h'
X/* SCCS Id: @(#)gold.h 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* gold.h - version 1.0.2 */
X
Xstruct gold {
X struct gold *ngold;
X xchar gx,gy;
X long amount;
X};
X
Xextern struct gold *fgold;
Xstruct gold *g_at();
X#define newgold() (struct gold *) alloc(sizeof(struct gold))
END_OF_gold.h
if test 311 -ne `wc -c <gold.h`; then
echo shar: \"gold.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f mkshop.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"mkshop.c\"
else
echo shar: Extracting \"mkshop.c\" \(7823 characters\)
sed "s/^X//" >mkshop.c <<'END_OF_mkshop.c'
X/* SCCS Id: @(#)mkshop.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* mkshop.c - version 1.0.3 */
X
X#ifndef QUEST
X#include "hack.h"
X#include "mkroom.h"
X#include "eshk.h"
X#define ESHK ((struct eshk *)(&(shk->mextra[0])))
Xextern struct monst *makemon();
Xextern struct obj *mkobj_at();
Xextern int nroom;
Xextern char shtypes[]; /* = "=/+)%?!["; 9 types: 8 specialized, 1 mixed */
X#ifdef SPELLS
Xschar shprobs[] = { 3,3,3,5,5,10,10,14,47 }; /* their probabilities */
X#else
Xschar shprobs[] = { 3,3,5,5,10,10,14,50 }; /* their probabilities */
X#endif
X
Xmkshop(){
Xregister struct mkroom *sroom;
Xregister int sh,sx,sy,i = -1;
Xregister char let;
Xint roomno;
Xregister struct monst *shk;
X#ifdef WIZARD
X /* first determine shoptype */
X if(wizard){
X extern char *getenv();
X register char *ep = getenv("SHOPTYPE");
X if(ep){
X if(*ep == 'z' || *ep == 'Z'){
X mkzoo(ZOO);
X return;
X }
X if(*ep == 'm' || *ep == 'M'){
X mkzoo(MORGUE);
X return;
X }
X if(*ep == 'b' || *ep == 'B'){
X mkzoo(BEEHIVE);
X return;
X }
X#ifdef NEWCLASS
X if(*ep == 't' || *ep == 'T'){
X mkzoo(COURT);
X return;
X }
X#endif
X if(*ep == 's' || *ep == 'S'){
X mkswamp();
X return;
X }
X for(i=0; shtypes[i]; i++)
X if(*ep == shtypes[i]) break;
X goto gottype;
X }
X }
Xgottype:
X#endif
X for(sroom = &rooms[0], roomno = 0; ; sroom++, roomno++){
X if(sroom->hx < 0) return;
X if(sroom - rooms >= nroom) {
X pline("rooms not closed by -1?");
X return;
X }
X if(sroom->rtype) continue;
X if(!sroom->rlit || has_dnstairs(sroom) || has_upstairs(sroom))
X continue;
X if(
X#ifdef WIZARD
X (wizard && getenv("SHOPTYPE") && sroom->doorct != 0) ||
X#endif
X sroom->doorct == 1) break;
X }
X
X if(i < 0) { /* shoptype not yet determined */
X register int j;
X
X for(j = rn2(100), i = 0; (j -= shprobs[i])>= 0; i++)
X if(!shtypes[i]) break; /* superfluous */
X if(isbig(sroom) && i + SHOPBASE == WANDSHOP)
X i = GENERAL-SHOPBASE;
X }
X sroom->rtype = i + SHOPBASE;
X let = shtypes[i];
X sh = sroom->fdoor;
X sx = doors[sh].x;
X sy = doors[sh].y;
X if(sx == sroom->lx-1) sx++; else
X if(sx == sroom->hx+1) sx--; else
X if(sy == sroom->ly-1) sy++; else
X if(sy == sroom->hy+1) sy--; else {
X#ifdef WIZARD
X /* This is said to happen sometimes, but I've never seen it. */
X if(wizard) {
X register int j = sroom->doorct;
X extern int doorindex;
X
X pline("Where is shopdoor?");
X pline("Room at (%d,%d),(%d,%d).", sroom->lx, sroom->ly,
X sroom->hx, sroom->hy);
X pline("doormax=%d doorct=%d fdoor=%d",
X doorindex, sroom->doorct, sh);
X while(j--) {
X pline("door [%d,%d]", doors[sh].x, doors[sh].y);
X sh++;
X }
X more();
X }
X#endif
X return;
X }
X if(!(shk = makemon(PM_SHK,sx,sy))) return;
X shk->isshk = shk->mpeaceful = 1;
X shk->msleep = 0;
X shk->mtrapseen = ~0; /* we know all the traps already */
X ESHK->shoproom = roomno;
X ESHK->shoplevel = dlevel;
X ESHK->shd = doors[sh];
X ESHK->shk.x = sx;
X ESHK->shk.y = sy;
X ESHK->robbed = 0;
X ESHK->visitct = 0;
X ESHK->following = 0;
X shk->mgold = 1000 + 30*rnd(100); /* initial capital */
X ESHK->billct = 0;
X findname(ESHK->shknam, let);
X for(sx = sroom->lx; sx <= sroom->hx; sx++)
X for(sy = sroom->ly; sy <= sroom->hy; sy++){
X register struct monst *mtmp;
X if((sx == sroom->lx && doors[sh].x == sx-1) ||
X (sx == sroom->hx && doors[sh].x == sx+1) ||
X (sy == sroom->ly && doors[sh].y == sy-1) ||
X (sy == sroom->hy && doors[sh].y == sy+1)) continue;
X if(rn2(100) < dlevel && !m_at(sx,sy) &&
X (mtmp = makemon(PM_MIMIC, sx, sy))){
X mtmp->mimic = 1;
X mtmp->mappearance =
X (let && rn2(10) < dlevel) ? let : ']';
X continue;
X }
X (void) mkobj_at(let, sx, sy);
X }
X}
X
Xmkzoo(type)
Xint type;
X{
X register struct mkroom *sroom;
X register struct monst *mon;
X register int sh,sx,sy,i;
X int goldlim = 500 * dlevel;
X int moct = 0;
X struct permonst *morguemon();
X#ifdef NEWCLASS
X struct permonst *courtmon();
X#endif
X
X i = nroom;
X for(sroom = &rooms[rn2(nroom)]; ; sroom++) {
X if(sroom == &rooms[nroom])
X sroom = &rooms[0];
X if(!i-- || sroom->hx < 0)
X return;
X if(sroom->rtype) continue;
X if(type == MORGUE && sroom->rlit) continue;
X if(has_upstairs(sroom) || (has_dnstairs(sroom) && rn2(3)))
X continue;
X if(sroom->doorct == 1 || !rn2(5))
X break;
X }
X sroom->rtype = type;
X sh = sroom->fdoor;
X for(sx = sroom->lx; sx <= sroom->hx; sx++)
X for(sy = sroom->ly; sy <= sroom->hy; sy++){
X if((sx == sroom->lx && doors[sh].x == sx-1) ||
X (sx == sroom->hx && doors[sh].x == sx+1) ||
X (sy == sroom->ly && doors[sh].y == sy-1) ||
X (sy == sroom->hy && doors[sh].y == sy+1)) continue;
X mon = makemon(
X#ifdef NEWCLASS
X (type == COURT) ? courtmon() :
X#endif
X (type == MORGUE) ? morguemon() :
X (type == BEEHIVE) ? PM_KILLER_BEE : (struct permonst *) 0,
X sx, sy);
X if(mon) mon->msleep = 1;
X switch(type) {
X case ZOO:
X i = sq(dist2(sx,sy,doors[sh].x,doors[sh].y));
X if(i >= goldlim) i = 5*dlevel;
X goldlim -= i;
X mkgold((long)(10 + rn2(i)), sx, sy);
X break;
X case MORGUE:
X /* Usually there is one dead body in the morgue */
X if(!moct && rn2(3)) {
X mksobj_at(CORPSE, sx, sy);
X moct++;
X }
X break;
X case BEEHIVE:
X if(!rn2(3)) mksobj_at(LUMP_OF_ROYAL_JELLY, sx, sy);
X break;
X }
X }
X#ifdef NEWCLASS
X if(type == COURT) {
X
X sx = sroom->lx + (rn2(sroom->hx - sroom->lx));
X sy = sroom->ly + (rn2(sroom->hy - sroom->ly));
X levl[sx][sy].typ = THRONE;
X levl[sx][sy].scrsym = THRONE_SYM;
X mkgold((long) rn1(50 * dlevel,10), sx, sy);
X }
X#endif
X
X}
X
Xstruct permonst *
Xmorguemon()
X{
X extern struct permonst pm_ghost;
X register int i = rn2(100), hd = rn2(dlevel);
X
X if(hd > 10 && i < 10) return(PM_DEMON);
X if(hd > 8 && i > 85) return(PM_VAMPIRE);
X return((i < 40) ? PM_GHOST : (i < 60) ? PM_WRAITH : PM_ZOMBIE);
X}
X
Xmkswamp() /* Michiel Huisjes & Fred de Wilde */
X{
X register struct mkroom *sroom;
X register int sx,sy,i,eelct = 0;
X extern struct permonst pm_eel;
X
X for(i=0; i<5; i++) { /* 5 tries */
X sroom = &rooms[rn2(nroom)];
X if(sroom->hx < 0 || sroom->rtype ||
X has_upstairs(sroom) || has_dnstairs(sroom))
X continue;
X
X /* satisfied; make a swamp */
X sroom->rtype = SWAMP;
X for(sx = sroom->lx; sx <= sroom->hx; sx++)
X for(sy = sroom->ly; sy <= sroom->hy; sy++)
X if((sx+sy)%2 && !o_at(sx,sy) && !t_at(sx,sy)
X && !m_at(sx,sy) && !nexttodoor(sx,sy)){
X levl[sx][sy].typ = POOL;
X levl[sx][sy].scrsym = POOL_SYM;
X if(!eelct || !rn2(4)) {
X (void) makemon(PM_EEL, sx, sy);
X eelct++;
X }
X }
X }
X}
X
Xnexttodoor(sx,sy)
Xregister sx,sy;
X{
X register dx,dy;
X register struct rm *lev;
X for(dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++)
X if((lev = &levl[sx+dx][sy+dy])->typ == DOOR ||
X lev->typ == SDOOR || lev->typ == LDOOR)
X return(1);
X return(0);
X}
X
Xhas_dnstairs(sroom)
Xregister struct mkroom *sroom;
X{
X return(sroom->lx <= xdnstair && xdnstair <= sroom->hx &&
X sroom->ly <= ydnstair && ydnstair <= sroom->hy);
X}
X
Xhas_upstairs(sroom)
Xregister struct mkroom *sroom;
X{
X return(sroom->lx <= xupstair && xupstair <= sroom->hx &&
X sroom->ly <= yupstair && yupstair <= sroom->hy);
X}
X
Xisbig(sroom)
Xregister struct mkroom *sroom;
X{
X register int area = (sroom->hx - sroom->lx) * (sroom->hy - sroom->ly);
X return( area > 20 );
X}
X
Xdist2(x0,y0,x1,y1){
X return((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1));
X}
X
Xsq(a) int a; {
X return(a*a);
X}
X#endif /* QUEST /**/
X
X#ifdef NEWCLASS
Xstruct permonst *
Xcourtmon()
X{
X int i = rn2(60) + rn2(3*dlevel);
X
X if (i > 100) return(PM_DRAGON);
X else if (i > 95) return(PM_XORN);
X else if (i > 85) return(PM_TROLL);
X else if (i > 75) return(PM_ETTIN);
X else if (i > 60) return(PM_CENTAUR);
X else if (i > 45) return(PM_ORC);
X else if (i > 30) return(PM_HOBGOBLIN);
X#ifdef KOPS
X else return(PM_GNOME);
X#else
X else if (i > 15) return(PM_GNOME);
X else return(PM_KOBOLD);
X#endif
X}
X#endif /* NEWCLASS /**/
END_OF_mkshop.c
if test 7823 -ne `wc -c <mkshop.c`; then
echo shar: \"mkshop.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f pager.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"pager.c\"
else
echo shar: Extracting \"pager.c\" \(8734 characters\)
sed "s/^X//" >pager.c <<'END_OF_pager.c'
X/* SCCS Id: @(#)pager.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* pager.c - version 1.0.3 */
X
X/* This file contains the command routine dowhatis() and a pager. */
X/* Also readmail() and doshell(), and generally the things that
X contact the outside world. */
X
X#include <stdio.h>
X#include <signal.h>
X#include "hack.h"
Xextern int CO, LI; /* usually COLNO and ROWNO+2 */
Xextern char *CD;
Xextern char quitchars[];
Xextern char *getenv(), *getlogin();
Xint done1();
X
Xdowhatis()
X{
X FILE *fp;
X char bufr[BUFSZ+6];
X register char *buf = &bufr[6], *ep, q;
X extern char readchar();
X
X if(!(fp = fopen(DATAFILE, "r")))
X pline("Cannot open data file!");
X else {
X pline("Specify what? ");
X q = readchar();
X#ifdef DGKMOD
X if (index(quitchars, q))
X return(0);
X#endif
X if(q != '\t')
X while(fgets(buf,BUFSZ,fp))
X if(*buf == q) {
X ep = index(buf, '\n');
X if(ep) *ep = 0;
X /* else: bad data file */
X /* Expand tab 'by hand' */
X if(buf[1] == '\t'){
X buf = bufr;
X buf[0] = q;
X (void) strncpy(buf+1, " ", 7);
X }
X pline(buf);
X if(ep[-1] == ';') {
X pline("More info? ");
X if(readchar() == 'y') {
X page_more(fp,1); /* does fclose() */
X return(0);
X }
X }
X (void) fclose(fp); /* kopper@psuvax1 */
X return(0);
X }
X pline("I've never heard of such things.");
X (void) fclose(fp);
X }
X return(0);
X}
X
X/* make the paging of a file interruptible */
Xstatic int got_intrup;
X
Xintruph(){
X got_intrup++;
X}
X
X/* simple pager, also used from dohelp() */
Xpage_more(fp,strip)
XFILE *fp;
Xint strip; /* nr of chars to be stripped from each line (0 or 1) */
X{
X register char *bufr, *ep;
X#ifdef DGK
X /* There seems to be a bug in ANSI.SYS The first tab character
X * after a clear screen sequence is not expanded correctly. Thus
X * expand the tabs by hand -dgk
X */
X int tabstop = 8, spaces;
X char buf[BUFSIZ], *bufp, *bufrp;
X
X set_pager(0);
X bufr = (char *) alloc((unsigned) CO);
X while (fgets(buf, BUFSIZ, fp) && (!strip || *buf == '\t')){
X bufp = buf;
X bufrp = bufr;
X while (*bufp && *bufp != '\n') {
X if (*bufp == '\t') {
X spaces = tabstop - (bufrp - bufr) % tabstop;
X while (spaces--)
X *bufrp++ = ' ';
X bufp++;
X } else
X *bufrp++ = *bufp++;
X }
X *bufrp = '\0';
X#else
X int (*prevsig)() = signal(SIGINT, intruph);
X
X set_pager(0);
X bufr = (char *) alloc((unsigned) CO);
X bufr[CO-1] = 0;
X while(fgets(bufr,CO-1,fp) && (!strip || *bufr == '\t')){
X ep = index(bufr, '\n');
X if(ep)
X *ep = 0;
X#endif /* DGK /**/
X if(page_line(bufr+strip)) {
X set_pager(2);
X goto ret;
X }
X }
X set_pager(1);
Xret:
X free(bufr);
X (void) fclose(fp);
X#ifndef DGK
X (void) signal(SIGINT, prevsig);
X got_intrup = 0;
X#endif
X}
X
Xstatic boolean whole_screen = TRUE;
X#define PAGMIN 12 /* minimum # of lines for page below level map */
X
Xset_whole_screen() { /* called in termcap as soon as LI is known */
X whole_screen = (LI-ROWNO-2 <= PAGMIN || !CD);
X}
X
X#ifdef NEWS
Xreadnews() {
X register int ret;
X
X whole_screen = TRUE; /* force a docrt(), our first */
X ret = page_file(NEWS, TRUE);
X set_whole_screen();
X return(ret); /* report whether we did docrt() */
X}
X#endif
X
Xset_pager(mode)
Xregister int mode; /* 0: open 1: wait+close 2: close */
X{
X static boolean so;
X if(mode == 0) {
X if(!whole_screen) {
X /* clear topline */
X clrlin();
X /* use part of screen below level map */
X curs(1, ROWNO+4);
X } else {
X cls();
X }
X so = flags.standout;
X flags.standout = 1;
X } else {
X if(mode == 1) {
X curs(1, LI);
X more();
X }
X flags.standout = so;
X if(whole_screen)
X docrt();
X else {
X curs(1, ROWNO+4);
X cl_eos();
X }
X }
X}
X
Xpage_line(s) /* returns 1 if we should quit */
Xregister char *s;
X{
X extern char morc;
X
X if(cury == LI-1) {
X if(!*s)
X return(0); /* suppress blank lines at top */
X putchar('\n');
X cury++;
X cmore("q\033");
X if(morc) {
X morc = 0;
X return(1);
X }
X if(whole_screen)
X cls();
X else {
X curs(1, ROWNO+4);
X cl_eos();
X }
X }
X puts(s);
X cury++;
X return(0);
X}
X
X/*
X * Flexible pager: feed it with a number of lines and it will decide
X * whether these should be fed to the pager above, or displayed in a
X * corner.
X * Call:
X * cornline(0, title or 0) : initialize
X * cornline(1, text) : add text to the chain of texts
X * cornline(2, morcs) : output everything and cleanup
X * cornline(3, 0) : cleanup
X */
X
Xcornline(mode, text)
Xint mode;
Xchar *text;
X{
X static struct line {
X struct line *next_line;
X char *line_text;
X } *texthead, *texttail;
X static int maxlen;
X static int linect;
X register struct line *tl;
X
X if(mode == 0) {
X texthead = 0;
X maxlen = 0;
X linect = 0;
X if(text) {
X cornline(1, text); /* title */
X cornline(1, ""); /* blank line */
X }
X return;
X }
X
X if(mode == 1) {
X register int len;
X
X if(!text) return; /* superfluous, just to be sure */
X linect++;
X len = strlen(text);
X if(len > maxlen)
X maxlen = len;
X tl = (struct line *)
X alloc((unsigned)(len + sizeof(struct line) + 1));
X tl->next_line = 0;
X tl->line_text = (char *)(tl + 1);
X (void) strcpy(tl->line_text, text);
X if(!texthead)
X texthead = tl;
X else
X texttail->next_line = tl;
X texttail = tl;
X return;
X }
X
X /* --- now we really do it --- */
X if(mode == 2 && linect == 1) /* topline only */
X pline(texthead->line_text);
X else
X if(mode == 2) {
X register int curline, lth;
X
X if(flags.toplin == 1) more(); /* ab@unido */
X remember_topl();
X
X lth = CO - maxlen - 2; /* Use full screen width */
X if (linect < LI && lth >= 10) { /* in a corner */
X home ();
X cl_end ();
X flags.toplin = 0;
X curline = 1;
X for (tl = texthead; tl; tl = tl->next_line) {
X curs (lth, curline);
X if(curline > 1)
X cl_end ();
X putsym(' ');
X putstr (tl->line_text);
X curline++;
X }
X curs (lth, curline);
X cl_end ();
X cmore (text);
X home ();
X cl_end ();
X docorner (lth, curline-1);
X } else { /* feed to pager */
X set_pager(0);
X for (tl = texthead; tl; tl = tl->next_line) {
X if (page_line (tl->line_text)) {
X set_pager(2);
X goto cleanup;
X }
X }
X if(text) {
X cgetret(text);
X set_pager(2);
X } else
X set_pager(1);
X }
X }
X
Xcleanup:
X while(tl = texthead) {
X texthead = tl->next_line;
X free((char *) tl);
X }
X}
X
Xdohelp()
X{
X char c;
X
X pline ("Long or short help? ");
X while (((c = readchar ()) != 'l') && (c != 's') && !index(quitchars,c))
X bell ();
X if (!index(quitchars, c))
X (void) page_file((c == 'l') ? HELP : SHELP, FALSE);
X return(0);
X}
X
Xpage_file(fnam, silent) /* return: 0 - cannot open fnam; 1 - otherwise */
Xregister char *fnam;
Xboolean silent;
X{
X#ifdef DEF_PAGER /* this implies that UNIX is defined */
X {
X /* use external pager; this may give security problems */
X
X register int fd = open(fnam, 0);
X
X if(fd < 0) {
X if(!silent) pline("Cannot open %s.", fnam);
X return(0);
X }
X if(child(1)){
X extern char *catmore;
X
X /* Now that child() does a setuid(getuid()) and a chdir(),
X we may not be able to open file fnam anymore, so make
X it stdin. */
X (void) close(0);
X if(dup(fd)) {
X if(!silent) printf("Cannot open %s as stdin.\n", fnam);
X } else {
X execl(catmore, "page", (char *) 0);
X if(!silent) printf("Cannot exec %s.\n", catmore);
X }
X exit(1);
X }
X (void) close(fd);
X }
X#else
X {
X FILE *f; /* free after Robert Viduya */
X
X if ((f = fopen (fnam, "r")) == (FILE *) 0) {
X if(!silent) {
X home(); perror (fnam); flags.toplin = 1;
X pline ("Cannot open %s.", fnam);
X }
X return(0);
X }
X page_more(f, 0);
X }
X#endif /* DEF_PAGER /**/
X
X return(1);
X}
X
X#ifdef UNIX
X#ifdef SHELL
Xdosh(){
Xregister char *str;
X if(child(0)) {
X if(str = getenv("SHELL"))
X execl(str, str, (char *) 0);
X else
X execl("/bin/sh", "sh", (char *) 0);
X pline("sh: cannot execute.");
X exit(1);
X }
X return(0);
X}
X#endif /* SHELL /**/
X
X#ifdef NOWAITINCLUDE
Xunion wait { /* used only for the cast (union wait *) 0 */
X int w_status;
X struct {
X unsigned short w_Termsig:7;
X unsigned short w_Coredump:1;
X unsigned short w_Retcode:8;
X } w_T;
X};
X
X#else
X
X#ifdef BSD
X#include <sys/wait.h>
X#else
X#include <wait.h>
X#endif
X#endif /* NOWAITINCLUDE /**/
X
Xchild(wt) {
Xregister int f = fork();
X if(f == 0){ /* child */
X settty((char *) 0); /* also calls end_screen() */
X (void) setuid(getuid());
X (void) setgid(getgid());
X#ifdef CHDIR
X (void) chdir(getenv("HOME"));
X#endif
X return(1);
X }
X if(f == -1) { /* cannot fork */
X pline("Fork failed. Try again.");
X return(0);
X }
X /* fork succeeded; wait for child to exit */
X (void) signal(SIGINT,SIG_IGN);
X (void) signal(SIGQUIT,SIG_IGN);
X (void) wait((union wait *) 0);
X gettty();
X setftty();
X (void) signal(SIGINT,done1);
X#ifdef WIZARD
X if(wizard) (void) signal(SIGQUIT,SIG_DFL);
X#endif
X if(wt) getret();
X docrt();
X return(0);
X}
X#endif /* UNIX /**/
END_OF_pager.c
if test 8734 -ne `wc -c <pager.c`; then
echo shar: \"pager.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f prisym.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"prisym.c\"
else
echo shar: Extracting \"prisym.c\" \(7614 characters\)
sed "s/^X//" >prisym.c <<'END_OF_prisym.c'
X/* SCCS Id: @(#)prisym.c 1.3 87/07/14
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* prisym.c - version 1.0 */
X
X#include <stdio.h>
X#include "hack.h"
X
Xextern xchar scrlx, scrhx, scrly, scrhy; /* corners from pri.c */
X
Xatl(x,y,ch)
Xregister x,y;
X{
X register struct rm *crm = &levl[x][y];
X
X if(x<0 || x>COLNO-1 || y<0 || y>ROWNO-1){
X impossible("atl(%d,%d,%c)",x,y,ch);
X return;
X }
X if(crm->seen && crm->scrsym == ch) return;
X crm->scrsym = ch;
X crm->new = 1;
X on_scr(x,y);
X}
X
Xon_scr(x,y)
Xregister x,y;
X{
X if(x < scrlx) scrlx = x;
X if(x > scrhx) scrhx = x;
X if(y < scrly) scrly = y;
X if(y > scrhy) scrhy = y;
X}
X
X/* call: (x,y) - display
X (-1,0) - close (leave last symbol)
X (-1,-1)- close (undo last symbol)
X (-1,let)-open: initialize symbol
X (-2,let)-change let
X*/
X
Xtmp_at(x,y) schar x,y; {
Xstatic schar prevx, prevy;
Xstatic char let;
X if((int)x == -2){ /* change let call */
X let = y;
X return;
X }
X if((int)x == -1 && (int)y >= 0){ /* open or close call */
X let = y;
X prevx = -1;
X return;
X }
X if(prevx >= 0 && cansee(prevx,prevy)) {
X delay_output();
X prl(prevx, prevy); /* in case there was a monster */
X at(prevx, prevy, levl[prevx][prevy].scrsym);
X }
X if(x >= 0){ /* normal call */
X if(cansee(x,y)) at(x,y,let);
X prevx = x;
X prevy = y;
X } else { /* close call */
X let = 0;
X prevx = -1;
X }
X}
X
X/* like the previous, but the symbols are first erased on completion */
XTmp_at(x,y) schar x,y; {
Xstatic char let;
Xstatic xchar cnt;
Xstatic coord tc[COLNO]; /* but watch reflecting beams! */
Xregister xx,yy;
X if((int)x == -1) {
X if(y > 0) { /* open call */
X let = y;
X cnt = 0;
X return;
X }
X /* close call (do not distinguish y==0 and y==-1) */
X while(cnt--) {
X xx = tc[cnt].x;
X yy = tc[cnt].y;
X prl(xx, yy);
X at(xx, yy, levl[xx][yy].scrsym);
X }
X cnt = let = 0; /* superfluous */
X return;
X }
X if((int)x == -2) { /* change let call */
X let = y;
X return;
X }
X /* normal call */
X if(cansee(x,y)) {
X if(cnt) delay_output();
X at(x,y,let);
X tc[cnt].x = x;
X tc[cnt].y = y;
X if(++cnt >= COLNO) panic("Tmp_at overflow?");
X levl[x][y].new = 0; /* prevent pline-nscr erasing --- */
X }
X}
X
Xcurs_on_u(){
X curs(u.ux, u.uy+2);
X}
X
Xpru()
X{
X if(u.udispl && (Invisible || u.udisx != u.ux || u.udisy != u.uy))
X /* if(! levl[u.udisx][u.udisy].new) */
X if(!vism_at(u.udisx, u.udisy))
X newsym(u.udisx, u.udisy);
X if(Invisible) {
X u.udispl = 0;
X prl(u.ux,u.uy);
X } else
X if(!u.udispl || u.udisx != u.ux || u.udisy != u.uy) {
X atl(u.ux, u.uy, u.usym);
X u.udispl = 1;
X u.udisx = u.ux;
X u.udisy = u.uy;
X }
X levl[u.ux][u.uy].seen = 1;
X}
X
X#ifndef NOWORM
X#include "wseg.h"
Xextern struct wseg *m_atseg;
X#endif
X
X/* print a position that is visible for @ */
Xprl(x,y)
X{
X register struct rm *room;
X register struct monst *mtmp;
X register struct obj *otmp;
X register struct trap *ttmp;
X
X if(x == u.ux && y == u.uy && (!Invisible)) {
X pru();
X return;
X }
X if(!isok(x,y)) return;
X room = &levl[x][y];
X if((!room->typ) ||
X (IS_ROCK(room->typ) && levl[u.ux][u.uy].typ == CORR))
X return;
X if((mtmp = m_at(x,y)) && !mtmp->mhide &&
X (!mtmp->minvis || See_invisible)) {
X#ifndef NOWORM
X if(m_atseg)
X pwseg(m_atseg);
X else
X#endif
X pmon(mtmp);
X }
X else if((otmp = o_at(x,y)) && room->typ != POOL)
X atl(x,y,Hallucination ? rndobjsym() : otmp->olet);
X#ifdef SPIDERS
X else if((!mtmp || mtmp->data == PM_SPIDER) &&
X (ttmp = t_at(x,y)) && ttmp->ttyp == WEB)
X atl(x,y,WEB_SYM);
X#endif
X else if(mtmp && (!mtmp->minvis || See_invisible)) {
X /* must be a hiding monster, but not hiding right now */
X /* assume for the moment that long worms do not hide */
X pmon(mtmp);
X }
X else if(g_at(x,y) && room->typ != POOL)
X atl(x,y,Hallucination ? rndobjsym() : '$');
X else if(!room->seen || room->scrsym == ' ') {
X room->new = room->seen = 1;
X newsym(x,y);
X on_scr(x,y);
X }
X room->seen = 1;
X}
X
Xchar
Xnews0(x,y)
Xregister xchar x,y;
X{
X register struct obj *otmp;
X register struct trap *ttmp;
X struct rm *room;
X register char tmp;
X
X room = &levl[x][y];
X if(!room->seen) tmp = ' ';
X else if(room->typ == POOL) tmp = POOL_SYM;
X else if(!Blind && (otmp = o_at(x,y)))
X tmp = Hallucination ? rndobjsym() : otmp->olet;
X else if(!Blind && g_at(x,y))
X tmp = Hallucination ? rndobjsym() : '$';
X else if(x == xupstair && y == yupstair) tmp = '<';
X else if(x == xdnstair && y == ydnstair) tmp = '>';
X#ifdef SPIDERS
X else if((ttmp = t_at(x,y)) && ttmp->ttyp == WEB) tmp = WEB_SYM;
X else if(ttmp && ttmp->tseen) tmp ='^';
X#else
X else if((ttmp = t_at(x,y)) && ttmp->tseen) tmp = '^';
X#endif
X else switch(room->typ) {
X case SCORR:
X case SDOOR:
X tmp = room->scrsym; /* %% wrong after killing mimic ! */
X break;
X#ifdef DGK
X case HWALL:
X tmp = room->scrsym; /* OK for corners only */
X if (!IS_CORNER(tmp))
X tmp = symbol.hwall;
X break;
X case VWALL:
X tmp = symbol.vwall;
X break;
X case LDOOR:
X case DOOR:
X tmp = symbol.door;
X break;
X case CORR:
X tmp = symbol.corr;
X break;
X case ROOM:
X if(room->lit || cansee(x,y) || Blind) tmp = symbol.room;
X else tmp = ' ';
X break;
X#else
X case HWALL:
X tmp = '-';
X break;
X case VWALL:
X tmp = '|';
X break;
X case LDOOR:
X case DOOR:
X tmp = '+';
X break;
X case CORR:
X tmp = CORR_SYM;
X break;
X case ROOM:
X if(room->lit || cansee(x,y) || Blind) tmp = '.';
X else tmp = ' ';
X break;
X#endif
X#ifdef FOUNTAINS
X case FOUNTAIN:
X tmp = FOUNTAIN_SYM;
X break;
X#endif
X#ifdef NEWCLASS
X case THRONE:
X tmp = THRONE_SYM;
X break;
X#endif
X/*
X case POOL:
X tmp = POOL_SYM;
X break;
X*/
X default:
X tmp = ERRCHAR;
X }
X return(tmp);
X}
X
Xnewsym(x,y)
Xregister x,y;
X{
X atl(x,y,news0(x,y));
X}
X
X/* used with wand of digging (or pick-axe): fill scrsym and force display */
X/* also when a POOL evaporates */
Xmnewsym(x,y)
Xregister x,y;
X{
X register struct rm *room;
X char newscrsym;
X
X if(!vism_at(x,y)) {
X room = &levl[x][y];
X newscrsym = news0(x,y);
X if(room->scrsym != newscrsym) {
X room->scrsym = newscrsym;
X room->seen = 0;
X }
X }
X}
X
Xnosee(x,y)
Xregister x,y;
X{
X register struct rm *room;
X
X if(!isok(x,y)) return;
X room = &levl[x][y];
X#ifdef DGK
X if(room->scrsym == symbol.room && !room->lit && !Blind) {
X#else
X if(room->scrsym == '.' && !room->lit && !Blind) {
X#endif
X room->scrsym = ' ';
X room->new = 1;
X on_scr(x,y);
X }
X}
X
X#ifndef QUEST
Xprl1(x,y)
Xregister x,y;
X{
X if(u.dx) {
X if(u.dy) {
X prl(x-(2*u.dx),y);
X prl(x-u.dx,y);
X prl(x,y);
X prl(x,y-u.dy);
X prl(x,y-(2*u.dy));
X } else {
X prl(x,y-1);
X prl(x,y);
X prl(x,y+1);
X }
X } else {
X prl(x-1,y);
X prl(x,y);
X prl(x+1,y);
X }
X}
X
Xnose1(x,y)
Xregister x,y;
X{
X if(u.dx) {
X if(u.dy) {
X nosee(x,u.uy);
X nosee(x,u.uy-u.dy);
X nosee(x,y);
X nosee(u.ux-u.dx,y);
X nosee(u.ux,y);
X } else {
X nosee(x,y-1);
X nosee(x,y);
X nosee(x,y+1);
X }
X } else {
X nosee(x-1,y);
X nosee(x,y);
X nosee(x+1,y);
X }
X}
X#endif /* QUEST /**/
X
Xvism_at(x,y)
Xregister x,y;
X{
X register struct monst *mtmp;
X
X if(x == u.ux && y == u.uy && !Invisible) return(1);
X
X if(mtmp = m_at(x,y)) return((Blind && Telepat) || canseemon(mtmp));
X
X return(0);
X}
X
X#ifdef NEWSCR
Xpobj(obj) register struct obj *obj; {
Xregister int show = (!obj->oinvis || See_invisible) &&
X cansee(obj->ox,obj->oy);
X if(obj->odispl){
X if(obj->odx != obj->ox || obj->ody != obj->oy || !show)
X if(!vism_at(obj->odx,obj->ody)){
X newsym(obj->odx, obj->ody);
X obj->odispl = 0;
X }
X }
X if(show && !vism_at(obj->ox,obj->oy)){
X atl(obj->ox,obj->oy,obj->olet);
X obj->odispl = 1;
X obj->odx = obj->ox;
X obj->ody = obj->oy;
X }
X}
X#endif /* NEWSCR /**/
X
Xunpobj(obj) register struct obj *obj; {
X/* if(obj->odispl){
X if(!vism_at(obj->odx, obj->ody))
X newsym(obj->odx, obj->ody);
X obj->odispl = 0;
X }
X*/
X if(!vism_at(obj->ox,obj->oy))
X newsym(obj->ox,obj->oy);
X}
END_OF_prisym.c
if test 7614 -ne `wc -c <prisym.c`; then
echo shar: \"prisym.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 12 \(of 16\).
cp /dev/null ark12isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 16 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.o: