[comp.sources.games] v09i029: NetHack3 - display oriented dungeons & dragons

billr@saab.CNA.TEK.COM (Bill Randle) (02/24/90)

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 9, Issue 29
Archive-name: NetHack3/Patch7cc
Patch-To: NetHack3: Volume 7, Issue 56-93



#! /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 29 (of 30)."
# Contents:  include/monflag.h others/Makefile.ovl others/pcmain.c
#   src/vault.c
# Wrapped by billr@saab on Wed Feb 21 10:04:53 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'include/monflag.h' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'include/monflag.h'\" to \"'include/monflag.h.orig'\"
  mv -f 'include/monflag.h' 'include/monflag.h.orig'
fi
echo shar: Extracting \"'include/monflag.h'\" \(5432 characters\)
sed "s/^X//" >'include/monflag.h' <<'END_OF_FILE'
X/*	SCCS Id: @(#)monflag.h	3.0	89/11/21
X/* NetHack may be freely redistributed.  See license for details. */
X/* Copyright (c) 1989 Mike Threepoint */
X
X#ifndef MONFLAG_H
X#define MONFLAG_H
X
X#define MS_SILENT	0	/* makes no sound */
X#define MS_SQEEK	1	/* squeaks, as a rodent */
X#define MS_SQAWK	2	/* squawks, as a bird */
X#define MS_HISS 	3	/* hisses */
X#define MS_BUZZ 	4	/* buzzes (killer bee) */
X#define MS_GRUNT	5	/* grunts (or speaks own language) */
X#define MS_GROWL	6	/* growls */
X#define MS_BARK 	7	/* if full moon, may howl */
X#define MS_MEW		8	/* mews or hisses */
X#define MS_ROAR 	9	/* roars */
X#define MS_NEIGH	10	/* neighs, as an equine */
X#define MS_WAIL 	11	/* wails, as a tortured soul */
X#define MS_GURGLE	12	/* gurgles, as liquid or through saliva */
X#define MS_BURBLE	13	/* burbles (jabberwock) */
X#define MS_SHRIEK	15	/* wakes up others */
X#define MS_LAUGH	17	/* grins, smiles, giggles, and laughs */
X#define MS_MUMBLE	18	/* says something or other */
X#define MS_IMITATE	19	/* imitates others (leocrotta) */
X#define MS_SEDUCE	20	/* "Hello, sailor." (Nymphs) */
X#define MS_VAMPIRE	21	/* vampiric seduction, Vlad's exclamations */
X#define MS_ORC		MS_GRUNT	/* intelligent brutes */
X#ifdef INFERNO
X#define MS_BRIBE	25	/* asks for money, or berates you */
X#endif
X#define MS_CUSS 	26	/* berates (demons) or intimidates (Wiz) */
X#define MS_NURSE	27	/* "Take off your shirt, please." */
X#define MS_DJINNI	28	/* "Thank you for freeing me!" */
X#define MS_HUMANOID	29	/* generic traveling companion */
X#define MS_GUARD	30	/* "Please drop that gold and follow me." */
X#define MS_SELL 	31	/* demand payment, complain about shoplifters */
X#ifdef ORACLE
X#define MS_ORACLE	32	/* do a consultation */
X#endif
X#ifdef ALTARS
X#define MS_PRIEST	33	/* ask for contribution; do cleansing */
X#endif
X#ifdef KOPS
X#define MS_ARREST	34	/* "Stop in the name of the law!" (Kops) */
X#endif
X#ifdef ARMY
X#define MS_SOLDIER	35	/* army expressions */
X#endif
X
X#define M1_FLY		0x00000001L	/* can fly or float */
X#define M1_SWIM 	0x00000002L	/* can traverse water */
X#define M1_AMORPHOUS	0x00000004L	/* can flow under doors */
X#define M1_WALLWALK	0x00000008L	/* can phase thru rock */
X#define M1_TUNNEL	0x00000010L	/* can tunnel thru rock */
X#define M1_NEEDPICK	0x00000020L	/* needs pick to tunnel */
X#define M1_CONCEAL	0x00000040L	/* hides under objects */
X#define M1_HIDE 	0x00000080L	/* mimics, blends in with ceiling */
X#define M1_NOEYES	0x00000100L	/* no eyes to gaze into or blind */
X#define M1_NOHANDS	0x00000200L	/* no hands to handle things */
X#define M1_NOLIMBS	0x00000600L	/* no arms/legs to kick/wear on */
X#define M1_NOPOLY	0x00000800L	/* players mayn't poly into one */
X#define M1_HUMANOID	0x00001000L	/* has humanoid body */
X#define M1_ANIMAL	0x00002000L	/* has animal body */
X#define M1_SLITHY	0x00004000L	/* has serpent body */
X#define M1_THICK_HIDE	0x00008000L	/* has thick hide or scales */
X#define M1_FIRE_RES	0x00010000L	/* resists fire */
X#define M1_SLEE_RES	0x00020000L	/* resists sleep */
X#define M1_COLD_RES	0x00040000L	/* resists cold */
X#define M1_ELEC_RES	0x00080000L	/* resists electricity */
X#define M1_STON_RES	0x00100000L	/* resists stoning */
X#define M1_ACID 	0x00200000L	/* acidic to eat */
X#define M1_POIS_RES	0x00400000L	/* resists poison */
X#define M1_POIS 	0x00800000L	/* poisonous to eat */
X#define M1_REGEN	0x01000000L	/* regenerates hit points */
X#define M1_SEE_INVIS	0x02000000L	/* can see invisible creatures */
X#define M1_TPORT	0x04000000L	/* can teleport */
X#define M1_TPORT_CONTROL 0x08000000L	/* controls where it teleports to */
X#define M1_GREEDY	0x10000000L	/* likes gold */
X#define M1_JEWELS	0x20000000L	/* likes gems */
X#define M1_COLLECT	0x40000000L	/* picks up weapons and food */
X#define M1_MAGIC	0x80000000L	/* picks up magic items */
X
X#define M2_UNDEAD	0x00000001L	/* walking dead */
X#define M2_WERE 	0x00000002L	/* lycanthrope */
X#define M2_ELF		0x00000010L	/* is an elf */
X#define M2_DWARF	0x00000020L	/* is a dwarf */
X#define M2_GIANT	0x00000040L	/* is a giant */
X#define M2_ORC		0x00000080L	/* is an orc */
X#define M2_HUMAN	0x00000100L	/* is a human */
X#define M2_DEMON	0x00000200L	/* is a demon */
X#define M2_MERC 	0x00000400L	/* is a guard or soldier */
X#define M2_FEM		0x00000800L	/* characteristically female */
X#define M2_WANDER	0x00001000L	/* wanders randomly */
X#define M2_STALK	0x00002000L	/* follows you to other levels */
X#define M2_DOMESTIC	0x00004000L	/* can be tamed by feeding */
X#define M2_HOSTILE	0x00010000L	/* always starts hostile */
X#define M2_PEACEFUL	0x00020000L	/* always starts peaceful */
X#define M2_NASTY	0x00040000L	/* extra-nasty monster (more xp) */
X#define M2_STRONG	0x00080000L	/* strong (or big) monster */
X#define M2_CARNIVORE	0x00100000L	/* eats corpses */
X#define M2_HERBIVORE	0x00200000L	/* eats fruits */
X#define M2_OMNIVORE	0x00300000L	/* eats both */
X#define M2_METALLIVORE	0x00400000L	/* eats metal */
X#define M2_EGGS 	0x01000000L	/* lays eggs */
X#define M2_ROCKTHROW	0x04000000L	/* throws boulders */
X#define M2_PNAME	0x20000000L	/* monster name is a proper name */
X#define M2_LORD 	0x40000000L	/* a lord to its kind */
X#define M2_PRINCE	0x80000000L	/* an overlord to its kind */
X
X#define MZ_TINY		0		/* < 2' */
X#define MZ_SMALL 	1		/* 2-4' */
X#define MZ_MEDIUM	2		/* 4-7' */
X#define MZ_HUMAN	MZ_MEDIUM	/* human-sized */
X#define MZ_LARGE 	3		/* 7-12' */
X#define MZ_HUGE		4		/* 12-25' */
X#define MZ_GIGANTIC	7		/* off the scale */
X
X#endif /* MONFLAG_H */
END_OF_FILE
if test 5432 -ne `wc -c <'include/monflag.h'`; then
    echo shar: \"'include/monflag.h'\" unpacked with wrong size!
fi
# end of 'include/monflag.h'
if test -f 'others/Makefile.ovl' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'others/Makefile.ovl'\" to \"'others/Makefile.ovl.orig'\"
  mv -f 'others/Makefile.ovl' 'others/Makefile.ovl.orig'
