home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume7 / nethack3 / patch7cc < prev    next >
Internet Message Format  |  1990-02-26  |  61KB

  1. Path: uunet!ns-mx!iowasp!deimos!ux1.cso.uiuc.edu!brutus.cs.uiuc.edu!zaphod.mps.ohio-state.edu!think!mintaka!mit-eddie!uw-beaver!zephyr.ens.tek.com!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v09i029:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Patch7cc
  5. Message-ID: <5243@tekred.CNA.TEK.COM>
  6. Date: 24 Feb 90 01:11:07 GMT
  7. Sender: news@tekred.CNA.TEK.COM
  8. Lines: 2063
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 9, Issue 29
  13. Archive-name: NetHack3/Patch7cc
  14. Patch-To: NetHack3: Volume 7, Issue 56-93
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 29 (of 30)."
  25. # Contents:  include/monflag.h others/Makefile.ovl others/pcmain.c
  26. #   src/vault.c
  27. # Wrapped by billr@saab on Wed Feb 21 10:04:53 1990
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'include/monflag.h' -a "${1}" != "-c" ; then 
  30.   echo shar: Renaming existing file \"'include/monflag.h'\" to \"'include/monflag.h.orig'\"
  31.   mv -f 'include/monflag.h' 'include/monflag.h.orig'
  32. fi
  33. echo shar: Extracting \"'include/monflag.h'\" \(5432 characters\)
  34. sed "s/^X//" >'include/monflag.h' <<'END_OF_FILE'
  35. X/*    SCCS Id: @(#)monflag.h    3.0    89/11/21
  36. X/* NetHack may be freely redistributed.  See license for details. */
  37. X/* Copyright (c) 1989 Mike Threepoint */
  38. X
  39. X#ifndef MONFLAG_H
  40. X#define MONFLAG_H
  41. X
  42. X#define MS_SILENT    0    /* makes no sound */
  43. X#define MS_SQEEK    1    /* squeaks, as a rodent */
  44. X#define MS_SQAWK    2    /* squawks, as a bird */
  45. X#define MS_HISS     3    /* hisses */
  46. X#define MS_BUZZ     4    /* buzzes (killer bee) */
  47. X#define MS_GRUNT    5    /* grunts (or speaks own language) */
  48. X#define MS_GROWL    6    /* growls */
  49. X#define MS_BARK     7    /* if full moon, may howl */
  50. X#define MS_MEW        8    /* mews or hisses */
  51. X#define MS_ROAR     9    /* roars */
  52. X#define MS_NEIGH    10    /* neighs, as an equine */
  53. X#define MS_WAIL     11    /* wails, as a tortured soul */
  54. X#define MS_GURGLE    12    /* gurgles, as liquid or through saliva */
  55. X#define MS_BURBLE    13    /* burbles (jabberwock) */
  56. X#define MS_SHRIEK    15    /* wakes up others */
  57. X#define MS_LAUGH    17    /* grins, smiles, giggles, and laughs */
  58. X#define MS_MUMBLE    18    /* says something or other */
  59. X#define MS_IMITATE    19    /* imitates others (leocrotta) */
  60. X#define MS_SEDUCE    20    /* "Hello, sailor." (Nymphs) */
  61. X#define MS_VAMPIRE    21    /* vampiric seduction, Vlad's exclamations */
  62. X#define MS_ORC        MS_GRUNT    /* intelligent brutes */
  63. X#ifdef INFERNO
  64. X#define MS_BRIBE    25    /* asks for money, or berates you */
  65. X#endif
  66. X#define MS_CUSS     26    /* berates (demons) or intimidates (Wiz) */
  67. X#define MS_NURSE    27    /* "Take off your shirt, please." */
  68. X#define MS_DJINNI    28    /* "Thank you for freeing me!" */
  69. X#define MS_HUMANOID    29    /* generic traveling companion */
  70. X#define MS_GUARD    30    /* "Please drop that gold and follow me." */
  71. X#define MS_SELL     31    /* demand payment, complain about shoplifters */
  72. X#ifdef ORACLE
  73. X#define MS_ORACLE    32    /* do a consultation */
  74. X#endif
  75. X#ifdef ALTARS
  76. X#define MS_PRIEST    33    /* ask for contribution; do cleansing */
  77. X#endif
  78. X#ifdef KOPS
  79. X#define MS_ARREST    34    /* "Stop in the name of the law!" (Kops) */
  80. X#endif
  81. X#ifdef ARMY
  82. X#define MS_SOLDIER    35    /* army expressions */
  83. X#endif
  84. X
  85. X#define M1_FLY        0x00000001L    /* can fly or float */
  86. X#define M1_SWIM     0x00000002L    /* can traverse water */
  87. X#define M1_AMORPHOUS    0x00000004L    /* can flow under doors */
  88. X#define M1_WALLWALK    0x00000008L    /* can phase thru rock */
  89. X#define M1_TUNNEL    0x00000010L    /* can tunnel thru rock */
  90. X#define M1_NEEDPICK    0x00000020L    /* needs pick to tunnel */
  91. X#define M1_CONCEAL    0x00000040L    /* hides under objects */
  92. X#define M1_HIDE     0x00000080L    /* mimics, blends in with ceiling */
  93. X#define M1_NOEYES    0x00000100L    /* no eyes to gaze into or blind */
  94. X#define M1_NOHANDS    0x00000200L    /* no hands to handle things */
  95. X#define M1_NOLIMBS    0x00000600L    /* no arms/legs to kick/wear on */
  96. X#define M1_NOPOLY    0x00000800L    /* players mayn't poly into one */
  97. X#define M1_HUMANOID    0x00001000L    /* has humanoid body */
  98. X#define M1_ANIMAL    0x00002000L    /* has animal body */
  99. X#define M1_SLITHY    0x00004000L    /* has serpent body */
  100. X#define M1_THICK_HIDE    0x00008000L    /* has thick hide or scales */
  101. X#define M1_FIRE_RES    0x00010000L    /* resists fire */
  102. X#define M1_SLEE_RES    0x00020000L    /* resists sleep */
  103. X#define M1_COLD_RES    0x00040000L    /* resists cold */
  104. X#define M1_ELEC_RES    0x00080000L    /* resists electricity */
  105. X#define M1_STON_RES    0x00100000L    /* resists stoning */
  106. X#define M1_ACID     0x00200000L    /* acidic to eat */
  107. X#define M1_POIS_RES    0x00400000L    /* resists poison */
  108. X#define M1_POIS     0x00800000L    /* poisonous to eat */
  109. X#define M1_REGEN    0x01000000L    /* regenerates hit points */
  110. X#define M1_SEE_INVIS    0x02000000L    /* can see invisible creatures */
  111. X#define M1_TPORT    0x04000000L    /* can teleport */
  112. X#define M1_TPORT_CONTROL 0x08000000L    /* controls where it teleports to */
  113. X#define M1_GREEDY    0x10000000L    /* likes gold */
  114. X#define M1_JEWELS    0x20000000L    /* likes gems */
  115. X#define M1_COLLECT    0x40000000L    /* picks up weapons and food */
  116. X#define M1_MAGIC    0x80000000L    /* picks up magic items */
  117. X
  118. X#define M2_UNDEAD    0x00000001L    /* walking dead */
  119. X#define M2_WERE     0x00000002L    /* lycanthrope */
  120. X#define M2_ELF        0x00000010L    /* is an elf */
  121. X#define M2_DWARF    0x00000020L    /* is a dwarf */
  122. X#define M2_GIANT    0x00000040L    /* is a giant */
  123. X#define M2_ORC        0x00000080L    /* is an orc */
  124. X#define M2_HUMAN    0x00000100L    /* is a human */
  125. X#define M2_DEMON    0x00000200L    /* is a demon */
  126. X#define M2_MERC     0x00000400L    /* is a guard or soldier */
  127. X#define M2_FEM        0x00000800L    /* characteristically female */
  128. X#define M2_WANDER    0x00001000L    /* wanders randomly */
  129. X#define M2_STALK    0x00002000L    /* follows you to other levels */
  130. X#define M2_DOMESTIC    0x00004000L    /* can be tamed by feeding */
  131. X#define M2_HOSTILE    0x00010000L    /* always starts hostile */
  132. X#define M2_PEACEFUL    0x00020000L    /* always starts peaceful */
  133. X#define M2_NASTY    0x00040000L    /* extra-nasty monster (more xp) */
  134. X#define M2_STRONG    0x00080000L    /* strong (or big) monster */
  135. X#define M2_CARNIVORE    0x00100000L    /* eats corpses */
  136. X#define M2_HERBIVORE    0x00200000L    /* eats fruits */
  137. X#define M2_OMNIVORE    0x00300000L    /* eats both */
  138. X#define M2_METALLIVORE    0x00400000L    /* eats metal */
  139. X#define M2_EGGS     0x01000000L    /* lays eggs */
  140. X#define M2_ROCKTHROW    0x04000000L    /* throws boulders */
  141. X#define M2_PNAME    0x20000000L    /* monster name is a proper name */
  142. X#define M2_LORD     0x40000000L    /* a lord to its kind */
  143. X#define M2_PRINCE    0x80000000L    /* an overlord to its kind */
  144. X
  145. X#define MZ_TINY        0        /* < 2' */
  146. X#define MZ_SMALL     1        /* 2-4' */
  147. X#define MZ_MEDIUM    2        /* 4-7' */
  148. X#define MZ_HUMAN    MZ_MEDIUM    /* human-sized */
  149. X#define MZ_LARGE     3        /* 7-12' */
  150. X#define MZ_HUGE        4        /* 12-25' */
  151. X#define MZ_GIGANTIC    7        /* off the scale */
  152. X
  153. X#endif /* MONFLAG_H */
  154. END_OF_FILE
  155. if test 5432 -ne `wc -c <'include/monflag.h'`; then
  156.     echo shar: \"'include/monflag.h'\" unpacked with wrong size!
  157. fi
  158. # end of 'include/monflag.h'
  159. if test -f 'others/Makefile.ovl' -a "${1}" != "-c" ; then 
  160.   echo shar: Renaming existing file \"'others/Makefile.ovl'\" to \"'others/Makefile.ovl.orig'\"
  161.   mv -f 'others/Makefile.ovl' 'others/Makefile.ovl.orig'
  162. fi
  163. echo shar: Extracting \"'others/Makefile.ovl'\" \(19154 characters\)
  164. sed "s/^X//" >'others/Makefile.ovl' <<'END_OF_FILE'
  165. X#    SCCS Id: @(#)Makefile.ovl    3.0    90/02/08
  166. X#    PC NetHack 3.0 Makefile for Microsoft(tm) "C" 5.1 -- Pierre Martineau
  167. X#    Overlay Arrangement -- Stephen Spackman, Pierre Martineau, Norm Meluch
  168. X#    Multiple Compilation Hack and so forth -- Stephen Spackman
  169. X#
  170. X#     Other things that have to be reconfigured are in config.h, pcconf.h,
  171. X#     (for other targets: unixconf.h, tosconf.h), and possibly system.h.
  172. X#
  173. X#     Nota Bene: OVERLAY *must* be defined in pcconf.h to use this makefile!
  174. X#     Also: Rename this file to "makefile", some targets rely on it.
  175. X# -----------------------------------------------------------------------------
  176. X#     In addition to your C compiler,
  177. X#
  178. X#     if you want to change    you will need a
  179. X#     files with suffix    workalike for
  180. X#       .y              yacc
  181. X#       .l              lex
  182. X#       .asm           masm
  183. X#
  184. X# *****************************************************************************
  185. X# ************************ Compiler Info **************************************
  186. X# *****************************************************************************
  187. X# Large memory model, register bug, remove stack probes:
  188. XCC    = cl /c
  189. XLINK    = link
  190. XMODEL    = L
  191. XASM    = masm
  192. X# $(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.
  193. XMAKEBIN = make
  194. X# For those of us who have these on PC.
  195. X# YACC     = yacc
  196. X# LEX     = lex
  197. XYACC    = bison -y
  198. XLEX    = flex
  199. X# Standard file names may vary in PC installations.
  200. XYTABC    = y_tab.c
  201. XYTABH    = y_tab.h
  202. XLEXYYC    = lexyy.c
  203. X# /Gt22 is currently about the largest value that keeps the initialised data
  204. X# segment below 64K (and keeps the linker happy).
  205. X# 286 or higher machines can use the /G2 CFLAG option for better performance.
  206. XCFLAGS    = /A$(MODEL) /Os /Oa /Gs /Gt22 /Zp1 /W0 /I$(INCL)
  207. X#
  208. XLFLAGS    = /noi /seg:512 /map /st:4096 /cp:5000
  209. X#
  210. XAFLAGS    = /MX 
  211. X#
  212. X# *****************************************************************************
  213. X# ********* Directories (makedefs hardcodes these, don't change them) *********
  214. X# *****************************************************************************
  215. X#
  216. XINCL    = ..\include
  217. XAUX    = ..\auxil
  218. XSRC    = ..\src
  219. XOTHERS    = ..\others
  220. XOBJ    = $(SRC)\o
  221. X#
  222. X# *****************************************************************************
  223. X# ************************ Local Variables ************************************
  224. X# *****************************************************************************
  225. X#
  226. X# The game name
  227. XGAME     = nethack
  228. X#
  229. X# The default make target (so just typing 'make' is useful)
  230. XDEFAULT  : $(GAME)
  231. X#
  232. X# The game directory
  233. X# make sure GAMEDIR exists!
  234. XGAMEDIR  = ..
  235. X#
  236. X# The game filename
  237. XGAMEFILE = $(GAMEDIR)\$(GAME).exe
  238. X#
  239. X# Target environment prefix
  240. XTARG     = pc
  241. X#
  242. X# Overlay manager object file.
  243. XOVLMGR     = ovlmgr.obj
  244. X#
  245. X# Termcap routines.
  246. XTERMCAPS = $(SRC)\termlib.lib
  247. X#
  248. X###############################################################################
  249. X# Switch the following lines if you have made changes in ovlmgr.asm
  250. X(OBJ)\$(OVLMGR):
  251. X#$(OBJ)\$(OVLMGR): ; copy $(OTHERS)\$(OVLMGR) $(OBJ)\$(OVLMGR)
  252. X###############################################################################
  253. X# If you have yacc and lex programs and make any changes, comment out the
  254. X# upper two targets and uncomment the lower two.
  255. X#do_yacc: yacc_msg
  256. X#do_lex:  lex_msg
  257. Xdo_yacc: yacc_act
  258. Xdo_lex:  lex_act
  259. X###############################################################################
  260. X# Optional high-quality BSD random number generation routines (see pcconf.h).
  261. X# Set to nothing if not used.
  262. XRANDOM     = $(OBJ)\random.o
  263. X# RANDOM =
  264. X###############################################################################
  265. X# Optional C library specifier for those with non-standard libraries or
  266. X# a multiple-target library setup.
  267. X# CLIB       = llibcer /nod
  268. XCLIB     =
  269. X###############################################################################
  270. X# If TERMLIB is NOT #defined in the source, comment out the lower line and
  271. X# uncomment the upper. Don't forget to copy the $(TERMCAPS) file to the
  272. X# $(SRC) directory if you have uncommented the lower line.
  273. X#TERMLIB =
  274. XTERMLIB = $(TERMCAPS)
  275. X###############################################################################
  276. X
  277. X# nothing below this line should have to be changed
  278. X
  279. XROOT =    $(OBJ)\$(OVLMGR) $(OBJ)\trampoli.o $(OBJ)\main.o $(OBJ)\msdos.o \
  280. X    $(OBJ)\mkroom.0 $(OBJ)\random.o $(OBJ)\rnd.01 $(OBJ)\mkobj.0 \
  281. X    $(OBJ)\invent.0 $(OBJ)\decl.o
  282. X
  283. XOVL01 = $(OBJ)\track.0 $(OBJ)\monmove.01 $(OBJ)\cmd.0 $(OBJ)\dbridge.0 \
  284. X    $(OBJ)\dog.0 $(OBJ)\engrave.01 $(OBJ)\mon.01 $(OBJ)\priest.0 \
  285. X    $(OBJ)\shk.0 $(OBJ)\trap.01 $(OBJ)\mthrowu.0 \
  286. X    $(OBJ)\mondata.01 $(OBJ)\mhitu.1 $(OBJ)\monst.o $(OBJ)\objects.o
  287. XOVL02 = $(OBJ)\dogmove.0 $(OBJ)\apply.0
  288. XOVL03 = $(OBJ)\makemon.0
  289. XOVL04 = $(OBJ)\shk.12b
  290. XOVL05 = $(OBJ)\hack.0
  291. XOVL06 = $(OBJ)\alloc.o
  292. XOVL07 = $(OBJ)\attrib.0 $(OBJ)\allmain.1
  293. XOVL08 = $(OBJ)\attrib.2b $(OBJ)\exper.o
  294. XOVL09 = $(OBJ)\cmd.2b $(OBJ)\getline.2 $(OBJ)\pray.o $(OBJ)\write.o
  295. XOVL10 = $(OBJ)\dbridge.12b
  296. XOVL11 = $(OBJ)\do_name.0
  297. XOVL12 = $(OBJ)\getline.b
  298. XOVL13 = $(OBJ)\invent.1
  299. XOVL14 = $(OBJ)\makemon.1
  300. XOVL15 = $(OBJ)\makemon.2b
  301. XOVL16 = $(OBJ)\allmain.0 $(OBJ)\cmd.1 $(OBJ)\do.0 $(OBJ)\pickup.0 \
  302. X    $(OBJ)\vault.0 $(OBJ)\wizard.0 $(OBJ)\artifact.0 $(OBJ)\timeout.0 \
  303. X    $(OBJ)\attrib.1 $(OBJ)\eat.0 $(OBJ)\engrave.2 $(OBJ)\getline.01 \
  304. X    $(OBJ)\mail.0 $(OBJ)\pri.1 $(OBJ)\prisym.1 $(OBJ)\sounds.0 \
  305. X    $(OBJ)\track.1 $(OBJ)\hack.1
  306. XOVL17 = $(OBJ)\hack.2
  307. XOVL18 = $(OBJ)\mcastu.o $(OBJ)\demon.o
  308. XOVL19 = $(OBJ)\mhitm.12b
  309. XOVL20 = $(OBJ)\mhitm.0 $(OBJ)\mhitu.0 $(OBJ)\weapon.01
  310. XOVL21 = $(OBJ)\mkobj.12b
  311. XOVL22 = $(OBJ)\mon.2b $(OBJ)\trap.2
  312. XOVL23 = $(OBJ)\monmove.2b $(OBJ)\steal.2b
  313. XOVL24 = $(OBJ)\mthrowu.1
  314. XOVL25 = $(OBJ)\mthrowu.2b
  315. XOVL26 = $(OBJ)\objnam.01 $(OBJ)\pager.0 $(OBJ)\polyself.0 $(OBJ)\mondata.2
  316. XOVL27 = $(OBJ)\objnam.2b
  317. XOVL28 = $(OBJ)\pager.12b
  318. XOVL29 = $(OBJ)\pri.0 $(OBJ)\prisym.0 $(OBJ)\termcap.0 $(OBJ)\topl.0
  319. XOVL30 = $(OBJ)\pri.b $(OBJ)\topl.12
  320. XOVL31 = $(OBJ)\priest.12b
  321. XOVL32 = $(OBJ)\worm.o
  322. XOVL33 = $(OBJ)\were.0
  323. XOVL34 = $(OBJ)\prisym.2
  324. XOVL35 = $(OBJ)\prisym.b
  325. XOVL36 = $(OBJ)\read.0
  326. XOVL37 = $(OBJ)\read.12b $(OBJ)\spell.o
  327. XOVL38 = $(OBJ)\rnd.2b $(OBJ)\topl.b
  328. XOVL39 = $(OBJ)\search.12b
  329. XOVL40 = $(OBJ)\search.0 $(OBJ)\uhitm.0 $(OBJ)\weapon.2b
  330. XOVL41 = $(OBJ)\steal.01
  331. XOVL42 = $(OBJ)\termcap.1 $(OBJ)\unix.0
  332. XOVL43 = $(OBJ)\termcap.2b
  333. XOVL44 = $(OBJ)\timeout.12b $(OBJ)\mondata.b
  334. XOVL45 = $(OBJ)\potion.0 $(OBJ)\artifact.1
  335. XOVL46 = $(OBJ)\were.12b $(OBJ)\wizard.12b
  336. XOVL47 = $(OBJ)\polyself.12b
  337. XOVL48 = $(OBJ)\pickup.12b
  338. XOVL49 = $(OBJ)\lock.o $(OBJ)\trap.b
  339. XOVL50 = $(OBJ)\invent.2b
  340. XOVL51 = $(OBJ)\hack.b
  341. XOVL52 = $(OBJ)\eat.12b $(OBJ)\potion.12b
  342. XOVL53 = $(OBJ)\dog.1 $(OBJ)\dogmove.12b
  343. XOVL54 = $(OBJ)\dokick.o $(OBJ)\dothrow.o
  344. XOVL55 = $(OBJ)\do.12b
  345. XOVL56 = $(OBJ)\apply.12b
  346. XOVL57 = $(OBJ)\dog.2b $(OBJ)\sounds.12b
  347. XOVL58 = $(OBJ)\do_wear.01 $(OBJ)\mhitu.2b
  348. XOVL59 = $(OBJ)\sit.o $(OBJ)\artifact.2b $(OBJ)\do_name.12b $(OBJ)\vault.12b \
  349. X    $(OBJ)\fountain.o $(OBJ)\music.o $(OBJ)\rumors.o $(OBJ)\shknam.0
  350. XOVL60 = $(OBJ)\worn.o $(OBJ)\wield.o $(OBJ)\do_wear.2b
  351. XOVL61 = $(OBJ)\zap.o $(OBJ)\pri.2
  352. XOVL62 = $(OBJ)\unix.12b $(OBJ)\mail.12b $(OBJ)\tty.o $(OBJ)\version.o \
  353. X    $(OBJ)\options.o $(OBJ)\o_init.o $(OBJ)\allmain.2b $(OBJ)\engrave.b \
  354. X    $(OBJ)\end.o $(OBJ)\save.o $(OBJ)\restore.o $(OBJ)\u_init.o \
  355. X    $(OBJ)\topten.o $(OBJ)\shknam.12b $(OBJ)\rip.o
  356. XOVL63 = $(OBJ)\bones.o $(OBJ)\mklev.o $(OBJ)\mkmaze.o $(OBJ)\mkroom.12b \
  357. X    $(OBJ)\sp_lev.o $(OBJ)\track.2b $(OBJ)\extralev.o
  358. X
  359. X# *****************************************************************************
  360. X# ************************* Make Objects **************************************
  361. X# *****************************************************************************
  362. X
  363. XMOBJ = $(OVL01) $(OVL02) $(OVL03) $(OVL04) $(OVL05) $(OVL06) $(OVL07) $(OVL08)\
  364. X       $(OVL09) $(OVL10) $(OVL11) $(OVL12) $(OVL13) $(OVL14) $(OVL15) $(OVL16)\
  365. X       $(OVL17) $(OVL18) $(OVL19) $(OVL20) $(OVL21) $(OVL22) $(OVL23) $(OVL24)\
  366. X       $(OVL25) $(OVL26) $(OVL27) $(OVL28) $(OVL29) $(OVL30) $(OVL31) $(OVL32)\
  367. X       $(OVL33) $(OVL34) $(OVL35) $(OVL36) $(OVL37) $(OVL38) $(OVL39) $(OVL40)\
  368. X       $(OVL41) $(OVL42) $(OVL43) $(OVL44) $(OVL45) $(OVL46) $(OVL47) $(OVL48)\
  369. X       $(OVL49) $(OVL50) $(OVL51) $(OVL52) $(OVL53) $(OVL54) $(OVL55) $(OVL56)\
  370. X       $(OVL57) $(OVL58) $(OVL59) $(OVL60) $(OVL61) $(OVL62)
  371. X
  372. XVOBJ =    $(ROOT) $(MOBJ)
  373. X
  374. XHOBJ =    $(VOBJ) $(OVL63)
  375. X
  376. X# object files for makedefs
  377. XMAKEOBJS    =    $(OBJ)\makedefs.o $(OBJ)\alloc.o    $(OBJ)\monst.o    \
  378. X        $(OBJ)\objects.o  $(OBJ)\panic.o
  379. X
  380. XOVERLAYS = ($(OVL01)) ($(OVL02)) ($(OVL03)) ($(OVL04)) ($(OVL05)) ($(OVL06)) \
  381. X       ($(OVL07)) ($(OVL08)) ($(OVL09)) ($(OVL10)) ($(OVL11)) ($(OVL12)) \
  382. X       ($(OVL13)) ($(OVL14)) ($(OVL15)) ($(OVL16)) ($(OVL17)) ($(OVL18)) \
  383. X       ($(OVL19)) ($(OVL20)) ($(OVL21)) ($(OVL22)) ($(OVL23)) ($(OVL24)) \
  384. X       ($(OVL25)) ($(OVL26)) ($(OVL27)) ($(OVL28)) ($(OVL29)) ($(OVL30)) \
  385. X       ($(OVL31)) ($(OVL32)) ($(OVL33)) ($(OVL34)) ($(OVL35)) ($(OVL36)) \
  386. X       ($(OVL37)) ($(OVL38)) ($(OVL39)) ($(OVL40)) ($(OVL41)) ($(OVL42)) \
  387. X       ($(OVL43)) ($(OVL44)) ($(OVL45)) ($(OVL46)) ($(OVL47)) ($(OVL48)) \
  388. X       ($(OVL49)) ($(OVL50)) ($(OVL51)) ($(OVL52)) ($(OVL53)) ($(OVL54)) \
  389. X       ($(OVL55)) ($(OVL56)) ($(OVL57)) ($(OVL58)) ($(OVL59)) ($(OVL60)) \
  390. X       ($(OVL61)) ($(OVL62)) ($(OVL63))
  391. X
  392. X# object files for special levels compiler
  393. XSPLEVOBJS   =    $(OBJ)\lev_comp.o $(OBJ)\lev_lex.o  $(OBJ)\lev_main.o \
  394. X        $(OBJ)\alloc.o      $(OBJ)\monst.o    $(OBJ)\objects.o  \
  395. X        $(OBJ)\panic.o
  396. X
  397. X# *****************************************************************************
  398. X# ************************** Header Objects ***********************************
  399. X# *****************************************************************************
  400. X
  401. XTRAP_H       = $(INCL)\trap.h
  402. XPERMONST_H = $(INCL)\permonst.h    $(INCL)\monflag.h
  403. XPCCONF_H   = $(INCL)\$(TARG)conf.h $(INCL)\extern.h   $(INCL)\msdos.h \
  404. X         $(INCL)\system.h
  405. XGLOBAL_H   = $(PCCONF_H)       $(INCL)\coord.h    $(INCL)\global.h
  406. XCONFIG_H   = $(GLOBAL_H)       $(INCL)\config.h   $(INCL)\tradstdc.h
  407. XYOU_H       = $(PERMONST_H)       $(INCL)\attrib.h   $(INCL)\mondata.h \
  408. X         $(INCL)\monst.h       $(INCL)\you.h      $(INCL)\youprop.h
  409. XDECL_H       = $(YOU_H)           $(INCL)\decl.h     $(INCL)\obj.h \
  410. X         $(INCL)\onames.h       $(INCL)\pm.h       $(INCL)\spell.h
  411. XHACK_H       = $(CONFIG_H)       $(DECL_H)          $(TRAP_H) \
  412. X         $(INCL)\flag.h       $(INCL)\gold.h     $(INCL)\mkroom.h \
  413. X         $(INCL)\monsym.h       $(INCL)\objclass.h $(INCL)\rm.h \
  414. X         $(INCL)\trampoli.h
  415. X
  416. X# *****************************************************************************
  417. X# ************************ File Dependencies **********************************
  418. X# *****************************************************************************
  419. X
  420. X# Due to an NDMake inadequacy these must accord with a topological sort of the
  421. X# generated-from relation... output on the left, input on the right. Trust me.
  422. X.SUFFIXES: .exe .0 .01 .012 .1 .12 .12b .2 .2b .b .o .c .y .l .obj .asm
  423. X
  424. X.c.o:
  425. X    $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
  426. X.c.0:
  427. X    $(CC) $(CFLAGS) /DOVL0 /NT$*.0 /Fo$(OBJ)\$*.0 $*.c
  428. X.c.01:
  429. X    $(CC) $(CFLAGS) /DOVL0 /DOVL1 /NT$*.01 /Fo$(OBJ)\$*.01 $*.c
  430. X.c.012:
  431. X    $(CC) $(CFLAGS) /DOVL0 /DOVL1 /DOVL2 /NT$*.012 /Fo$(OBJ)\$*.012 $*.c
  432. X.c.1:
  433. X    $(CC) $(CFLAGS) /DOVL1 /NT$*.1 /Fo$(OBJ)\$*.1 $*.c
  434. X.c.12:
  435. X    $(CC) $(CFLAGS) /DOVL1 /DOVL2 /NT$*.12 /Fo$(OBJ)\$*.12 $*.c
  436. X.c.12b:
  437. X    $(CC) $(CFLAGS) /DOVL1 /DOVL2 /DOVLB /NT$*.12b /Fo$(OBJ)\$*.12b $*.c
  438. X.c.2:
  439. X    $(CC) $(CFLAGS) /DOVL2 /NT$*.2 /Fo$(OBJ)\$*.2 $*.c
  440. X.c.2b:
  441. X    $(CC) $(CFLAGS) /DOVL2 /DOVLB /NT$*.2b /Fo$(OBJ)\$*.2b $*.c
  442. X.c.b:
  443. X    $(CC) $(CFLAGS) /DOVLB /NT$*.b /Fo$(OBJ)\$*.b $*.c
  444. X.asm.obj:
  445. X    $(ASM) $(AFLAGS) $*.asm,$(OBJ)\$*.obj ;
  446. X
  447. X$(GAME): $(GAMEFILE)
  448. X
  449. X$(GAME).exe: $(GAMEFILE)
  450. X
  451. X$(GAMEFILE): $(OBJ) $(HOBJ)
  452. X    @echo Loading....
  453. X    $(LINK) $(ROOT) $(OVERLAYS),$(GAMEFILE),$(GAME),$(CLIB) $(TERMLIB) $(LFLAGS) ;
  454. X    @echo Nethack is up to date.
  455. X
  456. X$(OBJ):
  457. X    if not exist .\$(OBJ)\*.* mkdir $(OBJ)
  458. X
  459. X#    The following 3 modules vary depending on what OS you are using.
  460. X
  461. X$(OBJ)\main.o:    $(HACK_H) $(TARG)main.c
  462. X    $(CC) $(CFLAGS)  /Fo.\$(OBJ)\main.o $(TARG)main.c
  463. X
  464. X$(OBJ)\tty.o:    $(HACK_H) $(INCL)\func_tab.h $(TARG)tty.c
  465. X    $(CC) $(CFLAGS)  /Fo.\$(OBJ)\tty.o  $(TARG)tty.c
  466. X
  467. X$(OBJ)\unix.0:    $(HACK_H) $(TARG)unix.c
  468. X    $(CC) $(CFLAGS)  /DOVL0 /Fo.\$(OBJ)\unix.0 $(TARG)unix.c
  469. X$(OBJ)\unix.12b:    $(HACK_H) $(TARG)unix.c
  470. X    $(CC) $(CFLAGS)  /DOVL1 /DOVL2 /DOVLB /Fo.\$(OBJ)\unix.12b $(TARG)unix.c
  471. X
  472. X$(OBJ)\makedefs.o:    $(INCL)\config.h $(INCL)\permonst.h $(INCL)\objclass.h
  473. X
  474. Xmakedefs.exe:    $(MAKEOBJS)
  475. X    $(LINK) $(LFLAGS) $(MAKEOBJS), makedefs.exe,, $(CLIB);
  476. X
  477. X#    Targets for the special levels compiler
  478. X
  479. Xlev_comp.c: lev_comp.y
  480. X    $(MAKEBIN) do_yacc
  481. X
  482. Xlev_lex.c:  lev_comp.l
  483. X    $(MAKEBIN) do_lex
  484. X
  485. Xyacc_msg:
  486. X    @echo lev_comp.y has changed. To update lev_comp.c and lev_comp.h run YACC.
  487. X
  488. Xyacc_act:
  489. X    $(YACC) -d lev_comp.y
  490. X    copy $(YTABC) lev_comp.c
  491. X    copy $(YTABH) $(INCL)\lev_comp.h
  492. X    del $(YTABC)
  493. X    del $(YTABH)
  494. X
  495. Xlex_msg:
  496. X    @echo lev_comp.l has changed. To update lev_lex.c run LEX.
  497. X
  498. Xlex_act:
  499. X    $(LEX) lev_comp.l
  500. X    copy $(LEXYYC) lev_lex.c
  501. X    del $(LEXYYC)
  502. X
  503. X#    This is stupid but since the default rule does not work here ...
  504. X
  505. X$(OBJ)\lev_comp.o:    $(HACK_H)   $(INCL)\sp_lev.h    lev_comp.c
  506. X    $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
  507. X$(OBJ)\lev_lex.o:    $(HACK_H)   $(INCL)\sp_lev.h    $(INCL)\lev_comp.h \
  508. X            lev_lex.c
  509. X    $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
  510. X
  511. Xlev_comp.exe:    $(SPLEVOBJS)
  512. X    $(LINK) $(LFLAGS) $(SPLEVOBJS),lev_comp.exe,, $(CLIB);
  513. X
  514. X# *****************************************************************************
  515. X# *************************  Makedefs Stuff ***********************************
  516. X# *****************************************************************************
  517. X#    The following include files depend on makedefs to be created.
  518. X#    date.h should be remade any time any of the source or include code
  519. X#    is modified.
  520. X
  521. X$(INCL)\date.h: $(VOBJ) makedefs.exe
  522. X    .\makedefs -v
  523. X
  524. X$(INCL)\trap.h:     makedefs.exe
  525. X    .\makedefs -t
  526. X
  527. X$(INCL)\onames.h:    makedefs.exe
  528. X    .\makedefs -o
  529. X
  530. X$(INCL)\pm.h:        makedefs.exe
  531. X    .\makedefs -p
  532. X
  533. Xdata:    $(AUX)\data.bas makedefs.exe
  534. X    .\makedefs -d
  535. X
  536. Xrumors: $(AUX)\rumors.tru $(AUX)\rumors.fal makedefs.exe
  537. X    .\makedefs -r
  538. X
  539. X# *****************************************************************************
  540. X# ************************ Secondary targets **********************************
  541. X# *****************************************************************************
  542. X
  543. Xall:    install
  544. X
  545. Xinstall:    $(OBJ) lev_comp.exe $(GAMEFILE) auxil.tag install.tag
  546. X    @echo Don't forget to check HACKDIR in nethack.cnf.
  547. X    @echo Done.
  548. X
  549. X
  550. X#    Watch Out!  This make cleans out the game & bones dirs!
  551. X#    This will delete any config file you have and overwrite it
  552. X#    with the default.
  553. X#    Since the game options may have changed since your last install,
  554. X#    you should say yes to clean the directory.
  555. X
  556. Xinstall.tag:
  557. X    copy $(OTHERS)\termcap        $(GAMEDIR)
  558. X    copy $(AUX)\*.            $(GAMEDIR)
  559. X    copy $(OTHERS)\nethack.cnf    $(GAMEDIR)
  560. X    echo install done > install.tag
  561. X
  562. Xspec_lev.tag: lev_comp.exe $(AUX)\castle.des $(AUX)\endgame.des $(AUX)\tower.des
  563. X    lev_comp $(AUX)\castle.des
  564. X    lev_comp $(AUX)\endgame.des
  565. X    lev_comp $(AUX)\tower.des
  566. X    copy castle $(GAMEDIR)
  567. X    copy endgame $(GAMEDIR)
  568. X    copy tower? $(GAMEDIR)
  569. X    del castle
  570. X    del endgame
  571. X    del tower?
  572. X    echo spec_lev done > spec_lev.tag
  573. X
  574. Xauxil.tag:    spec_lev.tag    data    rumors
  575. X    echo special levels created > auxil.tag
  576. X
  577. Xclean:
  578. X    del $(OBJ)\*.o
  579. X    del $(OBJ)\*.0
  580. X    del $(OBJ)\*.01
  581. X    del $(OBJ)\*.012
  582. X    del $(OBJ)\*.1
  583. X    del $(OBJ)\*.12
  584. X    del $(OBJ)\*.12b
  585. X    del $(OBJ)\*.2
  586. X    del $(OBJ)\*.2b
  587. X    del $(OBJ)\*.b
  588. X    del $(OBJ)\*.obj
  589. X    rmdir $(OBJ)
  590. X
  591. Xspotless: clean
  592. X    del $(INCL)\date.h
  593. X    del $(INCL)\onames.h
  594. X    del $(INCL)\pm.h
  595. X    if exist makedefs.exe del makedefs.exe
  596. X    if exist lev_comp.exe del lev_comp.exe
  597. X    del castle
  598. X    del endgame
  599. X    del tower?
  600. X    del *.bak
  601. X    del *.tag
  602. X    del *.map
  603. X    del *.txt
  604. X    del $(AUX)\data
  605. X    del $(AUX)\rumors
  606. X
  607. X# *****************************************************************************
  608. X# ************************* Other dependencies ********************************
  609. X# *****************************************************************************
  610. X# Other dependencies
  611. X#
  612. X# I deleted that line.    ;-}
  613. X
  614. X$(OBJ)\allmain.o:    $(HACK_H)
  615. X$(OBJ)\alloc.o:     $(CONFIG_H)
  616. X$(OBJ)\apply.o:     $(HACK_H)   $(INCL)\edog.h
  617. X$(OBJ)\artifact.o:    $(HACK_H)   $(INCL)\artifact.h
  618. X$(OBJ)\attrib.o:    $(HACK_H)
  619. X$(OBJ)\bones.o:     $(HACK_H)
  620. X$(OBJ)\cmd.o:        $(HACK_H)   $(INCL)\func_tab.h
  621. X$(OBJ)\dbridge.o:    $(HACK_H)
  622. X$(OBJ)\decl.o:        $(HACK_H)
  623. X$(OBJ)\demon.o:     $(HACK_H)
  624. X$(OBJ)\do.o:        $(HACK_H)
  625. X$(OBJ)\do_name.o:    $(HACK_H)
  626. X$(OBJ)\do_wear.o:    $(HACK_H)
  627. X$(OBJ)\dog.o:        $(HACK_H)   $(INCL)\edog.h
  628. X$(OBJ)\dogmove.o:    $(HACK_H)   $(INCL)\mfndpos.h     $(INCL)\edog.h
  629. X$(OBJ)\dokick.o:    $(HACK_H)
  630. X$(OBJ)\dothrow.o:    $(HACK_H)
  631. X$(OBJ)\eat.o:        $(HACK_H)
  632. X$(OBJ)\end.o:        $(HACK_H)   $(INCL)\eshk.h
  633. X$(OBJ)\engrave.o:    $(HACK_H)
  634. X$(OBJ)\exper.o:     $(HACK_H)
  635. X$(OBJ)\extralev.o:    $(HACK_H)
  636. X$(OBJ)\fountain.o:    $(HACK_H)
  637. X$(OBJ)\getline.o:    $(HACK_H)   $(INCL)\func_tab.h
  638. X$(OBJ)\hack.o:        $(HACK_H)
  639. X$(OBJ)\invent.o:    $(HACK_H)   $(INCL)\lev.h     $(INCL)\wseg.h
  640. X$(OBJ)\ioctl.o:     $(HACK_H)
  641. X$(OBJ)\lev_main.o:    $(HACK_H)   $(INCL)\sp_lev.h
  642. X$(OBJ)\lock.o:        $(HACK_H)
  643. X$(OBJ)\makemon.o:    $(HACK_H)
  644. X$(OBJ)\mail.o:        $(HACK_H)
  645. X$(OBJ)\mcastu.o:    $(HACK_H)
  646. X$(OBJ)\mhitm.o:     $(HACK_H)   $(INCL)\artifact.h
  647. X$(OBJ)\mhitu.o:     $(HACK_H)   $(INCL)\artifact.h     $(INCL)\edog.h
  648. X$(OBJ)\mklev.o:     $(HACK_H)
  649. X$(OBJ)\mkmaze.o:    $(HACK_H)
  650. X$(OBJ)\mkobj.o:     $(HACK_H)
  651. X$(OBJ)\mkroom.o:    $(HACK_H)
  652. X$(OBJ)\mon.o:        $(HACK_H)   $(INCL)\mfndpos.h     $(INCL)\artifact.h
  653. X$(OBJ)\mondata.o:    $(HACK_H)   $(INCL)\eshk.h     $(INCL)\epri.h
  654. X$(OBJ)\monmove.o:    $(HACK_H)   $(INCL)\mfndpos.h     $(INCL)\artifact.h
  655. X$(OBJ)\monst.o:     $(CONFIG_H) $(PERMONST_H)     $(INCL)\eshk.h     \
  656. X            $(INCL)\epri.h $(INCL)\vault.h
  657. X$(OBJ)\msdos.o:     $(HACK_H)
  658. X$(OBJ)\mthrowu.o:    $(HACK_H)
  659. X$(OBJ)\music.o:     $(HACK_H)
  660. X$(OBJ)\o_init.o:    $(HACK_H)   $(INCL)\onames.h
  661. X$(OBJ)\objects.o:    $(CONFIG_H) $(INCL)\obj.h     $(INCL)\objclass.h \
  662. X            $(INCL)\prop.h
  663. X$(OBJ)\objnam.o:    $(HACK_H)
  664. X$(OBJ)\options.o:    $(HACK_H)
  665. X$(OBJ)\pager.o:     $(HACK_H)
  666. X$(OBJ)\panic.o:     $(CONFIG_H)
  667. X$(OBJ)\pickup.o:    $(HACK_H)
  668. X$(OBJ)\polyself.o:    $(HACK_H)
  669. X$(OBJ)\potion.o:    $(HACK_H)
  670. X$(OBJ)\pray.o:        $(HACK_H)
  671. X$(OBJ)\pri.o:        $(HACK_H)
  672. X$(OBJ)\priest.o:    $(HACK_H)   $(INCL)\mfndpos.h     $(INCL)\eshk.h \
  673. X            $(INCL)\epri.h
  674. X$(OBJ)\prisym.o:    $(HACK_H)   $(INCL)\lev.h     $(INCL)\wseg.h
  675. X$(OBJ)\random.o:
  676. X$(OBJ)\read.o:        $(HACK_H)
  677. X$(OBJ)\restore.o:    $(HACK_H)   $(INCL)\lev.h     $(INCL)\wseg.h
  678. X$(OBJ)\rip.o:        $(HACK_H)
  679. X$(OBJ)\rnd.o:        $(HACK_H)
  680. X$(OBJ)\rumors.o:    $(HACK_H)
  681. X$(OBJ)\save.o:        $(HACK_H)   $(INCL)\lev.h     $(INCL)\wseg.h
  682. X$(OBJ)\search.o:    $(HACK_H)   $(INCL)\artifact.h
  683. X$(OBJ)\shk.o:        $(HACK_H)   $(INCL)\eshk.h
  684. X$(OBJ)\shknam.o:    $(HACK_H)   $(INCL)\eshk.h
  685. X$(OBJ)\sit.o:        $(HACK_H)
  686. X$(OBJ)\sounds.o:    $(HACK_H)   $(INCL)\edog.h     $(INCL)\eshk.h
  687. X$(OBJ)\sp_lev.o:    $(HACK_H)   $(INCL)\sp_lev.h
  688. X$(OBJ)\spell.o:     $(HACK_H)
  689. X$(OBJ)\steal.o:     $(HACK_H)
  690. X$(OBJ)\termcap.o:    $(HACK_H)
  691. X$(OBJ)\timeout.o:    $(HACK_H)
  692. X$(OBJ)\topl.o:        $(HACK_H)
  693. X$(OBJ)\topten.o:    $(HACK_H)
  694. X$(OBJ)\track.o:     $(HACK_H)
  695. X$(OBJ)\trampoli.o:    $(HACK_H)
  696. X$(OBJ)\trap.o:        $(HACK_H)   $(INCL)\edog.h
  697. X$(OBJ)\u_init.o:    $(HACK_H)
  698. X$(OBJ)\uhitm.o:     $(HACK_H)   $(INCL)\artifact.h
  699. X$(OBJ)\vault.o:     $(HACK_H)   $(INCL)\vault.h
  700. X$(OBJ)\version.o:    $(HACK_H)   $(INCL)\date.h
  701. X$(OBJ)\weapon.o:    $(HACK_H)
  702. X$(OBJ)\were.o:        $(HACK_H)
  703. X$(OBJ)\wield.o:     $(HACK_H)
  704. X$(OBJ)\wizard.o:    $(HACK_H)
  705. X$(OBJ)\worm.o:        $(HACK_H)   $(INCL)\wseg.h
  706. X$(OBJ)\worn.o:        $(HACK_H)
  707. X$(OBJ)\write.o:     $(HACK_H)
  708. X$(OBJ)\zap.o:        $(HACK_H)
  709. END_OF_FILE
  710. if test 19154 -ne `wc -c <'others/Makefile.ovl'`; then
  711.     echo shar: \"'others/Makefile.ovl'\" unpacked with wrong size!
  712. fi
  713. # end of 'others/Makefile.ovl'
  714. if test -f 'others/pcmain.c' -a "${1}" != "-c" ; then 
  715.   echo shar: Renaming existing file \"'others/pcmain.c'\" to \"'others/pcmain.c.orig'\"
  716.   mv -f 'others/pcmain.c' 'others/pcmain.c.orig'
  717. fi
  718. echo shar: Extracting \"'others/pcmain.c'\" \(19050 characters\)
  719. sed "s/^X//" >'others/pcmain.c' <<'END_OF_FILE'
  720. X/*    SCCS Id: @(#)pcmain.c    3.0    90/01/19
  721. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  722. X/* NetHack may be freely redistributed.  See license for details. */
  723. X/* main.c - PC, ST, and Amiga NetHack */
  724. X#include "hack.h"
  725. X
  726. X#ifndef NO_SIGNAL
  727. X#include <signal.h>
  728. X#endif
  729. X#include <ctype.h>
  730. X#ifdef DGK
  731. X#ifndef AMIGA
  732. X#include <sys\stat.h>
  733. X#endif
  734. X#endif
  735. X#ifdef MACOS
  736. Xextern WindowPtr    HackWindow;
  737. Xextern short *switches;
  738. Xextern short macflags;
  739. Xpascal boolean FDECL(startDlogFProc, (DialogPtr, EventRecord *, short *));
  740. X#define msmsg mprintf
  741. X#endif
  742. X
  743. X#if !defined(MACOS) && !defined(LATTICE)
  744. Xchar orgdir[PATHLEN];
  745. X#endif
  746. Xchar SAVEF[FILENAME];
  747. X#ifdef MSDOS
  748. Xchar SAVEP[FILENAME];
  749. X#endif
  750. X
  751. Xconst char *hname = "NetHack";    /* used for syntax messages */
  752. X#if !defined(AMIGA) && !defined(MACOS)
  753. Xchar obuf[BUFSIZ];    /* BUFSIZ is defined in stdio.h */
  754. X#endif
  755. Xint hackpid;        /* not used anymore, but kept in for save files */
  756. X
  757. X#if defined(DGK)
  758. Xstruct finfo    zfinfo = ZFINFO;
  759. Xint i;
  760. X#endif /* DGK */
  761. X
  762. X#ifdef __TURBOC__    /* tell Turbo C to make a bigger stack */
  763. Xextern unsigned _stklen = 0x2000;    /* 8K */
  764. Xextern unsigned char _osmajor;
  765. X#endif
  766. X
  767. X#ifdef TOS
  768. Xextern long compiletime;
  769. Xboolean run_from_desktop = TRUE;    /* should we pause before exiting?? */
  770. X# ifdef __GNUC__
  771. Xlong _stksize = 16*1024;
  772. X# endif
  773. X#endif
  774. X
  775. X#ifdef MACOS
  776. X#  ifdef AZTEC
  777. X#define OMASK    O_RDONLY
  778. X#  else
  779. X#define OMASK    (O_RDONLY | O_BINARY )
  780. X#  endif
  781. X# else
  782. X#define OMASK    O_RDONLY
  783. X#endif
  784. X
  785. X#ifdef MACOS
  786. XBoolean justscores;
  787. X#endif
  788. X
  789. X#ifdef AMIGA_WBENCH
  790. Xextern int FromWBench;
  791. X#endif
  792. X
  793. Xconst char *classes = "ABCEHKPRSTVW";
  794. X
  795. Xint
  796. Xmain(argc,argv)
  797. Xint argc;
  798. Xchar *argv[];
  799. X{
  800. X    extern int x_maze_max, y_maze_max;
  801. X    register int fd;
  802. X    register char *dir;
  803. X#ifndef AMIGA
  804. X    int (*funcp)();
  805. X#endif
  806. X#ifdef TOS
  807. X    long clock;
  808. X# ifdef __GNUC__
  809. X    extern int _unixmode;
  810. X    _unixmode = 0;
  811. X# endif
  812. X#endif
  813. X#ifdef __TURBOC__
  814. X    if (_osmajor >= 3) hname = argv[0];    /* DOS 3.0+ */
  815. X#endif
  816. X#ifdef TOS
  817. X    if (*argv[0]) {            /* only a CLI can give us argv[0] */
  818. X        hname = argv[0];
  819. X        run_from_desktop = FALSE;
  820. X    }
  821. X#endif
  822. X#ifdef MACOS
  823. X    AppFile    theFile;
  824. X    short    message,numFiles;
  825. X    SFReply    reply;
  826. X
  827. X    initterm(24,80);
  828. X    ObscureCursor();
  829. X# ifdef SMALLDATA
  830. X    init_decl();
  831. X# endif
  832. X    /* user might have started up with a save file, so check */
  833. X    CountAppFiles(&message,&numFiles);
  834. X    if (!message && numFiles) {
  835. X        message = 1;
  836. X
  837. X        while(message <= numFiles) {
  838. X            GetAppFiles(message,&theFile);
  839. X            ClrAppFiles(message);
  840. X            if ((theFile.fType == SAVE_TYPE)||(theFile.fType == EXPLORE_TYPE))
  841. X                break;
  842. X            message++;
  843. X        }
  844. X        if ((theFile.fType == SAVE_TYPE)||(theFile.fType == EXPLORE_TYPE)) {
  845. X            (void)strncpy(SAVEF, (char *)&theFile.fName[1],
  846. X                        (int)theFile.fName[0]);
  847. X            (void)strncpy(plname, (char *)&theFile.fName[1],
  848. X                        (int)theFile.fName[0]);
  849. X            SetVol(0,theFile.vRefNum);
  850. X            SAVEF[(int)theFile.fName[0]] = '\0';
  851. X            numFiles = 1;
  852. X        } else
  853. X            numFiles = 0;
  854. X    }
  855. X    switches = (short *)malloc((NROFOBJECTS+2) * sizeof(long));
  856. X    for (fd = 0; fd < (NROFOBJECTS + 2); fd++)
  857. X        switches[fd] = fd;
  858. X#endif
  859. X
  860. X
  861. X    /*
  862. X     *  Initialize screen I/O before anything is displayed.
  863. X     *
  864. X     *  startup() must be called before initoptions()
  865. X     *    due to ordering of graphics settings
  866. X     *  and before error(), due to use of termcap strings.
  867. X     */
  868. X    gettty();
  869. X#if !defined(AMIGA) && !defined(MACOS)
  870. X    setbuf(stdout,obuf);
  871. X#endif
  872. X    startup();
  873. X#if !defined(AMIGA) && !defined(MACOS)
  874. X    /* Save current directory and make sure it gets restored when
  875. X     * the game is exited.
  876. X     */
  877. X    if (getcwd(orgdir, sizeof orgdir) == NULL)
  878. X        error("NetHack: current directory path too long");
  879. X    funcp = (int (*)())exit; /* Kludge to get around LINT_ARGS of signal. */
  880. X# ifndef NO_SIGNAL
  881. X    signal(SIGINT, (SIG_RET_TYPE) funcp);    /* restore original directory */
  882. X# endif
  883. X#endif /* AMIGA || MACOS */
  884. X
  885. X#ifndef MACOS
  886. X    if ((dir = getenv("HACKDIR")) != NULL) {
  887. X        Strcpy(hackdir, dir);
  888. X# ifdef CHDIR
  889. X        chdirx (dir, 1);
  890. X# endif
  891. X    }
  892. X#if defined(AMIGA) && defined(CHDIR)
  893. X    /*
  894. X     * If we're dealing with workbench, change the directory.  Otherwise
  895. X     * we could get "Insert disk in drive 0" messages. (Must be done
  896. X     * before initoptions())....
  897. X     */
  898. X    if(argc == 0)
  899. X        chdirx(HACKDIR, 1);
  900. X#endif
  901. X
  902. X# if defined(DGK)
  903. X    /* zero "fileinfo" array to prevent crashes on level change */
  904. X    for (i = 0 ; i <= MAXLEVEL; i++) {
  905. X        fileinfo[i] = zfinfo;
  906. X    }
  907. X# endif /* DGK */
  908. X
  909. X    initoptions();
  910. X#ifdef AMIGA_WBENCH
  911. X    ami_wbench_init(argc,argv);
  912. X#endif
  913. X# if defined(TOS) && defined(TEXTCOLOR)
  914. X    if (flags.IBMBIOS && flags.use_color)
  915. X        set_colors();
  916. X# endif
  917. X    if (!hackdir[0])
  918. X#if !defined(LATTICE) && !defined(AMIGA)
  919. X        Strcpy(hackdir, orgdir);
  920. X#else
  921. X        Strcpy(hackdir, HACKDIR);
  922. X#endif
  923. X    if(argc > 1) {
  924. X        if (!strncmp(argv[1], "-d", 2)) {
  925. X        argc--;
  926. X        argv++;
  927. X        dir = argv[0]+2;
  928. X        if(*dir == '=' || *dir == ':') dir++;
  929. X        if(!*dir && argc > 1) {
  930. X            argc--;
  931. X            argv++;
  932. X            dir = argv[0];
  933. X        }
  934. X        if(!*dir)
  935. X            error("Flag -d must be followed by a directory name.");
  936. X        Strcpy(hackdir, dir);
  937. X        } else
  938. X
  939. X    /*
  940. X     * Now we know the directory containing 'record' and
  941. X     * may do a prscore().
  942. X     */
  943. X        if (!strncmp(argv[1], "-s", 2)) {
  944. X# ifdef CHDIR
  945. X        chdirx(hackdir,0);
  946. X# endif
  947. X        prscore(argc, argv);
  948. X        exit(0);
  949. X        }
  950. X    }
  951. X#else
  952. X    initoptions();
  953. X#endif    /* MACOS /* */
  954. X
  955. X    /*
  956. X     * It seems you really want to play.
  957. X     */
  958. X    setrandom();
  959. X    cls();
  960. X#ifdef TOS
  961. X    if ((unsigned long)time(&clock) < (unsigned long)compiletime)
  962. X        error("Your clock is incorrectly set!");
  963. X#endif
  964. X    u.uhp = 1;    /* prevent RIP on early quits */
  965. X    u.ux = FAR;    /* prevent nscr() */
  966. X
  967. X    /*
  968. X     * Find the creation date of this game,
  969. X     * so as to avoid restoring outdated savefiles.
  970. X     */
  971. X    /* gethdate(hname); */
  972. X
  973. X    /*
  974. X     * We cannot do chdir earlier, otherwise gethdate will fail.
  975. X     */
  976. X#ifdef CHDIR
  977. X    chdirx(hackdir,1);
  978. X#endif
  979. X
  980. X#ifndef MACOS
  981. X    /*
  982. X     * Process options.
  983. X     */
  984. X    while(argc > 1 && argv[1][0] == '-'){
  985. X        argv++;
  986. X        argc--;
  987. X        switch(argv[0][1]){
  988. X#if defined(WIZARD) || defined(EXPLORE_MODE)
  989. X# ifndef EXPLORE_MODE
  990. X        case 'X':
  991. X# endif
  992. X        case 'D':
  993. X# ifdef WIZARD
  994. X            /* Must have "name" set correctly by NETHACK.CNF,
  995. X             * NETHACKOPTIONS, or -u
  996. X             * before this flag to enter wizard mode. */
  997. X#  ifdef KR1ED
  998. X            if(!strcmp(plname, WIZARD_NAME)) {
  999. X#  else
  1000. X            if(!strcmp(plname, WIZARD)) {
  1001. X#  endif
  1002. X                wizard = TRUE;
  1003. X                break;
  1004. X            }
  1005. X            /* otherwise fall thru to discover */
  1006. X# endif
  1007. X# ifdef EXPLORE_MODE
  1008. X        case 'X':
  1009. X            discover = TRUE;
  1010. X# endif
  1011. X            break;
  1012. X#endif
  1013. X#ifdef NEWS
  1014. X        case 'n':
  1015. X            flags.nonews = TRUE;
  1016. X            break;
  1017. X#endif
  1018. X        case 'u':
  1019. X            if(argv[0][2])
  1020. X              (void) strncpy(plname, argv[0]+2, sizeof(plname)-1);
  1021. X            else if(argc > 1) {
  1022. X              argc--;
  1023. X              argv++;
  1024. X              (void) strncpy(plname, argv[0], sizeof(plname)-1);
  1025. X            } else
  1026. X                Printf("Player name expected after -u\n");
  1027. X            break;
  1028. X#ifdef DGK
  1029. X        /* Player doesn't want to use a RAM disk
  1030. X         */
  1031. X        case 'r':
  1032. X            ramdisk = FALSE;
  1033. X            break;
  1034. X#endif
  1035. X        default:
  1036. X            if (index(classes, toupper(argv[0][1]))) {
  1037. X                /* allow -T for Tourist, etc. */
  1038. X                (void) strncpy(pl_character, argv[0]+1,
  1039. X                           sizeof(pl_character)-1);
  1040. X                break;
  1041. X            } else Printf("\nUnknown switch: %s\n", argv[0]);
  1042. X        case '?':
  1043. XPrintf("\nUsage: %s [-d dir] -s [-[%s]] [maxrank] [name]...", hname, classes);
  1044. XPrintf("\n       or");
  1045. XPrintf("\n       %s [-d dir] [-u name] [-[%s]]", hname, classes);
  1046. X#if defined(WIZARD) || defined(EXPLORE_MODE)
  1047. X            Printf(" [-[DX]]");
  1048. X#endif
  1049. X#ifdef NEWS
  1050. X            Printf(" [-n]");
  1051. X#endif
  1052. X#ifdef DGK
  1053. X            Printf(" [-r]");
  1054. X#endif
  1055. X            putchar('\n');
  1056. X            return 0;
  1057. X        }
  1058. X    }
  1059. X#ifdef AMIGA_WBENCH
  1060. X    ami_wbench_args();
  1061. X#endif
  1062. X#ifdef DGK
  1063. X    set_lock_and_bones();
  1064. X    copybones(FROMPERM);
  1065. X#endif
  1066. X#ifdef WIZARD
  1067. X    if (wizard)
  1068. X        Strcpy(plname, "wizard");
  1069. X    else
  1070. X#endif
  1071. X    if (!*plname)
  1072. X        askname();
  1073. X    plnamesuffix();        /* strip suffix from name; calls askname() */
  1074. X                /* again if suffix was whole name */
  1075. X                /* accepts any suffix */
  1076. X#ifndef DGK
  1077. X    Strcpy(lock,plname);
  1078. X    Strcat(lock,".99");
  1079. X#endif
  1080. X#endif /* MACOS */
  1081. X    start_screen();
  1082. X
  1083. X    /*
  1084. X     * Initialisation of the boundaries of the mazes
  1085. X     * Both boundaries have to be even.
  1086. X     */
  1087. X
  1088. X    x_maze_max = COLNO-1;
  1089. X    if (x_maze_max % 2)
  1090. X        x_maze_max--;
  1091. X    y_maze_max = ROWNO-1;
  1092. X    if (y_maze_max % 2)
  1093. X        y_maze_max--;
  1094. X
  1095. X    /* initialize static monster strength array */
  1096. X    init_monstr();
  1097. X#ifdef MACOS
  1098. X    if (!numFiles) {
  1099. X        askname();
  1100. X        if(justscores){
  1101. X            prscore(1,&classes);
  1102. X            exit(0);
  1103. X        }
  1104. X#endif
  1105. X#if defined(AMIGA) || defined(MACOS)
  1106. X# ifdef AMIGA_WBENCH
  1107. X    if(!FromWBench)
  1108. X# endif
  1109. X    (void) strncat(SAVEF, plname, 31-4);
  1110. X#else
  1111. X    {
  1112. X        int ix = strlen(SAVEF);
  1113. X        (void)strncat(SAVEF, plname, 8);
  1114. X        regularize(SAVEF+ix);
  1115. X    }
  1116. X#endif
  1117. X#ifndef MACOS
  1118. X# ifdef AMIGA_WBENCH
  1119. X    if(!FromWBench)
  1120. X# endif
  1121. X    Strcat(SAVEF, ".sav");
  1122. X#else
  1123. X    }
  1124. X    Strcpy(lock,plname);
  1125. X    Strcat(lock,".99");
  1126. X#endif
  1127. X    cls();
  1128. X    if (
  1129. X#ifdef DGK
  1130. X# ifdef AMIGA_WBENCH
  1131. X        (FromWBench?1:saveDiskPrompt(1)) &&
  1132. X# else
  1133. X        saveDiskPrompt(1) &&
  1134. X# endif
  1135. X#endif /* DGK */
  1136. X#ifdef AMIGA_WBENCH
  1137. X        ((fd=ami_wbench_getsave(OMASK)) >=0) &&
  1138. X#else
  1139. X        ((fd = open(SAVEF, OMASK)) >= 0) &&
  1140. X#endif
  1141. X       /* if not up-to-date, quietly unlink file via false condition */
  1142. X       (uptodate(fd) || unlink(SAVEF) == 666)) {
  1143. X#ifdef WIZARD
  1144. X        /* Since wizard is actually flags.debug, restoring might
  1145. X         * overwrite it.
  1146. X         */
  1147. X        boolean remember_wiz_mode = wizard;
  1148. X#endif
  1149. X#ifndef NO_SIGNAL
  1150. X        (void) signal(SIGINT, (SIG_RET_TYPE) done1);
  1151. X#endif
  1152. X        pline("Restoring save file...");
  1153. X        (void) fflush(stdout);
  1154. X        if(!dorecover(fd))
  1155. X            goto not_recovered;
  1156. X#ifdef WIZARD
  1157. X        if(!wizard && remember_wiz_mode) wizard = TRUE;
  1158. X#endif
  1159. X        pline("Hello %s, welcome to NetHack!", plname);
  1160. X        /* get shopkeeper set properly if restore is in shop */
  1161. X        (void) inshop();
  1162. X#ifdef EXPLORE_MODE
  1163. X        if (discover)
  1164. X            You("are in non-scoring discovery mode.");
  1165. X#endif
  1166. X#if defined(EXPLORE_MODE) || defined(WIZARD)
  1167. X        if (discover || wizard) {
  1168. X            pline("Do you want to keep the save file? ");
  1169. X            if(yn() == 'n'){
  1170. X                (void) unlink(SAVEF);
  1171. X#ifdef AMIGA_WBENCH
  1172. X                ami_wbench_unlink(SAVEF);
  1173. X#endif
  1174. X            }
  1175. X        }
  1176. X#endif
  1177. X        flags.move = 0;
  1178. X    } else {
  1179. Xnot_recovered:
  1180. X        newgame();
  1181. X        /* give welcome message before pickup messages */
  1182. X        pline("Hello %s, welcome to NetHack!", plname);
  1183. X#ifdef EXPLORE_MODE
  1184. X        if (discover)
  1185. X            You("are in non-scoring discovery mode.");
  1186. X#endif
  1187. X        flags.move = 0;
  1188. X        set_wear();
  1189. X        pickup(1);
  1190. X        read_engr_at(u.ux,u.uy);
  1191. X    }
  1192. X    
  1193. X#ifdef MACOS
  1194. X    {
  1195. X        short    i;
  1196. X        MenuHandle    theMenu;
  1197. X        Rect    screen;
  1198. X        
  1199. X        theMenu = GetMHandle(appleMenu);
  1200. X        EnableItem(theMenu, 0);
  1201. X        EnableItem(theMenu, 1);
  1202. X        theMenu = GetMHandle(fileMenu);
  1203. X        EnableItem(theMenu,0);
  1204. X        for (i = inventMenu;i <= extendMenu; i++) {
  1205. X            theMenu = GetMHandle(i);
  1206. X            EnableItem(theMenu, 0);
  1207. X        }
  1208. X        DrawMenuBar();
  1209. X        macflags |= fDoUpdate;
  1210. X        SetPort(HackWindow);
  1211. X        screen = HackWindow->portRect;
  1212. X        ValidRect(&screen);
  1213. X        
  1214. X    }
  1215. X#endif
  1216. X            
  1217. X    flags.moonphase = phase_of_the_moon();
  1218. X    if(flags.moonphase == FULL_MOON) {
  1219. X        You("are lucky!  Full moon tonight.");
  1220. X        if(!u.uluck) change_luck(1);
  1221. X    } else if(flags.moonphase == NEW_MOON) {
  1222. X        pline("Be careful!  New moon tonight.");
  1223. X    }
  1224. X
  1225. X    initrack();
  1226. X#ifndef NO_SIGNAL
  1227. X    (void) signal(SIGINT, SIG_IGN);
  1228. X#endif
  1229. X#ifdef OS2
  1230. X    gettty(); /* somehow ctrl-P gets turned back on during startup ... */
  1231. X#endif
  1232. X
  1233. X    moveloop();
  1234. X#ifdef MACOS 
  1235. X    /* Help for Mac compilers */
  1236. X    free_decl();
  1237. X#endif
  1238. X    return 0;
  1239. X}
  1240. X
  1241. X
  1242. X/*
  1243. X * plname is filled either by an option (-u Player  or  -uPlayer) or
  1244. X * explicitly (by being the wizard) or by askname.
  1245. X * It may still contain a suffix denoting pl_character.
  1246. X */
  1247. Xvoid
  1248. Xaskname() {
  1249. X#ifndef MACOS
  1250. X    register int c, ct;
  1251. X
  1252. X    Printf("\nWho are you? ");
  1253. X    (void) fflush(stdout);
  1254. X    ct = 0;
  1255. X    while((c = Getchar()) != '\n') {
  1256. X        if(c == EOF) error("End of input\n");
  1257. X        /* some people get confused when their erase char is not ^H */
  1258. X        if(c == '\b') {
  1259. X            if(ct) {
  1260. X                ct--;
  1261. X#ifdef MSDOS
  1262. X                msmsg("\b \b");
  1263. X#endif
  1264. X            }
  1265. X            continue;
  1266. X        }
  1267. X        if(ct < sizeof(plname)-1) {
  1268. X#if defined(MSDOS)
  1269. X            msmsg("%c", c);
  1270. X#endif
  1271. X            plname[ct++] = c;
  1272. X        }
  1273. X    }
  1274. X    plname[ct] = 0;
  1275. X    if(ct == 0) askname();
  1276. X}
  1277. X#else /* MACOS */
  1278. X/* Macintosh startup Dialog written by Andy Swanson 10/20/89
  1279. X        modified for to include a few more options 12/17/89 */
  1280. X    DialogPtr asknameDlog;
  1281. X    DialogTHndl    th, centreDlgBox();
  1282. X    int kind;
  1283. X    Rect box;
  1284. X    Handle knob;
  1285. X    Boolean Done;
  1286. X    int chtype = 0,Hit,i;
  1287. X    Str255 ptemp;
  1288. X    char *p;
  1289. X#define OK 1
  1290. X#define NAME_TEXT 3
  1291. X#define RADIO_MIN 5
  1292. X#define RADIO_MAX 17
  1293. X#define CAVEPERSON 7
  1294. X#define CLERGY 11
  1295. X#define VALKYRIE 15
  1296. X#define ANY 17
  1297. X#define WIZ 18
  1298. X#define EXP 19
  1299. X#define FEM 20
  1300. X#define NEWS_BOX 21
  1301. X#define SCORES 22
  1302. X#define setCheckBox(a,b,c) {GetDItem(a,b,&kind,&knob,&box);SetCtlValue(knob,c?1:0);}
  1303. X#define changeRadio(a,b,c) {setCheckBox(a,b,FALSE); setCheckBox(a,c,TRUE);}
  1304. X#define Disable(b) {GetDItem(asknameDlog,b,&kind,&knob,&box);HiliteControl(knob,255);}
  1305. X#define Enable(b) {GetDItem(asknameDlog,b,&kind,&knob,&box);HiliteControl(knob,0);}
  1306. X#define Hide(b)  {GetDItem(asknameDlog,b,&kind,&knob,&box);HideControl(knob);\
  1307. X            SetDItem(asknameDlog,b,kind+128,knob,&box);}
  1308. X    justscores = FALSE;
  1309. X    if(p=strrchr((char *)plname, '-')){
  1310. X        *p = 0;
  1311. X        if(('a'<= p[1]) && ('z'>= p[1]))p[1] += 'A' - 'a';
  1312. X        pl_character[0] = p[1];
  1313. X        pl_character[1] = 0;
  1314. X        if(chtype = (int)index(classes,p[1]))
  1315. X            chtype -= (int)(classes)-1;
  1316. X        if(p[1] == 'V')
  1317. X            flags.female = TRUE;
  1318. X    }
  1319. X    if(chtype != 0) chtype += 4;
  1320. X    else chtype = 17;
  1321. X#ifdef THINKC4
  1322. X    if(!*plname && (p = getlogin()))
  1323. X        (void) strncpy((char *)&plname,p,sizeof(plname)-1);
  1324. X#endif
  1325. X    th = centreDlgBox(131, FALSE);
  1326. X    
  1327. X    asknameDlog = GetNewDialog(131,0,-1);
  1328. X    
  1329. X    ReleaseResource((Handle)th);
  1330. X    if(*plname){
  1331. X        GetDItem(asknameDlog,NAME_TEXT,&kind,&knob,&box);
  1332. X        strncpy((char*)ptemp,(char*)&plname,255);
  1333. X        CtoPstr((char*)ptemp);
  1334. X        SetIText(knob,ptemp);
  1335. X    }
  1336. X    GetDItem(asknameDlog,chtype,&kind,&knob,&box);
  1337. X    SetCtlValue(knob,1);
  1338. X    if(flags.female){
  1339. X        setCheckBox(asknameDlog,FEM,TRUE);
  1340. X        changeDgenders(asknameDlog,TRUE);
  1341. X    }
  1342. X#ifdef NEWS
  1343. X    setCheckBox(asknameDlog,NEWS_BOX,!flags.nonews);
  1344. X#else
  1345. X    Hide(NEWS_BOX);
  1346. X#endif
  1347. X#ifdef WIZARD
  1348. X    wizard = FALSE;
  1349. X# ifdef KR1ED
  1350. X    if (strcmp(plname,WIZARD_NAME)) {
  1351. X# else
  1352. X    if (strcmp(plname,WIZARD)) {
  1353. X# endif
  1354. X#else
  1355. X    {
  1356. X#endif
  1357. X        Hide(WIZ);
  1358. X    }
  1359. X#ifdef EXPLORE_MODE
  1360. X    setCheckBox(asknameDlog,EXP,discover);
  1361. X#else
  1362. X        Hide(EXP);
  1363. X#endif
  1364. X    SelIText(asknameDlog, NAME_TEXT, 0, 32767);
  1365. X    ShowWindow(asknameDlog);
  1366. X    Done = FALSE;
  1367. X    while (!Done){
  1368. X        ModalDialog(startDlogFProc, &Hit);
  1369. X        if(Hit == OK){
  1370. X            Done = TRUE;
  1371. X            GetDItem(asknameDlog,NAME_TEXT,&kind,&knob,&box);
  1372. X            GetIText(knob,&ptemp);
  1373. X            PtoCstr((char*)ptemp);
  1374. X            (void) strncpy((char*)&plname,(char*)ptemp,sizeof(plname)-1);
  1375. X            pl_character[0]=classes[chtype-5];
  1376. X            pl_character[1]=0;
  1377. X            HideWindow(asknameDlog);
  1378. X        } else if((Hit >= RADIO_MIN) && (Hit <= RADIO_MAX)){
  1379. X            extern int lastDlgBut;
  1380. X            
  1381. X            changeRadio(asknameDlog,chtype,Hit);
  1382. X            lastDlgBut = chtype = Hit;
  1383. X            if ((chtype == VALKYRIE) && !flags.female) {
  1384. X                flags.female = TRUE;
  1385. X                setCheckBox(asknameDlog,FEM,flags.female);
  1386. X                changeDgenders(asknameDlog,TRUE);
  1387. X            }
  1388. X        } else if(Hit == WIZ) {
  1389. X            wizard = !wizard;
  1390. X            setCheckBox(asknameDlog,WIZ,wizard);
  1391. X        } else if(Hit == EXP) {
  1392. X            discover = !discover;
  1393. X            setCheckBox(asknameDlog,EXP,discover);
  1394. X        } else if(Hit == FEM) {
  1395. X            flags.female = !flags.female;
  1396. X            setCheckBox(asknameDlog,FEM,flags.female);
  1397. X            if(chtype == VALKYRIE) {
  1398. X                chtype = ANY;
  1399. X                changeRadio(asknameDlog,VALKYRIE,ANY);
  1400. X            }
  1401. X            changeDgenders(asknameDlog,flags.female);
  1402. X        } else if(Hit == NEWS_BOX) {
  1403. X            flags.nonews = !flags.nonews;
  1404. X            setCheckBox(asknameDlog,NEWS_BOX,!flags.nonews);
  1405. X        } else if(Hit == SCORES) {
  1406. X            justscores = !justscores;
  1407. X            setCheckBox(asknameDlog,SCORES,justscores);
  1408. X            if(justscores) for (i=RADIO_MIN;i<SCORES;i++) {
  1409. X                Disable(i);
  1410. X                }
  1411. X            else for (i=RADIO_MIN;i<SCORES;i++)
  1412. X                Enable(i);
  1413. X        }
  1414. X    }
  1415. X    DisposDialog(asknameDlog);
  1416. X}
  1417. X
  1418. X
  1419. X#define RADIO_STRING "ABCEHKPRSTVWL"
  1420. Xint    lastDlgBut = ANY;
  1421. X
  1422. X/* The filterProc for handling character selection from keyboard
  1423. X   by h+@nada.kth.se                                             */
  1424. Xpascal boolean
  1425. XstartDlogFProc(theDialog, theEvent, itemHit)
  1426. XDialogPtr theDialog;
  1427. XEventRecord * theEvent;
  1428. Xshort * itemHit;
  1429. X{
  1430. X    int x, c;
  1431. X
  1432. X    if(theEvent->what == keyDown) {
  1433. X        c = theEvent->message & 0xFF;
  1434. X#ifdef BETA /* We don't want this is no shipped version */
  1435. X        if(c == '#') Debugger();
  1436. X#endif
  1437. X        if(c == 10 || c == 13 || c == 3) { /* Accept */
  1438. X            *itemHit = OK;
  1439. X            return TRUE;
  1440. X        }
  1441. X        if(c == '\t' || c == ' ') { /* Select */
  1442. X            lastDlgBut++;
  1443. X            if(lastDlgBut > RADIO_MAX) lastDlgBut = RADIO_MIN;
  1444. X            *itemHit = lastDlgBut;
  1445. X            return TRUE;
  1446. X        }
  1447. X        if(theEvent->modifiers & cmdKey) {
  1448. X            if(c >= 'a' && c <= 'z') c &= 0x5F; /* Uppercase */
  1449. X            switch(c) {
  1450. X            case 'F' :
  1451. X                *itemHit = FEM;
  1452. X                return TRUE;
  1453. X            case 'X' :
  1454. X                *itemHit = EXP;
  1455. X                return TRUE;
  1456. X            case 'N' :
  1457. X                *itemHit = NEWS_BOX;
  1458. X                return TRUE;
  1459. X            case 'J' :
  1460. X                *itemHit = SCORES;
  1461. X                return TRUE;
  1462. X            default :
  1463. X                for(x=0; RADIO_STRING[x]; x++) {
  1464. X                    if(c == RADIO_STRING[x]) {
  1465. X                        *itemHit = x + RADIO_MIN;
  1466. X                        return TRUE;
  1467. X                    }
  1468. X                }
  1469. X            }
  1470. X            theEvent->what = nullEvent;
  1471. X        }
  1472. X    }
  1473. X
  1474. X    return FALSE;
  1475. X}
  1476. X
  1477. X
  1478. XchangeDgenders(Dlog,fem)
  1479. XDialogPtr Dlog;
  1480. XBoolean fem;
  1481. X{    int kind;
  1482. X    Rect box;
  1483. X    Handle knob;
  1484. X    Str255 ptemp;
  1485. X    if(fem){
  1486. X        GetDItem(Dlog,CAVEPERSON,&kind,&knob,&box);
  1487. X        strncpy((char*)ptemp,"Cave-Woman",255);
  1488. X        CtoPstr((char*)ptemp);
  1489. X        SetCTitle(knob,ptemp);
  1490. X        GetDItem(Dlog,CLERGY,&kind,&knob,&box);
  1491. X        strncpy((char*)ptemp,"Priestess",255);
  1492. X        CtoPstr((char*)ptemp);
  1493. X        SetCTitle(knob,ptemp);
  1494. X    } else {
  1495. X        GetDItem(Dlog,CAVEPERSON,&kind,&knob,&box);
  1496. X        strncpy((char*)ptemp,"Cave-Man",255);
  1497. X        CtoPstr((char*)ptemp);
  1498. X        SetCTitle(knob,ptemp);
  1499. X        GetDItem(Dlog,CLERGY,&kind,&knob,&box);
  1500. X        strncpy((char*)ptemp,"Priest",255);
  1501. X        CtoPstr((char*)ptemp);
  1502. X        SetCTitle(knob,ptemp);
  1503. X    }
  1504. X}
  1505. X#endif /* MACOS */
  1506. X
  1507. X
  1508. X#ifdef CHDIR
  1509. Xvoid
  1510. Xchdirx(dir, wr)
  1511. Xchar *dir;
  1512. Xboolean wr;
  1513. X{
  1514. X#ifdef AMIGA
  1515. X    static char thisdir[] = "";
  1516. X#else
  1517. X    static char thisdir[] = ".";
  1518. X#endif
  1519. X    if(dir && chdir(dir) < 0) {
  1520. X        error("Cannot chdir to %s.", dir);
  1521. X    }
  1522. X
  1523. X    /* Change the default drive as well.
  1524. X     */
  1525. X#ifndef AMIGA
  1526. X    chdrive(dir);
  1527. X#endif
  1528. X
  1529. X    /* warn the player if we can't write the record file */
  1530. X    /* perhaps we should also test whether . is writable */
  1531. X    /* unfortunately the access systemcall is worthless */
  1532. X    if(wr) {
  1533. X        register int fd;
  1534. X
  1535. X        if(dir == NULL)
  1536. X        dir = thisdir;
  1537. X#ifdef OS2_CODEVIEW  /* explicit path on opening for OS/2 */
  1538. X        {
  1539. X        char tmp[PATHLEN];
  1540. X
  1541. X        Strcpy(tmp, dir);
  1542. X        append_slash(tmp);
  1543. X        Strcat(tmp, RECORD);
  1544. X        if((fd = open(tmp, O_RDWR)) < 0) {
  1545. X#else
  1546. X        if((fd = open(RECORD, O_RDWR)) < 0) {
  1547. X#endif
  1548. X#ifdef DGK
  1549. X# ifndef OS2_CODEVIEW
  1550. X        char tmp[PATHLEN];
  1551. X
  1552. X        Strcpy(tmp, dir);
  1553. X        append_slash(tmp);
  1554. X# endif
  1555. X        /* try to create empty record */
  1556. X
  1557. X# ifdef OS2_CODEVIEW
  1558. X        if((fd = open(tmp, O_CREAT|O_RDWR, S_IREAD|S_IWRITE)) < 0) {
  1559. X            msmsg("Warning: cannot write %s\n", tmp);
  1560. X# else
  1561. X# ifdef AZTEC_C
  1562. X        /* Aztec doesn't use the third argument */
  1563. X        if((fd = open(RECORD, O_CREAT|O_RDWR)) < 0) {
  1564. X            msmsg("Warning: cannot write %s%s\n", tmp, RECORD);
  1565. X# else
  1566. X          if((fd = open(RECORD, O_CREAT|O_RDWR, S_IREAD|S_IWRITE)) < 0) {
  1567. X            msmsg("Warning: cannot write %s%s\n", tmp, RECORD);
  1568. X# endif
  1569. X# endif
  1570. X            getreturn("to continue");
  1571. X        } else
  1572. X            (void) close(fd);
  1573. X#else
  1574. X        Printf("Warning: cannot write %s/%s", dir, RECORD);
  1575. X        getret();
  1576. X#endif
  1577. X        } else
  1578. X        (void) close(fd);
  1579. X#ifdef OS2_CODEVIEW
  1580. X        }
  1581. X#endif
  1582. X    }
  1583. X}
  1584. X#endif /* CHDIR /**/
  1585. END_OF_FILE
  1586. if test 19050 -ne `wc -c <'others/pcmain.c'`; then
  1587.     echo shar: \"'others/pcmain.c'\" unpacked with wrong size!
  1588. fi
  1589. # end of 'others/pcmain.c'
  1590. if test -f 'src/vault.c' -a "${1}" != "-c" ; then 
  1591.   echo shar: Renaming existing file \"'src/vault.c'\" to \"'src/vault.c.orig'\"
  1592.   mv -f 'src/vault.c' 'src/vault.c.orig'
  1593. fi
  1594. echo shar: Extracting \"'src/vault.c'\" \(11389 characters\)
  1595. sed "s/^X//" >'src/vault.c' <<'END_OF_FILE'
  1596. X/*    SCCS Id: @(#)vault.c    3.0    88/10/25
  1597. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1598. X/* NetHack may be freely redistributed.  See license for details. */
  1599. X
  1600. X#include "hack.h"
  1601. X#include "vault.h"
  1602. X
  1603. Xstatic void FDECL(restfakecorr,(struct monst *));
  1604. XOSTATIC boolean FDECL(in_vault,(int,int));
  1605. XOSTATIC struct monst *NDECL(findgd);
  1606. Xstatic boolean FDECL(in_fcorridor, (struct monst *,int,int));
  1607. X
  1608. X#ifdef OVLB
  1609. X
  1610. Xstatic void
  1611. Xrestfakecorr(grd) 
  1612. Xregister struct monst *grd;
  1613. X{
  1614. X    register int fcx, fcy, fcbeg;
  1615. X    register struct rm *crm;
  1616. X
  1617. X    while((fcbeg = EGD(grd)->fcbeg) < EGD(grd)->fcend) {
  1618. X        fcx = EGD(grd)->fakecorr[fcbeg].fx;
  1619. X        fcy = EGD(grd)->fakecorr[fcbeg].fy;
  1620. X        if((u.ux == fcx && u.uy == fcy) || cansee(fcx,fcy) ||
  1621. X           m_at(fcx,fcy))
  1622. X            return;
  1623. X        crm = &levl[fcx][fcy];
  1624. X        crm->typ = EGD(grd)->fakecorr[fcbeg].ftyp;
  1625. X        if(!crm->typ) crm->seen = 0;
  1626. X        newsym(fcx,fcy);
  1627. X        if(cansee(fcx,fcy)) prl(fcx,fcy);
  1628. X        EGD(grd)->fcbeg++;
  1629. X    }
  1630. X    /* it seems he left the corridor - let the guard disappear */
  1631. X    mongone(grd);
  1632. X}
  1633. X
  1634. Xstatic boolean
  1635. Xin_fcorridor(grd, x, y)
  1636. Xregister struct monst *grd;
  1637. Xint x, y; 
  1638. X{
  1639. X    register int fci;
  1640. X
  1641. X    for(fci = EGD(grd)->fcbeg; fci < EGD(grd)->fcend; fci++)
  1642. X        if(x == EGD(grd)->fakecorr[fci].fx &&
  1643. X                y == EGD(grd)->fakecorr[fci].fy)
  1644. X            return(TRUE);
  1645. X    return(FALSE);
  1646. X}
  1647. X
  1648. XXSTATIC 
  1649. Xstruct monst *
  1650. Xfindgd() {
  1651. X
  1652. X    register struct monst *mtmp;
  1653. X
  1654. X    for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  1655. X        if(mtmp->isgd && EGD(mtmp)->gdlevel == dlevel)
  1656. X        return(mtmp);
  1657. X    return((struct monst *)0);
  1658. X}
  1659. X
  1660. X#endif /* OVLB */
  1661. X#ifdef OVL0
  1662. X
  1663. XXSTATIC
  1664. Xboolean
  1665. Xin_vault(x, y)
  1666. Xint x, y;
  1667. X{
  1668. X    register int roomno = inroom(x, y);
  1669. X
  1670. X    if(roomno < 0) return(FALSE);
  1671. X    return(rooms[roomno].rtype == VAULT);
  1672. X}
  1673. X
  1674. Xvoid
  1675. Xinvault() {
  1676. X
  1677. X#ifdef BSD_43_BUG
  1678. X    int dummy;        /* hack to avoid schain botch */
  1679. X#endif
  1680. X    struct monst *guard;
  1681. X
  1682. X    if(!in_vault(u.ux, u.uy)) {
  1683. X    u.uinvault = 0;
  1684. X    return;
  1685. X    }
  1686. X
  1687. X    guard = findgd();
  1688. X    if(++u.uinvault % 30 == 0 && !guard) { /* if time ok and no guard now. */
  1689. X    char buf[BUFSZ];
  1690. X    register int x, y, dd, gx, gy;
  1691. X
  1692. X    /* first find the goal for the guard */
  1693. X    for(dd = 1; (dd < ROWNO || dd < COLNO); dd++) {
  1694. X      for(y = u.uy-dd; y <= u.uy+dd; y++) {
  1695. X        if(y < 0 || y > ROWNO-1) continue;
  1696. X        for(x = u.ux-dd; x <= u.ux+dd; x++) {
  1697. X          if(y != u.uy-dd && y != u.uy+dd && x != u.ux-dd)
  1698. X        x = u.ux+dd;
  1699. X          if(x < 0 || x > COLNO-1) continue;
  1700. X          if(levl[x][y].typ == CORR) goto fnd;
  1701. X        }
  1702. X      }
  1703. X    }
  1704. X    impossible("Not a single corridor on this level??");
  1705. X    tele();
  1706. X    return;
  1707. Xfnd:
  1708. X    gx = x; gy = y;
  1709. X
  1710. X    /* next find a good place for a door in the wall */
  1711. X    x = u.ux; y = u.uy;
  1712. X    while(levl[x][y].typ == ROOM) {
  1713. X        register int dx,dy;
  1714. X
  1715. X        dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;
  1716. X        dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;
  1717. X        if(abs(gx-x) >= abs(gy-y))
  1718. X            x += dx;
  1719. X        else
  1720. X            y += dy;
  1721. X    }
  1722. X
  1723. X    /* make something interesting happen */
  1724. X    if(!(guard = makemon(&mons[PM_GUARD], x, y))) return;
  1725. X    guard->isgd = 1;
  1726. X    guard->mpeaceful = 1;
  1727. X    EGD(guard)->gddone = 0;
  1728. X    EGD(guard)->ogx = x;
  1729. X    EGD(guard)->ogy = y;
  1730. X    EGD(guard)->gdlevel = dlevel;
  1731. X    EGD(guard)->warncnt = 0;
  1732. X
  1733. X    if(!cansee(guard->mx, guard->my)) {
  1734. X        mongone(guard);
  1735. X        return;
  1736. X    }
  1737. X
  1738. X    reset_faint();            /* if fainted - wake up */
  1739. X    pline("Suddenly one of the Vault's guards enters!");
  1740. X    pmon(guard);
  1741. X    stop_occupation();        /* if occupied, stop it *now* */
  1742. X    do {
  1743. X        pline("\"Hello stranger, who are you?\" - ");
  1744. X        getlin(buf);
  1745. X    } while (!letter(buf[0]));
  1746. X
  1747. X    if(!strcmp(buf, "Croesus") || !strcmp(buf, "Kroisos")) {
  1748. X        verbalize("Oh, yes, of course.  Sorry to have disturbed you.");
  1749. X        mongone(guard);
  1750. X        return;
  1751. X    }
  1752. X    clrlin();
  1753. X    verbalize("I don't know you.");
  1754. X    if(!u.ugold)
  1755. X        verbalize("Please follow me.");
  1756. X    else {
  1757. X        verbalize("Most likely all that gold was stolen from this vault.");
  1758. X        verbalize("Please drop that gold and follow me.");
  1759. X    }
  1760. X    EGD(guard)->gdx = gx;
  1761. X    EGD(guard)->gdy = gy;
  1762. X    EGD(guard)->fcbeg = 0;
  1763. X    EGD(guard)->fakecorr[0].fx = x;
  1764. X    EGD(guard)->fakecorr[0].fy = y;
  1765. X    EGD(guard)->fakecorr[0].ftyp = levl[x][y].typ;
  1766. X    levl[x][y].typ = DOOR;
  1767. X    levl[x][y].doormask = D_NODOOR;
  1768. X    EGD(guard)->fcend = 1;
  1769. X    EGD(guard)->warncnt = 1;
  1770. X    }
  1771. X}
  1772. X
  1773. X#endif /* OVL0 */
  1774. X#ifdef OVLB
  1775. X
  1776. X/*
  1777. X * return  1: he moved,  0: he didn't,  -1: let m_move do it,  -2: died
  1778. X */
  1779. Xint
  1780. Xgd_move(grd)
  1781. Xregister struct monst *grd;
  1782. X{
  1783. X    int x, y, nx, ny, m, n;
  1784. X    int dx, dy, gx, gy, i, fci;
  1785. X    uchar typ;
  1786. X    struct fakecorridor *fcp;
  1787. X    register struct rm *crm;
  1788. X    register struct gold *gold;
  1789. X    register boolean goldincorridor = FALSE;
  1790. X
  1791. X#ifdef __GNULINT__
  1792. X    m = n = 0;
  1793. X#endif
  1794. X    if(EGD(grd)->gdlevel != dlevel) return(-1);
  1795. X    if(!grd->mpeaceful && in_vault(grd->mx, grd->my) &&
  1796. X            !in_vault(u.ux, u.uy)) {
  1797. X        rloc(grd);
  1798. X        goto letknow;
  1799. X    }
  1800. X    if(!grd->mpeaceful) return(-1);
  1801. X    if(abs(EGD(grd)->ogx - grd->mx) > 1 || 
  1802. X            abs(EGD(grd)->ogy - grd->my) > 1)
  1803. X        return(-1);    /* teleported guard - treat as monster */
  1804. X    if(EGD(grd)->fcend == 1) {
  1805. X        if(in_vault(u.ux, u.uy) && 
  1806. X            (u.ugold || um_dist(grd->mx, grd->my, 1))) {
  1807. X        if(EGD(grd)->warncnt == 3)
  1808. X            pline("\"Again, %sfollow me!\"", 
  1809. X                u.ugold ? "drop that gold and " : "");
  1810. X        if(EGD(grd)->warncnt == 6) {
  1811. X            register int m = grd->mx, n = grd->my;
  1812. X            verbalize("You've been warned, knave!");
  1813. X            mnexto(grd);
  1814. X            levl[m][n].typ = EGD(grd)->fakecorr[0].ftyp;
  1815. X            newsym(m,n);
  1816. X            if(cansee(m,n)) prl(m,n);
  1817. X            grd->mpeaceful = 0;
  1818. X            return(-1);
  1819. X        }
  1820. X        /* not fair to get mad when (s)he's fainted */
  1821. X        if(!is_fainted()) EGD(grd)->warncnt++;
  1822. X        return(0);
  1823. X        }
  1824. X        if(!in_vault(u.ux,u.uy) && u.ugold) { /* player teleported */
  1825. X        register int m = grd->mx, n = grd->my;
  1826. X        rloc(grd);
  1827. X        levl[m][n].typ = EGD(grd)->fakecorr[0].ftyp;
  1828. X        newsym(m,n);
  1829. X        if(!Blind) prl(m,n);
  1830. X        grd->mpeaceful = 0;
  1831. Xletknow:
  1832. X        if(!cansee(grd->mx, grd->my))
  1833. X            You("hear the shrill sound of a guard's whistle.");
  1834. X        else
  1835. X            You(um_dist(grd->mx, grd->my, 2) ?
  1836. X            "see an angry %s approaching." :
  1837. X            "are confronted by an angry %s.",
  1838. X            lmonnam(grd)+4);
  1839. X        return(-1);
  1840. X        }
  1841. X    }
  1842. X    if(u.ugold && (in_fcorridor(grd, u.ux, u.uy) || /*cover 'blind' spot*/
  1843. X            (EGD(grd)->fcend > 1 && in_vault(u.ux, u.uy)))) {
  1844. X        if(EGD(grd)->warncnt < 6) {
  1845. X            EGD(grd)->warncnt = 6;
  1846. X            verbalize("Drop all your gold, scoundrel!");
  1847. X            return(0);
  1848. X        } else {
  1849. X            verbalize("So be it, rogue!");
  1850. X            grd->mpeaceful = 0;
  1851. X            return(-1);
  1852. X        }    
  1853. X    } 
  1854. X    for(fci = EGD(grd)->fcbeg; fci < EGD(grd)->fcend; fci++)
  1855. X        if(g_at(EGD(grd)->fakecorr[fci].fx, EGD(grd)->fakecorr[fci].fy)){
  1856. X        m = EGD(grd)->fakecorr[fci].fx;
  1857. X        n = EGD(grd)->fakecorr[fci].fy;
  1858. X        goldincorridor = TRUE; 
  1859. X        }
  1860. X    if(goldincorridor && !EGD(grd)->gddone) {
  1861. X        x = grd->mx;
  1862. X        y = grd->my;
  1863. X        if(m == x && n == y) mpickgold(grd);
  1864. X        else if(m == u.ux && n == u.uy) {
  1865. X            gold = g_at(u.ux, u.uy);
  1866. X             grd->mgold += gold->amount;
  1867. X            freegold(gold);
  1868. X        } else {
  1869. X            /* just for insurance... */
  1870. X            if(MON_AT(m, n) && m != grd->mx && n != grd->my) {
  1871. X            verbalize("Out of my way, scum!");
  1872. X            rloc(m_at(m, n));
  1873. X            }
  1874. X            remove_monster(grd->mx, grd->my);
  1875. X            place_monster(grd, m, n);
  1876. X            pmon(grd);
  1877. X            mpickgold(grd);
  1878. X        }
  1879. X        pline("The %s%s picks the gold.", lmonnam(grd)+4,
  1880. X                grd->mpeaceful ? " calms down and" : "");
  1881. X        if(x != grd->mx || y != grd->my) {
  1882. X            remove_monster(grd->mx, grd->my);
  1883. X            place_monster(grd, x, y);
  1884. X            pmon(grd);
  1885. X        }
  1886. X        goldincorridor = FALSE;
  1887. X        if(!grd->mpeaceful) return(-1);
  1888. X        else {
  1889. X            EGD(grd)->warncnt = 5;
  1890. X            return(0);
  1891. X        }
  1892. X    }
  1893. X    if(um_dist(grd->mx, grd->my, 1) || EGD(grd)->gddone) {
  1894. X        restfakecorr(grd);
  1895. X        return(0);    /* didn't move */
  1896. X    }
  1897. X    x = grd->mx;
  1898. X    y = grd->my;
  1899. X    /* look around (hor & vert only) for accessible places */
  1900. X    for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) {
  1901. X      if((nx == x || ny == y) && (nx != x || ny != y) && isok(nx, ny)) {
  1902. X
  1903. X        typ = (crm = &levl[nx][ny])->typ;
  1904. X        if(!IS_STWALL(typ) && !IS_POOL(typ)) {
  1905. X
  1906. X        for(i = EGD(grd)->fcbeg; i < EGD(grd)->fcend; i++)
  1907. X            if(EGD(grd)->fakecorr[i].fx == nx && 
  1908. X                EGD(grd)->fakecorr[i].fy == ny)
  1909. X            goto nextnxy;
  1910. X
  1911. X        if((i = inroom(nx,ny)) >= 0 && rooms[i].rtype == VAULT)
  1912. X            continue;
  1913. X
  1914. X        /* seems we found a good place to leave him alone */
  1915. X        EGD(grd)->gddone = 1;
  1916. X        if(ACCESSIBLE(typ)) goto newpos;
  1917. X#ifdef STUPID
  1918. X        if (typ == SCORR)
  1919. X            crm->typ = CORR;
  1920. X        else
  1921. X            crm->typ = DOOR;
  1922. X#else
  1923. X        crm->typ = (typ == SCORR) ? CORR : DOOR;
  1924. X#endif
  1925. X        if(crm->typ == DOOR) crm->doormask = D_NODOOR;
  1926. X        goto proceed;
  1927. X        }
  1928. X      }
  1929. Xnextnxy:    ;
  1930. X    }
  1931. X    nx = x;
  1932. X    ny = y;
  1933. X    gx = EGD(grd)->gdx;
  1934. X    gy = EGD(grd)->gdy;
  1935. X    dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;
  1936. X    dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;
  1937. X    if(abs(gx-x) >= abs(gy-y)) nx += dx; else ny += dy;
  1938. X
  1939. X    while((typ = (crm = &levl[nx][ny])->typ) != 0) {
  1940. X    /* in view of the above we must have IS_WALL(typ) or typ == POOL */
  1941. X    /* must be a wall here */
  1942. X        if(isok(nx+nx-x,ny+ny-y) && !IS_POOL(typ) &&
  1943. X            SPACE_POS(levl[nx+nx-x][ny+ny-y].typ)){
  1944. X            crm->typ = DOOR;
  1945. X            crm->doormask = D_NODOOR;
  1946. X            goto proceed;
  1947. X        }
  1948. X        if(dy && nx != x) {
  1949. X            nx = x; ny = y+dy;
  1950. X            continue;
  1951. X        }
  1952. X        if(dx && ny != y) {
  1953. X            ny = y; nx = x+dx; dy = 0;
  1954. X            continue;
  1955. X        }
  1956. X        /* I don't like this, but ... */
  1957. X        crm->typ = DOOR;
  1958. X        crm->doormask = D_NODOOR;
  1959. X        goto proceed;
  1960. X    }
  1961. X    crm->typ = CORR;
  1962. Xproceed:
  1963. X    if(cansee(nx,ny)) {
  1964. X        mnewsym(nx,ny);
  1965. X        prl(nx,ny);
  1966. X    }
  1967. X    fcp = &(EGD(grd)->fakecorr[EGD(grd)->fcend]);
  1968. X    if(EGD(grd)->fcend++ == FCSIZ) panic("fakecorr overflow");
  1969. X    fcp->fx = nx;
  1970. X    fcp->fy = ny;
  1971. X    fcp->ftyp = typ;
  1972. Xnewpos:
  1973. X    if(EGD(grd)->gddone) {
  1974. X        /* The following is a kluge.  We need to keep     */
  1975. X        /* the guard around in order to be able to make   */
  1976. X        /* the fake corridor disappear as the player      */
  1977. X        /* moves out of it, but we also need the guard    */
  1978. X        /* out of the way.  We send the guard to never-   */
  1979. X        /* never land.  We set ogx ogy to mx my in order  */
  1980. X        /* to avoid a check at the top of this function.  */
  1981. X        /* At the end of the process, the guard is killed */
  1982. X        /* in restfakecorr().                  */
  1983. X        remove_monster(grd->mx, grd->my);
  1984. X        place_monster(grd, 0, 0);
  1985. X        EGD(grd)->ogx = grd->mx;
  1986. X        EGD(grd)->ogy = grd->my;
  1987. X        restfakecorr(grd);
  1988. X        if(in_fcorridor(grd, u.ux, u.uy) || cansee(grd->mx, grd->my))
  1989. X            pline("Suddenly, the guard disappears.");
  1990. X        return(-2);
  1991. X    }
  1992. X    EGD(grd)->ogx = grd->mx;    /* update old positions */
  1993. X    EGD(grd)->ogy = grd->my;
  1994. X    remove_monster(grd->mx, grd->my);
  1995. X    place_monster(grd, nx, ny);
  1996. X    pmon(grd);
  1997. X    restfakecorr(grd);
  1998. X    return(1);
  1999. X}
  2000. X
  2001. X/* Routine when dying or quitting with a vault guard around */
  2002. Xvoid
  2003. Xpaygd() {
  2004. X
  2005. X    struct monst *guard;
  2006. X    register int i;
  2007. X    int gx,gy;
  2008. X    char buf[BUFSZ];
  2009. X
  2010. X    guard = findgd();
  2011. X    if (!u.ugold || !guard) return;
  2012. X
  2013. X    if (u.uinvault) {
  2014. X        Your("%ld zorkmid%s goes into the Magic Memory Vault.",
  2015. X        u.ugold, plur(u.ugold));
  2016. X        mkgold(u.ugold, u.ux, u.uy);
  2017. X        u.ugold = 0L;
  2018. X    } else {
  2019. X        if(guard->mpeaceful) { /* he has no "right" to your gold */
  2020. X        mongone(guard);
  2021. X        return;
  2022. X        }
  2023. X        mnexto(guard);
  2024. X        pmon(guard);
  2025. X        pline("%s remits your gold to the vault.", Monnam(guard));
  2026. X        for(i=0; i<=nroom; i++)
  2027. X        if (rooms[i].rtype==VAULT) break;
  2028. X        if (i > nroom) {
  2029. X        impossible("no vault?");
  2030. X        return;
  2031. X        }
  2032. X        gx = rooms[i].lx + rn2(2);
  2033. X        gy = rooms[i].ly + rn2(2);
  2034. X        mkgold(u.ugold, gx, gy);
  2035. X        u.ugold = 0L;
  2036. X        Sprintf(buf,
  2037. X        "To Croesus: here's the gold recovered from the %s %s...",
  2038. X        player_mon()->mname, plname);
  2039. X        make_engr_at(gx, gy, buf);
  2040. X    }
  2041. X    mongone(guard);
  2042. X}
  2043. X
  2044. Xboolean
  2045. Xgd_sound() {  /* prevent "You hear footsteps.." when inappropriate */
  2046. X    register struct monst *grd = findgd();
  2047. X
  2048. X    return(grd == (struct monst *)0);
  2049. X}
  2050. X
  2051. X#endif /* OVLB */
  2052. END_OF_FILE
  2053. if test 11389 -ne `wc -c <'src/vault.c'`; then
  2054.     echo shar: \"'src/vault.c'\" unpacked with wrong size!
  2055. fi
  2056. # end of 'src/vault.c'
  2057. echo shar: End of archive 29 \(of 30\).
  2058. cp /dev/null ark29isdone
  2059. MISSING=""
  2060. 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
  2061.     if test ! -f ark${I}isdone ; then
  2062.     MISSING="${MISSING} ${I}"
  2063.     fi
  2064. done
  2065. if test "${MISSING}" = "" ; then
  2066.     echo You have unpacked all 30 archives.
  2067.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2068. else
  2069.     echo You still need to unpack the following archives:
  2070.     echo "        " ${MISSING}
  2071. fi
  2072. ##  End of shell archive.
  2073. exit 0
  2074.