billr@saab.CNA.TEK.COM (Bill Randle) (07/25/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 7, Issue 78
Archive-name: NetHack3/Part23
#! /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 23 (of 38)."
# Contents: src/Makefile.src src/lock.c src/topten.c src/unixtty.c
# Wrapped by billr@saab on Sun Jul 23 21:33:06 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'src/Makefile.src' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/Makefile.src'\"
else
echo shar: Extracting \"'src/Makefile.src'\" \(15831 characters\)
sed "s/^X//" >'src/Makefile.src' <<'END_OF_FILE'
X# Hack Makefile.
X# SCCS Id: @(#)Makefile.unix 3.0 88/10/17
X
X# This makefile replaces the previous Makefile.unix, Makefile.xenix,
X# Makefile.3B2, Makefile.att, and Makefile.tos.
X# Set SYSTEM to one of:
X# 'Sysunix' -- generic UNIX
X# 'Sysxenix' -- 286 Xenix (386 Xenix can use Sysunix)
X# 'Sys3B2' -- AT&T 3B2, 3B5, etc.
X# 'Sysatt' -- AT&T UNIXPC, 7300, 3B1
X# 'Systos' -- Atari
X# 'SysV-AT' -- Microport 286 UNIX (put -DDUMB in CFLAGS)
XSYSTEM = Sysunix
X
X#
X# Make sure that your bourne shell is specified here, as you have to spawn
X# some of the commands (eg. depend) in bourne shell for them to work.
X#
XSHELL=/bin/sh
X
X# if you are cross-compiling (eg. from Xenix into a Dos enviornment) you will
X# have to redefine this filename prefix (which is used to select the filenames
X# *main.c, *tty.c, and *unix.c for the target environment)
X#
X# possible values are 'unix' and 'pc'
X# Systos wants 'pc'; everything else normally wants 'unix'
XTARG = unix
X
X# flags may have to be changed as required
X# flags for 286 Xenix:
X# CFLAGS = -O -Gt24 -LARGE -Ml -I../include
X# LFLAGS = -Ml
X# flags for 286 Microport SysV-AT
X# CFLAGS = -DDUMB -Ml -I../include
X# LFLAGS = -Ml
X# flags for debugging:
X# CFLAGS = -g -I../include
X
XCFLAGS = -O -I../include
XLFLAGS =
X
X# object files for makedefs
XMAKEOBJS = makedefs.o monst.o objects.o panic.o
X# objects files for makedefs for 286 Xenix
X# MAKEOBJS = Smakedefs.o Smonst.o Sobjects.o Spanic.o
X
X# object files for special levels compiler
XSPLEVOBJS = lev_comp.o lev_lex.o lev_main.o alloc.o monst.o objects.o panic.o
X# object files for special levels compiler for 286 Xenix
X# SPLEVOBJS = Slev_comp.o Slev_lex.o Slev_main.o Salloc.o Smonst.o Sobjects.o \
X# Spanic.o
X
X# on some systems the termcap library is in -ltermcap or -lcurses
X# Sysatt uses shared library in lieu of this option
X# TERMLIB = -ltermcap
X# TERMLIB = -lcurses
XTERMLIB = -ltermlib
X
X# yacc/lex programs to use to generate lev_comp.c, lev_comp.h, and lev_lex.c.
X# if, instead of yacc/lex you have bison/flex, comment/uncomment the following.
XYACC = yacc
XLEX = lex
X#YACC = bison
X#LEX = flex
X
X# make NetHack
XGAME = nethack
X
X# if you defined RANDOM in unixconf.h/pcconf.h since your system did not come
X# with a reasonable random number generator -- also remember to get random.c
X# into the src directory
X# RANDOBJ = random.o
XRANDOBJ =
X
X# nothing below this line should have to be changed
X#
X# other things that have to be reconfigured are in config.h,
X# {unixconf.h, pcconf.h, tosconf.h}, and possibly system.h
X
XHACKCSRC = alloc.c apply.c artifact.c attrib.c bones.c cmd.c dbridge.c decl.c\
X demon.c do.c do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c\
X eat.c end.c engrave.c exper.c extralev.c fountain.c getline.c hack.c\
X invent.c ioctl.c lock.c mail.c makemon.c mcastu.c mhitm.c mhitu.c\
X mklev.c mkmaze.c mkobj.c mkroom.c mon.c mondata.c monmove.c monst.c\
X mthrowu.c music.c o_init.c objects.c objnam.c options.c pager.c\
X pickup.c polyself.c potion.c pray.c pri.c priest.c prisym.c read.c\
X restore.c rip.c rnd.c rumors.c save.c search.c shk.c shknam.c sit.c\
X sounds.c sp_lev.c spell.c steal.c termcap.c timeout.c topl.c topten.c\
X track.c trap.c u_init.c uhitm.c vault.c version.c weapon.c were.c\
X wield.c wizard.c worm.c worn.c write.c zap.c
X
X# all .c files but msdos.c, tos.c, *main.c, *tty.c, *unix.c, (system specific)
X# and makedefs.c, lev_comp.c, panic.c (not part of any nethack)
X
XCSOURCES = $(HACKCSRC) $(TARG)main.c $(TARG)main.c $(TARG)main.c makedefs.c panic.c
X
XHACKINCL = artifact.h attrib.h config.h coord.h decl.h edog.h epri.h eshk.h\
X extern.h flag.h func_tab.h global.h gold.h hack.h lev.h mfndpos.h\
X mkroom.h monattk.h mondata.h monflag.h monst.h monsym.h msdos.h\
X obj.h objclass.h permonst.h prop.h rm.h sp_lev.h spell.h tradstdc.h\
X trapname.h vault.h wseg.h you.h youprop.h
X
X# all .h files except date.h, onames.h, pm.h & trap.h which would cause
X# dependency loops if run through "make depend".
X
XHSOURCES = $(HACKINCL) date.h onames.h pm.h trap.h
X
XSOURCES = $(CSOURCES) $(HSOURCES)
X
XHOBJ = alloc.o apply.o artifact.o attrib.o bones.o cmd.o dbridge.o decl.o\
X demon.o do.o do_name.o do_wear.o dog.o dogmove.o dokick.o dothrow.o\
X eat.o end.o engrave.o exper.o extralev.o fountain.o getline.o hack.o\
X invent.o ioctl.o lock.o mail.o main.o makemon.o mcastu.o mhitm.o\
X mhitu.o mklev.o mkmaze.o mkobj.o mkroom.o mon.o mondata.o monmove.o\
X monst.o mthrowu.o music.o o_init.o objects.o objnam.o options.o pager.o\
X pickup.o polyself.o potion.o pray.o pri.o priest.o prisym.o read.o\
X restore.o rip.o rnd.o rumors.o save.o search.o shk.o shknam.o sit.o\
X sounds.o sp_lev.o spell.o steal.o termcap.o timeout.o topl.o topten.o\
X track.o trap.o tty.o u_init.o uhitm.o unix.o vault.o version.o\
X weapon.o were.o wield.o wizard.o worm.o worn.o write.o zap.o $(RANDOBJ)
X
X# the .o files from the HACKCSRC list, plus main.o tty.o unix.o
X
X$(GAME): $(SYSTEM)
X @echo "$(GAME) is up to date."
X
XSysunix: $(HOBJ) Makefile
X @echo "Loading ..."
X @$(CC) $(LFLAGS) -o $(GAME) $(HOBJ) $(TERMLIB)
X @touch Sysunix
X
XSysxenix: $(HOBJ) Makefile
X @echo "Loading ..."
X @$(CC) $(LFLAGS) -m hack.map -o $(GAME) /lib/Lsignal.o $(HOBJ) $(TERMLIB) -SEG#256
X @touch Sysxenix
X
XSys3B2: $(HOBJ) Makefile
X @echo "Loading ..."
X @$(CC) $(LFLAGS) -o $(GAME) $(HOBJ) $(TERMLIB) -lmalloc
X @touch Sys3B2
X
XSysatt: $(HOBJ) Makefile
X @echo "Loading ..."
X @$(LD) $(LFLAGS) /lib/crt0s.o /lib/shlib.ifile -o $(GAME) $(HOBJ)
X @touch Sysatt
X
XSystos: $(HOBJ) tos.o Makefile
X @echo "Loading ..."
X @$(CC) $(LFLAGS) -o $(GAME) $(HOBJ) tos.o $(TERMLIB)
X @touch Systos
X
XSysV-AT: DUMB.Setup $(HOBJ) Makefile
X @echo "Loading ..."
X @$(CC) $(LFLAGS) -o $(GAME) $(HOBJ) $(TERMLIB)
X @touch SysV-AT
X
XDUMB.Setup: ../include/extern.h
X cp ../include/extern.h ../include/extern.h.BAK
X cat ../include/extern.h | \
X sed -e '/^E\ int\ /!b' \
X -e '/[^;/ ]$$/N' \
X -e '/[(][*]occupation[)]/b' \
X -e '/[(][*]afternmv[)]/b' \
X -e '/float_down/b' \
X -e '/done1/b' \
X -e '/identify/b' \
X -e '/Hear_again/b' \
X -e '/hangup/b' \
X -e 's/^\(.*\)$$/\/\* \1 \/\*\*\//' | \
X sed -e '/^E\ void\ /!b' \
X -e '/[^;/ ]$$/N' \
X -e 's/^\(.*\)$$/\/\* \1 \/\*\*\//' \
X >../include/extern.DUMB
X cp ../include/extern.DUMB ../include/extern.h
X @touch DUMB.Setup
X
Xall: $(GAME)
X
X#
X# Please note: The dependency lines for the modules here are
X# deliberately incorrect. Including "hack.h" in
X# the dependency list would cause a dependency
X# loop.
X#
Xmakedefs: $(MAKEOBJS)
X $(CC) $(LFLAGS) -o makedefs $(MAKEOBJS)
X
Xmakedefs.o: ../include/config.h ../include/permonst.h
X
Xlev_comp: $(SPLEVOBJS)
X $(CC) $(LFLAGS) -o lev_comp $(SPLEVOBJS)
X
Xlev_comp.o: ../include/hack.h ../include/sp_lev.h
X
Xlev_lex.o: ../include/lev_comp.h ../include/hack.h ../include/sp_lev.h
X
Xlev_main.o: ../include/hack.h ../include/sp_lev.h
X
X../include/lev_comp.h: lev_comp.c
X
Xlev_comp.c: lev_comp.y
X $(YACC) -d lev_comp.y
X mv y.tab.c lev_comp.c
X mv y.tab.h ../include/lev_comp.h
X
Xlev_lex.c: lev_comp.l
X $(LEX) lev_comp.l
X mv lex.yy.c lev_lex.c
X
X# special stuff for 286 Xenix makedefs & lev_comp
X
XSmakedefs.o: makedefs.c ../include/config.h ../include/permonst.h
X cp makedefs.c Smakedefs.c
X $(CC) -O -c Smakedefs.c
X
XSlev_comp.o: lev_comp.c ../include/hack.h ../include/sp_lev.h
X cp lev_comp.c Slev_comp.c
X $(CC) -O -c Slev_comp.c
X
XSlev_lex.o: lev_lex.c ../include/hack.h ../include/sp_lev.h ../include/lev_comp.h
X cp lev_lex.c Slev_lex.c
X $(CC) -O -c Slev_lex.c
X
XSlev_main.o: lev_main.c ../include/hack.h ../include/sp_lev.h
X cp lev_main.c Slev_main.c
X $(CC) -O -c Slev_main.c
X
XSalloc.o: alloc.c
X cp alloc.c Salloc.c
X $(CC) -O -c Salloc.c
X
XSmonst.o: monst.c ../include/config.h ../include/permonst.h \
X ../include/monsym.h ../include/epri.h ../include/eshk.h \
X ../include/vault.h
X cp monst.c Smonst.c
X $(CC) -O -c Smonst.c
X
XSobjects.o: objects.c ../include/config.h ../include/obj.h \
X ../include/objclass.h ../include/prop.h
X cp objects.c Sobjects.c
X $(CC) -O -c Sobjects.c
X
XSpanic.o: panic.c
X cp panic.c Spanic.c
X $(CC) -O -c Spanic.c
X
X#
X# The following include files depend on makedefs to be created.
X# As a result, they are not defined in HACKINCL, instead, their
X# dependencies are explicitly outlined here.
X#
X
X#
X# date.h should be remade any time any of the source or include code
X# is modified. Unfortunately, this would make the contents of this
X# file far more complex. Since "hack.h" depends on most of the include
X# files, we kludge around this by making date.h dependent on hack.h,
X# even though it doesn't include this file.
X#
X../include/date.h: $(CSOURCES) ../include/hack.h makedefs
X ./makedefs -v
X
X../include/trap.h: ../include/config.h makedefs
X ./makedefs -t
X
X../include/onames.h: makedefs
X ./makedefs -o
X
X../include/pm.h: makedefs
X ./makedefs -p
X
X#
X# The following programs vary depending on what OS you are using.
X# As a result, they are not defined in HACKSRC, and their dependancies
X# are explicitly outlined here.
X#
Xmain.o: ../include/hack.h $(TARG)main.c
X $(CC) $(CFLAGS) -c $(TARG)main.c
X mv $(TARG)main.o main.o
X
Xtty.o: ../include/hack.h $(TARG)tty.c
X $(CC) $(CFLAGS) -c $(TARG)tty.c
X mv $(TARG)tty.o tty.o
X
Xunix.o: ../include/hack.h $(TARG)unix.c
X $(CC) $(CFLAGS) -c $(TARG)unix.c
X mv $(TARG)unix.o unix.o
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 -I../include -DLINT $(HACKCSRC) $(TARG)main.c $(TARG)tty.c $(TARG)unix.c | sed '/_flsbuf/d'
X
X
Xdiff:
X @- for i in $(SOURCES) ; do \
X cmp -s $$i $D/$$i || \
X ( echo diff $D/$$i $$i ; diff $D/$$i $$i ; echo ) ; done
X
Xtags: $(CSOURCES)
X @echo ctags -tw ...
X @ctags -tw $(CSOURCES)
X @( cd ../include ; ctags -tw $(HSOURCES) )
X
Xclean:
X rm -f *.o
X
Xspotless: clean
X rm -f a.out core $(GAME) lev_comp makedefs
X rm -f ../include/onames.h ../include/pm.h
X touch ../include/onames.h ../include/pm.h
X touch makedefs.c
X#(make sure files exist and have timestamps in the right order for next compile)
X
X
Xdepend:
X# For the moment we are lazy and disregard /usr/include files because
X# the sources contain them conditionally. Perhaps we should use cpp.
X# ( /bin/grep '^#[ ]*include' $$i | sed -n \
X# -e 's,<\(.*\)>,"/usr/include/\1",' \
X#
X#
X for i in ${HACKCSRC}; do \
X ( /bin/grep '^#[ ]*include[ ]*"' $$i | sed -n \
X -e 's/[^"]*"\([^"]*\)".*/\1/' \
X -e 's/.*\.h/..\/include\/&/' \
X -e H -e '$$g' -e '$$s/\n/ /g' \
X -e '$$s/.*/'$$i': &/' -e '$$s/\.c:/.o:/p' \
X >> makedep); done
X for i in ${HACKINCL}; do \
X ( /bin/grep '^#[ ]*include[ ]*"' ../include/$$i | sed -n \
X -e 's/[^"]*"\([^"]*\)".*/\1/' \
X -e 's/.*\.h/..\/include\/&/' \
X -e H -e '$$g' -e '$$s/\n/ /g' \
X -e '$$s/.*/..\/include\/'$$i': &\
X touch ..\/include\/'$$i/p \
X >> makedep); done
X @echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep
X @echo '$$r makedep' >>eddep
X @echo 'w' >>eddep
X @cp Makefile Makefile.bak
X ed - Makefile < eddep
X @rm -f eddep makedep
X @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile
X @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile
X @echo '# see make depend above' >> Makefile
X - diff Makefile Makefile.bak
X @rm -f Makefile.bak
X
X# PC dependency for Systos that won't be made on a UNIX system
Xtos.o: ../include/hack.h ../include/osbind.h
X
X# DO NOT DELETE THIS LINE
X
Xalloc.o: ../include/config.h
Xapply.o: ../include/hack.h ../include/edog.h
Xartifact.o: ../include/hack.h ../include/artifact.h
Xattrib.o: ../include/hack.h
Xbones.o: ../include/hack.h
Xcmd.o: ../include/hack.h ../include/func_tab.h
Xdbridge.o: ../include/hack.h
Xdecl.o: ../include/hack.h
Xdemon.o: ../include/hack.h
Xdo.o: ../include/hack.h
Xdo_name.o: ../include/hack.h
Xdo_wear.o: ../include/hack.h
Xdog.o: ../include/hack.h ../include/edog.h
Xdogmove.o: ../include/hack.h ../include/mfndpos.h ../include/edog.h
Xdokick.o: ../include/hack.h ../include/eshk.h
Xdothrow.o: ../include/hack.h
Xeat.o: ../include/hack.h
Xend.o: ../include/hack.h ../include/eshk.h
Xengrave.o: ../include/hack.h
Xexper.o: ../include/hack.h
Xextralev.o: ../include/hack.h
Xfountain.o: ../include/hack.h
Xgetline.o: ../include/hack.h ../include/func_tab.h
Xhack.o: ../include/hack.h
Xinvent.o: ../include/hack.h ../include/lev.h ../include/wseg.h
Xioctl.o: ../include/hack.h
Xlock.o: ../include/hack.h
Xmail.o: ../include/hack.h
Xmakemon.o: ../include/hack.h
Xmcastu.o: ../include/hack.h
Xmhitm.o: ../include/hack.h ../include/artifact.h
Xmhitu.o: ../include/hack.h ../include/artifact.h ../include/edog.h
Xmklev.o: ../include/hack.h
Xmkmaze.o: ../include/hack.h
Xmkobj.o: ../include/hack.h
Xmkroom.o: ../include/hack.h
Xmon.o: ../include/hack.h ../include/mfndpos.h ../include/artifact.h
Xmondata.o: ../include/hack.h ../include/eshk.h ../include/epri.h
Xmonmove.o: ../include/hack.h ../include/mfndpos.h ../include/artifact.h
Xmonst.o: ../include/config.h ../include/permonst.h ../include/monsym.h ../include/eshk.h ../include/vault.h ../include/epri.h
Xmthrowu.o: ../include/hack.h
Xmusic.o: ../include/hack.h
Xo_init.o: ../include/hack.h
Xobjects.o: ../include/config.h ../include/obj.h ../include/objclass.h ../include/prop.h
Xobjnam.o: ../include/hack.h
Xoptions.o: ../include/hack.h
Xpager.o: ../include/hack.h
Xpickup.o: ../include/hack.h
Xpolyself.o: ../include/hack.h
Xpotion.o: ../include/hack.h
Xpray.o: ../include/hack.h
Xpri.o: ../include/hack.h
Xpriest.o: ../include/hack.h ../include/mfndpos.h ../include/eshk.h ../include/epri.h
Xprisym.o: ../include/hack.h ../include/wseg.h ../include/lev.h
Xread.o: ../include/hack.h
Xrestore.o: ../include/hack.h ../include/lev.h ../include/wseg.h
Xrip.o: ../include/hack.h
Xrnd.o: ../include/hack.h
Xrumors.o: ../include/hack.h
Xsave.o: ../include/hack.h ../include/lev.h ../include/wseg.h
Xsearch.o: ../include/hack.h ../include/artifact.h
Xshk.o: ../include/hack.h ../include/eshk.h
Xshknam.o: ../include/hack.h ../include/eshk.h
Xsit.o: ../include/hack.h
Xsounds.o: ../include/hack.h ../include/edog.h ../include/eshk.h
Xsp_lev.o: ../include/hack.h ../include/sp_lev.h
Xspell.o: ../include/hack.h
Xsteal.o: ../include/hack.h
Xtermcap.o: ../include/hack.h
Xtimeout.o: ../include/hack.h
Xtopl.o: ../include/hack.h
Xtopten.o: ../include/hack.h
Xtrack.o: ../include/hack.h
Xtrap.o: ../include/hack.h ../include/edog.h ../include/trapname.h
Xu_init.o: ../include/hack.h
Xuhitm.o: ../include/hack.h ../include/artifact.h
Xvault.o: ../include/hack.h ../include/vault.h
Xversion.o: ../include/hack.h ../include/date.h
Xweapon.o: ../include/hack.h
Xwere.o: ../include/hack.h
Xwield.o: ../include/hack.h
Xwizard.o: ../include/hack.h
Xworm.o: ../include/hack.h ../include/wseg.h
Xworn.o: ../include/hack.h
Xwrite.o: ../include/hack.h
Xzap.o: ../include/hack.h
X../include/config.h: ../include/tradstdc.h ../include/global.h
X touch ../include/config.h
X../include/decl.h: ../include/spell.h ../include/obj.h ../include/you.h ../include/onames.h ../include/pm.h
X touch ../include/decl.h
X../include/global.h: ../include/coord.h ../include/unixconf.h ../include/pcconf.h ../include/tosconf.h ../include/amiconf.h
X touch ../include/global.h
X../include/hack.h: ../include/config.h ../include/decl.h ../include/monsym.h ../include/mkroom.h ../include/objclass.h ../include/gold.h ../include/trap.h ../include/flag.h ../include/rm.h
X touch ../include/hack.h
X../include/permonst.h: ../include/monattk.h ../include/monflag.h
X touch ../include/permonst.h
X../include/you.h: ../include/attrib.h ../include/monst.h ../include/youprop.h
X touch ../include/you.h
X../include/youprop.h: ../include/prop.h ../include/permonst.h ../include/mondata.h ../include/pm.h
X touch ../include/youprop.h
X# DEPENDENCIES MUST END AT END OF FILE
X# IF YOU PUT STUFF HERE IT WILL GO AWAY
X# see make depend above
END_OF_FILE
if test 15831 -ne `wc -c <'src/Makefile.src'`; then
echo shar: \"'src/Makefile.src'\" unpacked with wrong size!
fi
# end of 'src/Makefile.src'
fi
if test -f 'src/lock.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/lock.c'\"
else
echo shar: Extracting \"'src/lock.c'\" \(15150 characters\)
sed "s/^X//" >'src/lock.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)lock.c 3.0 88/10/22
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "hack.h"
X
Xstatic struct {
X int door_or_box, picktyp;
X struct rm *door;
X struct obj *box;
X int chance, usedtime;
X} xlock;
X
Xstatic
Xint
Xpicklock() { /* try to open/close a lock */
X
X if(!xlock.door_or_box) { /* box */
X
X if((xlock.box->ox != u.ux) || (xlock.box->oy != u.uy)) {
X return((xlock.usedtime = 0)); /* you or it moved */
X }
X } else { /* door */
X if(xlock.door != &(levl[u.ux+u.dx][u.uy+u.dy])) {
X return((xlock.usedtime = 0)); /* you moved */
X }
X switch (xlock.door->doormask) {
X case D_NODOOR:
X pline("This doorway has no door.");
X return((xlock.usedtime = 0));
X case D_ISOPEN:
X pline("Picking the lock of an open door is pointless.");
X return((xlock.usedtime = 0));
X case D_BROKEN:
X pline("This door is broken.");
X return((xlock.usedtime = 0));
X }
X }
X
X if(xlock.usedtime++ >= 50
X#ifdef POLYSELF
X || nohands(uasmon)
X#endif
X ) {
X You("give up your attempt to %s the lock.",
X (xlock.door_or_box ? !(xlock.door->doormask & D_LOCKED) :
X !xlock.box->olocked) ? "lock" :
X ((xlock.picktyp == LOCK_PICK) ? "pick" : "open" ));
X
X return((xlock.usedtime = 0));
X }
X
X if(rn2(100) > xlock.chance) return(1); /* still busy */
X
X if(xlock.door_or_box) {
X You("succeed in %sing the lock.",
X !(xlock.door->doormask & D_LOCKED) ? "lock" :
X ((xlock.picktyp == LOCK_PICK) ? "pick" : "open" ));
X if(xlock.door->doormask & D_TRAPPED) {
X b_trapped("door");
X xlock.door->doormask = D_NODOOR;
X } else if(xlock.door->doormask == D_LOCKED)
X xlock.door->doormask = D_CLOSED;
X else xlock.door->doormask = D_LOCKED;
X } else {
X You("succeed in %sing the lock.",
X (!xlock.box->olocked) ? "lock" :
X (xlock.picktyp == LOCK_PICK) ? "pick" : "open" );
X xlock.box->olocked = !xlock.box->olocked;
X if(xlock.box->otrapped) chest_trap(xlock.box, FINGER);
X }
X return((xlock.usedtime = 0));
X}
X
Xstatic
Xint
Xforcelock() { /* try to force a locked chest */
X
X register struct obj *otmp, *otmp2;
X register struct obj *probj = fcobj; /* initialize to make lint happy */
X
X if((xlock.box->ox != u.ux) || (xlock.box->oy != u.uy))
X return((xlock.usedtime = 0)); /* you or it moved */
X
X if(xlock.usedtime++ >= 50 || !uwep
X#ifdef POLYSELF
X || nohands(uasmon)
X#endif
X ) {
X You("give up your attempt to force the lock.");
X
X return((xlock.usedtime = 0));
X }
X
X if(xlock.picktyp) { /* blade */
X
X if(rn2(1000-uwep->spe) > 992 && !uwep->cursed) {
X /* for a +0 weapon, probability that it survives an unsuccessful
X * attempt to force the lock is (.992)^50 = .67
X */
X pline("%sour %s broke!",
X (uwep->quan > 1) ? "One of y" : "Y", xname(uwep));
X useup(uwep);
X You("give up your attempt to force the lock.");
X return((xlock.usedtime = 0));
X }
X } else /* blunt */
X wake_nearby(); /* due to hammering on the container */
X
X if(rn2(100) > xlock.chance) return(1); /* still busy */
X
X You("succeed in forcing the lock.");
X xlock.box->olocked = !xlock.box->olocked;
X if(!xlock.picktyp && !rn2(3)) {
X
X pline("In fact, you've totally destroyed the %s.",
X xname(xlock.box));
X for(otmp = fcobj; otmp; otmp = otmp2) {
X
X otmp2 = otmp->nobj;
X if(otmp->cobj == xlock.box) {
X
X /* unlink it from the "contained" list */
X if(otmp == fcobj) fcobj = otmp2;
X else probj->nobj = otmp2;
X
X if(!rn2(3) || otmp->olet == POTION_SYM)
X free((genericptr_t) otmp);
X else { /* spill it onto the floor */
X otmp->nobj = xlock.box->nobj;
X xlock.box->nobj = otmp;
X otmp->cobj = (struct obj *)0;
X otmp->ox = u.ux;
X otmp->oy = u.uy;
X levl[u.ux][u.uy].omask = 1;
X stackobj(otmp);
X }
X } else probj = otmp;
X }
X delobj(xlock.box);
X }
X return((xlock.usedtime = 0));
X}
X
Xint
Xpick_lock(pick) /* pick a lock with a given object */
X register struct obj *pick;
X{
X register int x, y, picktyp, c, ch;
X register struct rm *door;
X register struct obj *otmp;
X
X picktyp = pick->otyp;
X if(xlock.usedtime && picktyp == xlock.picktyp) {
X
X You("resume your attempt to %s the lock.",
X (xlock.door_or_box ? !(xlock.door->doormask & D_LOCKED) :
X !xlock.box->olocked) ? "lock" :
X ((xlock.picktyp == LOCK_PICK) ? "pick" : "open" ));
X
X set_occupation(picklock,
X (picktyp == LOCK_PICK) ? "picking the lock" :
X "opening the lock", 0);
X return(1);
X }
X
X#ifdef POLYSELF
X if(nohands(uasmon)) {
X You("can't hold a %s - you have no hands!");
X return(0);
X }
X#endif
X if((picktyp != LOCK_PICK && picktyp != CREDIT_CARD &&
X picktyp != SKELETON_KEY && picktyp != KEY)) {
X impossible("picking lock with object %d?", picktyp);
X return(0);
X }
X if(!getdir(1)) return(0);
X
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X if((x == u.ux) && (y == u.uy)) { /* pick the lock on a container */
X c = 'n'; /* in case there are no boxes here */
X if(levl[x][y].omask)
X for(otmp = fobj; otmp; otmp = otmp->nobj)
X if((otmp->ox == x) && (otmp->oy == y))
X if(Is_box(otmp)) {
X pline("There is %s here, %s the lock? ",
X doname(otmp), (!otmp->olocked) ? "close" :
X ((picktyp == LOCK_PICK) ? "pick" : "open" ));
X
X c = ynq();
X if(c == 'q') return(0);
X if(c == 'n') continue;
X
X if(picktyp == KEY && otmp->spe != pick->spe) {
X pline("The %s won't fit the lock.",xname(pick));
X return(1);
X }
X switch(picktyp) {
X case CREDIT_CARD:
X ch = ACURR(A_DEX)+(20*(pl_character[0] == 'R'));
X break;
X case LOCK_PICK:
X ch = 4*ACURR(A_DEX)+(25*(pl_character[0] == 'R'));
X break;
X case SKELETON_KEY:
X ch = 75 + ACURR(A_DEX);
X break;
X case KEY:
X ch = 1000;
X break;
X default: ch = 0;
X }
X if(otmp->cursed) ch /= 2;
X
X xlock.door_or_box = 0;
X xlock.picktyp = picktyp;
X xlock.box = otmp;
X break;
X }
X if(c != 'y')
X return(0); /* decided against all boxes */
X } else { /* pick the lock in a door */
X struct monst *mtmp;
X
X door = &levl[x][y];
X if (door->mmask && canseemon(mtmp = m_at(x,y)) && !mtmp->mimic) {
X if (picktyp == CREDIT_CARD &&
X#ifdef ORACLE
X (mtmp->isshk || mtmp->data == &mons[PM_ORACLE]))
X#else
X mtmp->isshk)
X#endif
X pline("\"No checks, no credit, no problem.\"");
X else
X kludge("I don't think %s would appreciate that.", mon_nam(mtmp));
X return(0);
X }
X if(!IS_DOOR(door->typ)) {
X#ifdef STRONGHOLD
X if (is_drawbridge_wall(x,y) >= 0)
X You("%s no lock on the drawbridge.",
X Blind ? "feel" : "see");
X else
X#endif
X You("%s no door there.",
X Blind ? "feel" : "see");
X return(0);
X }
X switch (door->doormask) {
X case D_NODOOR:
X pline("This doorway has no door.");
X return(0);
X case D_ISOPEN:
X pline("Picking the lock of an open door is pointless.");
X return(0);
X case D_BROKEN:
X pline("This door is broken.");
X return(0);
X default:
X pline("%sock it? ", (door->doormask & D_LOCKED) ? "Unl" : "L" );
X
X c = yn();
X if(c == 'n') return(0);
X
X switch(picktyp) {
X case CREDIT_CARD:
X ch = 2*ACURR(A_DEX)+(20*(pl_character[0] == 'R'));
X break;
X case LOCK_PICK:
X ch = 3*ACURR(A_DEX)+(30*(pl_character[0] == 'R'));
X break;
X case SKELETON_KEY:
X ch = 70 + ACURR(A_DEX);
X break;
X case KEY:
X pline("The %s won't fit the door.", xname(pick));
X return(1);
X default: ch = 0;
X }
X xlock.door_or_box = 1;
X xlock.door = door;
X }
X }
X flags.move = 0;
X xlock.chance = ch;
X xlock.picktyp = picktyp;
X xlock.usedtime = 0;
X set_occupation(picklock,
X (picktyp == LOCK_PICK) ? "picking the lock" :
X "opening the lock", 0);
X return(1);
X}
X
Xint
Xdoforce() { /* try to force a chest with your weapon */
X
X register struct obj *otmp;
X register int c, picktyp;
X
X if(!uwep || /* proper type test */
X (uwep->olet != WEAPON_SYM && uwep->olet != ROCK_SYM &&
X uwep->otyp != PICK_AXE) ||
X (uwep->otyp < DAGGER) ||
X (uwep->otyp > VOULGE && uwep->olet != ROCK_SYM &&
X uwep->otyp != PICK_AXE)
X ) {
X You("can't force anything without a %sweapon.",
X (uwep) ? "proper " : "");
X return(0);
X }
X
X picktyp = (uwep->otyp >= DAGGER && uwep->otyp <= KATANA);
X if(xlock.usedtime && xlock.box && picktyp == xlock.picktyp) {
X You("resume your attempt to force the lock.");
X set_occupation(forcelock, "forcing the lock", 0);
X return(1);
X }
X
X /* A lock is made only for the honest man, the thief will break it. */
X xlock.box = (struct obj *)0;
X if(levl[u.ux][u.uy].omask)
X for(otmp = fobj; otmp; otmp = otmp->nobj)
X if((otmp->ox == u.ux) && (otmp->oy == u.uy))
X if(Is_box(otmp)) {
X if(otmp->olocked)
X pline("There is %s here, force the lock? ", doname(otmp));
X else {
X pline("There is a %s here, but it's already unlocked.",
X xname(otmp));
X continue;
X }
X
X c = ynq();
X if(c == 'q') return(0);
X if(c == 'n') continue;
X
X if(picktyp)
X You("force your %s into a crack and pry.", xname(uwep));
X else
X You("start bashing it with your %s.", xname(uwep));
X xlock.box = otmp;
X xlock.chance = objects[otmp->otyp].wldam * 2;
X xlock.picktyp = picktyp;
X xlock.usedtime = 0;
X break;
X }
X
X if(xlock.box) set_occupation(forcelock, "forcing the lock", 0);
X else You("decide not to force the issue.");
X return(1);
X}
X
Xint
Xdoopen() { /* try to open a door */
X register int x, y;
X register struct rm *door;
X
X if(!getdir(1)) return(0);
X
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X if((x == u.ux) && (y == u.uy)) return(0);
X
X door = &levl[x][y];
X
X if(!IS_DOOR(door->typ)) {
X#ifdef STRONGHOLD
X if (is_drawbridge_wall(x,y) >= 0) {
X pline("There is no obvious way to open the drawbridge.");
X return(0);
X }
X#endif
X You("%s no door there.",
X Blind ? "feel" : "see");
X return(0);
X }
X
X if(!(door->doormask & D_CLOSED)) {
X switch(door->doormask) {
X case D_BROKEN: pline("This door is broken."); break;
X case D_NODOOR: pline("This doorway has no door."); break;
X case D_ISOPEN: pline("This door is already open."); break;
X default: pline("This door is locked."); break;
X }
X return(0);
X }
X
X#ifdef POLYSELF
X if(verysmall(uasmon)) {
X pline("You're too small to pull the door open.");
X return(0);
X }
X#endif
X /* door is known to be CLOSED */
X if (rnl(20) < (ACURR(A_STR)+ACURR(A_DEX)+ACURR(A_CON))/3) {
X pline("The door opens.");
X if(door->doormask & D_TRAPPED) {
X b_trapped("door");
X door->doormask = D_NODOOR;
X } else
X door->doormask = D_ISOPEN;
X } else {
X pline("The door resists!");
X }
X
X return(1);
X}
X
Xstatic
Xboolean
Xobstructed(x,y)
Xregister int x, y;
X{
X if(levl[x][y].mmask) {
X if (m_at(x,y)->mimic) goto obj;
X pline("%s stands in the way!", Blind ?
X "Some creature" : Monnam(m_at(x,y)));
X return(TRUE);
X }
X if (levl[x][y].omask || levl[x][y].gmask) {
Xobj:
X pline("Something's in the way.");
X return(TRUE);
X }
X return(FALSE);
X}
X
Xint
Xdoclose() { /* try to close a door */
X register int x, y;
X register struct rm *door;
X
X if(!getdir(1)) return(0);
X
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X if((x == u.ux) && (y == u.uy)) {
X You("are in the way!");
X return(1);
X }
X door = &levl[x][y];
X
X if(!IS_DOOR(door->typ)) {
X#ifdef STRONGHOLD
X if (door->typ == DRAWBRIDGE_DOWN)
X pline("There is no obvious way to close the drawbridge.");
X else
X#endif
X You("%s no door there.",
X Blind ? "feel" : "see");
X return(0);
X }
X
X if(door->doormask == D_NODOOR) {
X pline("This doorway has no door.");
X return(0);
X }
X
X if(obstructed(x, y)) return(0);
X
X if(door->doormask == D_BROKEN) {
X pline("This door is broken.");
X return(0);
X }
X
X if(door->doormask & (D_CLOSED | D_LOCKED)) {
X pline("This door is already closed.");
X return(0);
X }
X
X if(door->doormask == D_ISOPEN) {
X#ifdef POLYSELF
X if(verysmall(uasmon)) {
X pline("You're too small to push the door closed.");
X return(0);
X }
X#endif
X if (rn2(25) < (ACURR(A_STR)+ACURR(A_DEX)+ACURR(A_CON))/3) {
X pline("The door closes.");
X door->doormask = D_CLOSED;
X }
X else pline("The door resists!");
X }
X
X return(1);
X}
X
Xint
Xboxlock(obj, otmp) /* box obj was hit with spell effect otmp */
X /* returns 1 if something happened */
X register struct obj *obj, *otmp; /* obj *is* a box */
X{
X register boolean res;
X
X switch(otmp->otyp) {
X case WAN_LOCKING:
X#ifdef SPELLS
X case SPE_WIZARD_LOCK:
X#endif
X if(!obj->olocked) {
X pline("Klunk!");
X obj->olocked = !(obj->olocked);
X res = 1;
X } else res = 0;
X break;
X case WAN_OPENING:
X#ifdef SPELLS
X case SPE_KNOCK:
X#endif
X if(obj->olocked) {
X pline("Klick!");
X obj->olocked = !(obj->olocked);
X res = 1;
X } else res = 0;
X break;
X }
X return(res);
X}
X
Xint
Xdoorlock(otmp,x,y) /* door was hit with spell effect otmp */
X register struct obj *otmp;
X int x, y;
X{
X register struct rm *door = &levl[x][y];
X boolean res = 1;
X
X if(obstructed(x,y))
X return 0;
X
X if(door->typ == SDOOR) {
X if(otmp->otyp == WAN_OPENING
X#ifdef SPELLS
X || otmp->otyp == SPE_KNOCK
X#endif /* SPELLS /**/
X ) {
X door->typ = DOOR;
X door->doormask = D_CLOSED | (door->doormask & D_TRAPPED);
X if(cansee(x,y)) {
X pline("A section of the wall opens up!");
X newsym(x,y);
X }
X return(1);
X } else
X return(0);
X }
X
X#ifdef STRONGHOLD
X /* make sure it isn't an open drawbridge */
X if (is_maze_lev && find_drawbridge(&x,&y)) {
X if(otmp->otyp == WAN_OPENING
X#ifdef SPELLS
X || otmp->otyp == SPE_KNOCK
X#endif /* SPELLS /**/
X )
X (void) open_drawbridge(x,y);
X else
X (void) close_drawbridge(x,y);
X return 1;
X }
X#endif
X
X switch(otmp->otyp) {
X case WAN_LOCKING:
X#ifdef SPELLS
X case SPE_WIZARD_LOCK:
X#endif
X if (cansee(x,y))
X switch (door->doormask & ~D_TRAPPED) {
X case D_CLOSED:
X pline("The door locks!");
X break;
X case D_ISOPEN:
X pline("The door swings shut, and locks!");
X break;
X case D_BROKEN:
X pline("The broken door reassembles and locks!");
X break;
X case D_NODOOR:
X pline("A cloud of dust springs up and assembles itself into a door!");
X break;
X default: res = 0;
X }
X door->doormask = D_LOCKED | (door->doormask & D_TRAPPED);
X break;
X case WAN_OPENING:
X#ifdef SPELLS
X case SPE_KNOCK:
X#endif
X if(door->doormask & D_LOCKED) {
X door->doormask = D_CLOSED | (door->doormask & D_TRAPPED);
X if(cansee(x,y)) pline("The door unlocks!");
X } else res = 0;
X break;
X default: impossible("magic (%d) attempted on door.", otmp->otyp);
X }
X return res;
X}
X
X#ifdef STUPID_CPP /* otherwise these functions are macros in obj.h */
Xint
XIs_container(otmp) struct obj * otmp; {
X return(otmp->otyp >= ICE_BOX && otmp->otyp <= BAG_OF_TRICKS);
X}
X
Xint
XIs_box(otmp) struct obj * otmp; {
X return(otmp->otyp == LARGE_BOX || otmp->otyp == CHEST);
X}
X
Xint
XIs_mbag(otmp) struct obj * otmp; {
X return(otmp->otyp == BAG_OF_HOLDING || otmp->otyp == BAG_OF_TRICKS);
X}
X
Xint
Xis_sword(otmp) struct obj * otmp; {
X return(otmp->otyp >= SHORT_SWORD && otmp->otyp <= KATANA);
X}
X
Xint
Xbimanual(otmp) struct obj * otmp; {
X return(otmp->olet == WEAPON_SYM && objects[otmp->otyp].oc_bimanual);
X}
X#endif /* STUPID_CPP */
END_OF_FILE
if test 15150 -ne `wc -c <'src/lock.c'`; then
echo shar: \"'src/lock.c'\" unpacked with wrong size!
fi
# end of 'src/lock.c'
fi
if test -f 'src/topten.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/topten.c'\"
else
echo shar: Extracting \"'src/topten.c'\" \(15837 characters\)
sed "s/^X//" >'src/topten.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)topten.c 3.0 88/11/24
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X/* block some unused #defines to avoid overloading some cpp's */
X#define MONATTK_H
X#include "hack.h"
X
X#include <errno.h> /* George Barbanis */
X
Xstatic char *itoa P((int)), *ordin P((int));
Xstatic void outheader();
Xstatic int outentry P((int,struct toptenentry *,int));
X
X#define newttentry() (struct toptenentry *) alloc(sizeof(struct toptenentry))
X#define NAMSZ 10
X#define DTHSZ 60
X#define PERSMAX 3 /* entries per name/uid per char. allowed */
X#define POINTSMIN 1 /* must be > 0 */
X#define ENTRYMAX 100 /* must be >= 10 */
X#ifndef MSDOS
X#define PERS_IS_UID /* delete for PERSMAX per name; now per uid */
X#endif
Xstruct toptenentry {
X struct toptenentry *tt_next;
X long int points;
X int level,maxlvl,hp,maxhp;
X int uid;
X char plchar;
X char sex;
X char name[NAMSZ+1];
X char death[DTHSZ+1];
X char date[7]; /* yymmdd */
X} *tt_head;
X
Xvoid
Xtopten(){
X int uid = getuid();
X int rank, rank0 = -1, rank1 = 0;
X int occ_cnt = PERSMAX;
X register struct toptenentry *t0, *t1, *tprev;
X char *recfile = RECORD;
X#ifdef UNIX
X char *reclock = "record_lock";
X#endif
X int sleepct = 300;
X FILE *rfile;
X register int flg = 0;
X#ifdef LOGFILE
X char *lgfile = LOGFILE;
X FILE *lfile;
X#ifdef UNIX
X char *loglock = "logfile_lock";
X int sleeplgct = 30;
X#endif /* UNIX */
X#endif /* LOGFILE */
X
X#ifdef MSDOS
X#define HUP
X#else
X#define HUP if(!done_hup)
X#endif
X
X#ifdef UNIX
X while(link(recfile, reclock) == -1) {
X HUP perror(reclock);
X if(!sleepct--) {
X HUP (void) puts("I give up. Sorry.");
X HUP (void) puts("Perhaps there is an old record_lock around?");
X return;
X }
X HUP Printf("Waiting for access to record file. (%d)\n",
X sleepct);
X HUP (void) fflush(stdout);
X#if defined(SYSV) || defined(ULTRIX)
X (void)
X#endif
X sleep(1);
X }
X#endif
X if(!(rfile = fopen(recfile,"r"))){
X HUP (void) puts("Cannot open record file!");
X goto unlock;
X }
X HUP (void) putchar('\n');
X
X /* create a new 'topten' entry */
X t0 = newttentry();
X t0->level = dlevel;
X t0->maxlvl = maxdlevel;
X t0->hp = u.uhp;
X t0->maxhp = u.uhpmax;
X t0->points = u.urexp;
X t0->plchar = pl_character[0];
X t0->sex = (flags.female ? 'F' : 'M');
X t0->uid = uid;
X (void) strncpy(t0->name, plname, NAMSZ);
X (t0->name)[NAMSZ] = 0;
X (void) strncpy(t0->death, killer, DTHSZ);
X (t0->death)[DTHSZ] = 0;
X Strcpy(t0->date, getdate());
X
X /* assure minimum number of points */
X if(t0->points < POINTSMIN) t0->points = 0;
X#ifdef LOGFILE /* used for debugging (who dies of what, where) */
X#ifdef UNIX
X while(link(lgfile, loglock) == -1) {
X extern int errno;
X
X if (errno == ENOENT) /* If no such file, do not keep log */
X goto lgend; /* George Barbanis */
X HUP perror(loglock);
X if(!sleeplgct--) {
X HUP (void) puts("I give up. Sorry.");
X HUP (void) puts("Perhaps there is an old logfile_lock around?");
X goto lgend;
X }
X HUP Printf("Waiting for access to log file. (%d)\n",
X sleeplgct);
X HUP (void) fflush(stdout);
X#if defined(SYSV) || defined(ULTRIX)
X (void)
X#endif
X sleep(1);
X }
X#endif /* UNIX */
X if(!(lfile = fopen(lgfile,"a"))){
X HUP (void) puts("Cannot open log file!");
X goto lgend;
X }
X (void) fprintf(lfile,"%6s %d %d %d %d %d %ld %c%c %s,%s\n",
X t0->date, t0->uid,
X t0->level, t0->maxlvl,
X t0->hp, t0->maxhp, t0->points,
X t0->plchar, t0->sex, t0->name, t0->death);
X (void) fclose(lfile);
X#ifdef UNIX
X (void) unlink(loglock);
X#endif /* UNIX */
X lgend:;
X#endif /* LOGFILE */
X
X t1 = tt_head = newttentry();
X tprev = 0;
X /* rank0: -1 undefined, 0 not_on_list, n n_th on list */
X for(rank = 1; ; ) {
X#ifdef TOS
X char k1[2],k2[2];
X if(fscanf(rfile, "%6s %d %d %d %d %d %ld %1s%1s %s %s]",
X#else
X if(fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]",
X#endif
X t1->date, &t1->uid,
X &t1->level, &t1->maxlvl,
X &t1->hp, &t1->maxhp, &t1->points,
X#ifdef TOS
X k1, k2,
X#else
X &t1->plchar, &t1->sex,
X#endif
X t1->name, t1->death) != 11 || t1->points < POINTSMIN)
X t1->points = 0;
X
X#ifdef TOS
X t1->plchar=k1[0];
X t1->sex=k2[0];
X#endif
X if(rank0 < 0 && t1->points < t0->points) {
X rank0 = rank++;
X if(tprev == 0)
X tt_head = t0;
X else
X tprev->tt_next = t0;
X t0->tt_next = t1;
X occ_cnt--;
X flg++; /* ask for a rewrite */
X } else tprev = t1;
X
X if(t1->points == 0) break;
X if(
X#ifdef PERS_IS_UID
X t1->uid == t0->uid &&
X#else
X strncmp(t1->name, t0->name, NAMSZ) == 0 &&
X#endif
X t1->plchar == t0->plchar && --occ_cnt <= 0) {
X if(rank0 < 0) {
X rank0 = 0;
X rank1 = rank;
X HUP Printf("You didn't beat your previous score of %ld points.\n\n",
X t1->points);
X }
X if(occ_cnt < 0) {
X flg++;
X continue;
X }
X }
X if(rank <= ENTRYMAX) {
X t1 = t1->tt_next = newttentry();
X rank++;
X }
X if(rank > ENTRYMAX) {
X t1->points = 0;
X break;
X }
X }
X if(flg) { /* rewrite record file */
X (void) fclose(rfile);
X if(!(rfile = fopen(recfile,"w"))){
X HUP (void) puts("Cannot write record file\n");
X goto unlock;
X }
X
X if(!done_stopprint) if(rank0 > 0){
X if(rank0 <= 10)
X (void) puts("You made the top ten list!\n");
X else
X Printf("You reached the %d%s place on the top %d list.\n\n",
X rank0, ordin(rank0), ENTRYMAX);
X }
X }
X if(rank0 == 0) rank0 = rank1;
X if(rank0 <= 0) rank0 = rank;
X if(!done_stopprint) outheader();
X t1 = tt_head;
X for(rank = 1; t1->points != 0; rank++, t1 = t1->tt_next) {
X if(flg) (void) fprintf(rfile,"%6s %d %d %d %d %d %ld %c%c %s,%s\n",
X t1->date, t1->uid,
X t1->level, t1->maxlvl,
X t1->hp, t1->maxhp, t1->points,
X t1->plchar, t1->sex, t1->name, t1->death);
X if(done_stopprint) continue;
X if(rank > flags.end_top &&
X (rank < rank0-flags.end_around || rank > rank0+flags.end_around)
X && (!flags.end_own ||
X#ifdef PERS_IS_UID
X t1->uid != t0->uid
X#else
X strncmp(t1->name, t0->name, NAMSZ)
X#endif
X )) continue;
X if(rank == rank0-flags.end_around &&
X rank0 > flags.end_top+flags.end_around+1 &&
X !flags.end_own)
X (void) putchar('\n');
X if(rank != rank0)
X (void) outentry(rank, t1, 0);
X else if(!rank1)
X (void) outentry(rank, t1, 1);
X else {
X int t0lth = outentry(0, t0, -1);
X int t1lth = outentry(rank, t1, t0lth);
X if(t1lth > t0lth) t0lth = t1lth;
X (void) outentry(0, t0, t0lth);
X }
X }
X if(rank0 >= rank) if(!done_stopprint)
X (void) outentry(0, t0, 1);
X (void) fclose(rfile);
Xunlock: ;
X#ifdef UNIX
X (void) unlink(reclock);
X#endif
X}
X
Xstatic void
Xoutheader() {
X char linebuf[BUFSZ];
X register char *bp;
X
X Strcpy(linebuf, " No Points Name");
X bp = eos(linebuf);
X while(bp < linebuf + COLNO - 9) *bp++ = ' ';
X Strcpy(bp, "Hp [max]");
X (void) puts(linebuf);
X}
X
X/* so>0: standout line; so=0: ordinary line; so<0: no output, return lth */
Xstatic int
Xoutentry(rank, t1, so)
Xregister struct toptenentry *t1;
Xregister int rank, so;
X{
X register boolean quit = FALSE, iskilled = FALSE, starv = FALSE,
X isstoned = FALSE;
X char linebuf[BUFSZ];
X linebuf[0] = 0;
X if(rank) Sprintf(eos(linebuf), " %2d", rank);
X else Sprintf(eos(linebuf), " ");
X Sprintf(eos(linebuf), " %7ld %.10s", t1->points, t1->name);
X Sprintf(eos(linebuf), "-%c ", t1->plchar);
X if(!strncmp("escaped", t1->death, 7)) {
X if(!strcmp(" (with amulet)", t1->death+7))
X Sprintf(eos(linebuf), "escaped the dungeon with amulet");
X else
X Sprintf(eos(linebuf), "escaped the dungeon [max level %d]",
X t1->maxlvl);
X#ifdef ENDGAME
X } else if(!strncmp("ascended", t1->death, 8)) {
X Sprintf(eos(linebuf), "ascended to demigod-hood");
X#endif
X } else {
X if(!strncmp(t1->death,"quit",4)) {
X quit = TRUE;
X Sprintf(eos(linebuf), "quit");
X } else if(!strcmp(t1->death,"choked"))
X Sprintf(eos(linebuf), "choked on %s food",
X (t1->sex == 'F') ? "her" : "his");
X else if(!strncmp(t1->death,"starv",5)) {
X Sprintf(eos(linebuf), "starved to death");
X starv = TRUE;
X } else if(!strncmp(t1->death, "turned to stone by ",19)) {
X Sprintf(eos(linebuf), "was petrified");
X isstoned = TRUE;
X } else {
X Sprintf(eos(linebuf), "was killed");
X iskilled = TRUE;
X }
X#ifdef ENDLEVEL
X if (t1->level == ENDLEVEL)
X Strcpy(eos(linebuf), " in the endgame");
X else
X#endif
X Sprintf(eos(linebuf), " on%s level %d",
X (iskilled || isstoned || starv) ? "" : " dungeon", t1->level);
X if(t1->maxlvl != t1->level)
X Sprintf(eos(linebuf), " [max %d]", t1->maxlvl);
X if(quit && t1->death[4]) Sprintf(eos(linebuf), t1->death + 4);
X }
X if(iskilled) Sprintf(eos(linebuf), " by %s%s",
X (!strncmp(t1->death, "trick", 5) || !strncmp(t1->death, "the ", 4)
X || !strncmp(t1->death, "Mr. ", 4) || !strncmp(t1->death, "Ms. ", 4)
X ) ? "" :
X index(vowels,*t1->death) ? "an " : "a ",
X t1->death);
X if (isstoned) Sprintf(eos(linebuf), " by %s%s", index(vowels,
X *(t1->death + 19)) ? "an " : "a ", t1->death + 19);
X Sprintf(eos(linebuf), ".");
X if(t1->maxhp) {
X register char *bp = eos(linebuf);
X char hpbuf[10];
X int hppos;
X int lngr = strlen(linebuf);
X Sprintf(hpbuf, (t1->hp > 0) ? itoa(t1->hp) : "-");
X hppos = COLNO - 7 - strlen(hpbuf);
X if (lngr >= hppos) hppos = (2*COLNO) - 7 - strlen(hpbuf);
X if(bp <= linebuf + hppos) {
X /* pad any necessary blanks to the hit point entry */
X while(bp < linebuf + hppos) *bp++ = ' ';
X Strcpy(bp, hpbuf);
X if(t1->maxhp < 10)
X Sprintf(eos(bp), " [%d]", t1->maxhp);
X else if(t1->maxhp < 100)
X Sprintf(eos(bp), " [%d]", t1->maxhp);
X else Sprintf(eos(bp), " [%d]", t1->maxhp);
X }
X }
X if(so == 0) (void) puts(linebuf);
X else if(so > 0) {
X register char *bp = eos(linebuf);
X if(so >= COLNO) so = COLNO-1;
X while(bp < linebuf + so) *bp++ = ' ';
X *bp = 0;
X standoutbeg();
X (void) fputs(linebuf,stdout);
X standoutend();
X (void) putchar('\n');
X }
X return(strlen(linebuf));
X}
X
Xstatic char *
Xitoa(a) int a; {
X#ifdef LINT /* static char buf[12]; */
Xchar buf[12];
X#else
Xstatic char buf[12];
X#endif
X Sprintf(buf,"%d",a);
X return(buf);
X}
X
Xstatic char *
Xordin(n)
Xint n; {
X register int dd = n%10;
X
X#if ENTRYMAX > 110
X return((dd==0 || dd>3 || (n/10)%10==1) ? "th" :
X#else
X return((dd==0 || dd>3 || n/10==1) ? "th" :
X#endif
X (dd==1) ? "st" : (dd==2) ? "nd" : "rd");
X}
X
Xchar *
Xeos(s)
Xregister char *s;
X{
X while(*s) s++;
X return(s);
X}
X
X/*
X * Called with args from main if argc >= 0. In this case, list scores as
X * requested. Otherwise, find scores for the current player (and list them
X * if argc == -1).
X */
Xvoid
Xprscore(argc,argv)
Xint argc;
Xchar **argv;
X{
X char **players;
X int playerct;
X int rank;
X register struct toptenentry *t1, *t2;
X char *recfile = RECORD;
X FILE *rfile;
X register int flg = 0, i;
X#ifdef nonsense
X long total_score = 0L;
X char totchars[10];
X int totcharct = 0;
X#endif
X int outflg = (argc >= -1);
X#ifdef PERS_IS_UID
X int uid = -1;
X#else
X char *player0;
X#endif
X
X if(!(rfile = fopen(recfile,"r"))){
X (void) puts("Cannot open record file!");
X return;
X }
X
X if(argc > 1 && !strncmp(argv[1], "-s", 2)){
X if(!argv[1][2]){
X argc--;
X argv++;
X } else if(!argv[1][3] && index("ABCEHKPRSTVW", argv[1][2])) {
X argv[1]++;
X argv[1][0] = '-';
X } else argv[1] += 2;
X }
X if(argc <= 1){
X#ifdef PERS_IS_UID
X uid = getuid();
X playerct = 0;
X#else
X player0 = plname;
X if(!*player0)
X player0 = "hackplayer";
X playerct = 1;
X players = &player0;
X#endif
X } else {
X playerct = --argc;
X players = ++argv;
X }
X if(outflg) (void) putchar('\n');
X
X t1 = tt_head = newttentry();
X for(rank = 1; ; rank++) {
X#ifdef TOS
X char k1[2], k2[2];
X if(fscanf(rfile, "%6s %d %d %d %d %d %ld %1s%1s %s %s]",
X#else
X if(fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]",
X#endif
X t1->date, &t1->uid,
X &t1->level, &t1->maxlvl,
X &t1->hp, &t1->maxhp, &t1->points,
X#ifdef TOS
X k1, k2,
X#else
X &t1->plchar, &t1->sex,
X#endif
X t1->name, t1->death) != 11)
X t1->points = 0;
X if(t1->points == 0) break;
X#ifdef TOS
X t1->plchar=k1[0];
X t1->sex=k2[0];
X#endif
X#ifdef PERS_IS_UID
X if(!playerct && t1->uid == uid)
X flg++;
X else
X#endif
X for(i = 0; i < playerct; i++){
X if(strcmp(players[i], "all") == 0 ||
X strncmp(t1->name, players[i], NAMSZ) == 0 ||
X (players[i][0] == '-' &&
X players[i][1] == t1->plchar &&
X players[i][2] == 0) ||
X (digit(players[i][0]) && rank <= atoi(players[i])))
X flg++;
X }
X t1 = t1->tt_next = newttentry();
X }
X (void) fclose(rfile);
X if(!flg) {
X if(outflg) {
X Printf("Cannot find any entries for ");
X if(playerct < 1) Printf("you.\n");
X else {
X if(playerct > 1) Printf("any of ");
X for(i=0; i<playerct; i++)
X Printf("%s%s", players[i], (i<playerct-1)?", ":".\n");
X Printf("Call is: %s -s [-role] [maxrank] [playernames]\n", hname);
X }
X }
X return;
X }
X
X if(outflg) outheader();
X t1 = tt_head;
X for(rank = 1; t1->points != 0; rank++, t1 = t2) {
X t2 = t1->tt_next;
X#ifdef PERS_IS_UID
X if(!playerct && t1->uid == uid)
X goto outwithit;
X else
X#endif
X for(i = 0; i < playerct; i++){
X if(strcmp(players[i], "all") == 0 ||
X strncmp(t1->name, players[i], NAMSZ) == 0 ||
X (players[i][0] == '-' &&
X players[i][1] == t1->plchar &&
X players[i][2] == 0) ||
X (digit(players[i][0]) && rank <= atoi(players[i]))){
X outwithit:
X if(outflg)
X (void) outentry(rank, t1, 0);
X#ifdef nonsense
X total_score += t1->points;
X if(totcharct < sizeof(totchars)-1)
X totchars[totcharct++] = t1->plchar;
X#endif
X break;
X }
X }
X free((genericptr_t) t1);
X }
X#ifdef nonsense
X totchars[totcharct] = 0;
X
X /* We would like to determine whether he is experienced. However,
X the information collected here only tells about the scores/roles
X that got into the topten (top 100?). We should maintain a
X .hacklog or something in his home directory. */
X flags.beginner = (total_score < 6000);
X for(i=0; i<6; i++)
X if(!index(totchars, "ABCEHKPRSTVW"[i])) {
X flags.beginner = 1;
X if(!pl_character[0]) pl_character[0] = "ABCEHKPRSTVW"[i];
X break;
X }
X#endif /* nonsense /**/
X}
X
Xstatic int
Xclassmon(plch, fem)
Xchar plch;
Xboolean fem;
X{
X switch (plch) {
X case 'A': return PM_ARCHEOLOGIST;
X case 'B': return PM_BARBARIAN;
X case 'C': return (fem ? PM_CAVEWOMAN : PM_CAVEMAN);
X case 'E': return PM_ELF;
X case 'H': return PM_HEALER;
X case 'F': /* accept old Fighter class */
X case 'K': return PM_KNIGHT;
X case 'P': return (fem ? PM_PRIESTESS : PM_PRIEST);
X case 'R': return PM_ROGUE;
X case 'N': /* accept old Ninja class */
X case 'S': return PM_SAMURAI;
X case 'T': return PM_TOURIST;
X case 'V': return PM_VALKYRIE;
X case 'W': return PM_WIZARD;
X default: impossible("What weird class is this? (%c)", plch);
X return PM_HUMAN_ZOMBIE;
X }
X}
X
X/*
X * Get a random player name and class from the high score list,
X * and attach them to an object (for statues or morgue corpses).
X */
Xstruct obj *
Xtt_oname(otmp)
Xstruct obj *otmp;
X{
X int rank;
X register int i;
X register struct toptenentry *tt;
X char *recfile = RECORD;
X FILE *rfile;
X
X if (!otmp) return((struct obj *) 0);
X
X if(!(rfile = fopen(recfile,"r")))
X panic("Cannot open record file!");
X
X tt = newttentry();
X rank = rnd(10);
Xpickentry:
X for(i = rank; i; i--) {
X#ifdef TOS
X char k1[2], k2[2];
X if(fscanf(rfile, "%6s %d %d %d %d %d %ld %1s%1s %s %s]",
X#else
X if(fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]",
X#endif
X tt->date, &tt->uid,
X &tt->level, &tt->maxlvl,
X &tt->hp, &tt->maxhp, &tt->points,
X#ifdef TOS
X k1, k2,
X#else
X &tt->plchar, &tt->sex,
X#endif
X tt->name, tt->death) != 11)
X tt->points = 0;
X if(tt->points == 0) break;
X#ifdef TOS
X tt->plchar=k1[0];
X tt->sex=k2[0];
X#endif
X }
X (void) fclose(rfile);
X
X if(tt->points == 0) {
X if(rank > 1) {
X rank = 1;
X goto pickentry;
X }
X free((genericptr_t) tt);
X return((struct obj *) 0);
X } else {
X otmp->corpsenm = classmon(tt->plchar, (tt->sex == 'F'));
X otmp->owt = mons[otmp->corpsenm].cwt;
X otmp = oname(otmp, tt->name, 0);
X free((genericptr_t) tt);
X return otmp;
X }
X}
END_OF_FILE
if test 15837 -ne `wc -c <'src/topten.c'`; then
echo shar: \"'src/topten.c'\" unpacked with wrong size!
fi
# end of 'src/topten.c'
fi
if test -f 'src/unixtty.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/unixtty.c'\"
else
echo shar: Extracting \"'src/unixtty.c'\" \(4576 characters\)
sed "s/^X//" >'src/unixtty.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)unixtty.c 3.0 88/05/03
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X/* tty.c - (Unix) version */
X
X/* With thanks to the people who sent code for SYSV - hpscdi!jon,
X * arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others.
X */
X
X/* block some unused #defines to avoid overloading some cpp's */
X#define MONATTK_H
X#define ONAMES_H
X#include "hack.h"
X
X/*
X * The distinctions here are not BSD - rest but rather USG - rest, as
X * BSD still has the old sgttyb structure, but SYSV has termio. Thus:
X */
X#if defined(BSD) || defined(ULTRIX)
X#define V7
X#else
X#define USG
X#endif
X
X
X#ifdef USG
X
X#include <termio.h>
X#define termstruct termio
X#define kill_sym c_cc[VKILL]
X#define erase_sym c_cc[VERASE]
X#define intr_sym c_cc[VINTR]
X#define EXTABS TAB3
X#define tabflgs c_oflag
X#define echoflgs c_lflag
X#define cbrkflgs c_lflag
X#define CBRKMASK ICANON
X#define CBRKON ! /* reverse condition */
X#define OSPEED(x) ((x).c_cflag & CBAUD)
X#define GTTY(x) (ioctl(0, TCGETA, x))
X/* STTY now modified to run under Sys V R3. - may have to be #ifdef'ed */
X#define STTY(x) (ioctl(0, TCSETAW, x)) /* TCSETAF? TCSETAW? */
X#define GTTY2(x) 1
X#define STTY2(x) 1
X#define nonesuch 0
X#define inittyb2 inittyb
X#define curttyb2 curttyb
X
X#else /* V7 */
X
X#include <sgtty.h>
X#define termstruct sgttyb
X#define kill_sym sg_kill
X#define erase_sym sg_erase
X#define intr_sym t_intrc
X#define EXTABS XTABS
X#define tabflgs sg_flags
X#define echoflgs sg_flags
X#define cbrkflgs sg_flags
X#define CBRKMASK CBREAK
X#define CBRKON /* empty */
X#define OSPEED(x) (x).sg_ospeed
X#define GTTY(x) (gtty(0, x))
X#define STTY(x) (stty(0, x))
X#define GTTY2(x) (ioctl(0, TIOCGETC, (char *)x))
X#define STTY2(x) (ioctl(0, TIOCSETC, (char *)x))
X#define nonesuch -1
Xstruct tchars inittyb2, curttyb2;
X
X#endif
X
Xextern short ospeed;
Xchar erase_char, intr_char, kill_char;
Xstatic boolean settty_needed = FALSE;
Xstruct termstruct inittyb, curttyb;
X
Xstatic void
Xsetctty(){
X if(STTY(&curttyb) < 0 || STTY2(&curttyb2) < 0)
X perror("NetHack (setctty)");
X}
X
X/*
X * Get initial state of terminal, set ospeed (for termcap routines)
X * and switch off tab expansion if necessary.
X * Called by startup() in termcap.c and after returning from ! or ^Z
X */
Xvoid
Xgettty(){
X if(GTTY(&inittyb) < 0 || GTTY2(&inittyb2) < 0)
X perror("NetHack (gettty)");
X curttyb = inittyb;
X curttyb2 = inittyb2;
X ospeed = OSPEED(inittyb);
X erase_char = inittyb.erase_sym;
X kill_char = inittyb.kill_sym;
X intr_char = inittyb2.intr_sym;
X getioctls();
X
X /* do not expand tabs - they might be needed inside a cm sequence */
X if(curttyb.tabflgs & EXTABS) {
X curttyb.tabflgs &= ~EXTABS;
X setctty();
X }
X settty_needed = TRUE;
X}
X
X/* reset terminal to original state */
Xvoid
Xsettty(s)
Xchar *s;
X{
X clear_screen();
X end_screen();
X if(s) Printf(s);
X (void) fflush(stdout);
X if(STTY(&inittyb) < 0 || STTY2(&inittyb2) < 0)
X perror("NetHack (settty)");
X flags.echo = (inittyb.echoflgs & ECHO) ? ON : OFF;
X flags.cbreak = (CBRKON(inittyb.cbrkflgs & CBRKMASK)) ? ON : OFF;
X setioctls();
X}
X
Xvoid
Xsetftty(){
Xregister int ef = 0; /* desired value of flags & ECHO */
X#ifdef LINT /* cf = CBRKON(CBRKMASK); const expr to initialize is ok */
Xregister int cf = 0;
X#else
Xregister int cf = CBRKON(CBRKMASK); /* desired value of flags & CBREAK */
X#endif
Xregister int change = 0;
X flags.cbreak = ON;
X flags.echo = OFF;
X /* Should use (ECHO|CRMOD) here instead of ECHO */
X if((curttyb.echoflgs & ECHO) != ef){
X curttyb.echoflgs &= ~ECHO;
X/* curttyb.echoflgs |= ef; */
X change++;
X }
X if((curttyb.cbrkflgs & CBRKMASK) != cf){
X curttyb.cbrkflgs &= ~CBRKMASK;
X curttyb.cbrkflgs |= cf;
X#ifdef USG
X /* be satisfied with one character; no timeout */
X curttyb.c_cc[VMIN] = 1; /* was VEOF */
X curttyb.c_cc[VTIME] = 0; /* was VEOL */
X#endif
X change++;
X }
X /* If an interrupt character is used, it will be overriden and
X * set to ^C.
X */
X if(intr_char != nonesuch && curttyb2.intr_sym != '\003') {
X curttyb2.intr_sym = '\003';
X change++;
X }
X
X if(change) setctty();
X start_screen();
X}
X
Xvoid
Xintron() { /* enable kbd interupts if enabled when game started */
X
X if(intr_char != nonesuch && curttyb2.intr_sym != '\003') {
X curttyb2.intr_sym = '\003';
X setctty();
X }
X}
X
Xvoid
Xintroff() { /* disable kbd interrupts if required*/
X
X if(curttyb2.intr_sym != nonesuch) {
X curttyb2.intr_sym = nonesuch;
X setctty();
X }
X}
X
X
X/* fatal error */
X/*VARARGS1*/
Xvoid
Xerror(s, x, y)
Xchar *s, *x, *y;
X{
X if(settty_needed)
X settty(NULL);
X Printf(s,x,y);
X (void) putchar('\n');
X exit(1);
X}
END_OF_FILE
if test 4576 -ne `wc -c <'src/unixtty.c'`; then
echo shar: \"'src/unixtty.c'\" unpacked with wrong size!
fi
# end of 'src/unixtty.c'
fi
echo shar: End of archive 23 \(of 38\).
cp /dev/null ark23isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 38 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