fi
echo shar: Extracting \"'others/Makefile.ovl'\" \(19154 characters\)
sed "s/^X//" >'others/Makefile.ovl' <<'END_OF_FILE'
X#	SCCS Id: @(#)Makefile.ovl	3.0	90/02/08
X#	PC NetHack 3.0 Makefile for Microsoft(tm) "C" 5.1 -- Pierre Martineau
X#	Overlay Arrangement -- Stephen Spackman, Pierre Martineau, Norm Meluch
X#	Multiple Compilation Hack and so forth -- Stephen Spackman
X#
X#	 Other things that have to be reconfigured are in config.h, pcconf.h,
X#	 (for other targets: unixconf.h, tosconf.h), and possibly system.h.
X#
X#	 Nota Bene: OVERLAY *must* be defined in pcconf.h to use this makefile!
X#	 Also: Rename this file to "makefile", some targets rely on it.
X# -----------------------------------------------------------------------------
X#	 In addition to your C compiler,
X#
X#	 if you want to change	you will need a
X#	 files with suffix	workalike for
X#	   .y			  yacc
X#	   .l			  lex
X#	   .asm 		  masm
X#
X# *****************************************************************************
X# ************************ Compiler Info **************************************
X# *****************************************************************************
X# Large memory model, register bug, remove stack probes:
XCC	= cl /c
XLINK	= link
XMODEL	= L
XASM	= masm
X# $(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.
XMAKEBIN = make
X# For those of us who have these on PC.
X# YACC	 = yacc
X# LEX	 = lex
XYACC	= bison -y
XLEX	= flex
X# Standard file names may vary in PC installations.
XYTABC	= y_tab.c
XYTABH	= y_tab.h
XLEXYYC	= lexyy.c
X# /Gt22 is currently about the largest value that keeps the initialised data
X# segment below 64K (and keeps the linker happy).
X# 286 or higher machines can use the /G2 CFLAG option for better performance.
XCFLAGS	= /A$(MODEL) /Os /Oa /Gs /Gt22 /Zp1 /W0 /I$(INCL)
X#
XLFLAGS	= /noi /seg:512 /map /st:4096 /cp:5000
X#
XAFLAGS	= /MX 
X#
X# *****************************************************************************
X# ********* Directories (makedefs hardcodes these, don't change them) *********
X# *****************************************************************************
X#
XINCL	= ..\include
XAUX	= ..\auxil
XSRC	= ..\src
XOTHERS	= ..\others
XOBJ	= $(SRC)\o
X#
X# *****************************************************************************
X# ************************ Local Variables ************************************
X# *****************************************************************************
X#
X# The game name
XGAME	 = nethack
X#
X# The default make target (so just typing 'make' is useful)
XDEFAULT  : $(GAME)
X#
X# The game directory
X# make sure GAMEDIR exists!
XGAMEDIR  = ..
X#
X# The game filename
XGAMEFILE = $(GAMEDIR)\$(GAME).exe
X#
X# Target environment prefix
XTARG	 = pc
X#
X# Overlay manager object file.
XOVLMGR	 = ovlmgr.obj
X#
X# Termcap routines.
XTERMCAPS = $(SRC)\termlib.lib
X#
X###############################################################################
X# Switch the following lines if you have made changes in ovlmgr.asm
X(OBJ)\$(OVLMGR):
X#$(OBJ)\$(OVLMGR): ; copy $(OTHERS)\$(OVLMGR) $(OBJ)\$(OVLMGR)
X###############################################################################
X# If you have yacc and lex programs and make any changes, comment out the
X# upper two targets and uncomment the lower two.
X#do_yacc: yacc_msg
X#do_lex:  lex_msg
Xdo_yacc: yacc_act
Xdo_lex:  lex_act
X###############################################################################
X# Optional high-quality BSD random number generation routines (see pcconf.h).
X# Set to nothing if not used.
XRANDOM	 = $(OBJ)\random.o
X# RANDOM =
X###############################################################################
X# Optional C library specifier for those with non-standard libraries or
X# a multiple-target library setup.
X# CLIB	   = llibcer /nod
XCLIB	 =
X###############################################################################
X# If TERMLIB is NOT #defined in the source, comment out the lower line and
X# uncomment the upper. Don't forget to copy the $(TERMCAPS) file to the
X# $(SRC) directory if you have uncommented the lower line.
X#TERMLIB =
XTERMLIB = $(TERMCAPS)
X###############################################################################
X
X# nothing below this line should have to be changed
X
XROOT =	$(OBJ)\$(OVLMGR) $(OBJ)\trampoli.o $(OBJ)\main.o $(OBJ)\msdos.o \
X	$(OBJ)\mkroom.0 $(OBJ)\random.o $(OBJ)\rnd.01 $(OBJ)\mkobj.0 \
X	$(OBJ)\invent.0 $(OBJ)\decl.o
X
XOVL01 = $(OBJ)\track.0 $(OBJ)\monmove.01 $(OBJ)\cmd.0 $(OBJ)\dbridge.0 \
X	$(OBJ)\dog.0 $(OBJ)\engrave.01 $(OBJ)\mon.01 $(OBJ)\priest.0 \
X	$(OBJ)\shk.0 $(OBJ)\trap.01 $(OBJ)\mthrowu.0 \
X	$(OBJ)\mondata.01 $(OBJ)\mhitu.1 $(OBJ)\monst.o $(OBJ)\objects.o
XOVL02 = $(OBJ)\dogmove.0 $(OBJ)\apply.0
XOVL03 = $(OBJ)\makemon.0
XOVL04 = $(OBJ)\shk.12b
XOVL05 = $(OBJ)\hack.0
XOVL06 = $(OBJ)\alloc.o
XOVL07 = $(OBJ)\attrib.0 $(OBJ)\allmain.1
XOVL08 = $(OBJ)\attrib.2b $(OBJ)\exper.o
XOVL09 = $(OBJ)\cmd.2b $(OBJ)\getline.2 $(OBJ)\pray.o $(OBJ)\write.o
XOVL10 = $(OBJ)\dbridge.12b
XOVL11 = $(OBJ)\do_name.0
XOVL12 = $(OBJ)\getline.b
XOVL13 = $(OBJ)\invent.1
XOVL14 = $(OBJ)\makemon.1
XOVL15 = $(OBJ)\makemon.2b
XOVL16 = $(OBJ)\allmain.0 $(OBJ)\cmd.1 $(OBJ)\do.0 $(OBJ)\pickup.0 \
X	$(OBJ)\vault.0 $(OBJ)\wizard.0 $(OBJ)\artifact.0 $(OBJ)\timeout.0 \
X	$(OBJ)\attrib.1 $(OBJ)\eat.0 $(OBJ)\engrave.2 $(OBJ)\getline.01 \
X	$(OBJ)\mail.0 $(OBJ)\pri.1 $(OBJ)\prisym.1 $(OBJ)\sounds.0 \
X	$(OBJ)\track.1 $(OBJ)\hack.1
XOVL17 = $(OBJ)\hack.2
XOVL18 = $(OBJ)\mcastu.o $(OBJ)\demon.o
XOVL19 = $(OBJ)\mhitm.12b
XOVL20 = $(OBJ)\mhitm.0 $(OBJ)\mhitu.0 $(OBJ)\weapon.01
XOVL21 = $(OBJ)\mkobj.12b
XOVL22 = $(OBJ)\mon.2b $(OBJ)\trap.2
XOVL23 = $(OBJ)\monmove.2b $(OBJ)\steal.2b
XOVL24 = $(OBJ)\mthrowu.1
XOVL25 = $(OBJ)\mthrowu.2b
XOVL26 = $(OBJ)\objnam.01 $(OBJ)\pager.0 $(OBJ)\polyself.0 $(OBJ)\mondata.2
XOVL27 = $(OBJ)\objnam.2b
XOVL28 = $(OBJ)\pager.12b
XOVL29 = $(OBJ)\pri.0 $(OBJ)\prisym.0 $(OBJ)\termcap.0 $(OBJ)\topl.0
XOVL30 = $(OBJ)\pri.b $(OBJ)\topl.12
XOVL31 = $(OBJ)\priest.12b
XOVL32 = $(OBJ)\worm.o
XOVL33 = $(OBJ)\were.0
XOVL34 = $(OBJ)\prisym.2
XOVL35 = $(OBJ)\prisym.b
XOVL36 = $(OBJ)\read.0
XOVL37 = $(OBJ)\read.12b $(OBJ)\spell.o
XOVL38 = $(OBJ)\rnd.2b $(OBJ)\topl.b
XOVL39 = $(OBJ)\search.12b
XOVL40 = $(OBJ)\search.0 $(OBJ)\uhitm.0 $(OBJ)\weapon.2b
XOVL41 = $(OBJ)\steal.01
XOVL42 = $(OBJ)\termcap.1 $(OBJ)\unix.0
XOVL43 = $(OBJ)\termcap.2b
XOVL44 = $(OBJ)\timeout.12b $(OBJ)\mondata.b
XOVL45 = $(OBJ)\potion.0 $(OBJ)\artifact.1
XOVL46 = $(OBJ)\were.12b $(OBJ)\wizard.12b
XOVL47 = $(OBJ)\polyself.12b
XOVL48 = $(OBJ)\pickup.12b
XOVL49 = $(OBJ)\lock.o $(OBJ)\trap.b
XOVL50 = $(OBJ)\invent.2b
XOVL51 = $(OBJ)\hack.b
XOVL52 = $(OBJ)\eat.12b $(OBJ)\potion.12b
XOVL53 = $(OBJ)\dog.1 $(OBJ)\dogmove.12b
XOVL54 = $(OBJ)\dokick.o $(OBJ)\dothrow.o
XOVL55 = $(OBJ)\do.12b
XOVL56 = $(OBJ)\apply.12b
XOVL57 = $(OBJ)\dog.2b $(OBJ)\sounds.12b
XOVL58 = $(OBJ)\do_wear.01 $(OBJ)\mhitu.2b
XOVL59 = $(OBJ)\sit.o $(OBJ)\artifact.2b $(OBJ)\do_name.12b $(OBJ)\vault.12b \
X	$(OBJ)\fountain.o $(OBJ)\music.o $(OBJ)\rumors.o $(OBJ)\shknam.0
XOVL60 = $(OBJ)\worn.o $(OBJ)\wield.o $(OBJ)\do_wear.2b
XOVL61 = $(OBJ)\zap.o $(OBJ)\pri.2
XOVL62 = $(OBJ)\unix.12b $(OBJ)\mail.12b $(OBJ)\tty.o $(OBJ)\version.o \
X	$(OBJ)\options.o $(OBJ)\o_init.o $(OBJ)\allmain.2b $(OBJ)\engrave.b \
X	$(OBJ)\end.o $(OBJ)\save.o $(OBJ)\restore.o $(OBJ)\u_init.o \
X	$(OBJ)\topten.o $(OBJ)\shknam.12b $(OBJ)\rip.o
XOVL63 = $(OBJ)\bones.o $(OBJ)\mklev.o $(OBJ)\mkmaze.o $(OBJ)\mkroom.12b \
X	$(OBJ)\sp_lev.o $(OBJ)\track.2b $(OBJ)\extralev.o
X
X# *****************************************************************************
X# ************************* Make Objects **************************************
X# *****************************************************************************
X
XMOBJ = $(OVL01) $(OVL02) $(OVL03) $(OVL04) $(OVL05) $(OVL06) $(OVL07) $(OVL08)\
X       $(OVL09) $(OVL10) $(OVL11) $(OVL12) $(OVL13) $(OVL14) $(OVL15) $(OVL16)\
X       $(OVL17) $(OVL18) $(OVL19) $(OVL20) $(OVL21) $(OVL22) $(OVL23) $(OVL24)\
X       $(OVL25) $(OVL26) $(OVL27) $(OVL28) $(OVL29) $(OVL30) $(OVL31) $(OVL32)\
X       $(OVL33) $(OVL34) $(OVL35) $(OVL36) $(OVL37) $(OVL38) $(OVL39) $(OVL40)\
X       $(OVL41) $(OVL42) $(OVL43) $(OVL44) $(OVL45) $(OVL46) $(OVL47) $(OVL48)\
X       $(OVL49) $(OVL50) $(OVL51) $(OVL52) $(OVL53) $(OVL54) $(OVL55) $(OVL56)\
X       $(OVL57) $(OVL58) $(OVL59) $(OVL60) $(OVL61) $(OVL62)
X
XVOBJ =	$(ROOT) $(MOBJ)
X
XHOBJ =	$(VOBJ) $(OVL63)
X
X# object files for makedefs
XMAKEOBJS    =	$(OBJ)\makedefs.o $(OBJ)\alloc.o    $(OBJ)\monst.o    \
X		$(OBJ)\objects.o  $(OBJ)\panic.o
X
XOVERLAYS = ($(OVL01)) ($(OVL02)) ($(OVL03)) ($(OVL04)) ($(OVL05)) ($(OVL06)) \
X	   ($(OVL07)) ($(OVL08)) ($(OVL09)) ($(OVL10)) ($(OVL11)) ($(OVL12)) \
X	   ($(OVL13)) ($(OVL14)) ($(OVL15)) ($(OVL16)) ($(OVL17)) ($(OVL18)) \
X	   ($(OVL19)) ($(OVL20)) ($(OVL21)) ($(OVL22)) ($(OVL23)) ($(OVL24)) \
X	   ($(OVL25)) ($(OVL26)) ($(OVL27)) ($(OVL28)) ($(OVL29)) ($(OVL30)) \
X	   ($(OVL31)) ($(OVL32)) ($(OVL33)) ($(OVL34)) ($(OVL35)) ($(OVL36)) \
X	   ($(OVL37)) ($(OVL38)) ($(OVL39)) ($(OVL40)) ($(OVL41)) ($(OVL42)) \
X	   ($(OVL43)) ($(OVL44)) ($(OVL45)) ($(OVL46)) ($(OVL47)) ($(OVL48)) \
X	   ($(OVL49)) ($(OVL50)) ($(OVL51)) ($(OVL52)) ($(OVL53)) ($(OVL54)) \
X	   ($(OVL55)) ($(OVL56)) ($(OVL57)) ($(OVL58)) ($(OVL59)) ($(OVL60)) \
X	   ($(OVL61)) ($(OVL62)) ($(OVL63))
X
X# object files for special levels compiler
XSPLEVOBJS   =	$(OBJ)\lev_comp.o $(OBJ)\lev_lex.o  $(OBJ)\lev_main.o \
X		$(OBJ)\alloc.o	  $(OBJ)\monst.o    $(OBJ)\objects.o  \
X		$(OBJ)\panic.o
X
X# *****************************************************************************
X# ************************** Header Objects ***********************************
X# *****************************************************************************
X
XTRAP_H	   = $(INCL)\trap.h
XPERMONST_H = $(INCL)\permonst.h    $(INCL)\monflag.h
XPCCONF_H   = $(INCL)\$(TARG)conf.h $(INCL)\extern.h   $(INCL)\msdos.h \
X	     $(INCL)\system.h
XGLOBAL_H   = $(PCCONF_H)	   $(INCL)\coord.h    $(INCL)\global.h
XCONFIG_H   = $(GLOBAL_H)	   $(INCL)\config.h   $(INCL)\tradstdc.h
XYOU_H	   = $(PERMONST_H)	   $(INCL)\attrib.h   $(INCL)\mondata.h \
X	     $(INCL)\monst.h	   $(INCL)\you.h      $(INCL)\youprop.h
XDECL_H	   = $(YOU_H)		   $(INCL)\decl.h     $(INCL)\obj.h \
X	     $(INCL)\onames.h	   $(INCL)\pm.h       $(INCL)\spell.h
XHACK_H	   = $(CONFIG_H)	   $(DECL_H)	      $(TRAP_H) \
X	     $(INCL)\flag.h	   $(INCL)\gold.h     $(INCL)\mkroom.h \
X	     $(INCL)\monsym.h	   $(INCL)\objclass.h $(INCL)\rm.h \
X	     $(INCL)\trampoli.h
X
X# *****************************************************************************
X# ************************ File Dependencies **********************************
X# *****************************************************************************
X
X# Due to an NDMake inadequacy these must accord with a topological sort of the
X# generated-from relation... output on the left, input on the right. Trust me.
X.SUFFIXES: .exe .0 .01 .012 .1 .12 .12b .2 .2b .b .o .c .y .l .obj .asm
X
X.c.o:
X	$(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
X.c.0:
X	$(CC) $(CFLAGS) /DOVL0 /NT$*.0 /Fo$(OBJ)\$*.0 $*.c
X.c.01:
X	$(CC) $(CFLAGS) /DOVL0 /DOVL1 /NT$*.01 /Fo$(OBJ)\$*.01 $*.c
X.c.012:
X	$(CC) $(CFLAGS) /DOVL0 /DOVL1 /DOVL2 /NT$*.012 /Fo$(OBJ)\$*.012 $*.c
X.c.1:
X	$(CC) $(CFLAGS) /DOVL1 /NT$*.1 /Fo$(OBJ)\$*.1 $*.c
X.c.12:
X	$(CC) $(CFLAGS) /DOVL1 /DOVL2 /NT$*.12 /Fo$(OBJ)\$*.12 $*.c
X.c.12b:
X	$(CC) $(CFLAGS) /DOVL1 /DOVL2 /DOVLB /NT$*.12b /Fo$(OBJ)\$*.12b $*.c
X.c.2:
X	$(CC) $(CFLAGS) /DOVL2 /NT$*.2 /Fo$(OBJ)\$*.2 $*.c
X.c.2b:
X	$(CC) $(CFLAGS) /DOVL2 /DOVLB /NT$*.2b /Fo$(OBJ)\$*.2b $*.c
X.c.b:
X	$(CC) $(CFLAGS) /DOVLB /NT$*.b /Fo$(OBJ)\$*.b $*.c
X.asm.obj:
X	$(ASM) $(AFLAGS) $*.asm,$(OBJ)\$*.obj ;
X
X$(GAME): $(GAMEFILE)
X
X$(GAME).exe: $(GAMEFILE)
X
X$(GAMEFILE): $(OBJ) $(HOBJ)
X	@echo Loading....
X	$(LINK) $(ROOT) $(OVERLAYS),$(GAMEFILE),$(GAME),$(CLIB) $(TERMLIB) $(LFLAGS) ;
X	@echo Nethack is up to date.
X
X$(OBJ):
X	if not exist .\$(OBJ)\*.* mkdir $(OBJ)
X
X#	The following 3 modules vary depending on what OS you are using.
X
X$(OBJ)\main.o:	$(HACK_H) $(TARG)main.c
X	$(CC) $(CFLAGS)  /Fo.\$(OBJ)\main.o $(TARG)main.c
X
X$(OBJ)\tty.o:	$(HACK_H) $(INCL)\func_tab.h $(TARG)tty.c
X	$(CC) $(CFLAGS)  /Fo.\$(OBJ)\tty.o  $(TARG)tty.c
X
X$(OBJ)\unix.0:	$(HACK_H) $(TARG)unix.c
X	$(CC) $(CFLAGS)  /DOVL0 /Fo.\$(OBJ)\unix.0 $(TARG)unix.c
X$(OBJ)\unix.12b:	$(HACK_H) $(TARG)unix.c
X	$(CC) $(CFLAGS)  /DOVL1 /DOVL2 /DOVLB /Fo.\$(OBJ)\unix.12b $(TARG)unix.c
X
X$(OBJ)\makedefs.o:	$(INCL)\config.h $(INCL)\permonst.h $(INCL)\objclass.h
X
Xmakedefs.exe:	$(MAKEOBJS)
X	$(LINK) $(LFLAGS) $(MAKEOBJS), makedefs.exe,, $(CLIB);
X
X#	Targets for the special levels compiler
X
Xlev_comp.c: lev_comp.y
X	$(MAKEBIN) do_yacc
X
Xlev_lex.c:  lev_comp.l
X	$(MAKEBIN) do_lex
X
Xyacc_msg:
X	@echo lev_comp.y has changed. To update lev_comp.c and lev_comp.h run YACC.
X
Xyacc_act:
X	$(YACC) -d lev_comp.y
X	copy $(YTABC) lev_comp.c
X	copy $(YTABH) $(INCL)\lev_comp.h
X	del $(YTABC)
X	del $(YTABH)
X
Xlex_msg:
X	@echo lev_comp.l has changed. To update lev_lex.c run LEX.
X
Xlex_act:
X	$(LEX) lev_comp.l
X	copy $(LEXYYC) lev_lex.c
X	del $(LEXYYC)
X
X#	This is stupid but since the default rule does not work here ...
X
X$(OBJ)\lev_comp.o:	$(HACK_H)   $(INCL)\sp_lev.h	lev_comp.c
X	$(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
X$(OBJ)\lev_lex.o:	$(HACK_H)   $(INCL)\sp_lev.h	$(INCL)\lev_comp.h \
X			lev_lex.c
X	$(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
X
Xlev_comp.exe:	$(SPLEVOBJS)
X	$(LINK) $(LFLAGS) $(SPLEVOBJS),lev_comp.exe,, $(CLIB);
X
X# *****************************************************************************
X# *************************  Makedefs Stuff ***********************************
X# *****************************************************************************
X#	The following include files depend on makedefs to be created.
X#	date.h should be remade any time any of the source or include code
X#	is modified.
X
X$(INCL)\date.h: $(VOBJ) makedefs.exe
X	.\makedefs -v
X
X$(INCL)\trap.h: 	makedefs.exe
X	.\makedefs -t
X
X$(INCL)\onames.h:	makedefs.exe
X	.\makedefs -o
X
X$(INCL)\pm.h:		makedefs.exe
X	.\makedefs -p
X
Xdata:	$(AUX)\data.bas makedefs.exe
X	.\makedefs -d
X
Xrumors: $(AUX)\rumors.tru $(AUX)\rumors.fal makedefs.exe
X	.\makedefs -r
X
X# *****************************************************************************
X# ************************ Secondary targets **********************************
X# *****************************************************************************
X
Xall:	install
X
Xinstall:	$(OBJ) lev_comp.exe $(GAMEFILE) auxil.tag install.tag
X	@echo Don't forget to check HACKDIR in nethack.cnf.
X	@echo Done.
X
X
X#	Watch Out!  This make cleans out the game & bones dirs!
X#	This will delete any config file you have and overwrite it
X#	with the default.
X#	Since the game options may have changed since your last install,
X#	you should say yes to clean the directory.
X
Xinstall.tag:
X	copy $(OTHERS)\termcap		$(GAMEDIR)
X	copy $(AUX)\*.			$(GAMEDIR)
X	copy $(OTHERS)\nethack.cnf	$(GAMEDIR)
X	echo install done > install.tag
X
Xspec_lev.tag: lev_comp.exe $(AUX)\castle.des $(AUX)\endgame.des $(AUX)\tower.des
X	lev_comp $(AUX)\castle.des
X	lev_comp $(AUX)\endgame.des
X	lev_comp $(AUX)\tower.des
X	copy castle $(GAMEDIR)
X	copy endgame $(GAMEDIR)
X	copy tower? $(GAMEDIR)
X	del castle
X	del endgame
X	del tower?
X	echo spec_lev done > spec_lev.tag
X
Xauxil.tag:	spec_lev.tag	data	rumors
X	echo special levels created > auxil.tag
X
Xclean:
X	del $(OBJ)\*.o
X	del $(OBJ)\*.0
X	del $(OBJ)\*.01
X	del $(OBJ)\*.012
X	del $(OBJ)\*.1
X	del $(OBJ)\*.12
X	del $(OBJ)\*.12b
X	del $(OBJ)\*.2
X	del $(OBJ)\*.2b
X	del $(OBJ)\*.b
X	del $(OBJ)\*.obj
X	rmdir $(OBJ)
X
Xspotless: clean
X	del $(INCL)\date.h
X	del $(INCL)\onames.h
X	del $(INCL)\pm.h
X	if exist makedefs.exe del makedefs.exe
X	if exist lev_comp.exe del lev_comp.exe
X	del castle
X	del endgame
X	del tower?
X	del *.bak
X	del *.tag
X	del *.map
X	del *.txt
X	del $(AUX)\data
X	del $(AUX)\rumors
X
X# *****************************************************************************
X# ************************* Other dependencies ********************************
X# *****************************************************************************
X# Other dependencies
X#
X# I deleted that line.	;-}
X
X$(OBJ)\allmain.o:	$(HACK_H)
X$(OBJ)\alloc.o: 	$(CONFIG_H)
X$(OBJ)\apply.o: 	$(HACK_H)   $(INCL)\edog.h
X$(OBJ)\artifact.o:	$(HACK_H)   $(INCL)\artifact.h
X$(OBJ)\attrib.o:	$(HACK_H)
X$(OBJ)\bones.o: 	$(HACK_H)
X$(OBJ)\cmd.o:		$(HACK_H)   $(INCL)\func_tab.h
X$(OBJ)\dbridge.o:	$(HACK_H)
X$(OBJ)\decl.o:		$(HACK_H)
X$(OBJ)\demon.o: 	$(HACK_H)
X$(OBJ)\do.o:		$(HACK_H)
X$(OBJ)\do_name.o:	$(HACK_H)
X$(OBJ)\do_wear.o:	$(HACK_H)
X$(OBJ)\dog.o:		$(HACK_H)   $(INCL)\edog.h
X$(OBJ)\dogmove.o:	$(HACK_H)   $(INCL)\mfndpos.h	 $(INCL)\edog.h
X$(OBJ)\dokick.o:	$(HACK_H)
X$(OBJ)\dothrow.o:	$(HACK_H)
X$(OBJ)\eat.o:		$(HACK_H)
X$(OBJ)\end.o:		$(HACK_H)   $(INCL)\eshk.h
X$(OBJ)\engrave.o:	$(HACK_H)
X$(OBJ)\exper.o: 	$(HACK_H)
X$(OBJ)\extralev.o:	$(HACK_H)
X$(OBJ)\fountain.o:	$(HACK_H)
X$(OBJ)\getline.o:	$(HACK_H)   $(INCL)\func_tab.h
X$(OBJ)\hack.o:		$(HACK_H)
X$(OBJ)\invent.o:	$(HACK_H)   $(INCL)\lev.h	 $(INCL)\wseg.h
X$(OBJ)\ioctl.o: 	$(HACK_H)
X$(OBJ)\lev_main.o:	$(HACK_H)   $(INCL)\sp_lev.h
X$(OBJ)\lock.o:		$(HACK_H)
X$(OBJ)\makemon.o:	$(HACK_H)
X$(OBJ)\mail.o:		$(HACK_H)
X$(OBJ)\mcastu.o:	$(HACK_H)
X$(OBJ)\mhitm.o: 	$(HACK_H)   $(INCL)\artifact.h
X$(OBJ)\mhitu.o: 	$(HACK_H)   $(INCL)\artifact.h	 $(INCL)\edog.h
X$(OBJ)\mklev.o: 	$(HACK_H)
X$(OBJ)\mkmaze.o:	$(HACK_H)
X$(OBJ)\mkobj.o: 	$(HACK_H)
X$(OBJ)\mkroom.o:	$(HACK_H)
X$(OBJ)\mon.o:		$(HACK_H)   $(INCL)\mfndpos.h	 $(INCL)\artifact.h
X$(OBJ)\mondata.o:	$(HACK_H)   $(INCL)\eshk.h	 $(INCL)\epri.h
X$(OBJ)\monmove.o:	$(HACK_H)   $(INCL)\mfndpos.h	 $(INCL)\artifact.h
X$(OBJ)\monst.o: 	$(CONFIG_H) $(PERMONST_H)	 $(INCL)\eshk.h     \
X			$(INCL)\epri.h $(INCL)\vault.h
X$(OBJ)\msdos.o: 	$(HACK_H)
X$(OBJ)\mthrowu.o:	$(HACK_H)
X$(OBJ)\music.o: 	$(HACK_H)
X$(OBJ)\o_init.o:	$(HACK_H)   $(INCL)\onames.h
X$(OBJ)\objects.o:	$(CONFIG_H) $(INCL)\obj.h	 $(INCL)\objclass.h \
X			$(INCL)\prop.h
X$(OBJ)\objnam.o:	$(HACK_H)
X$(OBJ)\options.o:	$(HACK_H)
X$(OBJ)\pager.o: 	$(HACK_H)
X$(OBJ)\panic.o: 	$(CONFIG_H)
X$(OBJ)\pickup.o:	$(HACK_H)
X$(OBJ)\polyself.o:	$(HACK_H)
X$(OBJ)\potion.o:	$(HACK_H)
X$(OBJ)\pray.o:		$(HACK_H)
X$(OBJ)\pri.o:		$(HACK_H)
X$(OBJ)\priest.o:	$(HACK_H)   $(INCL)\mfndpos.h	 $(INCL)\eshk.h \
X			$(INCL)\epri.h
X$(OBJ)\prisym.o:	$(HACK_H)   $(INCL)\lev.h	 $(INCL)\wseg.h
X$(OBJ)\random.o:
X$(OBJ)\read.o:		$(HACK_H)
X$(OBJ)\restore.o:	$(HACK_H)   $(INCL)\lev.h	 $(INCL)\wseg.h
X$(OBJ)\rip.o:		$(HACK_H)
X$(OBJ)\rnd.o:		$(HACK_H)
X$(OBJ)\rumors.o:	$(HACK_H)
X$(OBJ)\save.o:		$(HACK_H)   $(INCL)\lev.h	 $(INCL)\wseg.h
X$(OBJ)\search.o:	$(HACK_H)   $(INCL)\artifact.h
X$(OBJ)\shk.o:		$(HACK_H)   $(INCL)\eshk.h
X$(OBJ)\shknam.o:	$(HACK_H)   $(INCL)\eshk.h
X$(OBJ)\sit.o:		$(HACK_H)
X$(OBJ)\sounds.o:	$(HACK_H)   $(INCL)\edog.h	 $(INCL)\eshk.h
X$(OBJ)\sp_lev.o:	$(HACK_H)   $(INCL)\sp_lev.h
X$(OBJ)\spell.o: 	$(HACK_H)
X$(OBJ)\steal.o: 	$(HACK_H)
X$(OBJ)\termcap.o:	$(HACK_H)
X$(OBJ)\timeout.o:	$(HACK_H)
X$(OBJ)\topl.o:		$(HACK_H)
X$(OBJ)\topten.o:	$(HACK_H)
X$(OBJ)\track.o: 	$(HACK_H)
X$(OBJ)\trampoli.o:	$(HACK_H)
X$(OBJ)\trap.o:		$(HACK_H)   $(INCL)\edog.h
X$(OBJ)\u_init.o:	$(HACK_H)
X$(OBJ)\uhitm.o: 	$(HACK_H)   $(INCL)\artifact.h
X$(OBJ)\vault.o: 	$(HACK_H)   $(INCL)\vault.h
X$(OBJ)\version.o:	$(HACK_H)   $(INCL)\date.h
X$(OBJ)\weapon.o:	$(HACK_H)
X$(OBJ)\were.o:		$(HACK_H)
X$(OBJ)\wield.o: 	$(HACK_H)
X$(OBJ)\wizard.o:	$(HACK_H)
X$(OBJ)\worm.o:		$(HACK_H)   $(INCL)\wseg.h
X$(OBJ)\worn.o:		$(HACK_H)
X$(OBJ)\write.o: 	$(HACK_H)
X$(OBJ)\zap.o:		$(HACK_H)
END_OF_FILE
if test 19154 -ne `wc -c <'others/Makefile.ovl'`; then
    echo shar: \"'others/Makefile.ovl'\" unpacked with wrong size!
fi
# end of 'others/Makefile.ovl'
if test -f 'others/pcmain.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'others/pcmain.c'\" to \"'others/pcmain.c.orig'\"
  mv -f 'others/pcmain.c' 'others/pcmain.c.orig'
fi
echo shar: Extracting \"'others/pcmain.c'\" \(19050 characters\)
sed "s/^X//" >'others/pcmain.c' <<'END_OF_FILE'
X/*	SCCS Id: @(#)pcmain.c	3.0	90/01/19
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed.  See license for details. */
X/* main.c - PC, ST, and Amiga NetHack */
X#include "hack.h"
X
X#ifndef NO_SIGNAL
X#include <signal.h>
X#endif
X#include <ctype.h>
X#ifdef DGK
X#ifndef AMIGA
X#include <sys\stat.h>
X#endif
X#endif
X#ifdef MACOS
Xextern WindowPtr	HackWindow;
Xextern short *switches;
Xextern short macflags;
Xpascal boolean FDECL(startDlogFProc, (DialogPtr, EventRecord *, short *));
X#define msmsg mprintf
X#endif
X
X#if !defined(MACOS) && !defined(LATTICE)
Xchar orgdir[PATHLEN];
X#endif
Xchar SAVEF[FILENAME];
X#ifdef MSDOS
Xchar SAVEP[FILENAME];
X#endif
X
Xconst char *hname = "NetHack";	/* used for syntax messages */
X#if !defined(AMIGA) && !defined(MACOS)
Xchar obuf[BUFSIZ];	/* BUFSIZ is defined in stdio.h */
X#endif
Xint hackpid;		/* not used anymore, but kept in for save files */
X
X#if defined(DGK)
Xstruct finfo	zfinfo = ZFINFO;
Xint i;
X#endif /* DGK */
X
X#ifdef __TURBOC__	/* tell Turbo C to make a bigger stack */
Xextern unsigned _stklen = 0x2000;	/* 8K */
Xextern unsigned char _osmajor;
X#endif
X
X#ifdef TOS
Xextern long compiletime;
Xboolean run_from_desktop = TRUE;	/* should we pause before exiting?? */
X# ifdef __GNUC__
Xlong _stksize = 16*1024;
X# endif
X#endif
X
X#ifdef MACOS
X#  ifdef AZTEC
X#define OMASK	O_RDONLY
X#  else
X#define OMASK	(O_RDONLY | O_BINARY )
X#  endif
X# else
X#define OMASK	O_RDONLY
X#endif
X
X#ifdef MACOS
XBoolean justscores;
X#endif
X
X#ifdef AMIGA_WBENCH
Xextern int FromWBench;
X#endif
X
Xconst char *classes = "ABCEHKPRSTVW";
X
Xint
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	extern int x_maze_max, y_maze_max;
X	register int fd;
X	register char *dir;
X#ifndef AMIGA
X	int (*funcp)();
X#endif
X#ifdef TOS
X	long clock;
X# ifdef __GNUC__
X	extern int _unixmode;
X	_unixmode = 0;
X# endif
X#endif
X#ifdef __TURBOC__
X	if (_osmajor >= 3) hname = argv[0];	/* DOS 3.0+ */
X#endif
X#ifdef TOS
X	if (*argv[0]) {			/* only a CLI can give us argv[0] */
X		hname = argv[0];
X		run_from_desktop = FALSE;
X	}
X#endif
X#ifdef MACOS
X	AppFile	theFile;
X	short	message,numFiles;
X	SFReply	reply;
X
X	initterm(24,80);
X	ObscureCursor();
X# ifdef SMALLDATA
X	init_decl();
X# endif
X	/* user might have started up with a save file, so check */
X	CountAppFiles(&message,&numFiles);
X	if (!message && numFiles) {
X		message = 1;
X
X		while(message <= numFiles) {
X			GetAppFiles(message,&theFile);
X			ClrAppFiles(message);
X			if ((theFile.fType == SAVE_TYPE)||(theFile.fType == EXPLORE_TYPE))
X				break;
X			message++;
X		}
X		if ((theFile.fType == SAVE_TYPE)||(theFile.fType == EXPLORE_TYPE)) {
X			(void)strncpy(SAVEF, (char *)&theFile.fName[1],
X						(int)theFile.fName[0]);
X			(void)strncpy(plname, (char *)&theFile.fName[1],
X						(int)theFile.fName[0]);
X			SetVol(0,theFile.vRefNum);
X			SAVEF[(int)theFile.fName[0]] = '\0';
X			numFiles = 1;
X		} else
X			numFiles = 0;
X	}
X	switches = (short *)malloc((NROFOBJECTS+2) * sizeof(long));
X	for (fd = 0; fd < (NROFOBJECTS + 2); fd++)
X		switches[fd] = fd;
X#endif
X
X
X	/*
X	 *  Initialize screen I/O before anything is displayed.
X	 *
X	 *  startup() must be called before initoptions()
X	 *    due to ordering of graphics settings
X	 *  and before error(), due to use of termcap strings.
X	 */
X	gettty();
X#if !defined(AMIGA) && !defined(MACOS)
X	setbuf(stdout,obuf);
X#endif
X	startup();
X#if !defined(AMIGA) && !defined(MACOS)
X	/* Save current directory and make sure it gets restored when
X	 * the game is exited.
X	 */
X	if (getcwd(orgdir, sizeof orgdir) == NULL)
X		error("NetHack: current directory path too long");
X	funcp = (int (*)())exit; /* Kludge to get around LINT_ARGS of signal. */
X# ifndef NO_SIGNAL
X	signal(SIGINT, (SIG_RET_TYPE) funcp);	/* restore original directory */
X# endif
X#endif /* AMIGA || MACOS */
X
X#ifndef MACOS
X	if ((dir = getenv("HACKDIR")) != NULL) {
X		Strcpy(hackdir, dir);
X# ifdef CHDIR
X		chdirx (dir, 1);
X# endif
X	}
X#if defined(AMIGA) && defined(CHDIR)
X	/*
X	 * If we're dealing with workbench, change the directory.  Otherwise
X	 * we could get "Insert disk in drive 0" messages. (Must be done
X	 * before initoptions())....
X	 */
X	if(argc == 0)
X		chdirx(HACKDIR, 1);
X#endif
X
X# if defined(DGK)
X	/* zero "fileinfo" array to prevent crashes on level change */
X	for (i = 0 ; i <= MAXLEVEL; i++) {
X		fileinfo[i] = zfinfo;
X	}
X# endif /* DGK */
X
X	initoptions();
X#ifdef AMIGA_WBENCH
X	ami_wbench_init(argc,argv);
X#endif
X# if defined(TOS) && defined(TEXTCOLOR)
X	if (flags.IBMBIOS && flags.use_color)
X		set_colors();
X# endif
X	if (!hackdir[0])
X#if !defined(LATTICE) && !defined(AMIGA)
X		Strcpy(hackdir, orgdir);
X#else
X		Strcpy(hackdir, HACKDIR);
X#endif
X	if(argc > 1) {
X	    if (!strncmp(argv[1], "-d", 2)) {
X		argc--;
X		argv++;
X		dir = argv[0]+2;
X		if(*dir == '=' || *dir == ':') dir++;
X		if(!*dir && argc > 1) {
X			argc--;
X			argv++;
X			dir = argv[0];
X		}
X		if(!*dir)
X		    error("Flag -d must be followed by a directory name.");
X		Strcpy(hackdir, dir);
X	    } else
X
X	/*
X	 * Now we know the directory containing 'record' and
X	 * may do a prscore().
X	 */
X	    if (!strncmp(argv[1], "-s", 2)) {
X# ifdef CHDIR
X		chdirx(hackdir,0);
X# endif
X		prscore(argc, argv);
X		exit(0);
X	    }
X	}
X#else
X	initoptions();
X#endif	/* MACOS /* */
X
X	/*
X	 * It seems you really want to play.
X	 */
X	setrandom();
X	cls();
X#ifdef TOS
X	if ((unsigned long)time(&clock) < (unsigned long)compiletime)
X		error("Your clock is incorrectly set!");
X#endif
X	u.uhp = 1;	/* prevent RIP on early quits */
X	u.ux = FAR;	/* prevent nscr() */
X
X	/*
X	 * Find the creation date of this game,
X	 * so as to avoid restoring outdated savefiles.
X	 */
X	/* gethdate(hname); */
X
X	/*
X	 * We cannot do chdir earlier, otherwise gethdate will fail.
X	 */
X#ifdef CHDIR
X	chdirx(hackdir,1);
X#endif
X
X#ifndef MACOS
X	/*
X	 * Process options.
X	 */
X	while(argc > 1 && argv[1][0] == '-'){
X		argv++;
X		argc--;
X		switch(argv[0][1]){
X#if defined(WIZARD) || defined(EXPLORE_MODE)
X# ifndef EXPLORE_MODE
X		case 'X':
X# endif
X		case 'D':
X# ifdef WIZARD
X			/* Must have "name" set correctly by NETHACK.CNF,
X			 * NETHACKOPTIONS, or -u
X			 * before this flag to enter wizard mode. */
X#  ifdef KR1ED
X			if(!strcmp(plname, WIZARD_NAME)) {
X#  else
X			if(!strcmp(plname, WIZARD)) {
X#  endif
X				wizard = TRUE;
X				break;
X			}
X			/* otherwise fall thru to discover */
X# endif
X# ifdef EXPLORE_MODE
X		case 'X':
X			discover = TRUE;
X# endif
X			break;
X#endif
X#ifdef NEWS
X		case 'n':
X			flags.nonews = TRUE;
X			break;
X#endif
X		case 'u':
X			if(argv[0][2])
X			  (void) strncpy(plname, argv[0]+2, sizeof(plname)-1);
X			else if(argc > 1) {
X			  argc--;
X			  argv++;
X			  (void) strncpy(plname, argv[0], sizeof(plname)-1);
X			} else
X				Printf("Player name expected after -u\n");
X			break;
X#ifdef DGK
X		/* Player doesn't want to use a RAM disk
X		 */
X		case 'r':
X			ramdisk = FALSE;
X			break;
X#endif
X		default:
X			if (index(classes, toupper(argv[0][1]))) {
X				/* allow -T for Tourist, etc. */
X				(void) strncpy(pl_character, argv[0]+1,
X					       sizeof(pl_character)-1);
X				break;
X			} else Printf("\nUnknown switch: %s\n", argv[0]);
X		case '?':
XPrintf("\nUsage: %s [-d dir] -s [-[%s]] [maxrank] [name]...", hname, classes);
XPrintf("\n       or");
XPrintf("\n       %s [-d dir] [-u name] [-[%s]]", hname, classes);
X#if defined(WIZARD) || defined(EXPLORE_MODE)
X			Printf(" [-[DX]]");
X#endif
X#ifdef NEWS
X			Printf(" [-n]");
X#endif
X#ifdef DGK
X			Printf(" [-r]");
X#endif
X			putchar('\n');
X			return 0;
X		}
X	}
X#ifdef AMIGA_WBENCH
X	ami_wbench_args();
X#endif
X#ifdef DGK
X	set_lock_and_bones();
X	copybones(FROMPERM);
X#endif
X#ifdef WIZARD
X	if (wizard)
X		Strcpy(plname, "wizard");
X	else
X#endif
X	if (!*plname)
X		askname();
X	plnamesuffix();		/* strip suffix from name; calls askname() */
X				/* again if suffix was whole name */
X				/* accepts any suffix */
X#ifndef DGK
X	Strcpy(lock,plname);
X	Strcat(lock,".99");
X#endif
X#endif /* MACOS */
X	start_screen();
X
X	/*
X	 * Initialisation of the boundaries of the mazes
X	 * Both boundaries have to be even.
X	 */
X
X	x_maze_max = COLNO-1;
X	if (x_maze_max % 2)
X		x_maze_max--;
X	y_maze_max = ROWNO-1;
X	if (y_maze_max % 2)
X		y_maze_max--;
X
X	/* initialize static monster strength array */
X	init_monstr();
X#ifdef MACOS
X	if (!numFiles) {
X		askname();
X		if(justscores){
X			prscore(1,&classes);
X			exit(0);
X		}
X#endif
X#if defined(AMIGA) || defined(MACOS)
X# ifdef AMIGA_WBENCH
X	if(!FromWBench)
X# endif
X	(void) strncat(SAVEF, plname, 31-4);
X#else
X	{
X		int ix = strlen(SAVEF);
X		(void)strncat(SAVEF, plname, 8);
X		regularize(SAVEF+ix);
X	}
X#endif
X#ifndef MACOS
X# ifdef AMIGA_WBENCH
X	if(!FromWBench)
X# endif
X	Strcat(SAVEF, ".sav");
X#else
X	}
X	Strcpy(lock,plname);
X	Strcat(lock,".99");
X#endif
X	cls();
X	if (
X#ifdef DGK
X# ifdef AMIGA_WBENCH
X	    (FromWBench?1:saveDiskPrompt(1)) &&
X# else
X	    saveDiskPrompt(1) &&
X# endif
X#endif /* DGK */
X#ifdef AMIGA_WBENCH
X	    ((fd=ami_wbench_getsave(OMASK)) >=0) &&
X#else
X	    ((fd = open(SAVEF, OMASK)) >= 0) &&
X#endif
X	   /* if not up-to-date, quietly unlink file via false condition */
X	   (uptodate(fd) || unlink(SAVEF) == 666)) {
X#ifdef WIZARD
X		/* Since wizard is actually flags.debug, restoring might
X		 * overwrite it.
X		 */
X		boolean remember_wiz_mode = wizard;
X#endif
X#ifndef NO_SIGNAL
X		(void) signal(SIGINT, (SIG_RET_TYPE) done1);
X#endif
X		pline("Restoring save file...");
X		(void) fflush(stdout);
X		if(!dorecover(fd))
X			goto not_recovered;
X#ifdef WIZARD
X		if(!wizard && remember_wiz_mode) wizard = TRUE;
X#endif
X		pline("Hello %s, welcome to NetHack!", plname);
X		/* get shopkeeper set properly if restore is in shop */
X		(void) inshop();
X#ifdef EXPLORE_MODE
X		if (discover)
X			You("are in non-scoring discovery mode.");
X#endif
X#if defined(EXPLORE_MODE) || defined(WIZARD)
X		if (discover || wizard) {
X			pline("Do you want to keep the save file? ");
X			if(yn() == 'n'){
X				(void) unlink(SAVEF);
X#ifdef AMIGA_WBENCH
X				ami_wbench_unlink(SAVEF);
X#endif
X			}
X		}
X#endif
X		flags.move = 0;
X	} else {
Xnot_recovered:
X		newgame();
X		/* give welcome message before pickup messages */
X		pline("Hello %s, welcome to NetHack!", plname);
X#ifdef EXPLORE_MODE
X		if (discover)
X			You("are in non-scoring discovery mode.");
X#endif
X		flags.move = 0;
X		set_wear();
X		pickup(1);
X		read_engr_at(u.ux,u.uy);
X	}
X	
X#ifdef MACOS
X	{
X		short	i;
X		MenuHandle	theMenu;
X		Rect	screen;
X		
X		theMenu = GetMHandle(appleMenu);
X		EnableItem(theMenu, 0);
X		EnableItem(theMenu, 1);
X		theMenu = GetMHandle(fileMenu);
X		EnableItem(theMenu,0);
X		for (i = inventMenu;i <= extendMenu; i++) {
X			theMenu = GetMHandle(i);
X			EnableItem(theMenu, 0);
X		}
X		DrawMenuBar();
X		macflags |= fDoUpdate;
X		SetPort(HackWindow);
X		screen = HackWindow->portRect;
X		ValidRect(&screen);
X		
X	}
X#endif
X			
X	flags.moonphase = phase_of_the_moon();
X	if(flags.moonphase == FULL_MOON) {
X		You("are lucky!  Full moon tonight.");
X		if(!u.uluck) change_luck(1);
X	} else if(flags.moonphase == NEW_MOON) {
X		pline("Be careful!  New moon tonight.");
X	}
X
X	initrack();
X#ifndef NO_SIGNAL
X	(void) signal(SIGINT, SIG_IGN);
X#endif
X#ifdef OS2
X	gettty(); /* somehow ctrl-P gets turned back on during startup ... */
X#endif
X
X	moveloop();
X#ifdef MACOS 
X	/* Help for Mac compilers */
X	free_decl();
X#endif
X	return 0;
X}
X
X
X/*
X * plname is filled either by an option (-u Player  or  -uPlayer) or
X * explicitly (by being the wizard) or by askname.
X * It may still contain a suffix denoting pl_character.
X */
Xvoid
Xaskname() {
X#ifndef MACOS
X	register int c, ct;
X
X	Printf("\nWho are you? ");
X	(void) fflush(stdout);
X	ct = 0;
X	while((c = Getchar()) != '\n') {
X		if(c == EOF) error("End of input\n");
X		/* some people get confused when their erase char is not ^H */
X		if(c == '\b') {
X			if(ct) {
X				ct--;
X#ifdef MSDOS
X				msmsg("\b \b");
X#endif
X			}
X			continue;
X		}
X		if(ct < sizeof(plname)-1) {
X#if defined(MSDOS)
X			msmsg("%c", c);
X#endif
X			plname[ct++] = c;
X		}
X	}
X	plname[ct] = 0;
X	if(ct == 0) askname();
X}
X#else /* MACOS */
X/* Macintosh startup Dialog written by Andy Swanson 10/20/89
X		modified for to include a few more options 12/17/89 */
X	DialogPtr asknameDlog;
X	DialogTHndl	th, centreDlgBox();
X	int kind;
X	Rect box;
X	Handle knob;
X	Boolean Done;
X	int chtype = 0,Hit,i;
X	Str255 ptemp;
X	char *p;
X#define OK 1
X#define NAME_TEXT 3
X#define RADIO_MIN 5
X#define RADIO_MAX 17
X#define CAVEPERSON 7
X#define CLERGY 11
X#define VALKYRIE 15
X#define ANY 17
X#define WIZ 18
X#define EXP 19
X#define FEM 20
X#define NEWS_BOX 21
X#define SCORES 22
X#define setCheckBox(a,b,c) {GetDItem(a,b,&kind,&knob,&box);SetCtlValue(knob,c?1:0);}
X#define changeRadio(a,b,c) {setCheckBox(a,b,FALSE); setCheckBox(a,c,TRUE);}
X#define Disable(b) {GetDItem(asknameDlog,b,&kind,&knob,&box);HiliteControl(knob,255);}
X#define Enable(b) {GetDItem(asknameDlog,b,&kind,&knob,&box);HiliteControl(knob,0);}
X#define Hide(b)  {GetDItem(asknameDlog,b,&kind,&knob,&box);HideControl(knob);\
X			SetDItem(asknameDlog,b,kind+128,knob,&box);}
X	justscores = FALSE;
X	if(p=strrchr((char *)plname, '-')){
X		*p = 0;
X		if(('a'<= p[1]) && ('z'>= p[1]))p[1] += 'A' - 'a';
X		pl_character[0] = p[1];
X		pl_character[1] = 0;
X		if(chtype = (int)index(classes,p[1]))
X			chtype -= (int)(classes)-1;
X		if(p[1] == 'V')
X			flags.female = TRUE;
X	}
X	if(chtype != 0) chtype += 4;
X	else chtype = 17;
X#ifdef THINKC4
X	if(!*plname && (p = getlogin()))
X		(void) strncpy((char *)&plname,p,sizeof(plname)-1);
X#endif
X	th = centreDlgBox(131, FALSE);
X	
X	asknameDlog = GetNewDialog(131,0,-1);
X	
X	ReleaseResource((Handle)th);
X	if(*plname){
X		GetDItem(asknameDlog,NAME_TEXT,&kind,&knob,&box);
X		strncpy((char*)ptemp,(char*)&plname,255);
X		CtoPstr((char*)ptemp);
X		SetIText(knob,ptemp);
X	}
X	GetDItem(asknameDlog,chtype,&kind,&knob,&box);
X	SetCtlValue(knob,1);
X	if(flags.female){
X		setCheckBox(asknameDlog,FEM,TRUE);
X		changeDgenders(asknameDlog,TRUE);
X	}
X#ifdef NEWS
X	setCheckBox(asknameDlog,NEWS_BOX,!flags.nonews);
X#else
X	Hide(NEWS_BOX);
X#endif
X#ifdef WIZARD
X	wizard = FALSE;
X# ifdef KR1ED
X	if (strcmp(plname,WIZARD_NAME)) {
X# else
X	if (strcmp(plname,WIZARD)) {
X# endif
X#else
X	{
X#endif
X		Hide(WIZ);
X	}
X#ifdef EXPLORE_MODE
X	setCheckBox(asknameDlog,EXP,discover);
X#else
X		Hide(EXP);
X#endif
X	SelIText(asknameDlog, NAME_TEXT, 0, 32767);
X	ShowWindow(asknameDlog);
X	Done = FALSE;
X	while (!Done){
X		ModalDialog(startDlogFProc, &Hit);
X		if(Hit == OK){
X			Done = TRUE;
X			GetDItem(asknameDlog,NAME_TEXT,&kind,&knob,&box);
X			GetIText(knob,&ptemp);
X			PtoCstr((char*)ptemp);
X			(void) strncpy((char*)&plname,(char*)ptemp,sizeof(plname)-1);
X			pl_character[0]=classes[chtype-5];
X			pl_character[1]=0;
X			HideWindow(asknameDlog);
X		} else if((Hit >= RADIO_MIN) && (Hit <= RADIO_MAX)){
X			extern int lastDlgBut;
X			
X			changeRadio(asknameDlog,chtype,Hit);
X			lastDlgBut = chtype = Hit;
X			if ((chtype == VALKYRIE) && !flags.female) {
X				flags.female = TRUE;
X				setCheckBox(asknameDlog,FEM,flags.female);
X				changeDgenders(asknameDlog,TRUE);
X			}
X		} else if(Hit == WIZ) {
X			wizard = !wizard;
X			setCheckBox(asknameDlog,WIZ,wizard);
X		} else if(Hit == EXP) {
X			discover = !discover;
X			setCheckBox(asknameDlog,EXP,discover);
X		} else if(Hit == FEM) {
X			flags.female = !flags.female;
X			setCheckBox(asknameDlog,FEM,flags.female);
X			if(chtype == VALKYRIE) {
X				chtype = ANY;
X				changeRadio(asknameDlog,VALKYRIE,ANY);
X			}
X			changeDgenders(asknameDlog,flags.female);
X		} else if(Hit == NEWS_BOX) {
X			flags.nonews = !flags.nonews;
X			setCheckBox(asknameDlog,NEWS_BOX,!flags.nonews);
X		} else if(Hit == SCORES) {
X			justscores = !justscores;
X			setCheckBox(asknameDlog,SCORES,justscores);
X			if(justscores) for (i=RADIO_MIN;i<SCORES;i++) {
X				Disable(i);
X				}
X			else for (i=RADIO_MIN;i<SCORES;i++)
X				Enable(i);
X		}
X	}
X	DisposDialog(asknameDlog);
X}
X
X
X#define RADIO_STRING "ABCEHKPRSTVWL"
Xint	lastDlgBut = ANY;
X
X/* The filterProc for handling character selection from keyboard
X   by h+@nada.kth.se                                             */
Xpascal boolean
XstartDlogFProc(theDialog, theEvent, itemHit)
XDialogPtr theDialog;
XEventRecord * theEvent;
Xshort * itemHit;
X{
X	int x, c;
X
X	if(theEvent->what == keyDown) {
X		c = theEvent->message & 0xFF;
X#ifdef BETA /* We don't want this is no shipped version */
X		if(c == '#') Debugger();
X#endif
X		if(c == 10 || c == 13 || c == 3) { /* Accept */
X			*itemHit = OK;
X			return TRUE;
X		}
X		if(c == '\t' || c == ' ') { /* Select */
X			lastDlgBut++;
X			if(lastDlgBut > RADIO_MAX) lastDlgBut = RADIO_MIN;
X			*itemHit = lastDlgBut;
X			return TRUE;
X		}
X		if(theEvent->modifiers & cmdKey) {
X			if(c >= 'a' && c <= 'z') c &= 0x5F; /* Uppercase */
X			switch(c) {
X			case 'F' :
X				*itemHit = FEM;
X				return TRUE;
X			case 'X' :
X				*itemHit = EXP;
X				return TRUE;
X			case 'N' :
X				*itemHit = NEWS_BOX;
X				return TRUE;
X			case 'J' :
X				*itemHit = SCORES;
X				return TRUE;
X			default :
X				for(x=0; RADIO_STRING[x]; x++) {
X					if(c == RADIO_STRING[x]) {
X						*itemHit = x + RADIO_MIN;
X						return TRUE;
X					}
X				}
X			}
X			theEvent->what = nullEvent;
X		}
X	}
X
X	return FALSE;
X}
X
X
XchangeDgenders(Dlog,fem)
XDialogPtr Dlog;
XBoolean fem;
X{	int kind;
X	Rect box;
X	Handle knob;
X	Str255 ptemp;
X	if(fem){
X		GetDItem(Dlog,CAVEPERSON,&kind,&knob,&box);
X		strncpy((char*)ptemp,"Cave-Woman",255);
X		CtoPstr((char*)ptemp);
X		SetCTitle(knob,ptemp);
X		GetDItem(Dlog,CLERGY,&kind,&knob,&box);
X		strncpy((char*)ptemp,"Priestess",255);
X		CtoPstr((char*)ptemp);
X		SetCTitle(knob,ptemp);
X	} else {
X		GetDItem(Dlog,CAVEPERSON,&kind,&knob,&box);
X		strncpy((char*)ptemp,"Cave-Man",255);
X		CtoPstr((char*)ptemp);
X		SetCTitle(knob,ptemp);
X		GetDItem(Dlog,CLERGY,&kind,&knob,&box);
X		strncpy((char*)ptemp,"Priest",255);
X		CtoPstr((char*)ptemp);
X		SetCTitle(knob,ptemp);
X	}
X}
X#endif /* MACOS */
X
X
X#ifdef CHDIR
Xvoid
Xchdirx(dir, wr)
Xchar *dir;
Xboolean wr;
X{
X#ifdef AMIGA
X	static char thisdir[] = "";
X#else
X	static char thisdir[] = ".";
X#endif
X	if(dir && chdir(dir) < 0) {
X		error("Cannot chdir to %s.", dir);
X	}
X
X	/* Change the default drive as well.
X	 */
X#ifndef AMIGA
X	chdrive(dir);
X#endif
X
X	/* warn the player if we can't write the record file */
X	/* perhaps we should also test whether . is writable */
X	/* unfortunately the access systemcall is worthless */
X	if(wr) {
X	    register int fd;
X
X	    if(dir == NULL)
X		dir = thisdir;
X#ifdef OS2_CODEVIEW  /* explicit path on opening for OS/2 */
X	    {
X	    char tmp[PATHLEN];
X
X	    Strcpy(tmp, dir);
X	    append_slash(tmp);
X	    Strcat(tmp, RECORD);
X	    if((fd = open(tmp, O_RDWR)) < 0) {
X#else
X	    if((fd = open(RECORD, O_RDWR)) < 0) {
X#endif
X#ifdef DGK
X# ifndef OS2_CODEVIEW
X		char tmp[PATHLEN];
X
X		Strcpy(tmp, dir);
X		append_slash(tmp);
X# endif
X		/* try to create empty record */
X
X# ifdef OS2_CODEVIEW
X		if((fd = open(tmp, O_CREAT|O_RDWR, S_IREAD|S_IWRITE)) < 0) {
X		    msmsg("Warning: cannot write %s\n", tmp);
X# else
X# ifdef AZTEC_C
X		/* Aztec doesn't use the third argument */
X		if((fd = open(RECORD, O_CREAT|O_RDWR)) < 0) {
X		    msmsg("Warning: cannot write %s%s\n", tmp, RECORD);
X# else
X  		if((fd = open(RECORD, O_CREAT|O_RDWR, S_IREAD|S_IWRITE)) < 0) {
X		    msmsg("Warning: cannot write %s%s\n", tmp, RECORD);
X# endif
X# endif
X		    getreturn("to continue");
X		} else
X		    (void) close(fd);
X#else
X		Printf("Warning: cannot write %s/%s", dir, RECORD);
X		getret();
X#endif
X	    } else
X		(void) close(fd);
X#ifdef OS2_CODEVIEW
X	    }
X#endif
X	}
X}
X#endif /* CHDIR /**/
END_OF_FILE
if test 19050 -ne `wc -c <'others/pcmain.c'`; then
    echo shar: \"'others/pcmain.c'\" unpacked with wrong size!
fi
# end of 'others/pcmain.c'
if test -f 'src/vault.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'src/vault.c'\" to \"'src/vault.c.orig'\"
  mv -f 'src/vault.c' 'src/vault.c.orig'
fi
echo shar: Extracting \"'src/vault.c'\" \(11389 characters\)
sed "s/^X//" >'src/vault.c' <<'END_OF_FILE'
X/*	SCCS Id: @(#)vault.c	3.0	88/10/25
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed.  See license for details. */
X
X#include "hack.h"
X#include "vault.h"
X
Xstatic void FDECL(restfakecorr,(struct monst *));
XOSTATIC boolean FDECL(in_vault,(int,int));
XOSTATIC struct monst *NDECL(findgd);
Xstatic boolean FDECL(in_fcorridor, (struct monst *,int,int));
X
X#ifdef OVLB
X
Xstatic void
Xrestfakecorr(grd) 
Xregister struct monst *grd;
X{
X	register int fcx, fcy, fcbeg;
X	register struct rm *crm;
X
X	while((fcbeg = EGD(grd)->fcbeg) < EGD(grd)->fcend) {
X		fcx = EGD(grd)->fakecorr[fcbeg].fx;
X		fcy = EGD(grd)->fakecorr[fcbeg].fy;
X		if((u.ux == fcx && u.uy == fcy) || cansee(fcx,fcy) ||
X		   m_at(fcx,fcy))
X			return;
X		crm = &levl[fcx][fcy];
X		crm->typ = EGD(grd)->fakecorr[fcbeg].ftyp;
X		if(!crm->typ) crm->seen = 0;
X		newsym(fcx,fcy);
X		if(cansee(fcx,fcy)) prl(fcx,fcy);
X		EGD(grd)->fcbeg++;
X	}
X	/* it seems he left the corridor - let the guard disappear */
X	mongone(grd);
X}
X
Xstatic boolean
Xin_fcorridor(grd, x, y)
Xregister struct monst *grd;
Xint x, y; 
X{
X	register int fci;
X
X	for(fci = EGD(grd)->fcbeg; fci < EGD(grd)->fcend; fci++)
X		if(x == EGD(grd)->fakecorr[fci].fx &&
X				y == EGD(grd)->fakecorr[fci].fy)
X			return(TRUE);
X	return(FALSE);
X}
X
XXSTATIC 
Xstruct monst *
Xfindgd() {
X
X	register struct monst *mtmp;
X
X	for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X	    if(mtmp->isgd && EGD(mtmp)->gdlevel == dlevel)
X		return(mtmp);
X	return((struct monst *)0);
X}
X
X#endif /* OVLB */
X#ifdef OVL0
X
XXSTATIC
Xboolean
Xin_vault(x, y)
Xint x, y;
X{
X    register int roomno = inroom(x, y);
X
X    if(roomno < 0) return(FALSE);
X    return(rooms[roomno].rtype == VAULT);
X}
X
Xvoid
Xinvault() {
X
X#ifdef BSD_43_BUG
X    int dummy;		/* hack to avoid schain botch */
X#endif
X    struct monst *guard;
X
X    if(!in_vault(u.ux, u.uy)) {
X	u.uinvault = 0;
X	return;
X    }
X
X    guard = findgd();
X    if(++u.uinvault % 30 == 0 && !guard) { /* if time ok and no guard now. */
X	char buf[BUFSZ];
X	register int x, y, dd, gx, gy;
X
X	/* first find the goal for the guard */
X	for(dd = 1; (dd < ROWNO || dd < COLNO); dd++) {
X	  for(y = u.uy-dd; y <= u.uy+dd; y++) {
X	    if(y < 0 || y > ROWNO-1) continue;
X	    for(x = u.ux-dd; x <= u.ux+dd; x++) {
X	      if(y != u.uy-dd && y != u.uy+dd && x != u.ux-dd)
X		x = u.ux+dd;
X	      if(x < 0 || x > COLNO-1) continue;
X	      if(levl[x][y].typ == CORR) goto fnd;
X	    }
X	  }
X	}
X	impossible("Not a single corridor on this level??");
X	tele();
X	return;
Xfnd:
X	gx = x; gy = y;
X
X	/* next find a good place for a door in the wall */
X	x = u.ux; y = u.uy;
X	while(levl[x][y].typ == ROOM) {
X		register int dx,dy;
X
X		dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;
X		dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;
X		if(abs(gx-x) >= abs(gy-y))
X			x += dx;
X		else
X			y += dy;
X	}
X
X	/* make something interesting happen */
X	if(!(guard = makemon(&mons[PM_GUARD], x, y))) return;
X	guard->isgd = 1;
X	guard->mpeaceful = 1;
X	EGD(guard)->gddone = 0;
X	EGD(guard)->ogx = x;
X	EGD(guard)->ogy = y;
X	EGD(guard)->gdlevel = dlevel;
X	EGD(guard)->warncnt = 0;
X
X	if(!cansee(guard->mx, guard->my)) {
X		mongone(guard);
X		return;
X	}
X
X	reset_faint();			/* if fainted - wake up */
X	pline("Suddenly one of the Vault's guards enters!");
X	pmon(guard);
X	stop_occupation();		/* if occupied, stop it *now* */
X	do {
X		pline("\"Hello stranger, who are you?\" - ");
X		getlin(buf);
X	} while (!letter(buf[0]));
X
X	if(!strcmp(buf, "Croesus") || !strcmp(buf, "Kroisos")) {
X		verbalize("Oh, yes, of course.  Sorry to have disturbed you.");
X		mongone(guard);
X		return;
X	}
X	clrlin();
X	verbalize("I don't know you.");
X	if(!u.ugold)
X	    verbalize("Please follow me.");
X	else {
X	    verbalize("Most likely all that gold was stolen from this vault.");
X	    verbalize("Please drop that gold and follow me.");
X	}
X	EGD(guard)->gdx = gx;
X	EGD(guard)->gdy = gy;
X	EGD(guard)->fcbeg = 0;
X	EGD(guard)->fakecorr[0].fx = x;
X	EGD(guard)->fakecorr[0].fy = y;
X	EGD(guard)->fakecorr[0].ftyp = levl[x][y].typ;
X	levl[x][y].typ = DOOR;
X	levl[x][y].doormask = D_NODOOR;
X	EGD(guard)->fcend = 1;
X	EGD(guard)->warncnt = 1;
X    }
X}
X
X#endif /* OVL0 */
X#ifdef OVLB
X
X/*
X * return  1: he moved,  0: he didn't,  -1: let m_move do it,  -2: died
X */
Xint
Xgd_move(grd)
Xregister struct monst *grd;
X{
X	int x, y, nx, ny, m, n;
X	int dx, dy, gx, gy, i, fci;
X	uchar typ;
X	struct fakecorridor *fcp;
X	register struct rm *crm;
X	register struct gold *gold;
X	register boolean goldincorridor = FALSE;
X
X#ifdef __GNULINT__
X	m = n = 0;
X#endif
X	if(EGD(grd)->gdlevel != dlevel) return(-1);
X	if(!grd->mpeaceful && in_vault(grd->mx, grd->my) &&
X			!in_vault(u.ux, u.uy)) {
X		rloc(grd);
X		goto letknow;
X	}
X	if(!grd->mpeaceful) return(-1);
X	if(abs(EGD(grd)->ogx - grd->mx) > 1 || 
X			abs(EGD(grd)->ogy - grd->my) > 1)
X		return(-1);	/* teleported guard - treat as monster */
X	if(EGD(grd)->fcend == 1) {
X	    if(in_vault(u.ux, u.uy) && 
X			(u.ugold || um_dist(grd->mx, grd->my, 1))) {
X		if(EGD(grd)->warncnt == 3)
X			pline("\"Again, %sfollow me!\"", 
X				u.ugold ? "drop that gold and " : "");
X		if(EGD(grd)->warncnt == 6) {
X			register int m = grd->mx, n = grd->my;
X			verbalize("You've been warned, knave!");
X			mnexto(grd);
X			levl[m][n].typ = EGD(grd)->fakecorr[0].ftyp;
X			newsym(m,n);
X			if(cansee(m,n)) prl(m,n);
X			grd->mpeaceful = 0;
X			return(-1);
X		}
X		/* not fair to get mad when (s)he's fainted */
X		if(!is_fainted()) EGD(grd)->warncnt++;
X		return(0);
X	    }
X	    if(!in_vault(u.ux,u.uy) && u.ugold) { /* player teleported */
X		register int m = grd->mx, n = grd->my;
X		rloc(grd);
X		levl[m][n].typ = EGD(grd)->fakecorr[0].ftyp;
X		newsym(m,n);
X		if(!Blind) prl(m,n);
X		grd->mpeaceful = 0;
Xletknow:
X		if(!cansee(grd->mx, grd->my))
X		    You("hear the shrill sound of a guard's whistle.");
X		else
X		    You(um_dist(grd->mx, grd->my, 2) ?
X			"see an angry %s approaching." :
X			"are confronted by an angry %s.",
X			lmonnam(grd)+4);
X		return(-1);
X	    }
X	}
X	if(u.ugold && (in_fcorridor(grd, u.ux, u.uy) || /*cover 'blind' spot*/
X		    (EGD(grd)->fcend > 1 && in_vault(u.ux, u.uy)))) {
X		if(EGD(grd)->warncnt < 6) {
X			EGD(grd)->warncnt = 6;
X			verbalize("Drop all your gold, scoundrel!");
X			return(0);
X		} else {
X			verbalize("So be it, rogue!");
X			grd->mpeaceful = 0;
X			return(-1);
X		}	
X	} 
X	for(fci = EGD(grd)->fcbeg; fci < EGD(grd)->fcend; fci++)
X	    if(g_at(EGD(grd)->fakecorr[fci].fx, EGD(grd)->fakecorr[fci].fy)){
X		m = EGD(grd)->fakecorr[fci].fx;
X		n = EGD(grd)->fakecorr[fci].fy;
X		goldincorridor = TRUE; 
X	    }
X	if(goldincorridor && !EGD(grd)->gddone) {
X		x = grd->mx;
X		y = grd->my;
X		if(m == x && n == y) mpickgold(grd);
X		else if(m == u.ux && n == u.uy) {
X		    gold = g_at(u.ux, u.uy);
X 		    grd->mgold += gold->amount;
X		    freegold(gold);
X		} else {
X		    /* just for insurance... */
X		    if(MON_AT(m, n) && m != grd->mx && n != grd->my) {
X			verbalize("Out of my way, scum!");
X			rloc(m_at(m, n));
X		    }
X		    remove_monster(grd->mx, grd->my);
X		    place_monster(grd, m, n);
X		    pmon(grd);
X		    mpickgold(grd);
X		}
X		pline("The %s%s picks the gold.", lmonnam(grd)+4,
X				grd->mpeaceful ? " calms down and" : "");
X		if(x != grd->mx || y != grd->my) {
X		    remove_monster(grd->mx, grd->my);
X		    place_monster(grd, x, y);
X		    pmon(grd);
X		}
X		goldincorridor = FALSE;
X		if(!grd->mpeaceful) return(-1);
X		else {
X		    EGD(grd)->warncnt = 5;
X		    return(0);
X		}
X	}
X	if(um_dist(grd->mx, grd->my, 1) || EGD(grd)->gddone) {
X		restfakecorr(grd);
X		return(0);	/* didn't move */
X	}
X	x = grd->mx;
X	y = grd->my;
X	/* look around (hor & vert only) for accessible places */
X	for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) {
X	  if((nx == x || ny == y) && (nx != x || ny != y) && isok(nx, ny)) {
X
X	    typ = (crm = &levl[nx][ny])->typ;
X	    if(!IS_STWALL(typ) && !IS_POOL(typ)) {
X
X		for(i = EGD(grd)->fcbeg; i < EGD(grd)->fcend; i++)
X		    if(EGD(grd)->fakecorr[i].fx == nx && 
X				EGD(grd)->fakecorr[i].fy == ny)
X			goto nextnxy;
X
X		if((i = inroom(nx,ny)) >= 0 && rooms[i].rtype == VAULT)
X			continue;
X
X		/* seems we found a good place to leave him alone */
X		EGD(grd)->gddone = 1;
X		if(ACCESSIBLE(typ)) goto newpos;
X#ifdef STUPID
X		if (typ == SCORR)
X		    crm->typ = CORR;
X		else
X		    crm->typ = DOOR;
X#else
X		crm->typ = (typ == SCORR) ? CORR : DOOR;
X#endif
X		if(crm->typ == DOOR) crm->doormask = D_NODOOR;
X		goto proceed;
X	    }
X	  }
Xnextnxy:	;
X	}
X	nx = x;
X	ny = y;
X	gx = EGD(grd)->gdx;
X	gy = EGD(grd)->gdy;
X	dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;
X	dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;
X	if(abs(gx-x) >= abs(gy-y)) nx += dx; else ny += dy;
X
X	while((typ = (crm = &levl[nx][ny])->typ) != 0) {
X	/* in view of the above we must have IS_WALL(typ) or typ == POOL */
X	/* must be a wall here */
X		if(isok(nx+nx-x,ny+ny-y) && !IS_POOL(typ) &&
X		    SPACE_POS(levl[nx+nx-x][ny+ny-y].typ)){
X			crm->typ = DOOR;
X			crm->doormask = D_NODOOR;
X			goto proceed;
X		}
X		if(dy && nx != x) {
X			nx = x; ny = y+dy;
X			continue;
X		}
X		if(dx && ny != y) {
X			ny = y; nx = x+dx; dy = 0;
X			continue;
X		}
X		/* I don't like this, but ... */
X		crm->typ = DOOR;
X		crm->doormask = D_NODOOR;
X		goto proceed;
X	}
X	crm->typ = CORR;
Xproceed:
X	if(cansee(nx,ny)) {
X		mnewsym(nx,ny);
X		prl(nx,ny);
X	}
X	fcp = &(EGD(grd)->fakecorr[EGD(grd)->fcend]);
X	if(EGD(grd)->fcend++ == FCSIZ) panic("fakecorr overflow");
X	fcp->fx = nx;
X	fcp->fy = ny;
X	fcp->ftyp = typ;
Xnewpos:
X	if(EGD(grd)->gddone) {
X		/* The following is a kluge.  We need to keep     */
X		/* the guard around in order to be able to make   */
X		/* the fake corridor disappear as the player      */
X		/* moves out of it, but we also need the guard    */
X		/* out of the way.  We send the guard to never-   */
X		/* never land.  We set ogx ogy to mx my in order  */
X		/* to avoid a check at the top of this function.  */
X		/* At the end of the process, the guard is killed */
X		/* in restfakecorr().				  */
X		remove_monster(grd->mx, grd->my);
X		place_monster(grd, 0, 0);
X		EGD(grd)->ogx = grd->mx;
X		EGD(grd)->ogy = grd->my;
X		restfakecorr(grd);
X		if(in_fcorridor(grd, u.ux, u.uy) || cansee(grd->mx, grd->my))
X		    pline("Suddenly, the guard disappears.");
X		return(-2);
X	}
X	EGD(grd)->ogx = grd->mx;	/* update old positions */
X	EGD(grd)->ogy = grd->my;
X	remove_monster(grd->mx, grd->my);
X	place_monster(grd, nx, ny);
X	pmon(grd);
X	restfakecorr(grd);
X	return(1);
X}
X
X/* Routine when dying or quitting with a vault guard around */
Xvoid
Xpaygd() {
X
X	struct monst *guard;
X	register int i;
X	int gx,gy;
X	char buf[BUFSZ];
X
X	guard = findgd();
X	if (!u.ugold || !guard) return;
X
X	if (u.uinvault) {
X	    Your("%ld zorkmid%s goes into the Magic Memory Vault.",
X		u.ugold, plur(u.ugold));
X	    mkgold(u.ugold, u.ux, u.uy);
X	    u.ugold = 0L;
X	} else {
X	    if(guard->mpeaceful) { /* he has no "right" to your gold */
X		mongone(guard);
X		return;
X	    }
X	    mnexto(guard);
X	    pmon(guard);
X	    pline("%s remits your gold to the vault.", Monnam(guard));
X	    for(i=0; i<=nroom; i++)
X		if (rooms[i].rtype==VAULT) break;
X	    if (i > nroom) {
X		impossible("no vault?");
X		return;
X	    }
X	    gx = rooms[i].lx + rn2(2);
X	    gy = rooms[i].ly + rn2(2);
X	    mkgold(u.ugold, gx, gy);
X	    u.ugold = 0L;
X	    Sprintf(buf,
X		"To Croesus: here's the gold recovered from the %s %s...",
X		player_mon()->mname, plname);
X	    make_engr_at(gx, gy, buf);
X	}
X	mongone(guard);
X}
X
Xboolean
Xgd_sound() {  /* prevent "You hear footsteps.." when inappropriate */
X	register struct monst *grd = findgd();
X
X	return(grd == (struct monst *)0);
X}
X
X#endif /* OVLB */
END_OF_FILE
if test 11389 -ne `wc -c <'src/vault.c'`; then
    echo shar: \"'src/vault.c'\" unpacked with wrong size!
fi
# end of 'src/vault.c'
echo shar: End of archive 29 \(of 30\).
cp /dev/null ark29isdone
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 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 30 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