home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume7 / nethack3 / part17 < prev    next >
Internet Message Format  |  1989-07-31  |  57KB

  1. Path: uunet!zephyr.ens.tek.com!tektronix!tekgen!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v07i072:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Part17/38
  5. Message-ID: <4325@tekred.CNA.TEK.COM>
  6. Date: 24 Jul 89 05:05:03 GMT
  7. Sender: nobody@tekred.CNA.TEK.COM
  8. Lines: 2201
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 7, Issue 72
  13. Archive-name: NetHack3/Part17
  14.  
  15.  
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 17 (of 38)."
  24. # Contents:  include/extern.h include/you.h src/restore.c
  25. # Wrapped by billr@saab on Sun Jul 23 21:33:00 1989
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'include/extern.h' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'include/extern.h'\"
  29. else
  30. echo shar: Extracting \"'include/extern.h'\" \(29514 characters\)
  31. sed "s/^X//" >'include/extern.h' <<'END_OF_FILE'
  32. X/*    SCCS Id: @(#)extern.h    3.0    88/10/18 */
  33. X/*     Copyright (c)   Steve Creps, 1988.          */
  34. X/* NetHack may be freely redistributed.  See license for details. */
  35. X
  36. X#ifndef EXTERN_H
  37. X#define EXTERN_H
  38. X
  39. X#if defined(MSDOS) && !defined(__TURBOC__)
  40. X/* MSC include files do not contain "extern" keyword */
  41. X#define E
  42. X#else
  43. X#define E extern
  44. X#endif
  45. X
  46. X/* ### alloc.c ### */
  47. X
  48. X#ifndef __TURBOC__
  49. XE long *alloc P((unsigned int));
  50. X#endif
  51. X
  52. X/* ### apply.c ### */
  53. X
  54. XE int doapply();
  55. XE int holetime();
  56. XE void dighole();
  57. XE int dorub();
  58. XE int dojump();
  59. X#ifdef WALKIES
  60. XE int number_leashed();
  61. XE void o_unleash P((struct obj *));
  62. XE void m_unleash P((struct monst *));
  63. XE void unleash_all();
  64. XE boolean next_to_u();
  65. XE struct obj *get_mleash P((struct monst *));
  66. XE void check_leash P((xchar,xchar));
  67. X#endif
  68. XE boolean um_dist P((xchar,xchar,xchar));
  69. X
  70. X/* ### artifact.c ### */
  71. X
  72. X#ifdef NAMED_ITEMS
  73. XE void mkartifact P((struct obj **));
  74. XE boolean is_artifact P((struct obj *));
  75. XE boolean spec_ability P((struct obj *,unsigned));
  76. XE int restr_name P((struct obj *,char *));
  77. X# if defined(THEOLOGY) && defined(ALTARS)
  78. XE struct obj *mk_aligned_artifact P((int));
  79. X# endif
  80. XE int defends P((int,struct obj *));
  81. XE int spec_abon P((struct obj *,struct permonst *));
  82. XE int spec_dbon P((struct obj *,struct permonst *,int));
  83. X#endif
  84. X
  85. X/* ### attrib.c ### */
  86. X
  87. XE void adjattrib P((int,int,boolean));
  88. XE void change_luck P((schar));
  89. XE int stone_luck P((boolean));
  90. XE void gainstr P((struct obj *,int));
  91. XE void losestr P((int));
  92. XE void restore_attrib();
  93. XE void init_attr P((int));
  94. X#ifdef POLYSELF
  95. XE void redist_attr();
  96. X#endif
  97. XE void adjabil P((int));
  98. XE int newhp();
  99. XE schar acurr();
  100. XE void adjalign P((int));
  101. X
  102. X/* ### bones.c ### */
  103. X
  104. XE void savebones();
  105. XE int getbones();
  106. XE void name_file P((char *,int));
  107. X
  108. X/* ### cmd.c ### */
  109. X
  110. XE void set_occupation P((int(*)(),char *,int));
  111. X#ifdef REDO
  112. XE char pgetchar();
  113. XE void pushch P((char));
  114. XE void savech P((char));
  115. X#endif
  116. XE char unctrl P((char));
  117. XE void rhack P((char *));
  118. XE char lowc P((char));
  119. XE void enlightenment();
  120. XE int xytod P((schar,schar));
  121. XE void dtoxy P((coord *,int));
  122. XE int movecmd P((char));
  123. XE int getdir P((boolean));
  124. XE void confdir();
  125. XE int isok P((int,int));
  126. XE int doextlist();
  127. X
  128. X/* ### dbridge.c ### */
  129. X
  130. XE boolean is_pool P((int,int));
  131. X#ifdef STRONGHOLD
  132. XE void initsym P((int,int));
  133. XE int is_drawbridge_wall P((int, int));
  134. XE boolean is_db_wall P((int, int));
  135. XE boolean find_drawbridge P((int *, int*));
  136. XE boolean create_drawbridge P((int, int, int, boolean));
  137. XE void open_drawbridge P((int, int));
  138. XE void close_drawbridge P((int, int));
  139. XE void destroy_drawbridge P((int, int));
  140. X#endif    /* STRONGHOLD /**/
  141. X
  142. X/* ### decl.c ### */
  143. X
  144. X/* ### demon.c ### */
  145. X
  146. XE void dsummon P((struct permonst *));
  147. XE int demon_talk P((struct monst *));
  148. XE long bribe P((struct monst *));
  149. XE int dprince ();
  150. XE int dlord ();
  151. XE int ndemon ();
  152. X
  153. X/* ### do.c ### */
  154. X
  155. XE int dodrop();
  156. XE boolean flooreffects P((struct obj *,int,int));
  157. XE void doaltarobj P((struct obj *));
  158. XE boolean canletgo P((struct obj *,char *));
  159. XE void dropx P((struct obj *));
  160. XE void dropy P((struct obj *));
  161. XE int doddrop();
  162. XE int dodown();
  163. XE int doup();
  164. XE void goto_level P((int,boolean));
  165. XE int donull();
  166. XE int dowipe();
  167. XE struct obj *splitobj P((struct obj *,int));
  168. XE void set_wounded_legs P((long,int));
  169. XE void heal_legs();
  170. X
  171. X/* ### do_name.c ### */
  172. X
  173. XE void getpos P((coord *,int,char *));
  174. XE int do_mname();
  175. XE struct obj *oname P((struct obj *,char *,int));
  176. XE int ddocall();
  177. XE void docall P((struct obj *));
  178. XE char *x_monnam P((struct monst *,int));
  179. XE char *lmonnam P((struct monst *));
  180. XE char *mon_nam P((struct monst *));
  181. XE char *Monnam P((struct monst *));
  182. XE char *a_monnam P((struct monst *,char *));
  183. XE char *Amonnam P((struct monst *,char *));
  184. XE char *Xmonnam P((struct monst *));
  185. XE char *defmonnam P((struct monst *));
  186. XE char *rndmonnam();
  187. X#ifdef REINCARNATION
  188. XE char *roguename();
  189. X#endif
  190. X
  191. X/* ### do_wear.c ### */
  192. X
  193. XE void off_msg P((struct obj *));
  194. XE boolean is_helmet P((struct obj *));
  195. XE boolean is_gloves P((struct obj *));
  196. XE boolean is_boots P((struct obj *));
  197. XE boolean is_cloak P((struct obj *));
  198. XE boolean is_shield P((struct obj *));
  199. XE void set_wear();
  200. XE int Armor_off();
  201. XE int Armor_gone();
  202. XE int Helmet_off();
  203. XE int Gloves_off();
  204. XE int Boots_off();
  205. XE int Cloak_off();
  206. XE int Shield_off();
  207. XE void Amulet_off();
  208. XE void Ring_on P((struct obj *));
  209. XE void Ring_off P((struct obj *));
  210. XE void Ring_gone P((struct obj *));
  211. XE void Blindf_on P((struct obj *));
  212. XE void Blindf_off P((struct obj *));
  213. XE int dotakeoff();
  214. XE int doremring();
  215. XE int cursed P((struct obj *));
  216. XE int armoroff P((struct obj *));
  217. XE int dowear();
  218. XE int doputon();
  219. XE void find_ac();
  220. XE void glibr();
  221. XE struct obj *some_armor();
  222. XE void corrode_armor();
  223. XE int doddoremarm();
  224. XE void adj_abon P((struct obj *,schar));
  225. X
  226. X/* ### dog.c ### */
  227. X
  228. XE void initedog P((struct monst *));
  229. XE void make_familiar P((struct obj *));
  230. XE struct monst *makedog();
  231. XE void losedogs();
  232. XE void keepdogs();
  233. XE void fall_down P((struct monst *,int));
  234. XE int dogfood P((struct monst *,struct obj *));
  235. XE int inroom P((xchar,xchar));
  236. XE int tamedog P((struct monst *,struct obj *));
  237. X
  238. X/* ### dogmove.c ### */
  239. X
  240. XE int dog_move P((struct monst *,int));
  241. X
  242. X/* ### dokick.c ### */
  243. X
  244. XE boolean ghitm P((struct monst *,long));
  245. XE boolean bad_kick_throw_pos P((xchar,xchar));
  246. XE struct monst *ghit P((int,int,int));
  247. XE int dokick();
  248. X
  249. X/* ### dothrow.c ### */
  250. X
  251. XE int dothrow();
  252. XE int throwit P((struct obj *));
  253. XE int thitmonst P((struct monst *,struct obj *));
  254. XE int breaks P((struct obj *,boolean));
  255. X
  256. X/* ### eat.c ### */
  257. X
  258. XE void init_uhunger();
  259. XE int Hear_again();
  260. XE int doeat();
  261. XE void gethungry();
  262. XE void morehungry P((int));
  263. XE void lesshungry P((int));
  264. XE void newuhs P((boolean));
  265. XE void vomit();
  266. XE struct obj *floorfood P((char *,int));
  267. X
  268. X/* ### end.c ### */
  269. X
  270. XE int done1();
  271. XE int done2();
  272. XE void done_in_by P((struct monst *));
  273. XE void panic P((char *,...));
  274. XE void done P((char *));
  275. XE void clearlocks();
  276. X#ifdef NOSAVEONHANGUP
  277. XE void hangup();
  278. X#endif
  279. X
  280. X/* ### engrave.c ### */
  281. X
  282. X#ifdef ELBERETH
  283. XE int sengr_at P((char *,xchar,xchar));
  284. X#endif
  285. XE void u_wipe_engr P((int));
  286. XE void wipe_engr_at P((xchar,xchar,xchar));
  287. XE void read_engr_at P((int,int));
  288. XE void make_engr_at P((int,int,char *));
  289. XE int freehand();
  290. XE int doengrave();
  291. XE void save_engravings P((int));
  292. XE void rest_engravings P((int));
  293. X
  294. X/* ### exper.c ### */
  295. X
  296. XE long newuexp P((unsigned));
  297. XE int experience P((struct monst *,int));
  298. XE void more_experienced P((int,int));
  299. XE void losexp();
  300. XE void newexplevel();
  301. XE void pluslvl();
  302. XE long rndexp();
  303. X
  304. X/* ### extralev.c ### */
  305. X
  306. X#ifdef REINCARNATION
  307. XE void makeroguerooms();
  308. XE void corr P((int,int));
  309. XE void makerogueghost();
  310. X#endif
  311. X
  312. X/* ### fountain.c ### */
  313. X
  314. X#ifdef FOUNTAINS
  315. XE void dryup();
  316. XE void drinkfountain();
  317. XE void dipfountain P((struct obj *));
  318. X#endif /* FOUNTAINS */
  319. X#ifdef SINKS
  320. XE void drinksink();
  321. X#endif
  322. X
  323. X/* ### getline.c ### */
  324. X
  325. XE void getlin P((char *));
  326. XE void getret();
  327. XE void cgetret P((char *));
  328. XE void xwaitforspace P((char *));
  329. XE char *parse();
  330. XE char readchar();
  331. X#ifdef COM_COMPL
  332. XE void get_ext_cmd P((char *));
  333. X#endif /* COM_COMPL */
  334. X
  335. X/* ### hack.c ### */
  336. X
  337. XE void unsee();
  338. XE void seeoff P((int));
  339. XE void movobj P((struct obj *,xchar,xchar));
  340. XE boolean may_dig P((xchar,xchar));
  341. XE void domove();
  342. XE void spoteffects();
  343. XE int dopickup();
  344. XE void lookaround();
  345. XE int monster_nearby();
  346. XE int cansee P((xchar,xchar));
  347. XE int sgn P((int));
  348. XE void getcorners
  349. X    P((xchar *,xchar *,xchar *,xchar *,xchar *,xchar *,xchar *,xchar *));
  350. XE void setsee();
  351. XE void nomul P((int));
  352. XE void losehp P((int,char *));
  353. XE int weight_cap();
  354. XE int inv_weight();
  355. XE int inv_cnt();
  356. XE int little_to_big P((int));
  357. XE int big_to_little P((int));     
  358. X#ifdef STUPID_CPP    /* otherwise these functions are macros in hack.h */
  359. XE char yn();
  360. XE char ynq();
  361. XE char ynaq();
  362. XE char nyaq();
  363. XE char *plur P((long));
  364. XE void makeknown P((unsigned));
  365. X#endif
  366. X
  367. X/* ### invent.c ### */
  368. X
  369. XE struct obj *addinv P((struct obj *));
  370. XE void useup P((struct obj *));
  371. XE void freeinv P((struct obj *));
  372. XE void delobj P((struct obj *));
  373. XE void freeobj P((struct obj *));
  374. XE void freegold P((struct gold *));
  375. XE struct monst *m_at P((int,int));
  376. XE struct obj *o_at P((int,int));
  377. XE struct obj *sobj_at P((int,int,int));
  378. XE int carried P((struct obj *));
  379. XE struct obj *carrying P((int));
  380. XE struct obj *o_on P((unsigned int,struct obj *));
  381. XE struct gold *g_at P((int,int));
  382. XE struct obj *getobj P((char *,char *));
  383. XE int ggetobj P((char *,int(*)(),int));
  384. XE int askchain P((struct obj *,int,char *,int,int(*)(),int(*)(),int,char *));
  385. XE void prinv P((struct obj *));
  386. XE int ddoinv();
  387. XE void doinv P((char *));
  388. XE int dotypeinv();
  389. XE int dolook();
  390. XE void stackobj P((struct obj *));
  391. XE int doprgold();
  392. XE int doprwep();
  393. XE int doprarm();
  394. XE int doprring();
  395. XE int dopramulet();
  396. XE int doprtool();
  397. XE int digit P((char));
  398. XE void useupf P((struct obj *));
  399. XE char *let_to_name P((char));
  400. XE void reassign();
  401. X
  402. X/* ### ioctl.c ### */
  403. X
  404. X#ifdef UNIX
  405. XE void getioctls();
  406. XE void setioctls();
  407. X#ifdef SUSPEND
  408. XE int dosuspend();
  409. X#endif /* SUSPEND */
  410. X#endif /* UNIX */
  411. X
  412. X/* ### lock.c ### */
  413. X
  414. XE int pick_lock P((struct obj *));
  415. XE int doforce();
  416. XE int boxlock P((struct obj *,struct obj *));
  417. XE int doorlock P((struct obj *,int,int));
  418. XE int doopen();
  419. XE int doclose();
  420. X
  421. X/* ### makemon.c ### */
  422. X
  423. XE struct monst *makemon P((struct permonst *,int,int));
  424. XE void enexto P((coord *,xchar,xchar));
  425. XE int goodpos P((int,int));
  426. XE void rloc P((struct monst *));
  427. XE struct monst *mkmon_at P((char *,int,int));
  428. XE void init_monstr();
  429. XE struct permonst *rndmonst();
  430. XE struct permonst *mkclass P((char));
  431. XE int adj_lev P((struct permonst *));
  432. XE struct permonst *grow_up P((struct monst *));
  433. XE int mongets P((struct monst *,int));
  434. X#ifdef REINCARNATION
  435. XE struct permonst *roguemon();
  436. X#endif
  437. X#ifdef GOLEMS
  438. XE int golemhp P((int));
  439. X#endif /* GOLEMS */
  440. XE boolean peace_minded P((struct permonst *));
  441. XE void set_malign P((struct monst *));
  442. XE void set_mimic_sym P((struct monst *));
  443. X
  444. X/* ### mcastu.c ### */
  445. X
  446. XE int castmu P((struct monst *,struct attack *));
  447. XE int buzzmu P((struct monst *,struct attack *));
  448. X
  449. X/* ### mhitm.c ### */
  450. X
  451. XE int fightm P((struct monst *));
  452. XE int mattackm P((struct monst *,struct monst *));
  453. XE int noattacks P((struct permonst *));
  454. X
  455. X/* ### mhitu.c ### */
  456. X
  457. X#ifdef POLYSELF
  458. XE boolean incompatible P((struct monst *));
  459. XE struct monst *cloneu();
  460. X#endif
  461. XE boolean is_nymph P((struct monst *));
  462. XE boolean sp_melee P((struct monst *));
  463. XE int mattacku P((struct monst *));
  464. XE void mdamageu P((struct monst *,int));
  465. X#ifdef SEDUCE
  466. XE void doseduce P((struct monst *));
  467. X#endif
  468. X
  469. X/* ### mklev.c ### */
  470. X
  471. XE int somex P((struct mkroom *));
  472. XE int somey P((struct mkroom *));
  473. X#ifdef ORACLE
  474. XE boolean place_oracle P((struct mkroom *,int *,int *,int *));
  475. X#endif
  476. XE void mklev();
  477. XE int okdoor P((xchar,xchar));
  478. XE void dodoor P((int,int,struct mkroom *));
  479. XE void mktrap P((int,int,struct mkroom *));
  480. XE void mkfount P((int,struct mkroom *));
  481. X
  482. X/* ### mkmaze.c ### */
  483. X
  484. X#if defined(WALLIFIED_MAZE) || defined(STRONGHOLD)
  485. XE void wallification P((int,int,int,int,boolean));
  486. X#endif
  487. XE void walkfrom P((int,int));
  488. XE void makemaz();
  489. XE void move P((int *,int *,int));
  490. XE void mazexy P((coord *));
  491. XE void bound_digging();
  492. X
  493. X/* ### mkobj.c ### */
  494. X
  495. XE struct obj *mkobj_at P((char,int,int));
  496. XE struct obj *mksobj_at P((int,int,int));
  497. XE struct obj *mkobj P((char,boolean));
  498. XE int rndmonnum();
  499. XE struct obj *mksobj P((int,boolean));
  500. XE int letter P((int));
  501. XE int weight P((struct obj *));
  502. XE void mkgold P((long,int,int));
  503. XE struct obj *mkcorpse_at P((struct permonst *,int,int));
  504. XE struct obj *mk_tt_corpse P((int,int));
  505. XE struct obj *mkstatue P((struct permonst *,int,int));
  506. XE struct obj *mk_named_object P((int, struct permonst *,int,int,char *,int));
  507. X#ifdef MEDUSA
  508. XE struct obj *mk_tt_statue P((int,int));
  509. X#endif
  510. XE void bless P((struct obj *));
  511. XE void curse P((struct obj *));
  512. XE void blessorcurse P((struct obj *,int));
  513. XE boolean is_flammable P((struct obj *));
  514. XE boolean is_rustprone P((struct obj *));
  515. XE void set_omask P((xchar,xchar));
  516. X
  517. X/* ### mkroom.c ### */
  518. X
  519. XE void mkroom P((int));
  520. XE void shrine_pos P((int *, int*, struct mkroom *));
  521. XE boolean nexttodoor P((int,int));
  522. XE boolean has_dnstairs P((struct mkroom *));
  523. XE boolean has_upstairs P((struct mkroom *));
  524. XE int dist2 P((int,int,int,int));
  525. XE struct permonst *courtmon();
  526. XE int bcsign P((struct obj *));
  527. X
  528. X/* ### mon.c ### */
  529. X
  530. XE void movemon();
  531. XE void meatgold P((struct monst *));
  532. XE void meatobj P((struct monst *));
  533. XE void mpickgold P((struct monst *));
  534. XE void mpickgems P((struct monst *));
  535. XE int curr_mon_load P((struct monst *));
  536. XE int max_mon_load P((struct monst *));
  537. XE boolean can_carry P((struct monst *,struct obj *));
  538. XE void mpickstuff P((struct monst *,char *));
  539. XE int mfndpos P((struct monst *,coord *,long *,long));
  540. XE int dist P((int,int));
  541. XE void poisontell P((int));
  542. XE void poisoned P((char *,int,char *));
  543. XE void mondead P((struct monst *));
  544. XE void replmon P((struct monst *,struct monst *));
  545. XE void relmon P((struct monst *));
  546. XE void monfree P((struct monst *));
  547. XE void unstuck P((struct monst *));
  548. XE void killed P((struct monst *));
  549. XE void xkilled P((struct monst *,int));
  550. XE void kludge P((char *,char *,...));
  551. XE void rescham();
  552. XE void restartcham();
  553. XE int newcham P((struct monst *,struct permonst *));
  554. XE void mnexto P((struct monst *));
  555. XE void mnearto P((struct monst *, xchar, xchar, boolean));
  556. XE void setmangry P((struct monst *));
  557. XE int disturb P((struct monst *));
  558. XE void mondied P((struct monst *));
  559. XE void mongone P((struct monst *));
  560. XE void monstone P((struct monst *));
  561. X#ifdef GOLEMS
  562. XE void golemeffects P((struct monst *, int, int));
  563. X#endif /* GOLEMS */
  564. X
  565. X/* ### mondata.c ### */
  566. X
  567. XE boolean attacktype P((struct permonst *,int));
  568. XE boolean resists_ston P((struct permonst *));
  569. XE boolean resists_drli P((struct permonst *));
  570. XE boolean ranged_attk P((struct permonst *));
  571. XE boolean can_track P((struct permonst *));
  572. X#ifdef POLYSELF
  573. XE boolean breakarm P((struct permonst *));
  574. XE boolean sliparm P((struct permonst *));
  575. X#endif
  576. XE boolean sticks P((struct permonst *));
  577. XE boolean canseemon P((struct monst *));
  578. XE boolean dmgtype P((struct permonst *,int));
  579. XE int monsndx P((struct permonst *));
  580. XE int name_to_mon P((char *));
  581. X#ifdef POLYSELF
  582. XE boolean webmaker P((struct permonst *));
  583. X#endif
  584. XE boolean is_female P((struct monst *));
  585. XE int gender P((struct monst *));
  586. XE boolean levl_follower P((struct monst *));
  587. XE struct permonst *player_mon();
  588. X
  589. X/* ### monmove.c ### */
  590. X
  591. XE int dochugw P((struct monst *));
  592. XE boolean onscary P((int,int,struct monst *));
  593. XE int dochug P((struct monst *));
  594. XE int m_move P((struct monst *,int));
  595. XE void set_apparxy P((struct monst *));
  596. XE boolean mdig_tunnel P((struct monst *));
  597. X
  598. X/* ### monst.c ### */
  599. X
  600. X/* ### msdos.c ### */
  601. X
  602. X#ifdef MSDOS
  603. XE void flushout();
  604. XE int tgetch();
  605. XE int dosh();
  606. XE long freediskspace P((char *));
  607. XE long filesize P((char *));
  608. XE void eraseall P((char *,char *));
  609. XE void copybones P((int));
  610. XE void playwoRAMdisk();
  611. XE int saveDiskPrompt P((int));
  612. XE void gameDiskPrompt();
  613. XE void read_config_file();
  614. XE void set_lock_and_bones();
  615. XE void append_slash P((char *));
  616. XE void getreturn P((char *));
  617. XE void msmsg P((char *,...));
  618. XE void chdrive P((char *));
  619. XE void disable_ctrlP();
  620. XE void enable_ctrlP();
  621. XE FILE *fopenp P((char *,char *));
  622. XE void msexit P((int));
  623. X#endif /* MSDOS */
  624. X
  625. X/* ### mthrowu.c ### */
  626. X
  627. XE int thitu P((int,int,char *));
  628. XE int thrwmu P((struct monst *));
  629. XE int spitmu P((struct monst *));
  630. XE int breamu P((struct monst *,struct attack *));
  631. XE boolean linedup P((xchar,xchar,xchar,xchar));
  632. XE boolean lined_up P((struct monst *));
  633. XE struct obj *m_carrying P((struct monst *,int));
  634. XE void m_useup P((struct monst *,struct obj *));
  635. X
  636. X/* ### music.c ### */
  637. X
  638. X#ifdef MUSIC
  639. XE int do_play_instrument P((struct obj *));
  640. X#endif /* MUSIC /**/
  641. X
  642. X/* ### o_init.c ### */
  643. X
  644. XE int letindex P((char));
  645. XE void init_objects();
  646. XE void oinit();
  647. XE void savenames P((int));
  648. XE void restnames P((int));
  649. XE int dodiscovered();
  650. X
  651. X/* ### objnam.c ### */
  652. X
  653. XE char *typename P((int));
  654. XE char *distant_name P((struct obj *, char *(*)(struct obj *)));
  655. XE char *xname P((struct obj *));
  656. XE char *doname P((struct obj *));
  657. XE void setan P((char *,char *));
  658. XE char *aobjnam P((struct obj *,char *));
  659. XE char *Doname2 P((struct obj *));
  660. XE void lcase P((char *));
  661. XE char *makeplural P((char *));
  662. XE struct obj *readobjnam P((char *));
  663. XE boolean uses_known P((struct obj *));
  664. X
  665. X/* ### options.c ### */
  666. X
  667. XE void initoptions();
  668. XE void parseoptions P((char *,boolean));
  669. XE int doset();
  670. XE int dotogglepickup();
  671. XE void option_help();
  672. XE int fruitadd P((char *));
  673. X
  674. X/* ### pager.c ### */
  675. X
  676. XE int dowhatis();
  677. XE int dowhatdoes();
  678. XE void set_whole_screen();
  679. X#ifdef NEWS
  680. XE int readnews();
  681. X#endif /* NEWS */
  682. XE void set_pager P((int));
  683. XE int page_line P((char *));
  684. XE void cornline P((int,char *));
  685. XE int dohelp();
  686. XE int dohistory();
  687. XE int page_file P((char *,boolean));
  688. X#ifdef UNIX
  689. X#ifdef SHELL
  690. XE int dosh();
  691. X#endif /* SHELL */
  692. XE int child P((int));
  693. X#endif /* UNIX */
  694. X
  695. X/* ### pcmain.c ### */
  696. X
  697. X#ifdef MSDOS
  698. XE int (*occupation)();
  699. XE int (*afternmv)();
  700. XE void askname();
  701. XE void impossible P((char *,...));
  702. X#ifdef CHDIR
  703. XE void chdirx P((char *,char));
  704. X#endif /* CHDIR */
  705. XE void stop_occupation();
  706. X#endif /* MSDOS */
  707. X
  708. X/* ### pctty.c ### */
  709. X
  710. X#ifdef MSDOS
  711. XE void gettty();
  712. XE void settty P((char *));
  713. XE void error P((char *,...));
  714. X#endif /* MSDOS */
  715. X
  716. X/* ### pcunix.c ### */
  717. X
  718. X#ifdef MSDOS
  719. X#ifndef TOS
  720. XE void setrandom();
  721. XE int getyear();
  722. XE char *getdate();
  723. XE int phase_of_the_moon();
  724. XE int night();
  725. XE int midnight();
  726. XE void gethdate P((char *));
  727. XE int uptodate P((int));
  728. X#endif /* TOS */
  729. XE void regularize P((char *));
  730. X#endif /* MSDOS */
  731. X
  732. X/* ### pickup.c ### */
  733. X
  734. XE void pickup P((int));
  735. XE int doloot();
  736. XE void get_all_from_box();
  737. XE void use_container P((struct obj *, int));
  738. XE void inc_cwt P((struct obj *, struct obj *));
  739. XE void delete_contents P((struct obj *));
  740. XE void dec_cwt P((struct obj *, struct obj *));
  741. X
  742. X/* ### polyself.c ### */
  743. X
  744. X#ifdef POLYSELF
  745. XE void polyself();
  746. XE int polymon P((int));
  747. XE void rehumanize();
  748. XE int dobreathe();
  749. XE int dospit();
  750. XE int doremove();
  751. XE int dospinweb();
  752. XE int dosummon();
  753. XE int doconfuse();
  754. XE int dohide();
  755. X#endif
  756. XE char *body_part P((int));
  757. XE int poly_gender();
  758. X#ifdef POLYSELF
  759. X#ifdef GOLEMS
  760. XE void ugolemeffects P((int, int));
  761. X#endif /* GOLEMS */
  762. X#endif
  763. X
  764. X/* ### potion.c ### */
  765. X
  766. XE void make_confused P((long,boolean));
  767. XE void make_stunned P((long,boolean));
  768. XE void make_blinded P((long,boolean));
  769. XE void make_sick P((long,boolean));
  770. XE void make_hallucinated P((long,boolean));
  771. XE int dodrink();
  772. XE int dopotion P((struct obj *));
  773. XE int peffects P((struct obj *));
  774. XE void healup P((int,int,boolean,boolean));
  775. XE void strange_feeling P((struct obj *,char *));
  776. XE void potionhit P((struct monst *,struct obj *));
  777. XE void potionbreathe P((struct obj *));
  778. XE int dodip();
  779. XE void djinni_from_bottle P((struct obj *));
  780. XE int monster_detect P((struct obj *));
  781. XE int object_detect P((struct obj *));
  782. X
  783. X/* ### pray.c ### */
  784. X
  785. X# ifdef THEOLOGY
  786. XE int dosacrifice();
  787. XE int dopray();
  788. XE char *u_gname();
  789. X#endif
  790. XE int doturn();
  791. X#ifdef ALTARS
  792. XE char *a_gname();
  793. XE char *a_gname_at P((xchar,xchar));
  794. X# ifdef THEOLOGY
  795. XE void altar_wrath P((int,int));
  796. X# endif
  797. X#endif
  798. X
  799. X/* ### pri.c ### */
  800. X
  801. XE void swallowed();
  802. XE void setclipped();
  803. XE void at P((xchar,xchar,uchar,uchar));
  804. XE void prme();
  805. XE void shieldeff P((xchar,xchar));
  806. XE int doredraw();
  807. XE void docrt();
  808. XE void docorner P((int,int));
  809. XE void seeglds();
  810. XE void seeobjs();
  811. XE void seemons();
  812. XE void pmon P((struct monst *));
  813. XE void unpmon P((struct monst *));
  814. XE void nscr();
  815. XE void bot();
  816. XE void mstatusline P((struct monst *));
  817. XE void ustatusline();
  818. XE void cls();
  819. XE void max_rank_sz();
  820. XE char rndmonsym();
  821. XE char rndobjsym();
  822. XE const char *hcolor();
  823. X
  824. X/* ### priest.c ### */
  825. X
  826. XE int move_special P((struct monst *,schar,schar,boolean,boolean,
  827. X            xchar,xchar,xchar,xchar));
  828. X#if defined(ALTARS) && defined(THEOLOGY)
  829. XE struct mkroom *in_temple P((int,int));
  830. XE int pri_move P((struct monst *));
  831. XE void priestini P((int,int,int,int));
  832. XE char *priestname P((struct monst *));
  833. XE boolean p_coaligned P((struct monst *));
  834. XE void intemple();
  835. XE void priest_talk P((struct monst *));
  836. XE boolean u_in_sanctuary P((struct mkroom *));
  837. XE void ghod_hitsu();
  838. XE void angry_priest();
  839. X#endif
  840. X
  841. X/* ### prisym.c ### */
  842. X
  843. XE void atl P((int,int,char));
  844. XE void on_scr P((int,int));
  845. XE void tmp_at P((int,int));
  846. XE void Tmp_at2 P((int,int));
  847. XE void curs_on_u();
  848. XE void pru();
  849. XE void prl P((int,int));
  850. XE uchar news0 P((xchar,xchar));
  851. XE void newsym P((int,int));
  852. XE void mnewsym P((int,int));
  853. XE void nosee P((int,int));
  854. XE void prl1 P((int,int));
  855. XE void nose1 P((int,int));
  856. XE int vism_at P((int,int));
  857. X#ifdef NEWSCR
  858. XE void pobj P((struct obj *));
  859. X#endif /* NEWSCR */
  860. XE void unpobj P((struct obj *));
  861. X
  862. X/* ### read.c ### */
  863. X
  864. XE int doread();
  865. XE int seffects P((struct obj *));
  866. XE int identify P((struct obj *));
  867. XE void litroom P((boolean));
  868. XE void do_genocide P((int));
  869. XE void do_mapping();
  870. XE void do_vicinity_map();
  871. XE int destroy_arm P((struct obj *));
  872. XE int trap_detect P((struct obj *));
  873. XE int gold_detect P((struct obj *));
  874. XE int food_detect P((struct obj *));
  875. XE void punish P((struct obj *));
  876. XE void unpunish();
  877. XE boolean cant_create P((int *));
  878. X#if defined(WIZARD) || defined(EXPLORE_MODE)
  879. XE boolean create_particular();
  880. X#endif
  881. X
  882. X/* ### restore.c ### */
  883. X
  884. XE int dorecover P((int));
  885. XE void getlev P((int,int,xchar,boolean));
  886. X#ifdef ZEROCOMP
  887. XE void minit();
  888. XE int mread P((int,genericptr_t,unsigned int));
  889. X#else
  890. XE void mread P((int,genericptr_t,unsigned int));
  891. X#endif
  892. X
  893. X/* ### rip.c ### */
  894. X
  895. XE void outrip();
  896. X
  897. X/* ### rnd.c ### */
  898. X
  899. XE int rn1 P((int,int));
  900. XE int rn2 P((int));
  901. XE int rnl P((int));
  902. XE int rnd P((int));
  903. XE int d P((int,int));
  904. XE int rne P((int));
  905. X#ifdef THEOLOGY
  906. XE int rnz P((int));
  907. X#endif
  908. X
  909. X/* ### rumors.c ### */
  910. X
  911. XE void outrumor P((int,boolean));
  912. X#ifdef ORACLE
  913. XE int doconsult P((struct monst *));
  914. X#endif
  915. X
  916. X/* ### save.c ### */
  917. X
  918. XE int dosave();
  919. X#ifndef NOSAVEONHANGUP
  920. XE int hangup();
  921. X#endif /* NOSAVEONHANGUP */
  922. XE int dosave0();
  923. X#if defined(DGK) && !defined(TOS)
  924. XE boolean savelev P((int,xchar,int));
  925. XE boolean swapin_file P((int));
  926. X#else /* DGK && !TOS */
  927. XE void savelev P((int, xchar));
  928. X#endif /* DGK && !TOS */
  929. X#ifdef ZEROCOMP
  930. XE void bflush P((int));
  931. X#endif
  932. XE void bwrite P((int,genericptr_t,unsigned int));
  933. XE void savefruitchn P((int));
  934. X
  935. X/* ### search.c ### */
  936. X
  937. XE int findit();
  938. XE int dosearch();
  939. XE int dosearch0 P((int));
  940. XE int doidtrap();
  941. XE void wakeup P((struct monst *));
  942. XE void seemimic P((struct monst *));
  943. X
  944. X/* ### shk.c ### */
  945. X
  946. XE char *shkname P((struct monst *));
  947. XE void shkdead P((struct monst *));
  948. XE void replshk P((struct monst *,struct monst *));
  949. XE int inshop();
  950. XE int inhishop P((struct monst *));
  951. XE void obfree P((struct obj *,struct obj *));
  952. XE int dopay();
  953. XE void home_shk P((struct monst *));
  954. XE void make_happy_shk P((struct monst *));
  955. XE boolean paybill();
  956. XE void pay_for_door P((int,int,char *));
  957. XE void addtobill P((struct obj *,boolean));
  958. XE void splitbill P((struct obj *,struct obj *));
  959. XE void subfrombill P((struct obj *));
  960. XE int doinvbill P((int));
  961. XE int shkcatch P((struct obj *));
  962. XE int shk_move P((struct monst *));
  963. XE int online P((xchar,xchar));
  964. XE boolean is_fshk P((struct monst *));
  965. XE void shopdig P((int));
  966. XE boolean in_shop P((int,int));
  967. XE boolean costly_spot P((int,int));
  968. XE void check_unpaid P((struct obj *));
  969. X
  970. X/* ### shknam.c ### */
  971. X
  972. XE void stock_room P((struct shclass *,struct mkroom *));
  973. XE int saleable P((int,struct obj *));
  974. XE int get_shop_item P((int));
  975. X
  976. X/* ### sit.c ### */
  977. X
  978. X#if defined(THRONES) || defined(SPELLS)
  979. XE void take_gold();
  980. X#endif
  981. XE int dosit();
  982. XE void rndcurse();
  983. XE void attrcurse();
  984. X
  985. X/* ### sp_lev.c ### */
  986. X
  987. X#ifdef STRONGHOLD
  988. XE boolean load_special P((char *));
  989. X#endif /* STRONGHOLD /**/
  990. X
  991. X/* ### sounds.c ### */
  992. X
  993. XE void verbalize P((char *));
  994. X#ifdef SOUNDS
  995. XE void dosounds();
  996. XE void growl P((struct monst *));
  997. XE void yelp P((struct monst *));
  998. XE void whimper P((struct monst *));
  999. X#endif
  1000. XE int dotalk();
  1001. X
  1002. X/* ### spell.c ### */
  1003. X
  1004. X#ifdef SPELLS
  1005. XE int study_book P((struct obj *));
  1006. XE int docast();
  1007. XE int spelleffects P((int, boolean));
  1008. XE void losespells();
  1009. XE int dovspell();
  1010. X#endif /* SPELLS */
  1011. X
  1012. X/* ### steal.c ### */
  1013. X
  1014. XE long somegold();
  1015. XE void stealgold P((struct monst *));
  1016. XE int steal P((struct monst *));
  1017. XE void mpickobj P((struct monst *,struct obj *));
  1018. XE void stealamulet P((struct monst *));
  1019. XE void relobj P((struct monst *,int));
  1020. X
  1021. X/* ### termcap.c ### */
  1022. X
  1023. XE void startup();
  1024. XE void start_screen();
  1025. XE void end_screen();
  1026. XE void curs P((int,int));
  1027. XE void cmov P((int,int));
  1028. XE void xputc P((char));
  1029. XE void xputs P((char *));
  1030. XE void cl_end();
  1031. XE void clear_screen();
  1032. XE void home();
  1033. XE void standoutbeg();
  1034. XE void standoutend();
  1035. XE void revbeg();
  1036. X#if 0
  1037. XE void boldbeg();
  1038. XE void blinkbeg();
  1039. XE void dimbeg();
  1040. X#endif
  1041. XE void m_end();
  1042. XE void backsp();
  1043. XE void bell();
  1044. XE void graph_on();
  1045. XE void graph_off();
  1046. XE void delay_output();
  1047. XE void cl_eos();
  1048. X
  1049. X/* ### timeout.c ### */
  1050. X
  1051. XE void timeout();
  1052. XE void hatch_eggs();
  1053. X
  1054. X/* ### topl.c ### */
  1055. X
  1056. XE int doredotopl();
  1057. XE void remember_topl();
  1058. XE void addtopl P((char *));
  1059. XE void more();
  1060. XE void cmore P((char *));
  1061. XE void clrlin();
  1062. XE void pline P((const char *,...));
  1063. XE void You P((const char *,...));
  1064. XE void Your P((const char *,...));
  1065. XE void putsym P((char));
  1066. XE void putstr P((char *));
  1067. XE char yn_function P((char *,char));
  1068. X
  1069. X/* ### topten.c ### */
  1070. X
  1071. XE void topten();
  1072. XE char *eos P((char *));
  1073. XE void prscore P((int,char **));
  1074. XE struct obj *tt_oname P((struct obj *));
  1075. X
  1076. X/* ### track.c ### */
  1077. X
  1078. XE void initrack();
  1079. XE void settrack();
  1080. XE coord *gettrack P((int,int));
  1081. X
  1082. X/* ### trap.c ### */
  1083. X
  1084. XE boolean rust_dmg P((struct obj *,char *,int,boolean));
  1085. XE struct trap *maketrap P((int,int,int));
  1086. XE int teleok P((int,int));
  1087. XE void dotrap P((struct trap *));
  1088. XE int mintrap P((struct monst *));
  1089. XE void selftouch P((char *));
  1090. XE void float_up();
  1091. XE int float_down();
  1092. XE void tele();
  1093. XE void teleds P((int,int));
  1094. XE int dotele();
  1095. XE void placebc P((int));
  1096. XE void unplacebc();
  1097. XE void level_tele();
  1098. XE void drown();
  1099. X#ifdef SPELLS
  1100. XE void drain_en P((int));
  1101. X#endif
  1102. XE int dountrap();
  1103. XE void chest_trap P((struct obj *,int));
  1104. XE void wake_nearby();
  1105. XE void deltrap P((struct trap *));
  1106. XE struct trap *t_at P((int,int));
  1107. XE void b_trapped();
  1108. XE boolean unconscious();
  1109. X
  1110. X/* ### u_init.c ### */
  1111. X
  1112. XE void u_init();
  1113. XE void plnamesuffix();
  1114. X
  1115. X/* ### uhitm.c ### */
  1116. X
  1117. XE struct monst *clone_mon P((struct monst *));
  1118. XE boolean special_case P((struct monst *));
  1119. XE boolean attack P((struct monst *));
  1120. XE boolean hmon P((struct monst *,struct obj *,int));
  1121. X
  1122. X/* ### unixmain.c ### */
  1123. X
  1124. X#ifdef UNIX
  1125. XE int (*occupation)();
  1126. XE int (*afternmv)();
  1127. XE void glo P((int));
  1128. XE void askname();
  1129. XE void impossible P((char *,...));
  1130. XE void stop_occupation();
  1131. X#endif /* UNIX */
  1132. X
  1133. X/* ### unixtty.c ### */
  1134. X
  1135. X#ifdef UNIX
  1136. XE void gettty();
  1137. XE void settty P((char *));
  1138. XE void setftty();
  1139. XE void intron();
  1140. XE void introff();
  1141. XE void error P((char *, char *, char *));
  1142. X#endif /* UNIX */
  1143. X
  1144. X/* ### unixunix.c ### */
  1145. X
  1146. X#ifdef UNIX
  1147. XE void setrandom();
  1148. XE int getyear();
  1149. XE char *getdate();
  1150. XE int phase_of_the_moon();
  1151. XE int night();
  1152. XE int midnight();
  1153. XE void gethdate P((char *));
  1154. XE int uptodate P((int));
  1155. XE void getlock();
  1156. X#ifdef MAIL
  1157. XE void getmailstatus();
  1158. XE void ckmailstatus();
  1159. XE void readmail();
  1160. X#endif /* MAIL */
  1161. XE void regularize P((char *));
  1162. X#endif /* UNIX */
  1163. X
  1164. X/* ### vault.c ### */
  1165. X
  1166. XE void setgd();
  1167. XE void invault();
  1168. XE int gd_move();
  1169. XE void gddead();
  1170. XE void replgd P((struct monst *,struct monst *));
  1171. XE void paygd();
  1172. X
  1173. X/* ### version.c ### */
  1174. X
  1175. XE int doversion();
  1176. X
  1177. X/* ### weapon.c ### */
  1178. X
  1179. XE int hitval P((struct obj *,struct permonst *));
  1180. XE int dmgval P((struct obj *,struct permonst *));
  1181. XE void set_uasmon();
  1182. XE struct obj *select_rwep P((struct monst *));
  1183. XE struct obj *select_hwep P((struct monst *));
  1184. XE int abon();
  1185. XE int dbon();
  1186. X
  1187. X/* ### were.c ### */
  1188. X
  1189. XE void were_change P((struct monst *));
  1190. XE void new_were P((struct monst *));
  1191. XE boolean were_summon P((struct permonst *,boolean));
  1192. X#ifdef POLYSELF
  1193. XE void you_were();
  1194. X#endif /* POLYSELF */
  1195. X
  1196. X/* ### wield.c ### */
  1197. X
  1198. XE void setuwep P((struct obj *));
  1199. XE void uwepgone();
  1200. XE int dowield();
  1201. XE void corrode_weapon();
  1202. XE int chwepon P((struct obj *,int));
  1203. XE int welded P((struct obj *));
  1204. XE void weldmsg P((struct obj *,boolean));
  1205. X
  1206. X/* ### wizard.c ### */
  1207. X
  1208. XE void amulet();
  1209. XE int mon_has_amulet P((struct monst *));
  1210. XE int wiz_get_amulet P((struct monst *));
  1211. XE void aggravate();
  1212. XE void clonewiz();
  1213. X#ifdef HARD
  1214. XE void nasty();
  1215. XE void resurrect();
  1216. XE void intervene();
  1217. XE void wizdead P((struct monst *));
  1218. X#endif /* HARD */
  1219. XE void cuss P((struct monst *));
  1220. X
  1221. X/* ### worm.c ### */
  1222. X
  1223. X#ifdef WORM
  1224. XE int getwn P((struct monst *));
  1225. XE void initworm P((struct monst *));
  1226. XE void worm_move P((struct monst *));
  1227. XE void worm_nomove P((struct monst *));
  1228. XE void wormdead P((struct monst *));
  1229. XE void wormhit P((struct monst *));
  1230. XE void wormsee P((unsigned int));
  1231. XE void cutworm P((struct monst *,xchar,xchar,uchar));
  1232. X#endif /* WORM */
  1233. X
  1234. X/* ### worn.c ### */
  1235. X
  1236. XE void setworn P((struct obj *,long));
  1237. XE void setnotworn P((struct obj *));
  1238. X
  1239. X/* ### write.c ### */
  1240. X
  1241. XE void dowrite P((struct obj *));
  1242. X
  1243. X/* ### zap.c ### */
  1244. X
  1245. XE struct monst *revive P((struct obj *,boolean));
  1246. XE int zappable P((struct obj *));
  1247. XE void zapnodir P((struct obj *));
  1248. XE int dozap();
  1249. XE int zapyourself P((struct obj *));
  1250. XE void weffects P((struct obj *));
  1251. XE char *exclam P((int));
  1252. XE void hit P((char *,struct monst *,char *));
  1253. XE void miss P((char *,struct monst *));
  1254. XE struct monst *bhit P((int,int,int,char,int(*)(),int(*)(),struct obj *));
  1255. XE struct monst *boomhit P((int,int));
  1256. XE void buzz P((int,int,xchar,xchar,int,int));
  1257. XE void rloco P((struct obj *));
  1258. XE void fracture_rock P((struct obj *));
  1259. XE boolean break_statue P((struct obj *));
  1260. XE void destroy_item P((int,int));
  1261. XE int destroy_mitem P((struct monst *,int,int));
  1262. XE int resist P((struct monst *,char,int,int));
  1263. XE void makewish();
  1264. X
  1265. X#undef E
  1266. X
  1267. X#endif /* EXTERN_H /**/
  1268. END_OF_FILE
  1269. if test 29514 -ne `wc -c <'include/extern.h'`; then
  1270.     echo shar: \"'include/extern.h'\" unpacked with wrong size!
  1271. fi
  1272. # end of 'include/extern.h'
  1273. fi
  1274. if test -f 'include/you.h' -a "${1}" != "-c" ; then 
  1275.   echo shar: Will not clobber existing file \"'include/you.h'\"
  1276. else
  1277. echo shar: Extracting \"'include/you.h'\" \(4384 characters\)
  1278. sed "s/^X//" >'include/you.h' <<'END_OF_FILE'
  1279. X/*    SCCS Id: @(#)you.h    3.0    88/04/25
  1280. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1281. X/* NetHack may be freely redistributed.  See license for details. */
  1282. X
  1283. X#ifndef YOU_H
  1284. X#define YOU_H
  1285. X
  1286. X#ifndef ATTRIB_H
  1287. X#include "attrib.h"
  1288. X#endif
  1289. X#ifndef MONST_H
  1290. X#include "monst.h"
  1291. X#endif
  1292. X#ifndef YOUPROP_H
  1293. X#include "youprop.h"
  1294. X#endif
  1295. X
  1296. Xstruct prop {
  1297. X
  1298. X#define    TIMEOUT        007777    /* mask */
  1299. X
  1300. X#define    LEFT_RING    W_RINGL    /* 010000L */
  1301. X#define    RIGHT_RING    W_RINGR    /* 020000L */
  1302. X#define    LEFT_SIDE    LEFT_RING
  1303. X#define    RIGHT_SIDE    RIGHT_RING
  1304. X#define    BOTH_SIDES    (LEFT_SIDE | RIGHT_SIDE)
  1305. X
  1306. X#define WORN_ARMOR    W_ARM    /* 040000L */
  1307. X#define WORN_CLOAK    W_ARMC    /* 0100000L */
  1308. X#define WORN_HELMET    W_ARMH    /* 0200000L */
  1309. X#define WORN_SHIELD    W_ARMS    /* 0400000L */
  1310. X#define WORN_GLOVES    W_ARMG    /* 01000000L */
  1311. X#define WORN_BOOTS    W_ARMF    /* 02000000L */
  1312. X#define    WORN_AMUL    W_AMUL    /* 04000000L */
  1313. X#define    WORN_BLINDF    W_TOOL    /* 010000000L */
  1314. X#ifdef SHIRT
  1315. X#define    WORN_SHIRT    W_ARMU    /* 020000000L */
  1316. X#endif
  1317. X#define    INTRINSIC    040000000L
  1318. X
  1319. X
  1320. X    long p_flgs;
  1321. X    int (*p_tofn)();    /* called after timeout */
  1322. X};
  1323. X
  1324. Xstruct you {
  1325. X    xchar ux, uy;
  1326. X    schar dx, dy, dz;    /* direction of move (or zap or ... ) */
  1327. X    schar di;        /* direction of FF */
  1328. X    xchar ux0, uy0;        /* initial position FF */
  1329. X    xchar udisx, udisy;    /* last display pos */
  1330. X    uchar usym;        /* usually '@' */
  1331. X    int last_str_turn;    /* 0: none, 1: half turn, 2: full turn */
  1332. X                /* +: turn right, -: turn left */
  1333. X    boolean umoved;        /* changed map location (post-move) */
  1334. X    unsigned udispl;    /* @ on display */
  1335. X    unsigned ulevel;    /* 1 - MAXULEV */
  1336. X    unsigned utrap;        /* trap timeout */
  1337. X    unsigned utraptype;    /* defined if utrap nonzero */
  1338. X#define    TT_BEARTRAP    0
  1339. X#define    TT_PIT        1
  1340. X#define    TT_WEB        2
  1341. X    unsigned uinshop;    /* used only in shk.c - (roomno+1) of shop */
  1342. X    int     uhunger;    /* refd only in eat.c and shk.c */
  1343. X    unsigned uhs;        /* hunger state - see eat.c */
  1344. X
  1345. X    struct prop uprops[LAST_PROP+1];
  1346. X
  1347. X    unsigned umconf;
  1348. X    char *usick_cause;
  1349. X/* For messages referring to hands, eyes, feet, etc... when polymorphed */
  1350. X#define ARM 0
  1351. X#define EYE 1
  1352. X#define FACE 2
  1353. X#define FINGER 3
  1354. X#define FINGERTIP 4
  1355. X#define FOOT 5
  1356. X#define HAND 6
  1357. X#define HANDED 7
  1358. X#define HEAD 8
  1359. X#define LEG 9
  1360. X#define LIGHT_HEADED 10
  1361. X#define NECK 11
  1362. X#define TOE 12
  1363. X#ifdef POLYSELF
  1364. X    int mh, mhmax, mtimedone, umonnum;    /* for polymorph-self */
  1365. X    struct attribs    macurr,            /* for monster attribs */
  1366. X            mamax;            /* for monster attribs */
  1367. X    int ulycn;                /* lycanthrope type */
  1368. X#endif
  1369. X    unsigned ucreamed;
  1370. X    unsigned uswallow;        /* set if swallowed by a monster */
  1371. X    unsigned uswldtim;        /* time you have been swallowed */
  1372. X#ifdef POLYSELF
  1373. X    Bitfield(uundetected,1);    /* if you're a hiding monster/piercer */
  1374. X#endif
  1375. X#if defined(THEOLOGY) && defined(ELBERETH)
  1376. X    Bitfield(uhand_of_elbereth,1);    /* if you become Hand of Elbereth */
  1377. X#endif
  1378. X#ifdef MEDUSA
  1379. X    Bitfield(ukilled_medusa,1);    /* if you kill the medusa */
  1380. X#endif
  1381. X    Bitfield(uhave_amulet,1);    /* you're carrying the Amulet */
  1382. X#ifdef HARD
  1383. X    Bitfield(udemigod,1);        /* once you kill the wiz */
  1384. X    unsigned udg_cnt;        /* how long you have been demigod */
  1385. X#endif
  1386. X    struct    attribs    acurr,        /* your current attributes (eg. str) */
  1387. X            abon,        /* your bonus attributes (eg. str) */
  1388. X            amax,        /* your max attributes (eg. str) */
  1389. X            atemp,        /* used for temporary loss/gain */
  1390. X            atime;        /* used for loss/gain countdown */
  1391. X#define U_CHAOTIC      -1        /* the value range of ualigntyp */
  1392. X#define U_NEUTRAL    0
  1393. X#define U_LAWFUL    1
  1394. X    int     ualign;            /* running alignment score */
  1395. X    schar     ualigntyp;        /* basic character alignment */
  1396. X#ifdef THEOLOGY
  1397. X#define CONVERT     2
  1398. X    schar   ualignbase[CONVERT];    /* for ualigntyp conversion record */
  1399. X#endif
  1400. X    schar uluck, moreluck;        /* luck and luck bonus */
  1401. X#define    LUCKADD        3    /* added value when carrying luck stone */
  1402. X#define Luck    (u.uluck + u.moreluck)
  1403. X#define    LUCKMAX        10    /* on moonlit nights 11 */
  1404. X#define    LUCKMIN        (-10)
  1405. X    schar    udaminc;
  1406. X    schar    uac;
  1407. X    int    uhp,uhpmax;
  1408. X#ifdef SPELLS
  1409. X    int    uen, uenmax;        /* magical energy - M. Stephenson */
  1410. X#endif
  1411. X#ifdef THEOLOGY
  1412. X    int ugangr;            /* if the gods are angry at you */
  1413. X    int ublessed, ublesscnt;    /* blessing/duration from #pray */
  1414. X#endif
  1415. X    long    ugold, ugold0;
  1416. X    long    uexp, urexp;
  1417. X#ifdef ALTARS
  1418. X    long     ucleansed;    /* to record moves when player was cleansed */
  1419. X#endif
  1420. X    int uinvault;
  1421. X    struct monst *ustuck;
  1422. X    int ugrave_arise; /* you die and become something aside from a ghost */
  1423. X    int nr_killed[NUMMONS];     /* used for experience bookkeeping */
  1424. X};
  1425. X
  1426. X#endif /* YOU_H /**/
  1427. END_OF_FILE
  1428. if test 4384 -ne `wc -c <'include/you.h'`; then
  1429.     echo shar: \"'include/you.h'\" unpacked with wrong size!
  1430. fi
  1431. # end of 'include/you.h'
  1432. fi
  1433. if test -f 'src/restore.c' -a "${1}" != "-c" ; then 
  1434.   echo shar: Will not clobber existing file \"'src/restore.c'\"
  1435. else
  1436. echo shar: Extracting \"'src/restore.c'\" \(18280 characters\)
  1437. sed "s/^X//" >'src/restore.c' <<'END_OF_FILE'
  1438. X/*    SCCS Id: @(#)restore.c    3.0    88/10/25
  1439. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1440. X/* NetHack may be freely redistributed.  See license for details. */
  1441. X
  1442. X#include "hack.h"
  1443. X#include "lev.h"
  1444. X
  1445. X#ifdef WORM
  1446. X#include "wseg.h"
  1447. X#endif
  1448. X
  1449. Xboolean restoring = FALSE;
  1450. Xstatic struct fruit *oldfruit;
  1451. Xstatic long omoves;
  1452. X
  1453. X/*
  1454. X * "stuff" objects back into containers (relink the fcobj list).
  1455. X */
  1456. Xstatic void
  1457. Xstuff_objs(cobj)
  1458. Xregister struct obj *cobj;
  1459. X{
  1460. X    register struct obj *otmp, *otmp2;
  1461. X
  1462. X    for(; cobj; cobj = cobj->nobj)
  1463. X        if(Is_container(cobj))
  1464. X
  1465. X        for(otmp = cobj->nobj;
  1466. X            otmp && otmp->cobj == (struct obj *) -1; otmp = otmp2) {
  1467. X
  1468. X            otmp2 = otmp->nobj;
  1469. X
  1470. X            otmp->cobj = cobj;
  1471. X            cobj->nobj = otmp2;
  1472. X            otmp->nobj = fcobj;
  1473. X            fcobj = otmp;
  1474. X        }
  1475. X}
  1476. X
  1477. Xstatic struct obj *
  1478. Xrestobjchn(fd, ghostly)
  1479. Xregister int fd;
  1480. Xboolean ghostly;
  1481. X{
  1482. X    register struct obj *otmp, *otmp2;
  1483. X    register struct obj *first = 0;
  1484. X    register struct fruit *oldf;
  1485. X    int xl;
  1486. X#ifdef LINT
  1487. X    /* suppress "used before set" warning from lint */
  1488. X    otmp2 = 0;
  1489. X#endif
  1490. X    while(1) {
  1491. X        mread(fd, (genericptr_t) &xl, sizeof(xl));
  1492. X        if(xl == -1) break;
  1493. X        otmp = newobj(xl);
  1494. X        if(!first) first = otmp;
  1495. X        else otmp2->nobj = otmp;
  1496. X        mread(fd, (genericptr_t) otmp, (unsigned) xl + sizeof(struct obj));
  1497. X        if(!otmp->o_id) otmp->o_id = flags.ident++;
  1498. X        if(ghostly && otmp->otyp == SLIME_MOLD) {
  1499. X            for(oldf=oldfruit; oldf; oldf=oldf->nextf)
  1500. X                if (oldf->fid == otmp->spe) break;
  1501. X            if(!oldf) impossible("no old fruit?");
  1502. X            else otmp->spe = fruitadd(oldf->fname);
  1503. X        }
  1504. X    /* Ghost levels get object age shifted from old player's clock to
  1505. X     * new player's clock.  Assumption: new player arrived immediately
  1506. X     * after old player died.
  1507. X     */
  1508. X        if (ghostly) otmp->age = moves-omoves+otmp->age;
  1509. X        otmp2 = otmp;
  1510. X    }
  1511. X    if(first && otmp2->nobj){
  1512. X        impossible("Restobjchn: error reading objchn.");
  1513. X        otmp2->nobj = 0;
  1514. X    }
  1515. X
  1516. X    stuff_objs(first);
  1517. X    return(first);
  1518. X}
  1519. X
  1520. Xstatic struct monst *
  1521. Xrestmonchn(fd, ghostly)
  1522. Xregister int fd;
  1523. Xboolean ghostly;
  1524. X{
  1525. X    register struct monst *mtmp, *mtmp2;
  1526. X    register struct monst *first = 0;
  1527. X    int xl;
  1528. X
  1529. X    struct permonst *monbegin;
  1530. X    off_t differ;
  1531. X
  1532. X    mread(fd, (genericptr_t)&monbegin, sizeof(monbegin));
  1533. X#ifndef MSDOS
  1534. X    differ = (genericptr_t)(&mons[0]) - (genericptr_t)(monbegin);
  1535. X#else
  1536. X    differ = (long)(&mons[0]) - (long)(monbegin);
  1537. X#endif
  1538. X
  1539. X#ifdef LINT
  1540. X    /* suppress "used before set" warning from lint */
  1541. X    mtmp2 = 0;
  1542. X#endif
  1543. X    while(1) {
  1544. X        mread(fd, (genericptr_t) &xl, sizeof(xl));
  1545. X        if(xl == -1) break;
  1546. X        mtmp = newmonst(xl);
  1547. X        if(!first) first = mtmp;
  1548. X        else mtmp2->nmon = mtmp;
  1549. X        mread(fd, (genericptr_t) mtmp, (unsigned) xl + sizeof(struct monst));
  1550. X        if(!mtmp->m_id)
  1551. X            mtmp->m_id = flags.ident++;
  1552. X#ifndef MSDOS
  1553. X        /*ANSI type for differ is ptrdiff_t - long may be wrong*/
  1554. X        /*for segmented architecture - may be better to cast pointers*/
  1555. X        /*to (struct permonst *) rather than (genericptr_t)*/
  1556. X        /*this code handles save file -  so any bug should glow*/
  1557. X        /*probably best not to keep lint from complaining*/
  1558. X/*#ifdef LINT    /*possible compiler/hardware dependency - */
  1559. X/*        if (differ) mtmp->data = NULL;*/
  1560. X/*#else*/
  1561. X        mtmp->data = (struct permonst *)
  1562. X            ((genericptr_t)mtmp->data + differ);
  1563. X/*#endif    /*LINT*/
  1564. X#else
  1565. X        mtmp->data = (struct permonst *)
  1566. X            ((long) mtmp->data + differ);
  1567. X#endif
  1568. X        if(mtmp->minvent)
  1569. X            mtmp->minvent = restobjchn(fd, ghostly);
  1570. X        mtmp2 = mtmp;
  1571. X    }
  1572. X    if(first && mtmp2->nmon){
  1573. X        impossible("Restmonchn: error reading monchn.");
  1574. X        mtmp2->nmon = 0;
  1575. X    }
  1576. X    return(first);
  1577. X}
  1578. X
  1579. Xstatic void
  1580. Xrestgenoinfo(fd)
  1581. Xregister int fd;
  1582. X{
  1583. X    register int i;
  1584. X
  1585. X    for (i = 0; i < NUMMONS; i++)
  1586. X        mread(fd, (genericptr_t) &(mons[i].geno), sizeof(unsigned));
  1587. X}
  1588. X
  1589. Xint
  1590. Xdorecover(fd)
  1591. Xregister int fd;
  1592. X{
  1593. X    register int nfd;
  1594. X    int tmp;        /* not a register ! */
  1595. X    xchar ltmp;
  1596. X    unsigned int mid;        /* idem */
  1597. X    struct obj *otmp;
  1598. X    struct fruit *fruit;
  1599. X#ifdef MSDOS
  1600. X    struct flag oldflags;
  1601. X
  1602. X    oldflags = flags;    /* Save flags set in the config file */
  1603. X#endif
  1604. X#ifdef ZEROCOMP
  1605. X    minit();
  1606. X#endif
  1607. X    restoring = TRUE;
  1608. X    getlev(fd, 0, (xchar)0, FALSE);
  1609. X    invent = restobjchn(fd, FALSE);
  1610. X    for(otmp = invent; otmp; otmp = otmp->nobj)
  1611. X        if(otmp->owornmask)
  1612. X            setworn(otmp, otmp->owornmask);
  1613. X    fallen_down = restmonchn(fd, FALSE);
  1614. X    restgenoinfo(fd);
  1615. X    mread(fd, (genericptr_t) &tmp, sizeof tmp);
  1616. X#ifdef WIZARD
  1617. X    if(!wizard)
  1618. X#endif
  1619. X        if(tmp != getuid()) {        /* strange ... */
  1620. X        (void) close(fd);
  1621. X        (void) unlink(SAVEF);
  1622. X        (void) puts("Saved game was not yours.");
  1623. X        restoring = FALSE;
  1624. X        return(0);
  1625. X        }
  1626. X    mread(fd, (genericptr_t) &flags, sizeof(struct flag));
  1627. X    /* Some config file OPTIONS take precedence over those in save file.
  1628. X     */
  1629. X#ifdef MSDOS
  1630. X#ifdef DGK
  1631. X    flags.rawio = oldflags.rawio;
  1632. X#ifdef DECRAINBOW
  1633. X    flags.DECRainbow = oldflags.DECRainbow;
  1634. X#endif /* DECRAINBOW */
  1635. X    flags.IBMBIOS = oldflags.IBMBIOS;
  1636. X#endif
  1637. X#endif
  1638. X    mread(fd, (genericptr_t) &dlevel, sizeof dlevel);
  1639. X    mread(fd, (genericptr_t) &maxdlevel, sizeof maxdlevel);
  1640. X    mread(fd, (genericptr_t) &moves, sizeof moves);
  1641. X    mread(fd, (genericptr_t) &wiz_level, sizeof wiz_level);
  1642. X    mread(fd, (genericptr_t) &medusa_level, sizeof medusa_level);
  1643. X#ifdef ORACLE
  1644. X    mread(fd, (genericptr_t) &oracle_level, sizeof oracle_level);
  1645. X#endif
  1646. X#ifdef REINCARNATION
  1647. X    mread(fd, (genericptr_t) &rogue_level, sizeof rogue_level);
  1648. X    if (dlevel==rogue_level)
  1649. X        savesyms = showsyms;
  1650. X#endif
  1651. X#ifdef STRONGHOLD
  1652. X    mread(fd, (genericptr_t) &stronghold_level, sizeof stronghold_level);
  1653. X    mread(fd, (genericptr_t) &tower_level, sizeof tower_level);
  1654. X    mread(fd, (genericptr_t) tune, sizeof tune);
  1655. X#  ifdef MUSIC
  1656. X    mread(fd, (genericptr_t) &music_heard, sizeof music_heard);
  1657. X#  endif
  1658. X#endif
  1659. X    mread(fd, (genericptr_t) &is_maze_lev, sizeof is_maze_lev);
  1660. X    mread(fd, (genericptr_t) &u, sizeof(struct you));
  1661. X#ifdef SPELLS
  1662. X    mread(fd, (genericptr_t) spl_book, sizeof(struct spell) * (MAXSPELL + 1));
  1663. X#endif
  1664. X    if(u.ustuck)
  1665. X        mread(fd, (genericptr_t) &mid, sizeof mid);
  1666. X    mread(fd, (genericptr_t) pl_character, sizeof pl_character);
  1667. X    mread(fd, (genericptr_t) pl_fruit, sizeof pl_fruit);
  1668. X    mread(fd, (genericptr_t) ¤t_fruit, sizeof current_fruit);
  1669. X    ffruit = 0;
  1670. X    while (fruit = newfruit(),
  1671. X           mread(fd, (genericptr_t)fruit, sizeof(struct fruit)),
  1672. X           fruit->fid) {
  1673. X        fruit->nextf = ffruit;
  1674. X        ffruit = fruit;
  1675. X    }
  1676. X    free((genericptr_t) fruit);
  1677. X
  1678. X    restnames(fd);
  1679. X#ifdef DGK
  1680. X    msmsg("\n");
  1681. X    cl_end();
  1682. X    msmsg("You got as far as level %d%s.\n", maxdlevel,
  1683. X        flags.debug ? " in WIZARD mode" :
  1684. X        flags.explore ? " in discovery mode" : "");
  1685. X    cl_end();
  1686. X    msmsg("Restoring: ");
  1687. X#endif
  1688. X    while(1) {
  1689. X#ifdef ZEROCOMP
  1690. X        if(mread(fd, (genericptr_t) <mp, sizeof ltmp) < 0)
  1691. X#else
  1692. X        if(read(fd, (genericptr_t) <mp, sizeof ltmp) != sizeof ltmp)
  1693. X#endif
  1694. X            break;
  1695. X        getlev(fd, 0, ltmp, FALSE);
  1696. X        glo(ltmp);
  1697. X#ifdef DGK
  1698. X        msmsg(".");
  1699. X#endif
  1700. X#if defined(MSDOS) && !defined(TOS)
  1701. X        nfd = open(lock, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK);
  1702. X#else
  1703. X        nfd = creat(lock, FCMASK);
  1704. X#endif
  1705. X        if (nfd < 0)    panic("Cannot open temp file %s!\n", lock);
  1706. X#if defined(DGK) && !defined(TOS)
  1707. X        if (!savelev(nfd, ltmp, COUNT | WRITE)) {
  1708. X
  1709. X            /* The savelev can't proceed because the size required
  1710. X             * is greater than the available disk space.
  1711. X             */
  1712. X            msmsg("\nNot enough space on `%s' to restore your game.\n",
  1713. X                levels);
  1714. X
  1715. X            /* Remove levels and bones that may have been created.
  1716. X             */
  1717. X            (void) close(nfd);
  1718. X            eraseall(levels, alllevels);
  1719. X            eraseall(levels, allbones);
  1720. X
  1721. X            /* Perhaps the person would like to play without a
  1722. X             * RAMdisk.
  1723. X             */
  1724. X            if (ramdisk) {
  1725. X                /* PlaywoRAMdisk may not return, but if it does
  1726. X                 * it is certain that ramdisk will be 0.
  1727. X                 */
  1728. X                playwoRAMdisk();
  1729. X                /* Rewind save file and try again */
  1730. X                (void) lseek(fd, (off_t)0, 0);
  1731. X                return dorecover(fd);
  1732. X            } else {
  1733. X                msmsg("Be seeing you...\n");
  1734. X                exit(0);
  1735. X            }
  1736. X        }
  1737. X#else
  1738. X        savelev(nfd, ltmp);
  1739. X#endif
  1740. X#ifdef ZEROCOMP
  1741. X        bflush(nfd);
  1742. X#endif
  1743. X        (void) close(nfd);
  1744. X    }
  1745. X#ifdef BSD
  1746. X    (void) lseek(fd, 0L, 0);
  1747. X#else
  1748. X    (void) lseek(fd, (off_t)0, 0);
  1749. X#endif
  1750. X#ifdef ZEROCOMP
  1751. X    minit();
  1752. X#endif
  1753. X    getlev(fd, 0, (xchar)0, FALSE);
  1754. X    (void) close(fd);
  1755. X#ifdef EXPLORE_MODE
  1756. X    if(!discover)
  1757. X#endif
  1758. X        (void) unlink(SAVEF);
  1759. X#ifdef REINCARNATION
  1760. X    /* this can't be done earlier because we need to check the initial
  1761. X     * showsyms against the one saved in each of the non-rogue levels */
  1762. X    if (dlevel==rogue_level)
  1763. X        showsyms = defsyms;
  1764. X#endif
  1765. X    if(u.ustuck) {
  1766. X        register struct monst *mtmp;
  1767. X
  1768. X        for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  1769. X            if(mtmp->m_id == mid) goto monfnd;
  1770. X        panic("Cannot find the monster ustuck.");
  1771. X    monfnd:
  1772. X        u.ustuck = mtmp;
  1773. X    }
  1774. X    setsee();  /* only to recompute seelx etc. - these weren't saved */
  1775. X#ifdef DGK
  1776. X    gameDiskPrompt();
  1777. X#endif
  1778. X    max_rank_sz(); /* to recompute mrank_sz (pri.c) */
  1779. X#ifdef POLYSELF
  1780. X    set_uasmon();
  1781. X#endif
  1782. X    /* take care of iron ball & chain */
  1783. X    for(otmp = fobj; otmp; otmp = otmp->nobj)
  1784. X        if(otmp->owornmask)
  1785. X            setworn(otmp, otmp->owornmask);
  1786. X    docrt();
  1787. X    restoring = FALSE;
  1788. X    return(1);
  1789. X}
  1790. X
  1791. Xvoid
  1792. Xgetlev(fd, pid, lev, ghostly)
  1793. Xint fd, pid;
  1794. Xxchar lev;
  1795. Xboolean ghostly;
  1796. X{
  1797. X    register struct gold *gold;
  1798. X    register struct trap *trap;
  1799. X#ifdef WORM
  1800. X    register struct wseg *wtmp;
  1801. X    register int tmp;
  1802. X#endif
  1803. X    long nhp;
  1804. X    int hpid;
  1805. X    xchar dlvl;
  1806. X    struct symbols osymbol;
  1807. X    int x, y;
  1808. X    uchar osym, nsym;
  1809. X#ifdef TOS
  1810. X    short tlev;
  1811. X#endif
  1812. X
  1813. X#ifdef MSDOS
  1814. X    setmode(fd, O_BINARY);        /* is this required for TOS??? */
  1815. X#endif
  1816. X    /* Load the old fruit info.  We have to do it first, so the infor-
  1817. X     * mation is available when restoring the objects.  
  1818. X     */
  1819. X    if (ghostly) {
  1820. X        struct fruit *fruit;
  1821. X
  1822. X        oldfruit = 0;
  1823. X        while (fruit = newfruit(),
  1824. X               mread(fd, (genericptr_t)fruit, sizeof(struct fruit)),
  1825. X               fruit->fid) {
  1826. X            fruit->nextf = oldfruit;
  1827. X            oldfruit = fruit;
  1828. X        }
  1829. X        free((genericptr_t) fruit);
  1830. X    }
  1831. X
  1832. X    /* First some sanity checks */
  1833. X    mread(fd, (genericptr_t) &hpid, sizeof(hpid));
  1834. X#ifdef TOS
  1835. X    mread(fd, (genericptr_t) &tlev, sizeof(tlev));
  1836. X    dlvl=tlev&0xff;
  1837. X#else
  1838. X    mread(fd, (genericptr_t) &dlvl, sizeof(dlvl));
  1839. X#endif
  1840. X    if((pid && pid != hpid) || (lev && dlvl != lev)) {
  1841. X        pline("Strange, this map is not as I remember it.");
  1842. X        pline("Somebody is trying some trickery here...");
  1843. X        pline("This game is void.");
  1844. X        done("tricked");
  1845. X    }
  1846. X
  1847. X    mread(fd, (genericptr_t) levl, sizeof(levl));
  1848. X    mread(fd, (genericptr_t) &osymbol, sizeof(osymbol));
  1849. X    if (memcmp((genericptr_t) &osymbol,
  1850. X           (genericptr_t) &showsyms, sizeof (struct symbols))
  1851. X#ifdef REINCARNATION
  1852. X        && dlvl != rogue_level
  1853. X        /* rogue level always uses default syms, and showsyms will still
  1854. X         * have its initial value from environment when restoring a
  1855. X         * game */
  1856. X#endif
  1857. X        ) {
  1858. X        for (x = 0; x < COLNO; x++)
  1859. X            for (y = 0; y < ROWNO; y++) {
  1860. X                osym = levl[x][y].scrsym;
  1861. X                nsym = 0;
  1862. X                switch (levl[x][y].typ) {
  1863. X                case STONE:
  1864. X                case SCORR:
  1865. X                    if (osym == osymbol.stone)
  1866. X                        nsym = showsyms.stone;
  1867. X                    break;
  1868. X                case ROOM:
  1869. X#ifdef STRONGHOLD
  1870. X                case DRAWBRIDGE_DOWN:
  1871. X#endif /* STRONGHOLD /**/
  1872. X                    if (osym == osymbol.room)
  1873. X                        nsym = showsyms.room;
  1874. X                    break;
  1875. X                case DOOR:
  1876. X                    if (osym == osymbol.door)
  1877. X                        nsym = showsyms.door;
  1878. X                    break;
  1879. X                case CORR:
  1880. X                    if (osym == osymbol.corr)
  1881. X                        nsym = showsyms.corr;
  1882. X                    break;
  1883. X                case VWALL:
  1884. X                    if (osym == osymbol.vwall)
  1885. X                        nsym = showsyms.vwall;
  1886. X#ifdef STRONGHOLD
  1887. X                    else if (osym == osymbol.dbvwall)
  1888. X                        nsym = showsyms.dbvwall;
  1889. X#endif
  1890. X                    break;
  1891. X                case HWALL:
  1892. X                    if (osym == osymbol.hwall)
  1893. X                        nsym = showsyms.hwall;
  1894. X#ifdef STRONGHOLD
  1895. X                    else if (osym == osymbol.dbhwall)
  1896. X                        nsym = showsyms.dbhwall;
  1897. X#endif
  1898. X                    break;
  1899. X                case TLCORNER:
  1900. X                    if (osym == osymbol.tlcorn)
  1901. X                        nsym = showsyms.tlcorn;
  1902. X                    break;
  1903. X                case TRCORNER:
  1904. X                    if (osym == osymbol.trcorn)
  1905. X                        nsym = showsyms.trcorn;
  1906. X                    break;
  1907. X                case BLCORNER:
  1908. X                    if (osym == osymbol.blcorn)
  1909. X                        nsym = showsyms.blcorn;
  1910. X                    break;
  1911. X                case BRCORNER:
  1912. X                    if (osym == osymbol.brcorn)
  1913. X                        nsym = showsyms.brcorn;
  1914. X                    break;
  1915. X                case SDOOR:
  1916. X                    if (osym == osymbol.vwall)
  1917. X                        nsym = showsyms.vwall;
  1918. X                    else if (osym == osymbol.hwall)
  1919. X                        nsym = showsyms.hwall;
  1920. X                    break;
  1921. X                case CROSSWALL:
  1922. X                    if (osym == osymbol.crwall)
  1923. X                        nsym = showsyms.crwall;
  1924. X                    break;
  1925. X                case TUWALL:
  1926. X                    if (osym == osymbol.tuwall)
  1927. X                        nsym = showsyms.tuwall;
  1928. X                    break;
  1929. X                case TDWALL:
  1930. X                    if (osym == osymbol.tdwall)
  1931. X                        nsym = showsyms.tdwall;
  1932. X                    break;
  1933. X                case TLWALL:
  1934. X                    if (osym == osymbol.tlwall)
  1935. X                        nsym = showsyms.tlwall;
  1936. X                    break;
  1937. X                case TRWALL:
  1938. X                    if (osym == osymbol.trwall)
  1939. X                        nsym = showsyms.trwall;
  1940. X                    break;
  1941. X                case STAIRS:
  1942. X                    if (osym == osymbol.upstair)
  1943. X                        nsym = showsyms.upstair;
  1944. X                    else if (osym == osymbol.dnstair)
  1945. X                        nsym = showsyms.dnstair;
  1946. X                    break;
  1947. X#ifdef STRONGHOLD
  1948. X                case LADDER:
  1949. X                    if (osym == osymbol.upladder)
  1950. X                        nsym = showsyms.upladder;
  1951. X                    else if (osym == osymbol.dnladder)
  1952. X                        nsym = showsyms.dnladder;
  1953. X                    break;
  1954. X#endif /* STRONGHOLD /**/
  1955. X                case POOL:
  1956. X                case MOAT:
  1957. X#ifdef STRONGHOLD
  1958. X                case DRAWBRIDGE_UP:
  1959. X#endif /* STRONGHOLD /**/
  1960. X                    if (osym == osymbol.pool)
  1961. X                        nsym = showsyms.pool;
  1962. X                    break;
  1963. X#ifdef FOUNTAINS
  1964. X                case FOUNTAIN:
  1965. X                    if (osym == osymbol.fountain)
  1966. X                        nsym = showsyms.fountain;
  1967. X                    break;
  1968. X#endif /* FOUNTAINS /**/
  1969. X#ifdef THRONES
  1970. X                case THRONE:
  1971. X                    if (osym == osymbol.throne)
  1972. X                        nsym = showsyms.throne;
  1973. X                    break;
  1974. X#endif /* THRONES /**/
  1975. X#ifdef SINKS
  1976. X                case SINK:
  1977. X                    if (osym == osymbol.sink)
  1978. X                        nsym = showsyms.sink;
  1979. X                    break;
  1980. X#endif /* SINKS /**/
  1981. X#ifdef ALTARS
  1982. X                case ALTAR:
  1983. X                    if (osym == osymbol.altar)
  1984. X                        nsym = showsyms.altar;
  1985. X                    break;
  1986. X#endif /* ALTARS /**/
  1987. X                default:
  1988. X                    break;
  1989. X                }
  1990. X                if (nsym)
  1991. X                    levl[x][y].scrsym = nsym;
  1992. X            }
  1993. X    }
  1994. X
  1995. X    mread(fd, (genericptr_t)&omoves, sizeof(omoves));
  1996. X    mread(fd, (genericptr_t)&xupstair, sizeof(xupstair));
  1997. X    mread(fd, (genericptr_t)&yupstair, sizeof(yupstair));
  1998. X    mread(fd, (genericptr_t)&xdnstair, sizeof(xdnstair));
  1999. X    mread(fd, (genericptr_t)&ydnstair, sizeof(ydnstair));
  2000. X#ifdef STRONGHOLD
  2001. X    mread(fd, (genericptr_t)&xupladder, sizeof(xupladder));
  2002. X    mread(fd, (genericptr_t)&yupladder, sizeof(yupladder));
  2003. X    mread(fd, (genericptr_t)&xdnladder, sizeof(xdnladder));
  2004. X    mread(fd, (genericptr_t)&ydnladder, sizeof(ydnladder));
  2005. X#endif
  2006. X    mread(fd, (genericptr_t)&fountsound, sizeof(fountsound));
  2007. X    mread(fd, (genericptr_t)&sinksound, sizeof(sinksound));
  2008. X    fmon = restmonchn(fd, ghostly);
  2009. X
  2010. X    /* regenerate animals while on another level */
  2011. X    { long tmoves = (moves > omoves) ? moves-omoves : 0;
  2012. X      register struct monst *mtmp, *mtmp2;
  2013. X
  2014. X      for(mtmp = fmon; mtmp; mtmp = mtmp2) {
  2015. X
  2016. X        mtmp2 = mtmp->nmon;
  2017. X        if(mtmp->data->geno & G_GENOD) {
  2018. X            mondead(mtmp);
  2019. X            continue;
  2020. X        }
  2021. X
  2022. X        if (ghostly) {
  2023. X            /* reset peaceful/malign relative to new character */
  2024. X            if(!mtmp->isshk)
  2025. X                /* shopkeepers will reset based on name */
  2026. X                mtmp->mpeaceful = peace_minded(mtmp->data);
  2027. X            set_malign(mtmp);
  2028. X        } else if (mtmp->mtame && tmoves > 250)
  2029. X              mtmp->mtame = mtmp->mpeaceful = 0;
  2030. X
  2031. X        /* restore shape changers - Maarten Jan Huisjes */
  2032. X        if (mtmp->data == &mons[PM_CHAMELEON]
  2033. X            && !Protection_from_shape_changers
  2034. X            && !mtmp->cham)
  2035. X            mtmp->cham = 1;
  2036. X        else if(Protection_from_shape_changers) {
  2037. X            if (mtmp->cham) {
  2038. X                mtmp->cham = 0;
  2039. X                (void) newcham(mtmp, &mons[PM_CHAMELEON]);
  2040. X            } else if(is_were(mtmp->data) && !is_human(mtmp->data))
  2041. X                (void) new_were(mtmp);
  2042. X        }
  2043. X
  2044. X        if (!ghostly) {
  2045. X            nhp = mtmp->mhp +
  2046. X                (regenerates(mtmp->data) ? tmoves : tmoves/20);
  2047. X            if(nhp > mtmp->mhpmax)
  2048. X                mtmp->mhp = mtmp->mhpmax;
  2049. X            else
  2050. X#ifdef LINT    /* (long)newhp -> (schar = short int) mhp; ok in context of text above */
  2051. X                mtmp->mhp = 0;
  2052. X#else
  2053. X                mtmp->mhp = nhp;
  2054. X#endif
  2055. X        }
  2056. X      }
  2057. X    }
  2058. X
  2059. X    setgd();
  2060. X    fgold = 0;
  2061. X    while(gold = newgold(),
  2062. X          mread(fd, (genericptr_t)gold, sizeof(struct gold)),
  2063. X          gold->gx) {
  2064. X        gold->ngold = fgold;
  2065. X        fgold = gold;
  2066. X    }
  2067. X    free((genericptr_t) gold);
  2068. X    ftrap = 0;
  2069. X    while (trap = newtrap(),
  2070. X           mread(fd, (genericptr_t)trap, sizeof(struct trap)),
  2071. X           trap->tx) {
  2072. X        trap->ntrap = ftrap;
  2073. X        ftrap = trap;
  2074. X    }
  2075. X    free((genericptr_t) trap);
  2076. X    fobj = restobjchn(fd, ghostly);
  2077. X    billobjs = restobjchn(fd, ghostly);
  2078. X    rest_engravings(fd);
  2079. X    mread(fd, (genericptr_t)rooms, sizeof(rooms));
  2080. X    mread(fd, (genericptr_t)doors, sizeof(doors));
  2081. X#ifdef WORM
  2082. X    mread(fd, (genericptr_t)wsegs, sizeof(wsegs));
  2083. X    for(tmp = 1; tmp < 32; tmp++) if(wsegs[tmp]){
  2084. X        wheads[tmp] = wsegs[tmp] = wtmp = newseg();
  2085. X        while(1) {
  2086. X            mread(fd, (genericptr_t)wtmp, sizeof(struct wseg));
  2087. X            if(!wtmp->nseg) break;
  2088. X            wheads[tmp]->nseg = wtmp = newseg();
  2089. X            wheads[tmp] = wtmp;
  2090. X        }
  2091. X    }
  2092. X    mread(fd, (genericptr_t)wgrowtime, sizeof(wgrowtime));
  2093. X#endif
  2094. X    /* Now get rid of all the temp fruits... */
  2095. X    if (ghostly) {
  2096. X        struct fruit *fruit;
  2097. X
  2098. X        while(oldfruit) {
  2099. X            fruit = oldfruit->nextf;
  2100. X            free((genericptr_t) oldfruit);
  2101. X            oldfruit = fruit;
  2102. X        }
  2103. X    }
  2104. X}
  2105. X
  2106. X#ifdef ZEROCOMP
  2107. X#define RLESC '\0'     /* Leading character for run of RLESC's */
  2108. X
  2109. Xstatic unsigned char inbuf[BUFSZ];
  2110. Xstatic unsigned short inbufp = 0;
  2111. Xstatic unsigned short inbufsz = 0;
  2112. Xstatic short inrunlength = -1;
  2113. Xstatic int mreadfd;
  2114. X
  2115. Xstatic int
  2116. Xmgetc()
  2117. X{
  2118. X    if (inbufp >= inbufsz) {
  2119. X      inbufsz = read(mreadfd, (genericptr_t)inbuf, (int)sizeof inbuf);
  2120. X      if (!inbufsz) {
  2121. X      if (inbufp > sizeof inbuf)
  2122. X          error("EOF on file #%d.\n", mreadfd);
  2123. X      inbufp = 1 + sizeof inbuf;  /* exactly one warning :-) */
  2124. X      return -1;
  2125. X      }
  2126. X      inbufp = 0;
  2127. X    }
  2128. X    return inbuf[inbufp++];
  2129. X}
  2130. X
  2131. Xvoid
  2132. Xminit()
  2133. X{
  2134. X    inbufsz = 0;
  2135. X    inbufp = 0;
  2136. X    inrunlength = -1;
  2137. X}
  2138. X
  2139. Xint
  2140. Xmread(fd, buf, len)
  2141. Xint fd;
  2142. Xregister genericptr_t buf;
  2143. Xregister unsigned len;
  2144. X{
  2145. X    /*register int readlen = 0;*/
  2146. X    mreadfd = fd;
  2147. X    while (len--) {
  2148. X      if (inrunlength > 0) {
  2149. X      inrunlength--;
  2150. X      *((char *)buf)++ = '\0';
  2151. X      } else {
  2152. X      register short ch = mgetc();
  2153. X      if (ch < 0) return -1; /*readlen;*/
  2154. X      if ((*((char *)buf)++ = ch) == RLESC) {
  2155. X          inrunlength = mgetc();
  2156. X      }
  2157. X      }
  2158. X      /*readlen++;*/
  2159. X    }
  2160. X    return 0; /*readlen;*/
  2161. X}
  2162. X
  2163. X#else /* ZEROCOMP */
  2164. X
  2165. Xvoid
  2166. Xmread(fd, buf, len)
  2167. Xregister int fd;
  2168. Xregister genericptr_t buf;
  2169. Xregister unsigned int len;
  2170. X{
  2171. X    register int rlen;
  2172. X
  2173. X#if defined(BSD) || defined(ULTRIX)
  2174. X    rlen = read(fd, buf, (int) len);
  2175. X    if(rlen != len){
  2176. X#else /* e.g. SYSV, __TURBOC__ */
  2177. X    rlen = read(fd, buf, (unsigned) len);
  2178. X    if((unsigned)rlen != len){
  2179. X#endif
  2180. X        pline("Read %d instead of %u bytes.\n", rlen, len);
  2181. X        if(restoring) {
  2182. X            (void) unlink(SAVEF);
  2183. X            error("Error restoring old game.");
  2184. X        }
  2185. X        panic("Error reading level file.");
  2186. X    }
  2187. X}
  2188. X#endif /* ZEROCOMP */
  2189. END_OF_FILE
  2190. if test 18280 -ne `wc -c <'src/restore.c'`; then
  2191.     echo shar: \"'src/restore.c'\" unpacked with wrong size!
  2192. fi
  2193. # end of 'src/restore.c'
  2194. fi
  2195. echo shar: End of archive 17 \(of 38\).
  2196. cp /dev/null ark17isdone
  2197. MISSING=""
  2198. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ; do
  2199.     if test ! -f ark${I}isdone ; then
  2200.     MISSING="${MISSING} ${I}"
  2201.     fi
  2202. done
  2203. if test "${MISSING}" = "" ; then
  2204.     echo You have unpacked all 38 archives.
  2205.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2206. else
  2207.     echo You still need to unpack the following archives:
  2208.     echo "        " ${MISSING}
  2209. fi
  2210. ##  End of shell archive.
  2211. exit 0
  2212.