home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / part65 < prev    next >
Internet Message Format  |  1993-02-04  |  59KB

  1. Path: uunet!news.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v16i073:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part65/108
  5. Message-ID: <4376@master.CNA.TEK.COM>
  6. Date: 1 Feb 93 19:50:58 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2092
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1623
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 73
  14. Archive-name: nethack31/Part65
  15. Supersedes: nethack3p9: Volume 10, Issue 46-102
  16. Environment: Amiga, Atari, Mac, MS-DOS, OS2, Unix, VMS, X11
  17.  
  18.  
  19.  
  20. #! /bin/sh
  21. # This is a shell archive.  Remove anything before this line, then unpack
  22. # it by saving it into a file and typing "sh file".  To overwrite existing
  23. # files, type "sh file -c".  You can also feed this as standard input via
  24. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  25. # will see the following message at the end:
  26. #        "End of archive 65 (of 108)."
  27. # Contents:  dat/bigroom.des src/do.c src/drawing.c
  28. # Wrapped by billr@saab on Wed Jan 27 16:09:12 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'dat/bigroom.des' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'dat/bigroom.des'\"
  32. else
  33. echo shar: Extracting \"'dat/bigroom.des'\" \(3185 characters\)
  34. sed "s/^X//" >'dat/bigroom.des' <<'END_OF_FILE'
  35. X#    SCCS Id: @(#)bigroom.des    3.1    90/04/15
  36. X#    Copyright (c) 1989 by Jean-Christophe Collet
  37. X#    Copyright (c) 1990 by M. Stephenson
  38. X# NetHack may be freely redistributed.  See license for details.
  39. X#
  40. X# This is the bigroom level :
  41. X#
  42. X
  43. XMAZE:"bigroom",' '
  44. XGEOMETRY:center,center
  45. XMAP
  46. X---------------------------------------------------------------------------
  47. X|.........................................................................|
  48. X|.........................................................................|
  49. X|.........................................................................|
  50. X|.........................................................................|
  51. X|.........................................................................|
  52. X|.........................................................................|
  53. X|.........................................................................|
  54. X|.........................................................................|
  55. X|.........................................................................|
  56. X|.........................................................................|
  57. X|.........................................................................|
  58. X|.........................................................................|
  59. X|.........................................................................|
  60. X|.........................................................................|
  61. X|.........................................................................|
  62. X|.........................................................................|
  63. X---------------------------------------------------------------------------
  64. XENDMAP
  65. X# Dungeon Description
  66. XREGION:(01,01,73,16),lit,"ordinary"
  67. X# Stairs
  68. XSTAIR:random,up
  69. XSTAIR:random,down
  70. X# Non diggable walls
  71. XNON_DIGGABLE:(00,00,74,17)
  72. X# Objects
  73. XOBJECT:random,random,random
  74. XOBJECT:random,random,random
  75. XOBJECT:random,random,random
  76. XOBJECT:random,random,random
  77. XOBJECT:random,random,random
  78. XOBJECT:random,random,random
  79. XOBJECT:random,random,random
  80. XOBJECT:random,random,random
  81. XOBJECT:random,random,random
  82. XOBJECT:random,random,random
  83. XOBJECT:random,random,random
  84. XOBJECT:random,random,random
  85. XOBJECT:random,random,random
  86. XOBJECT:random,random,random
  87. XOBJECT:random,random,random
  88. X# Random traps
  89. XTRAP:random,random
  90. XTRAP:random,random
  91. XTRAP:random,random
  92. XTRAP:random,random
  93. XTRAP:random,random
  94. XTRAP:random,random
  95. X# Random monsters.
  96. XMONSTER:random,random,random
  97. XMONSTER:random,random,random
  98. XMONSTER:random,random,random
  99. XMONSTER:random,random,random
  100. XMONSTER:random,random,random
  101. XMONSTER:random,random,random
  102. XMONSTER:random,random,random
  103. XMONSTER:random,random,random
  104. XMONSTER:random,random,random
  105. XMONSTER:random,random,random
  106. XMONSTER:random,random,random
  107. XMONSTER:random,random,random
  108. XMONSTER:random,random,random
  109. XMONSTER:random,random,random
  110. XMONSTER:random,random,random
  111. XMONSTER:random,random,random
  112. XMONSTER:random,random,random
  113. XMONSTER:random,random,random
  114. XMONSTER:random,random,random
  115. XMONSTER:random,random,random
  116. XMONSTER:random,random,random
  117. XMONSTER:random,random,random
  118. XMONSTER:random,random,random
  119. XMONSTER:random,random,random
  120. XMONSTER:random,random,random
  121. XMONSTER:random,random,random
  122. XMONSTER:random,random,random
  123. XMONSTER:random,random,random
  124. END_OF_FILE
  125. if test 3185 -ne `wc -c <'dat/bigroom.des'`; then
  126.     echo shar: \"'dat/bigroom.des'\" unpacked with wrong size!
  127. fi
  128. # end of 'dat/bigroom.des'
  129. fi
  130. if test -f 'src/do.c' -a "${1}" != "-c" ; then 
  131.   echo shar: Will not clobber existing file \"'src/do.c'\"
  132. else
  133. echo shar: Extracting \"'src/do.c'\" \(31171 characters\)
  134. sed "s/^X//" >'src/do.c' <<'END_OF_FILE'
  135. X/*    SCCS Id: @(#)do.c    3.1    92/11/11    */
  136. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  137. X/* NetHack may be freely redistributed.  See license for details. */
  138. X
  139. X/* Contains code for 'd', 'D' (drop), '>', '<' (up, down) */
  140. X
  141. X#include "hack.h"
  142. X#include "lev.h"
  143. X
  144. X#include <errno.h>
  145. X#ifdef _MSC_VER    /* MSC 6.0 defines errno quite differently */
  146. X# if (_MSC_VER >= 600)
  147. X#  define SKIP_ERRNO
  148. X# endif
  149. X#endif
  150. X#ifndef SKIP_ERRNO
  151. Xextern int errno;
  152. X#endif
  153. X
  154. X#ifdef MFLOPPY
  155. Xextern struct finfo fileinfo[];
  156. X#else
  157. Xextern boolean level_exists[];
  158. X#endif
  159. X
  160. X#ifdef SINKS
  161. X# ifdef OVLB
  162. Xstatic void FDECL(trycall, (struct obj *));
  163. X# endif /* OVLB */
  164. XSTATIC_DCL void FDECL(dosinkring, (struct obj *));
  165. X#endif /* SINKS */
  166. X
  167. XSTATIC_PTR int FDECL(drop, (struct obj *));
  168. XSTATIC_PTR int NDECL(wipeoff);
  169. X
  170. X#ifdef OVL2
  171. Xstatic int NDECL(currentlevel_rewrite);
  172. X/* static boolean FDECL(badspot, (XCHAR_P,XCHAR_P)); */
  173. X#endif
  174. X
  175. X#ifdef OVLB
  176. X
  177. Xstatic const char NEARDATA drop_types[] =
  178. X    { ALLOW_COUNT, GOLD_CLASS, ALL_CLASSES, 0 };
  179. X
  180. Xint
  181. Xdodrop()
  182. X{
  183. X    int result;
  184. X
  185. X    if (*u.ushops) sellobj_state(TRUE);
  186. X    result = drop(getobj(drop_types, "drop"));
  187. X    if (*u.ushops) sellobj_state(FALSE);
  188. X    reset_occupations();
  189. X
  190. X    return result;
  191. X}
  192. X
  193. X#endif /* OVLB */
  194. X#ifdef OVL0
  195. X
  196. X/* Called when a boulder is dropped, thrown, or pushed.  If it ends up
  197. X * in a pool, it either fills the pool up or sinks away.  In either case, 
  198. X * it's gone for good...  If the destination is not a pool, returns FALSE.
  199. X */
  200. Xboolean
  201. Xboulder_hits_pool(otmp, rx, ry, pushing)
  202. Xstruct obj *otmp;
  203. Xregister int rx, ry;
  204. Xboolean pushing;
  205. X{
  206. X    if (!otmp || otmp->otyp != BOULDER)
  207. X        impossible("Not a boulder?");
  208. X    else if (!Is_waterlevel(&u.uz) && (is_pool(rx,ry) || is_lava(rx,ry))) {
  209. X        boolean lava = is_lava(rx,ry), fills_up;
  210. X        const char *what = lava ? "lava" : "water";
  211. X        schar ltyp = levl[rx][ry].typ;
  212. X        int chance = rn2(10);        /* water: 90%; lava: 10% */
  213. X        fills_up = lava ? chance == 0 : chance != 0;
  214. X
  215. X        if (fills_up) {
  216. X        if (ltyp == DRAWBRIDGE_UP) {
  217. X            levl[rx][ry].drawbridgemask &= ~DB_UNDER; /* clear lava */
  218. X            levl[rx][ry].drawbridgemask |= DB_FLOOR;
  219. X        } else
  220. X            levl[rx][ry].typ = ROOM;
  221. X
  222. X        delallobj(rx, ry);
  223. X        newsym(rx,ry);
  224. X        if (pushing) {
  225. X            You("push %s into the %s.", the(xname(otmp)), what);
  226. X            if (flags.verbose && !Blind)
  227. X            pline("Now you can cross it!");
  228. X            /* no splashing in this case */
  229. X        }
  230. X        }
  231. X        if (!fills_up || !pushing) {    /* splashing occurs */
  232. X        if (pushing ? !Blind : cansee(rx,ry))
  233. X            pline("There is a large splash as %s %s the %s.",
  234. X            the(xname(otmp)), fills_up ? "fills" : "falls into",
  235. X            lava ? "lava" : ltyp==POOL ? "pool" : "moat");
  236. X        else if (flags.soundok)
  237. X            You("hear a%s splash.", lava ? " sizzling" : "");
  238. X        wake_nearby();
  239. X
  240. X        if (fills_up && u.uinwater && distu(rx,ry) == 0) {
  241. X            You("find yourself on dry land again!");
  242. X            u.uinwater = 0;
  243. X        } else if (lava && distu(rx,ry) <= 2) {
  244. X            You("are hit by molten lava%c",
  245. X            Fire_resistance ? '.' : '!');
  246. X            losehp(d((Fire_resistance ? 1 : 3), 6),
  247. X               "molten lava", KILLED_BY);
  248. X        } else if (!fills_up && flags.verbose &&
  249. X               (pushing ? !Blind : cansee(rx,ry)))
  250. X            pline("It sinks without a trace!");
  251. X        }
  252. X
  253. X        /* boulder is now gone */
  254. X        if (pushing) delobj(otmp);
  255. X        else obfree(otmp, (struct obj *)0);
  256. X        return TRUE;
  257. X    }
  258. X    return FALSE;
  259. X}
  260. X
  261. X/* Used for objects which sometimes do special things when dropped; must be
  262. X * called with the object not in any chain.  Returns 1 if the object is
  263. X * gone.
  264. X */
  265. Xboolean
  266. Xflooreffects(obj,x,y,verb)
  267. Xstruct obj *obj;
  268. Xint x,y;
  269. Xconst char *verb;
  270. X{
  271. X    struct trap *t;
  272. X
  273. X    if (obj->otyp == BOULDER && boulder_hits_pool(obj, x, y, FALSE))
  274. X        return TRUE;
  275. X    else if (obj->otyp == BOULDER && (t = t_at(x,y)) != 0 &&
  276. X         (t->ttyp==PIT || t->ttyp==SPIKED_PIT || t->ttyp==TRAPDOOR)) {
  277. X        struct monst *mtmp;
  278. X
  279. X        delallobj(x, y);
  280. X        if(!Can_fall_thru(&u.uz) && t->ttyp == TRAPDOOR)
  281. X            return FALSE;
  282. X        if (((mtmp = m_at(x, y)) && mtmp->mtrapped) ||
  283. X            (u.utrap && x==u.ux && y==u.uy)) {
  284. X            /* u.utrap = 0;     /* player remains trapped. See trap.c */
  285. X            if (*verb)
  286. X            pline("The boulder %ss into the pit%s.", verb, 
  287. X                  (mtmp)? "" : " with you");
  288. X            if (mtmp) {
  289. X            if (!passes_walls(mtmp->data) && !throws_rocks(mtmp->data))
  290. X                if (hmon(mtmp, obj, TRUE))
  291. X                    return FALSE;            /* still alive */
  292. X                else
  293. X                    delallobj(x, y);  /* treasure, corpse */
  294. X            } else
  295. X#ifdef POLYSELF
  296. X                if (!passes_walls(uasmon) && !throws_rocks(uasmon))
  297. X#endif
  298. X            {
  299. X                   losehp(rnd(15), "squished under a boulder",
  300. X                             NO_KILLER_PREFIX);
  301. X                       return FALSE;
  302. X            }
  303. X        }
  304. X        if (*verb) {
  305. X            if (Blind) {
  306. X                if ((x == u.ux) && (y == u.uy))
  307. X                    You("hear a CRASH! beneath you.");
  308. X                else
  309. X                    You("hear the boulder %s.", verb);
  310. X            } else if (cansee(x, y)) {
  311. X                pline("The boulder %sfills a %s.",
  312. X                      t->tseen ? "" : "triggers and ",
  313. X                      t->ttyp == TRAPDOOR ? 
  314. X                      "trap door" : "pit");
  315. X            }
  316. X        }
  317. X        deltrap(t);
  318. X        obfree(obj, (struct obj *)0);
  319. X        newsym(x,y);
  320. X        return TRUE;
  321. X    }
  322. X    return FALSE;
  323. X}
  324. X
  325. X#endif /* OVL0 */
  326. X#ifdef OVLB
  327. X
  328. Xvoid
  329. Xdoaltarobj(obj)  /* obj is an object dropped on an altar */
  330. X    register struct obj *obj;
  331. X{
  332. X    if (Blind) return;
  333. X    if (obj->blessed || obj->cursed) {
  334. X        pline("There is %s flash as %s hit%s the altar.",
  335. X              an(Hallucination ? hcolor() :
  336. X             obj->blessed ? amber : Black),
  337. X              doname(obj),
  338. X              (obj->quan == 1L) ? "s" : "");
  339. X        if (!Hallucination) obj->bknown = 1;
  340. X    } else {
  341. X        pline("%s land%s on the altar.", Doname2(obj),
  342. X            (obj->quan == 1L) ? "s" : "");
  343. X        if (obj->otyp != GOLD_PIECE)
  344. X            obj->bknown = 1;
  345. X    }
  346. X}
  347. X
  348. X#ifdef SINKS
  349. Xstatic
  350. Xvoid
  351. Xtrycall(obj)
  352. Xregister struct obj *obj;
  353. X{
  354. X    if(!objects[obj->otyp].oc_name_known &&
  355. X       !objects[obj->otyp].oc_uname)
  356. X       docall(obj);
  357. X}
  358. X
  359. XSTATIC_OVL
  360. Xvoid
  361. Xdosinkring(obj)  /* obj is a ring being dropped over a kitchen sink */
  362. Xregister struct obj *obj;
  363. X{
  364. X    register struct obj *otmp,*otmp2;
  365. X    register boolean ideed = TRUE;
  366. X
  367. X    You("drop %s down the drain.", doname(obj));
  368. X    switch(obj->otyp) {    /* effects that can be noticed without eyes */
  369. X        case RIN_SEARCHING:
  370. X        You("thought your %s got lost in the sink, but there it is!",
  371. X            xname(obj));
  372. X        dropx(obj);
  373. X        trycall(obj);
  374. X        return;
  375. X        case RIN_LEVITATION:
  376. X        pline("The sink quivers upward for a moment.");
  377. X        break;
  378. X        case RIN_POISON_RESISTANCE:
  379. X#ifdef TUTTI_FRUTTI
  380. X        You("smell rotten %s.", makeplural(pl_fruit));
  381. X#else
  382. X        You("smell rotten fruit.");
  383. X#endif
  384. X        break;
  385. X        case RIN_AGGRAVATE_MONSTER:
  386. X        pline("Several flies buzz angrily around the sink.");
  387. X        break;
  388. X        case RIN_SHOCK_RESISTANCE:
  389. X        pline("Static electricity surrounds the sink.");
  390. X        break;
  391. X        case RIN_CONFLICT:
  392. X        You("hear loud noises coming from the drain.");
  393. X        break;
  394. X        case RIN_GAIN_STRENGTH:
  395. X        pline("The water flow seems %ser now.",
  396. X            (obj->spe<0) ? "weak" : "strong");
  397. X        break;
  398. X        case RIN_INCREASE_DAMAGE:
  399. X        pline("The water's force seems %ser now.",
  400. X            (obj->spe<0) ? "small" : "great");
  401. X        break;
  402. X        default:
  403. X        ideed = FALSE;
  404. X        break;
  405. X    }
  406. X    if(!Blind && !ideed) {
  407. X        ideed = TRUE;
  408. X        switch(obj->otyp) {        /* effects that need eyes */
  409. X        case RIN_ADORNMENT:
  410. X            pline("The faucets flash brightly for a moment.");
  411. X            break;
  412. X        case RIN_REGENERATION:
  413. X            pline("The sink looks as good as new.");
  414. X            break;
  415. X        case RIN_INVISIBILITY:
  416. X            You("don't see anything happen to the sink.");
  417. X            break;
  418. X        case RIN_SEE_INVISIBLE:
  419. X            You("see some air in the sink.");
  420. X            break;
  421. X        case RIN_STEALTH:
  422. X        pline("The sink seems to blend into the floor for a moment.");
  423. X            break;
  424. X        case RIN_HUNGER:
  425. X            ideed = FALSE;
  426. X            for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp2) {
  427. X            otmp2 = otmp->nexthere;
  428. X            if(otmp != uball && otmp != uchain) {
  429. X                pline("Suddenly, %s vanishes from the sink!",
  430. X                            doname(otmp));
  431. X                delobj(otmp);
  432. X                ideed = TRUE;
  433. X            }
  434. X            }
  435. X            break;
  436. X        case RIN_FIRE_RESISTANCE:
  437. X        pline("The hot water faucet flashes brightly for a moment.");
  438. X            break;
  439. X        case RIN_COLD_RESISTANCE:
  440. X        pline("The cold water faucet flashes brightly for a moment.");
  441. X            break;
  442. X        case RIN_PROTECTION_FROM_SHAPE_CHAN:
  443. X            pline("The sink looks nothing like a fountain.");
  444. X            break;
  445. X        case RIN_PROTECTION:
  446. X            pline("The sink glows %s for a moment.",
  447. X                Hallucination ? hcolor() :
  448. X                (obj->spe<0) ? Black : silver);
  449. X            break;
  450. X        case RIN_WARNING:
  451. X            pline("The sink glows %s for a moment.",
  452. X                Hallucination ? hcolor() : White);
  453. X            break;
  454. X        case RIN_TELEPORTATION:
  455. X            pline("The sink momentarily vanishes.");
  456. X            break;
  457. X        case RIN_TELEPORT_CONTROL:
  458. X        pline("The sink looks like it is being beamed aboard somewhere.");
  459. X            break;
  460. X#ifdef POLYSELF
  461. X        case RIN_POLYMORPH:
  462. X            pline("The sink momentarily looks like a fountain.");
  463. X            break;
  464. X        case RIN_POLYMORPH_CONTROL:
  465. X    pline("The sink momentarily looks like a regularly erupting geyser.");
  466. X            break;
  467. X#endif
  468. X        }
  469. X    }
  470. X    if(ideed)
  471. X        trycall(obj);
  472. X    else
  473. X        You("hear the ring bouncing down the drainpipe.");
  474. X    if (!rn2(20)) {
  475. X        pline("The sink backs up, leaving %s.", doname(obj));
  476. X        dropx(obj);
  477. X    }
  478. X    else
  479. X        useup(obj);
  480. X}
  481. X#endif
  482. X
  483. X#endif /* OVLB */
  484. X#ifdef OVL0
  485. X
  486. X/* some common tests when trying to drop or throw items */
  487. Xboolean
  488. Xcanletgo(obj,word)
  489. Xregister struct obj *obj;
  490. Xregister const char *word;
  491. X{
  492. X    if(obj->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)){
  493. X           if (*word)
  494. X            Norep("You cannot %s something you are wearing.",word);
  495. X        return(FALSE);
  496. X    }
  497. X    if (obj->otyp == LOADSTONE && obj->cursed) {
  498. X        if (*word)
  499. X            pline("For some reason, you cannot %s the stone%s!",
  500. X                word, plur(obj->quan));
  501. X        /* Kludge -- see invent.c */
  502. X        if (obj->corpsenm) {
  503. X            struct obj *otmp;
  504. X
  505. X            otmp = obj;
  506. X            obj = obj->nobj;
  507. X            obj->quan += otmp->quan;
  508. X            obj->owt = weight(obj);
  509. X            freeinv(otmp);
  510. X            obfree(otmp, obj);
  511. X        }
  512. X        obj->bknown = 1;
  513. X        return(FALSE);
  514. X    }
  515. X#ifdef WALKIES
  516. X    if (obj->otyp == LEASH && obj->leashmon != 0) {
  517. X           if (*word)
  518. X            pline ("The leash is tied around your %s.",
  519. X                    body_part(HAND));
  520. X        return(FALSE);
  521. X    }
  522. X#endif
  523. X    return(TRUE);
  524. X}
  525. X
  526. XSTATIC_PTR
  527. Xint
  528. Xdrop(obj)
  529. Xregister struct obj *obj;
  530. X{
  531. X    if(!obj) return(0);
  532. X    if(!canletgo(obj,"drop"))
  533. X        return(0);
  534. X    if(obj == uwep) {
  535. X        if(welded(uwep)) {
  536. X            weldmsg(obj, FALSE);
  537. X            return(0);
  538. X        }
  539. X        setuwep((struct obj *)0);
  540. X        if(uwep) return 0; /* lifesaved and rewielded */
  541. X    }
  542. X#ifdef SINKS
  543. X    if((obj->oclass == RING_CLASS) && IS_SINK(levl[u.ux][u.uy].typ)
  544. X                            && !u.uswallow) {
  545. X        dosinkring(obj);
  546. X        return(1);
  547. X    }
  548. X#endif
  549. X    if (IS_ALTAR(levl[u.ux][u.uy].typ) && !u.uswallow) {
  550. X        doaltarobj(obj);    /* set bknown */
  551. X    } else
  552. X        if(flags.verbose) You("drop %s.", doname(obj));
  553. X    dropx(obj);
  554. X    return(1);
  555. X}
  556. X
  557. X/* Called in several places - should not produce texts */
  558. Xvoid
  559. Xdropx(obj)
  560. Xregister struct obj *obj;
  561. X{
  562. X    /* Money is *not* in our inventory */
  563. X    if (obj->otyp != GOLD_PIECE) freeinv(obj);
  564. X    (void) snuff_candle(obj);
  565. X    if(!u.uswallow && obj != uball &&
  566. X                  ship_object(obj, u.ux, u.uy, FALSE)) return;
  567. X    dropy(obj);
  568. X}
  569. X
  570. Xvoid
  571. Xdropy(obj)
  572. Xregister struct obj *obj;
  573. X{
  574. X    if (!u.uswallow && flooreffects(obj,u.ux,u.uy,"drop")) return;
  575. X    if(obj->otyp == CRYSKNIFE)
  576. X        obj->otyp = WORM_TOOTH;
  577. X    /* uswallow check done by GAN 01/29/87 */
  578. X    if(u.uswallow) {
  579. X        if (obj->otyp == GOLD_PIECE) {
  580. X            u.ustuck->mgold += obj->quan;
  581. X            delobj(obj);
  582. X        } else if (obj != uball) {    /* mon doesn't pick up ball */
  583. X            (void) snuff_candle(obj);   /* security. it's never lit */
  584. X            mpickobj(u.ustuck,obj);
  585. X        }
  586. X    } else  {
  587. X        (void) snuff_candle(obj);
  588. X        obj->nobj = fobj;
  589. X        fobj = obj;
  590. X        place_object(obj, u.ux, u.uy);
  591. X        if (obj == uball)
  592. X            drop_ball(u.ux,u.uy);
  593. X        else
  594. X            sellobj(obj, u.ux, u.uy);
  595. X        stackobj(obj);
  596. X        if(Blind && Levitation)
  597. X            map_object(obj, 0);
  598. X        newsym(u.ux,u.uy);    /* remap location under self */
  599. X    }
  600. X}
  601. X
  602. X/* drop several things */
  603. Xint
  604. Xdoddrop()
  605. X{
  606. X    int result;
  607. X
  608. X    if (*u.ushops) sellobj_state(TRUE);
  609. X    result = ggetobj("drop", drop, 0);
  610. X    if (*u.ushops) sellobj_state(FALSE);
  611. X    reset_occupations();
  612. X
  613. X    return result;
  614. X}
  615. X
  616. X#endif /* OVL0 */
  617. X#ifdef OVL2
  618. X
  619. X/* on a ladder, used in goto_level */
  620. Xstatic boolean NEARDATA at_ladder = FALSE;
  621. X
  622. Xint
  623. Xdodown()
  624. X{
  625. X    struct trap *trap = 0;
  626. X
  627. X    if( (u.ux != xdnstair || u.uy != ydnstair)
  628. X         && (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)
  629. X         && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy
  630. X            || sstairs.up)
  631. X      ) {
  632. X        if (!(trap = t_at(u.ux,u.uy)) || trap->ttyp != TRAPDOOR
  633. X            || !Can_fall_thru(&u.uz) || !trap->tseen) {
  634. X            You("can't go down here.");
  635. X            return(0);
  636. X        }
  637. X    }
  638. X    if(u.ustuck) {
  639. X        You("are being held, and cannot go down.");
  640. X        return(1);
  641. X    }
  642. X    if(Levitation) {
  643. X        pline("You're floating high above the %s.",
  644. X            levl[u.ux][u.uy].typ == STAIRS ? "stairs" :
  645. X            levl[u.ux][u.uy].typ == LADDER ? "ladder" :
  646. X            "trap door");
  647. X        return(0);
  648. X    }
  649. X    if (on_level(&valley_level, &u.uz) && !u.uevent.gehennom_entered) {
  650. X        You("are standing at the gate to Gehennom.");
  651. X        pline("Unspeakable cruelty and harm lurk down there.");
  652. X        if (yn("Are you sure you want to enter?") != 'y')
  653. X             return(0);
  654. X        else pline("So be it.");
  655. X        u.uevent.gehennom_entered = 1;    /* don't ask again */
  656. X    }
  657. X
  658. X#ifdef WALKIES
  659. X    if(!next_to_u()) {
  660. X        You("are held back by your pet!");
  661. X        return(0);
  662. X    }
  663. X#endif
  664. X    if (trap)
  665. X#ifdef POLYSELF
  666. X        You("%s into the trap door.", locomotion(uasmon, "jump"));
  667. X#else
  668. X        You("jump into the trap door.");
  669. X#endif
  670. X    if (levl[u.ux][u.uy].typ == LADDER) at_ladder = TRUE;
  671. X    next_level(!trap);
  672. X    at_ladder = FALSE;
  673. X    return(1);
  674. X}
  675. X
  676. Xint
  677. Xdoup()
  678. X{
  679. X    if( (u.ux != xupstair || u.uy != yupstair)
  680. X         && (!xupladder || u.ux != xupladder || u.uy != yupladder)
  681. X         && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy
  682. X            || !sstairs.up)
  683. X       ) {
  684. X        You("can't go up here.");
  685. X        return(0);
  686. X    }
  687. X    if(u.ustuck) {
  688. X        You("are being held, and cannot go up.");
  689. X        return(1);
  690. X    }
  691. X    if(near_capacity() > SLT_ENCUMBER) {
  692. X        /* No levitation check; inv_weight() already allows for it */
  693. X        Your("load is too heavy to climb the %s.",
  694. X              levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
  695. X        return(1);
  696. X    }
  697. X    if(ledger_no(&u.uz) == 1) {
  698. X        if (yn("Beware, there will be no return! Still climb?") != 'y')
  699. X            return(0);
  700. X    }
  701. X#ifdef WALKIES
  702. X    if(!next_to_u()) {
  703. X        You("are held back by your pet!");
  704. X        return(0);
  705. X    }
  706. X#endif
  707. X    if (levl[u.ux][u.uy].typ == LADDER) at_ladder = TRUE;
  708. X    prev_level(TRUE);
  709. X    at_ladder = FALSE;
  710. X    return(1);
  711. X}
  712. X
  713. Xd_level save_dlevel = {0, 0};
  714. X
  715. X/* check that we can write out the current level */
  716. Xstatic int
  717. Xcurrentlevel_rewrite()
  718. X{
  719. X    register int fd;
  720. X
  721. X    fd = create_levelfile(ledger_no(&u.uz));
  722. X
  723. X    if(fd < 0) {
  724. X        /*
  725. X         * This is not quite impossible: e.g., we may have
  726. X         * exceeded our quota. If that is the case then we
  727. X         * cannot leave this level, and cannot save either.
  728. X         * Another possibility is that the directory was not
  729. X         * writable.
  730. X         */
  731. X        pline("Cannot create level file for level %d.",
  732. X                        ledger_no(&u.uz));
  733. X        return -1;
  734. X    }
  735. X
  736. X#ifdef MFLOPPY
  737. X    if (!savelev(fd, ledger_no(&u.uz), COUNT_SAVE)) {
  738. X        (void) close(fd);
  739. X        delete_levelfile(ledger_no(&u.uz));
  740. X        pline("NetHack is out of disk space for making levels!");
  741. X        You("can save, quit, or continue playing.");
  742. X        return -1;
  743. X    }
  744. X#endif
  745. X    return fd;
  746. X}
  747. X
  748. X#ifdef INSURANCE
  749. Xvoid
  750. Xsave_currentstate()
  751. X{
  752. X    int fd;
  753. X
  754. X    if (flags.ins_chkpt) {
  755. X        /* write out just-attained level, with pets and everything */
  756. X        fd = currentlevel_rewrite();
  757. X        if(fd < 0) return;
  758. X        bufon(fd);
  759. X        savelev(fd,ledger_no(&u.uz), WRITE_SAVE);
  760. X        bclose(fd);
  761. X    }
  762. X
  763. X    /* write out non-level state */
  764. X    savestateinlock();
  765. X}
  766. X#endif
  767. X
  768. X/*
  769. Xstatic boolean
  770. Xbadspot(x, y)
  771. Xregister xchar x, y;
  772. X{
  773. X        return((levl[x][y].typ != ROOM && levl[x][y].typ != AIR &&
  774. X                 levl[x][y].typ != CORR) || MON_AT(x, y));
  775. X}
  776. X*/
  777. X
  778. Xvoid
  779. Xgoto_level(newlevel, at_stairs, falling, portal)
  780. Xd_level *newlevel;
  781. Xregister boolean at_stairs, falling, portal;
  782. X{
  783. X    register int fd;
  784. X    register boolean up = (depth(newlevel) < depth(&u.uz));
  785. X    register boolean newdungeon = (u.uz.dnum != newlevel->dnum);
  786. X#ifdef REINCARNATION
  787. X    int new = 0;    /* made a new level? */
  788. X#endif
  789. X
  790. X    if(dunlev(newlevel) > dunlevs_in_dungeon(newlevel))
  791. X            newlevel->dlevel = dunlevs_in_dungeon(newlevel);
  792. X    if(newdungeon && In_endgame(newlevel)) { /* 1st Endgame Level !!! */
  793. X            if(u.uhave.amulet) 
  794. X            assign_level(newlevel, &earth_level);
  795. X            else return;
  796. X    }
  797. X    if(ledger_no(newlevel) <= 0)
  798. X            done(ESCAPED);    /* in fact < 0 is impossible */
  799. X    /* If you have the amulet and are trying to get out of Hell, going
  800. X     * up a set of stairs sometimes does some very strange things!
  801. X     */
  802. X    if(Inhell && up && !newdungeon && u.uhave.amulet &&
  803. X                   (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)-3)) {
  804. X            if(!rn2(4)) {
  805. X            if(!u.ualign.type) {            /* neutral */
  806. X                if(rn2(2)) assign_level(newlevel, &u.uz);
  807. X                else assign_rnd_level(newlevel, &u.uz, rnd(3));
  808. X            } else if(u.ualign.type == A_LAWFUL) {    /* lawful */
  809. X            assign_rnd_level(newlevel, &u.uz, rnd(3));
  810. X            } else assign_level(newlevel, &u.uz); /* chaotic */
  811. X            }
  812. X        pline("A mysterious force momentarily surrounds you...");
  813. X            if(ledger_no(newlevel) < 1) assign_level(newlevel, &u.uz);
  814. X            if(on_level(newlevel, &u.uz)) {
  815. X            (void) safe_teleds();
  816. X#ifdef WALKIES
  817. X            (void) next_to_u();
  818. X#endif
  819. X            return;
  820. X        }
  821. X    }
  822. X#ifdef MULDGN
  823. X/*    Prevent the player from going past the first quest level unless
  824. X *    (s)he has been given the go-ahead by the leader.
  825. X */
  826. X    if(on_level(&u.uz, &qstart_level) && !newdungeon && !ok_to_quest()) {
  827. X
  828. X        pline("A mysterious force prevents you from descending.");
  829. X        return;
  830. X    }
  831. X#endif
  832. X    if(on_level(newlevel, &u.uz)) return;          /* this can happen */
  833. X
  834. X    fd = currentlevel_rewrite();
  835. X    if(fd < 0) return;
  836. X
  837. X    if (falling) /* assuming this is only trapdoor */
  838. X        impact_drop((struct obj *)0, u.ux, u.uy, newlevel->dlevel);
  839. X
  840. X    check_special_room(TRUE);        /* probably was a trap door */
  841. X    if(Punished) unplacebc();
  842. X    u.utrap = 0;                /* needed in level_tele */
  843. X    fill_pit(u.ux, u.uy);
  844. X    u.ustuck = 0;                /* idem */
  845. X    u.uinwater = 0;
  846. X    keepdogs();
  847. X    if(u.uswallow)                /* idem */
  848. X        u.uswldtim = u.uswallow = 0;
  849. X    /*
  850. X     *  We no longer see anything on the level.  Make sure that this
  851. X     *  follows u.uswallow set to null since uswallow overrides all
  852. X     *  normal vision.
  853. X     */
  854. X    vision_recalc(2);
  855. X    bufon(fd);
  856. X    savelev(fd,ledger_no(&u.uz), WRITE_SAVE | FREE_SAVE);
  857. X    bclose(fd);
  858. X
  859. X#ifdef REINCARNATION
  860. X    if (Is_rogue_level(newlevel) || Is_rogue_level(&u.uz))
  861. X        assign_rogue_graphics(Is_rogue_level(newlevel));
  862. X#endif
  863. X    assign_level(&u.uz0, &u.uz);
  864. X    assign_level(&u.uz, newlevel);
  865. X    assign_level(&u.utolev, newlevel);
  866. X    u.utotype = 0;
  867. X    if(dunlev_reached(&u.uz) < dunlev(&u.uz))
  868. X        dunlev_reached(&u.uz) = dunlev(&u.uz);
  869. X
  870. X    /* set default level change destination areas */
  871. X    /* the special level code may override these */
  872. X    (void) memset((genericptr_t) &updest, 0, sizeof updest);
  873. X    (void) memset((genericptr_t) &dndest, 0, sizeof dndest);
  874. X
  875. X    if(In_endgame(&u.uz) ||
  876. X#ifdef MFLOPPY
  877. X        /* If the level has no .where yet, it hasn't been made */
  878. X        !fileinfo[ledger_no(&u.uz)].where) {
  879. X#else
  880. X        !level_exists[ledger_no(&u.uz)]) {
  881. X#endif
  882. X        mklev();
  883. X#ifdef REINCARNATION
  884. X        new = 1;    /* made the level */
  885. X#endif
  886. X    } else {
  887. X        fd = open_levelfile(ledger_no(&u.uz));
  888. X        if (fd < 0) {
  889. X            pline("Cannot open file (#%d) for level %d (errno %d).",
  890. X                    ledger_no(&u.uz), depth(&u.uz), errno);
  891. X            pline("Probably someone removed it.");
  892. X            done(TRICKED);
  893. X        }
  894. X#ifdef ZEROCOMP
  895. X        minit();
  896. X#endif
  897. X        getlev(fd, hackpid, ledger_no(&u.uz), FALSE);
  898. X        (void) close(fd);
  899. X    }
  900. X#ifdef MULDGN
  901. X    quest_init();    /* re-initialize */
  902. X#endif
  903. X
  904. X    if(portal && !In_endgame(&u.uz)) {
  905. X        /* find the portal on the new level */
  906. X        register struct trap *ttrap;
  907. X
  908. X        for(ttrap = ftrap; ttrap; ttrap = ttrap->ntrap)
  909. X        if(ttrap->ttyp == MAGIC_PORTAL) break;
  910. X
  911. X        if(ttrap) {
  912. X        u.ux = ttrap->tx;
  913. X        u.uy = ttrap->ty;
  914. X        } else panic("goto_level: no corresponding portal!");
  915. X    } else if(at_stairs && !In_endgame(&u.uz)) {
  916. X        if(up) {
  917. X        if(at_ladder) {
  918. X            u.ux = xdnladder;
  919. X            u.uy = ydnladder;
  920. X        } else {
  921. X            if(newdungeon) {
  922. X            if(Is_stronghold(&u.uz)) {
  923. X                register xchar x, y;
  924. X
  925. X                do {
  926. X                x = (COLNO - 2 - rnd(5));
  927. X                y = rn1(ROWNO - 4, 3);
  928. X                } while(occupied(x, y) ||
  929. X                    IS_WALL(levl[x][y].typ));
  930. X                u.ux = x;
  931. X                u.uy = y;
  932. X            } else u_on_sstairs();
  933. X            } else u_on_dnstairs();
  934. X        } 
  935. X        /* Remove bug which crashes with */ 
  936. X        /* levitation/punishment  KAA    */
  937. X        if(Punished) {
  938. X            if(!Levitation)
  939. X            pline("With great effort you climb the %s.",
  940. X                  !at_ladder ? "stairs" : "ladder");
  941. X            placebc();
  942. X        } 
  943. X        if(at_ladder && (!Punished || Levitation))
  944. X            You("climb up the ladder.");
  945. X        } else { /* down */
  946. X        if(at_ladder) {
  947. X            u.ux = xupladder;
  948. X            u.uy = yupladder;
  949. X        } else {
  950. X            if(newdungeon) u_on_sstairs();
  951. X            else u_on_upstairs();
  952. X        }
  953. X        if(at_stairs && u.dz && !up &&
  954. X           ((near_capacity()>UNENCUMBERED) || Punished || Fumbling)) {
  955. X            You("fall down the %s.",
  956. X            !at_ladder ? "stairs" : "ladder");
  957. X            if(Punished) {
  958. X            drag_down();
  959. X            if(carried(uball)) {
  960. X                if (uwep == uball)
  961. X                setuwep((struct obj *)0);
  962. X                if (uwep != uball)
  963. X                freeinv(uball);
  964. X            }
  965. X            placebc();
  966. X            } 
  967. X            losehp(rnd(3), "falling downstairs", KILLED_BY);
  968. X            selftouch("Falling, you");
  969. X        } 
  970. X        else if(at_ladder && u.dz)
  971. X            You("climb down the ladder.");
  972. X        }
  973. X    } else { /* trap door or level_tele or In_endgame */
  974. X        if(up)
  975. X        place_lregion(updest.lx, updest.ly,
  976. X                  updest.hx, updest.hy,
  977. X                  updest.nlx, updest.nly,
  978. X                  updest.nhx, updest.nhy,
  979. X                  LR_UPTELE, (d_level *) 0);
  980. X        else
  981. X        place_lregion(dndest.lx, dndest.ly,
  982. X                  dndest.hx, dndest.hy,
  983. X                  dndest.nlx, dndest.nly,
  984. X                  dndest.nhx, dndest.nhy,
  985. X                  LR_DOWNTELE, (d_level *) 0);
  986. X        if(Punished) {
  987. X        if(falling) ballfall();
  988. X        placebc();
  989. X        }
  990. X        if(falling)
  991. X        selftouch("Falling, you");
  992. X    }
  993. X
  994. X    losedogs();
  995. X    obj_delivery();
  996. X    check_special_room(FALSE);
  997. X
  998. X    initrack();
  999. X
  1000. X    if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy));
  1001. X    if(MON_AT(u.ux, u.uy)) {
  1002. X        impossible("mnexto failed (do.c)?");
  1003. X        rloc(m_at(u.ux, u.uy));
  1004. X    }
  1005. X    remove_cadavers(&fobj);    /* remove rotted meat (before seen) */
  1006. X
  1007. X    /* initial movement of bubbles just before vision_recalc */
  1008. X    if (Is_waterlevel(&u.uz))
  1009. X        movebubbles();
  1010. X
  1011. X    /* Reset the screen. */
  1012. X    vision_reset();        /* reset the blockages */
  1013. X    docrt();        /* does a full vision recalc */
  1014. X
  1015. X    /* In Nethack 3.1, Gehennom starts after the stronghold.  Moreover,
  1016. X     * there are traps in the stronghold, that can send the player
  1017. X     * to Gehennom (gnark, gnark)!  So we have to test here:
  1018. X     */
  1019. X    if(!In_hell(&u.uz0) && Inhell) {
  1020. X            if(Is_valley(newlevel)) {
  1021. X        You("arrive at the Valley of the Dead...");
  1022. X            pline("There is a smell of burnt flesh and decay here.");
  1023. X#ifdef MICRO
  1024. X            display_nhwindow(WIN_MESSAGE, FALSE);
  1025. X#endif
  1026. X        pline("The sounds of groans and moans fill the air.");
  1027. X        } else pline("It is hot here.  You smell smoke...");
  1028. X    }
  1029. X
  1030. X#ifdef REINCARNATION
  1031. X    /*
  1032. X     *  Move all plines beyond the screen reset.
  1033. X     */
  1034. X    if (new && Is_rogue_level(&u.uz))
  1035. X     You("have entered what appears to be an older, more primitive world.");
  1036. X#endif
  1037. X    /* Final confrontation */
  1038. X    if (In_endgame(&u.uz) && newdungeon && u.uhave.amulet &&
  1039. X                           flags.no_of_wizards == 0)
  1040. X        resurrect();
  1041. X    if (newdungeon && In_tower(&u.uz))
  1042. X        pline("The heat and smoke are gone.");
  1043. X#ifdef MULDGN
  1044. X    if(!In_quest(&u.uz0) && at_dgn_entrance("The Quest") &&
  1045. X        !(u.uevent.qexpelled || u.uevent.qcompleted || leaderless()))
  1046. X        com_pager(2);    /* the message from the leader */
  1047. X
  1048. X    if(Is_knox(&u.uz)) {
  1049. X            register struct monst *mtmp;
  1050. X
  1051. X            You("penetrated a high security area!");
  1052. X        pline("An alarm sounds!");
  1053. X        for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 
  1054. X            if(mtmp->msleep) mtmp->msleep = 0;
  1055. X    }
  1056. X#endif /* MULDGN */
  1057. X    if(on_level(&u.uz, &astral_level)) {
  1058. X            register struct monst *mtmp;
  1059. X
  1060. X            /* reset monster hostility relative to player */
  1061. X        for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 
  1062. X            reset_hostility(mtmp);
  1063. X
  1064. X        /* create some player-monsters */
  1065. X        create_mplayers(rn1(4, 3), TRUE);
  1066. X
  1067. X        /* create a guardian angel next to player, if worthy */
  1068. X        if (Conflict) {
  1069. X            coord mm;
  1070. X            int i = rnd(4);
  1071. X    pline("A voice booms: \"Thy desire for conflict shall be rewarded!\"");
  1072. X            while(i--) {
  1073. X            mm.x = u.ux;
  1074. X            mm.y = u.uy;
  1075. X            if(enexto(&mm, mm.x, mm.y, &mons[PM_ANGEL]))
  1076. X                (void) mk_roamer(&mons[PM_ANGEL], u.ualign.type,
  1077. X                         mm.x, mm.y, FALSE);
  1078. X            }
  1079. X
  1080. X        } else if(u.ualign.record > 3) {
  1081. X            coord mm;
  1082. X
  1083. X        pline("A voice whispers: \"Thou hast been worthy of me!\"");
  1084. X            mm.x = u.ux;
  1085. X            mm.y = u.uy;
  1086. X            if(enexto(&mm, mm.x, mm.y, &mons[PM_ANGEL])) {
  1087. X            if((mtmp = mk_roamer(&mons[PM_ANGEL], u.ualign.type,
  1088. X                       mm.x, mm.y, TRUE)) != 0) {
  1089. X                 register struct obj *otmp =
  1090. X                               mksobj(SILVER_SABER, FALSE, FALSE);
  1091. X
  1092. X                 if(!Blind)
  1093. X                         pline("An angel appears near you.");
  1094. X                 else 
  1095. X               You("feel the presence of a friendly angel near you.");
  1096. X                /* guardian angel -- the one case mtame doesn't
  1097. X                 * imply an edog structure, so we don't want to
  1098. X                 * call tamedog().
  1099. X                 */
  1100. X                 mtmp->mtame = 10;
  1101. X                 /* make him strong enough vs. endgame foes */
  1102. X                 mtmp->m_lev = rn1(8,15);
  1103. X                 mtmp->mhp = mtmp->mhpmax = 
  1104. X                       d((int)mtmp->m_lev,10) + 30 + rnd(30);
  1105. X                 bless(otmp);
  1106. X                 otmp->spe = 7;
  1107. X                 mpickobj(mtmp, otmp);
  1108. X                }
  1109. X            }
  1110. X        }
  1111. X        }
  1112. X
  1113. X#ifdef MULDGN
  1114. X    onquest();
  1115. X#endif
  1116. X    assign_level(&u.uz0, &u.uz); /* reset u.uz0 */
  1117. X
  1118. X#ifdef INSURANCE
  1119. X    save_currentstate();
  1120. X#endif
  1121. X
  1122. X    if(!flags.nopick && OBJ_AT(u.ux, u.uy) &&
  1123. X       (!is_pool(u.ux,u.uy) || Underwater))
  1124. X        pickup(1);
  1125. X    else read_engr_at(u.ux,u.uy);
  1126. X}
  1127. X
  1128. X/* handle something like portal ejection */
  1129. Xvoid
  1130. Xdeferred_goto()
  1131. X{
  1132. X    if (!on_level(&u.uz, &u.utolev)) {
  1133. X        d_level dest;
  1134. X        int typmask = u.utotype; /* save it; goto_level zeroes u.utotype */
  1135. X
  1136. X        assign_level(&dest, &u.utolev);
  1137. X        goto_level(&dest, !!(typmask&4), !!(typmask&2), !!(typmask&1));
  1138. X        if (typmask & 0200) {    /* remove portal */
  1139. X        deltrap(t_at(u.ux, u.uy));
  1140. X        newsym(u.ux, u.uy);
  1141. X        }
  1142. X    }
  1143. X}
  1144. X
  1145. X#endif /* OVL2 */
  1146. X#ifdef OVL3
  1147. X
  1148. Xvoid
  1149. Xrevive_corpse(corpse, odds, mark_as_old)    /* see remove_cadavers() */
  1150. Xregister struct obj *corpse;
  1151. Xint odds;
  1152. Xboolean mark_as_old;
  1153. X{
  1154. X    register struct monst *mtmp;
  1155. X
  1156. X    corpse->oldcorpse = mark_as_old;
  1157. X
  1158. X    /* odds == 0 is a special case meaning 'always revive' */
  1159. X    if (!odds || !rn2(odds)) {
  1160. X    if (carried(corpse)) {
  1161. X        if (corpse == uwep) {
  1162. X        if ((mtmp = revive(corpse,TRUE)) != 0)
  1163. X            pline("The %s%s %s writhes out of your grasp!",
  1164. X            (mtmp->mhp < mtmp->mhpmax) ? "bite-covered ":"",
  1165. X                mtmp->data->mname, xname(corpse));
  1166. X        } else if ((mtmp = revive(corpse,TRUE)) != 0)
  1167. X        You("feel squirming in your backpack!");
  1168. X    } else {
  1169. X        if ((mtmp = revive(corpse,FALSE)) && cansee(mtmp->mx,mtmp->my))
  1170. X        pline("%s rises from the dead!",
  1171. X            (mtmp->mhp==mtmp->mhpmax) ? Monnam(mtmp)
  1172. X            : Adjmonnam(mtmp, "bite-covered"));
  1173. X    }
  1174. X    }
  1175. X}
  1176. X
  1177. X/*
  1178. X *  Remove old cadavers from any object chain.  Regenerate trolls
  1179. X *  thanks to KAA.  Follows containers (except ice boxes).
  1180. X */
  1181. X#define TAINT_AGE    50    /* min. limit for tainting.  see eat.c */
  1182. X#define ODDS_RV1    37    /* 1/37 odds for 50 moves = 75% revive */
  1183. X#define ODDS_RV2    2    /* special case 1/2 odds of reviving */
  1184. X
  1185. Xvoid
  1186. Xremove_cadavers(chain)
  1187. Xstruct obj **chain;
  1188. X{
  1189. X    register struct obj *obj, *nobj, *pobj = (struct obj *)0;
  1190. X    register long corpse_age;
  1191. X    boolean ininv = (*chain == invent);
  1192. X    boolean onfloor = (*chain == fobj);
  1193. X
  1194. X    for (obj = *chain; obj; obj = nobj) {
  1195. X    nobj = obj->nobj;
  1196. X
  1197. X    if (obj->otyp == CORPSE) {
  1198. X        /* corpses laying on ice deteriorate more slowly */
  1199. X        if (onfloor && obj->age < monstermoves &&
  1200. X        rn2(3) && is_ice(obj->ox, obj->oy)) obj->age++;
  1201. X        corpse_age = monstermoves - obj->age;
  1202. X
  1203. X        if (is_rider(&mons[obj->corpsenm]) && corpse_age >= 12) {
  1204. X        /* these always come back eventually */
  1205. X        /* riders can't be picked up, so no need to check onfloor */
  1206. X        revive_corpse(obj, 3, FALSE);
  1207. X        } else if (mons[obj->corpsenm].mlet == S_TROLL && !obj->oldcorpse
  1208. X               && !(mons[obj->corpsenm].geno & (G_GENOD | G_EXTINCT))
  1209. X               && (onfloor || ininv)) {
  1210. X
  1211. X        /* the corpse has 50 moves, the lower limit for tainting,
  1212. X         * to attempt re-animation.  if it is unsuccessful it is
  1213. X         * marked to prevent further attempts.  if we leave the
  1214. X         * level and return to old corpses that haven't been marked
  1215. X         * they're given a one-shot chance to re-animate.
  1216. X         */
  1217. X        if (corpse_age < TAINT_AGE)
  1218. X            revive_corpse(obj, ODDS_RV1, FALSE);
  1219. X        else if (corpse_age == TAINT_AGE)
  1220. X            revive_corpse(obj, ODDS_RV1, TRUE);
  1221. X        else revive_corpse(obj, ODDS_RV2, TRUE);
  1222. X
  1223. X        } else if (obj->corpsenm != PM_LIZARD && (250 < corpse_age)) {
  1224. X        if(ininv)
  1225. X            useup(obj);
  1226. X        else if(onfloor)
  1227. X            delobj(obj);
  1228. X        else { /* in a container */
  1229. X            if(pobj) pobj->nobj = nobj;
  1230. X            else *chain = nobj;
  1231. X            obfree(obj, (struct obj *) 0);
  1232. X            obj = 0;
  1233. X        }
  1234. X        }
  1235. X    } else if(obj->cobj && Is_container(obj) && obj->otyp != ICE_BOX)
  1236. X        remove_cadavers(&obj->cobj);
  1237. X    /* pobj is only used for containers, which don't allow revive() -dlc */
  1238. X    if (obj) pobj = obj;
  1239. X    }
  1240. X}
  1241. X
  1242. Xint
  1243. Xdonull() {
  1244. X    return(1);    /* Do nothing, but let other things happen */
  1245. X}
  1246. X
  1247. X#endif /* OVL3 */
  1248. X#ifdef OVLB
  1249. X
  1250. XSTATIC_PTR int
  1251. Xwipeoff() {
  1252. X    if(u.ucreamed < 4)    u.ucreamed = 0;
  1253. X    else            u.ucreamed -= 4;
  1254. X    if (Blinded < 4)    Blinded = 0;
  1255. X    else            Blinded -= 4;
  1256. X    if (!Blinded) {
  1257. X        pline("You've got the glop off.");
  1258. X        u.ucreamed = 0;
  1259. X        Blinded = 1;
  1260. X        make_blinded(0L,TRUE);
  1261. X        return(0);
  1262. X    } else if (!u.ucreamed) {
  1263. X        Your("%s feels clean now.", body_part(FACE));
  1264. X        return(0);
  1265. X    }
  1266. X    return(1);        /* still busy */
  1267. X}
  1268. X
  1269. Xint
  1270. Xdowipe()
  1271. X{
  1272. X    if(u.ucreamed)  {
  1273. X        static char NEARDATA buf[39];
  1274. X
  1275. X        Sprintf(buf, "wiping off your %s", body_part(FACE));
  1276. X        set_occupation(wipeoff, buf, 0);
  1277. X        /* Not totally correct; what if they change back after now
  1278. X         * but before they're finished wiping?
  1279. X         */
  1280. X        return(1);
  1281. X    }
  1282. X    Your("%s is already clean.", body_part(FACE));
  1283. X    return(1);
  1284. X}
  1285. X
  1286. X#endif /* OVLB */
  1287. X#ifdef OVL1
  1288. X
  1289. X/* split obj so that it gets size num */
  1290. X/* remainder is put in the object structure delivered by this call */
  1291. Xstruct obj *
  1292. Xsplitobj(obj, num)
  1293. Xregister struct obj *obj;
  1294. Xregister long num;
  1295. X{
  1296. Xregister struct obj *otmp;
  1297. X    /* assert(0 < num && num < obj->quan); */
  1298. X    otmp = newobj(obj->onamelth);
  1299. X    *otmp = *obj;        /* copies whole structure */
  1300. X    otmp->o_id = flags.ident++;
  1301. X    obj->quan = num;
  1302. X    obj->owt = weight(obj);
  1303. X    otmp->quan -= num;
  1304. X    otmp->owt = weight(otmp);    /* -= obj->owt ? */
  1305. X    obj->nobj = obj->nexthere = otmp;
  1306. X    if (obj->onamelth)
  1307. X        (void)strncpy(ONAME(otmp), ONAME(obj), (int)obj->onamelth);
  1308. X    if(obj->unpaid) splitbill(obj,otmp);
  1309. X    return(otmp);
  1310. X}
  1311. X
  1312. X#endif /* OVL1 */
  1313. X#ifdef OVLB
  1314. X
  1315. Xvoid
  1316. Xset_wounded_legs(side, timex)
  1317. Xregister long side;
  1318. Xregister int timex;
  1319. X{
  1320. X    if(!Wounded_legs) {
  1321. X        ATEMP(A_DEX)--;
  1322. X        flags.botl = 1;
  1323. X    }
  1324. X
  1325. X    if(!Wounded_legs || (Wounded_legs & TIMEOUT))
  1326. X        Wounded_legs |= side + timex;
  1327. X    else
  1328. X        Wounded_legs |= side;
  1329. X}
  1330. X
  1331. Xvoid
  1332. Xheal_legs()
  1333. X{
  1334. X    if(Wounded_legs) {
  1335. X        if (ATEMP(A_DEX) < 0) {
  1336. X            ATEMP(A_DEX)++;
  1337. X            flags.botl = 1;
  1338. X        }
  1339. X
  1340. X        if((Wounded_legs & BOTH_SIDES) == BOTH_SIDES) {
  1341. X            Your("%s feel somewhat better.",
  1342. X                makeplural(body_part(LEG)));
  1343. X        } else {
  1344. X            Your("%s feels somewhat better.",
  1345. X                body_part(LEG));
  1346. X        }
  1347. X        Wounded_legs = 0;
  1348. X    }
  1349. X}
  1350. X
  1351. X#endif /* OVLB */
  1352. X
  1353. X/*do.c*/
  1354. END_OF_FILE
  1355. if test 31171 -ne `wc -c <'src/do.c'`; then
  1356.     echo shar: \"'src/do.c'\" unpacked with wrong size!
  1357. fi
  1358. # end of 'src/do.c'
  1359. fi
  1360. if test -f 'src/drawing.c' -a "${1}" != "-c" ; then 
  1361.   echo shar: Will not clobber existing file \"'src/drawing.c'\"
  1362. else
  1363. echo shar: Extracting \"'src/drawing.c'\" \(19138 characters\)
  1364. sed "s/^X//" >'src/drawing.c' <<'END_OF_FILE'
  1365. X/*    SCCS Id: @(#)drawing.c    3.1    92/12/20    */
  1366. X/* Copyright (c) NetHack Development Team 1992.              */
  1367. X/* NetHack may be freely redistributed.  See license for details. */
  1368. X
  1369. X#include "hack.h"
  1370. X#include "termcap.h"
  1371. X
  1372. X/* Relevent header information in rm.h and objclass.h. */
  1373. X
  1374. X#ifdef C
  1375. X#undef C
  1376. X#endif
  1377. X
  1378. X#ifdef TEXTCOLOR
  1379. X#define C(n) n
  1380. X#else
  1381. X#define C(n)
  1382. X#endif
  1383. X
  1384. X#define g_FILLER(symbol) 0
  1385. X
  1386. Xuchar oc_syms[MAXOCLASSES] = DUMMY; /* the current object  display symbols */
  1387. Xuchar showsyms[MAXPCHARS]  = DUMMY; /* the current feature display symbols */
  1388. Xuchar monsyms[MAXMCLASSES] = DUMMY; /* the current monster display symbols */
  1389. X
  1390. X/* Default object class symbols.  See objclass.h. */
  1391. Xconst char def_oc_syms[MAXOCLASSES] = {
  1392. X/* 0*/    '\0',        /* placeholder for the "random class" */
  1393. X    ILLOBJ_SYM,
  1394. X    WEAPON_SYM,
  1395. X    ARMOR_SYM,
  1396. X    RING_SYM,
  1397. X/* 5*/    AMULET_SYM,
  1398. X    TOOL_SYM,
  1399. X    FOOD_SYM,
  1400. X    POTION_SYM,
  1401. X    SCROLL_SYM,
  1402. X/*10*/    SPBOOK_SYM,
  1403. X    WAND_SYM,
  1404. X    GOLD_SYM,
  1405. X    GEM_SYM,
  1406. X    ROCK_SYM,
  1407. X/*15*/    BALL_SYM,
  1408. X    CHAIN_SYM,
  1409. X    VENOM_SYM
  1410. X};
  1411. X
  1412. X/* Object descriptions.  Used in do_look(). */
  1413. Xconst char *objexplain[] = {    /* these match def_oc_syms, above */
  1414. X/* 0*/    0,
  1415. X    "strange object",
  1416. X    "weapon",
  1417. X    "suit or piece of armor",
  1418. X    "ring",
  1419. X/* 5*/    "amulet",
  1420. X    "useful item (pick-axe, key, lamp...)",
  1421. X    "piece of food",
  1422. X    "potion",
  1423. X    "scroll",
  1424. X/*10*/    "spell book",
  1425. X    "wand",
  1426. X    "pile of coins",
  1427. X    "gem or rock",
  1428. X    "boulder or statue",
  1429. X/*15*/    "iron ball",
  1430. X    "iron chain",
  1431. X    "splash of venom"
  1432. X};
  1433. X
  1434. X/* Object class names.  Used in object_detect(). */
  1435. Xconst char *oclass_names[] = {
  1436. X/* 0*/    0,
  1437. X    "illegal objects",
  1438. X    "weapons",
  1439. X    "armor",
  1440. X    "rings",
  1441. X/* 5*/    "amulets",
  1442. X    "tools",
  1443. X    "food",
  1444. X    "potions",
  1445. X    "scrolls",
  1446. X/*10*/    "spell books",
  1447. X    "wands",
  1448. X    "coins",
  1449. X    "rocks",
  1450. X    "large stones",
  1451. X/*15*/    "iron balls",
  1452. X    "chains",
  1453. X    "venoms"
  1454. X};
  1455. X
  1456. X/* Default monster class symbols.  See monsym.h. */
  1457. Xconst char def_monsyms[MAXMCLASSES] = {
  1458. X    '\0',        /* holder */
  1459. X    DEF_ANT,
  1460. X    DEF_BLOB,
  1461. X    DEF_COCKATRICE,
  1462. X    DEF_DOG,
  1463. X    DEF_EYE,
  1464. X    DEF_FELINE,
  1465. X    DEF_GREMLIN,
  1466. X    DEF_HUMANOID,
  1467. X    DEF_IMP,
  1468. X    DEF_JELLY,        /* 10 */
  1469. X    DEF_KOBOLD,
  1470. X    DEF_LEPRECHAUN,
  1471. X    DEF_MIMIC,
  1472. X    DEF_NYMPH,
  1473. X    DEF_ORC,
  1474. X    DEF_PIERCER,
  1475. X    DEF_QUADRUPED,
  1476. X    DEF_RODENT,
  1477. X    DEF_SPIDER,
  1478. X    DEF_TRAPPER,        /* 20 */
  1479. X    DEF_UNICORN,
  1480. X    DEF_VORTEX,
  1481. X    DEF_WORM,
  1482. X    DEF_XAN,
  1483. X    DEF_LIGHT,
  1484. X    DEF_ZRUTY,
  1485. X    DEF_ANGEL,
  1486. X    DEF_BAT,
  1487. X    DEF_CENTAUR,
  1488. X    DEF_DRAGON,        /* 30 */
  1489. X    DEF_ELEMENTAL,
  1490. X    DEF_FUNGUS,
  1491. X    DEF_GNOME,
  1492. X    DEF_GIANT,
  1493. X    DEF_STALKER,
  1494. X    DEF_JABBERWOCK,
  1495. X    DEF_KOP,
  1496. X    DEF_LICH,
  1497. X    DEF_MUMMY,
  1498. X    DEF_NAGA,        /* 40 */
  1499. X    DEF_OGRE,
  1500. X    DEF_PUDDING,
  1501. X    DEF_QUANTMECH,
  1502. X    DEF_RUSTMONST,
  1503. X    DEF_SNAKE,
  1504. X    DEF_TROLL,
  1505. X    DEF_UMBER,
  1506. X    DEF_VAMPIRE,
  1507. X    DEF_WRAITH,
  1508. X    DEF_XORN,        /* 50 */
  1509. X    DEF_YETI,
  1510. X    DEF_ZOMBIE,
  1511. X    DEF_HUMAN,
  1512. X    DEF_GHOST,
  1513. X    DEF_GOLEM,
  1514. X    DEF_DEMON,
  1515. X    DEF_EEL,
  1516. X    DEF_LIZARD,
  1517. X    DEF_WORM_TAIL,
  1518. X    DEF_MIMIC_DEF,        /* 60 */
  1519. X};
  1520. X
  1521. Xconst char *monexplain[MAXMCLASSES] = {
  1522. X    0,
  1523. X    "ant or other insect",    "blob",            "cockatrice",
  1524. X    "dog or other canine",    "eye or sphere",    "feline",
  1525. X    "gremlin",            "humanoid",        "imp or minor demon",
  1526. X    "jelly",            "kobold",        "leprechaun",
  1527. X    "mimic",            "nymph",        "orc",
  1528. X    "piercer",            "quadruped",        "rodent",
  1529. X    "spider",            "trapper or lurker above", "unicorn",
  1530. X    "vortex",        "worm", "xan or other mythical/fantastic insect",
  1531. X    "light",            "zruty",
  1532. X
  1533. X    "angelic being",        "bat",            "centaur",
  1534. X    "dragon",            "elemental",        "fungus or mold",
  1535. X    "gnome",            "giant humanoid",    "invisible stalker",
  1536. X    "jabberwock",        "Keystone Kop",        "lich",
  1537. X    "mummy",            "naga",            "ogre",
  1538. X    "pudding or ooze",        "quantum mechanic",    "rust monster",
  1539. X    "snake",            "troll",        "umber hulk",
  1540. X    "vampire",            "wraith",        "xorn",
  1541. X    "yeti, ape or other large beast", "zombie",
  1542. X
  1543. X    "human",            "ghost",        "golem",
  1544. X    "demon",            "sea monster",        "lizard",
  1545. X    "long worm tail",        "mimic"
  1546. X};
  1547. X
  1548. X/*
  1549. X *  Default screen symbols with explanations and colors.
  1550. X *  Note:  {ibm|dec|mac}_graphics[] arrays also depend on this symbol order.
  1551. X */
  1552. Xconst struct symdef defsyms[MAXPCHARS] = {
  1553. X/* 0*/    {' ', "dark part of a room",C(NO_COLOR)},    /* stone */
  1554. X    {'|', "wall",        C(GRAY)},    /* vwall */
  1555. X    {'-', "wall",        C(GRAY)},    /* hwall */
  1556. X    {'-', "wall",        C(GRAY)},    /* tlcorn */
  1557. X    {'-', "wall",        C(GRAY)},    /* trcorn */
  1558. X    {'-', "wall",        C(GRAY)},    /* blcorn */
  1559. X    {'-', "wall",        C(GRAY)},    /* brcorn */
  1560. X    {'-', "wall",        C(GRAY)},    /* crwall */
  1561. X    {'-', "wall",        C(GRAY)},    /* tuwall */
  1562. X    {'-', "wall",        C(GRAY)},    /* tdwall */
  1563. X/*10*/    {'|', "wall",        C(GRAY)},    /* tlwall */
  1564. X    {'|', "wall",        C(GRAY)},    /* trwall */
  1565. X    {'.', "doorway",    C(GRAY)},    /* ndoor */
  1566. X    {'-', "open door",    C(BROWN)},    /* vodoor */
  1567. X    {'|', "open door",    C(BROWN)},    /* hodoor */
  1568. X    {'+', "closed door",    C(BROWN)},    /* vcdoor */
  1569. X    {'+', "closed door",    C(BROWN)},    /* hcdoor */
  1570. X    {'.', "floor of a room",C(GRAY)},    /* room */
  1571. X    {'#', "corridor",    C(GRAY)},    /* dark corr */
  1572. X    {'#', "lit corridor",    C(GRAY)},    /* lit corr */
  1573. X/*20*/    {'<', "staircase up",    C(GRAY)},    /* upstair */
  1574. X    {'>', "staircase down",    C(GRAY)},    /* dnstair */
  1575. X    {'<', "ladder up",    C(BROWN)},    /* upladder */
  1576. X    {'>', "ladder down",    C(BROWN)},    /* dnladder */
  1577. X    {'^', "trap",        C(RED)},    /* trap */
  1578. X    {'"', "web",        C(GRAY)},    /* web */
  1579. X    {'_', "altar",        C(GRAY)},    /* altar */
  1580. X    {'\\', "opulent throne",C(HI_GOLD)},    /* throne */
  1581. X#ifdef SINKS
  1582. X    {'#', "sink",        C(GRAY)},    /* sink */
  1583. X#else
  1584. X    {'#', "",        C(GRAY)},    /* sink */
  1585. X#endif
  1586. X    {'{', "fountain",    C(BLUE)},    /* fountain */
  1587. X/*30*/    {'}', "water filled area",C(BLUE)},    /* pool */
  1588. X    {'.', "ice",        C(CYAN)},    /* ice */
  1589. X    {'}', "molten lava",    C(RED)},    /* lava */
  1590. X    {'.', "lowered drawbridge",C(BROWN)},    /* vodbridge */
  1591. X    {'.', "lowered drawbridge",C(BROWN)},    /* hodbridge */
  1592. X    {'#', "raised drawbridge",C(BROWN)},    /* vcdbridge */
  1593. X    {'#', "raised drawbridge",C(BROWN)},    /* hcdbridge */
  1594. X    {' ', "air filled area",C(CYAN)},    /* open air */
  1595. X    {'#', "cloud filled area",C(GRAY)},    /* part of a cloud */
  1596. X    {'}', "water filled area",C(BLUE)},    /* under water */
  1597. X/*40*/    {'|', "wall",        C(GRAY)},    /* vbeam */
  1598. X    {'-', "wall",        C(GRAY)},    /* hbeam */
  1599. X    {'\\',"wall",        C(GRAY)},    /* lslant */
  1600. X    {'/', "wall",        C(GRAY)},    /* rslant */
  1601. X    {'*', "",        C(WHITE)},    /* dig beam */
  1602. X    {'!', "",        C(WHITE)},    /* camera flash beam */
  1603. X    {')', "",        C(HI_METAL)},    /* boomerang open left */
  1604. X    {'(', "",        C(HI_METAL)},    /* boomerang open right */
  1605. X    {'0', "",        C(HI_ZAP)},    /* 4 magic shield symbols */
  1606. X    {'#', "",        C(HI_ZAP)},
  1607. X/*50*/    {'@', "",        C(HI_ZAP)},
  1608. X    {'*', "",        C(HI_ZAP)},
  1609. X    {'/', "",        C(GREEN)},    /* swallow top left    */
  1610. X    {'-', "",        C(GREEN)},    /* swallow top center    */
  1611. X    {'\\', "",        C(GREEN)},    /* swallow top right    */
  1612. X    {'|', "",        C(GREEN)},    /* swallow middle left    */
  1613. X    {'|', "",        C(GREEN)},    /* swallow middle right    */
  1614. X    {'\\', "",        C(GREEN)},    /* swallow bottom left    */
  1615. X    {'-', "",        C(GREEN)},    /* swallow bottom center*/
  1616. X    {'/', "",        C(GREEN)},    /* swallow bottom right    */
  1617. X/*60*/    {'/', "",        C(ORANGE_COLORED)},/* explosion top left     */
  1618. X    {'-', "",        C(ORANGE_COLORED)},/* explosion top center   */
  1619. X    {'\\', "",        C(ORANGE_COLORED)},/* explosion top right    */
  1620. X    {'|', "",        C(ORANGE_COLORED)},/* explosion middle left  */
  1621. X    {' ', "",        C(ORANGE_COLORED)},/* explosion middle center*/
  1622. X    {'|', "",        C(ORANGE_COLORED)},/* explosion middle right */
  1623. X    {'\\', "",        C(ORANGE_COLORED)},/* explosion bottom left  */
  1624. X    {'-', "",        C(ORANGE_COLORED)},/* explosion bottom center*/
  1625. X    {'/', "",        C(ORANGE_COLORED)},/* explosion bottom right */
  1626. X/*
  1627. X *  Note: Additions to this array should be reflected in the
  1628. X *      {ibm,dec,mac}_graphics[] arrays below.
  1629. X */
  1630. X};
  1631. X
  1632. X#undef C
  1633. X
  1634. X#ifdef ASCIIGRAPH
  1635. Xstatic uchar ibm_graphics[MAXPCHARS] = {
  1636. X/* 0*/    g_FILLER(S_stone),
  1637. X    0xb3,    /* S_vwall:    meta-3, vertical rule */
  1638. X    0xc4,    /* S_hwall:    meta-D, horizontal rule */
  1639. X    0xda,    /* S_tlcorn:    meta-Z, top left corner */
  1640. X    0xbf,    /* S_trcorn:    meta-?, top right corner */
  1641. X    0xc0,    /* S_blcorn:    meta-@, bottom left */
  1642. X    0xd9,    /* S_brcorn:    meta-Y, bottom right */
  1643. X    0xc5,    /* S_crwall:    meta-E, cross */
  1644. X    0xc1,    /* S_tuwall:    meta-A, T up */
  1645. X    0xc2,    /* S_tdwall:    meta-B, T down */
  1646. X/*10*/    0xb4,    /* S_tlwall:    meta-4, T left */
  1647. X    0xc3,    /* S_trwall:    meta-C, T right */
  1648. X    0xfa,    /* S_ndoor:    meta-z, centered dot */
  1649. X    0xfe,    /* S_vodoor:    meta-~, small centered square */
  1650. X    0xfe,    /* S_hodoor:    meta-~, small centered square */
  1651. X    g_FILLER(S_vcdoor),
  1652. X    g_FILLER(S_hcdoor),
  1653. X    0xfa,    /* S_room:    meta-z, centered dot */
  1654. X    0xb0,    /* S_corr:    meta-0, light shading */
  1655. X    0xb1,    /* S_litcorr:    meta-1, medium shading */
  1656. X/*20*/    g_FILLER(S_upstair),
  1657. X    g_FILLER(S_dnstair),
  1658. X    g_FILLER(S_upladder),
  1659. X    g_FILLER(S_dnladder),
  1660. X    g_FILLER(S_trap),
  1661. X    g_FILLER(S_web),
  1662. X    g_FILLER(S_altar),
  1663. X    g_FILLER(S_throne),
  1664. X    g_FILLER(S_sink),
  1665. X    0xf4,   /* S_fountain:  meta-t, integral top half */
  1666. X/*30*/    0xf7,    /* S_pool:    meta-w, approx. equals */
  1667. X    0xfa,    /* S_ice:    meta-z, centered dot */
  1668. X    0xf7,    /* S_lava:    meta-w, approx. equals */
  1669. X    0xfa,    /* S_vodbridge:    meta-z, centered dot */
  1670. X    0xfa,    /* S_hodbridge:    meta-z, centered dot */
  1671. X    g_FILLER(S_vcdbridge),
  1672. X    g_FILLER(S_hcdbridge),
  1673. X    g_FILLER(S_air),
  1674. X    g_FILLER(S_cloud),
  1675. X    0xf7,    /* S_water:    meta-w, approx. equals */
  1676. X/*40*/    0xb3,   /* S_vbeam:     meta-3, vertical rule */
  1677. X    0xc4,    /* S_hbeam:    meta-D, horizontal rule */
  1678. X    g_FILLER(S_lslant),
  1679. X    g_FILLER(S_rslant),
  1680. X    g_FILLER(S_digbeam),
  1681. X    g_FILLER(S_flashbeam),
  1682. X    g_FILLER(S_boomleft),
  1683. X    g_FILLER(S_boomright),
  1684. X    g_FILLER(S_ss1),
  1685. X    g_FILLER(S_ss2),
  1686. X/*50*/    g_FILLER(S_ss3),
  1687. X    g_FILLER(S_ss4),
  1688. X    g_FILLER(S_sw_tl),
  1689. X    g_FILLER(S_sw_tc),
  1690. X    g_FILLER(S_sw_tr),
  1691. X    0xb3,    /* S_sw_ml:    meta-3, vertical rule */
  1692. X    0xb3,    /* S_sw_mr:    meta-3, vertical rule */
  1693. X    g_FILLER(S_sw_bl),
  1694. X    g_FILLER(S_sw_bc),
  1695. X    g_FILLER(S_sw_br),
  1696. X/*60*/    g_FILLER(S_explode1),
  1697. X    g_FILLER(S_explode2),
  1698. X    g_FILLER(S_explode3),
  1699. X    0xb3,    /* S_explode4:    meta-3, vertical rule */
  1700. X    g_FILLER(S_explode5),
  1701. X    0xb3,    /* S_explode6:    meta-3, vertical rule */
  1702. X    g_FILLER(S_explode7),
  1703. X    g_FILLER(S_explode8),
  1704. X    g_FILLER(S_explode9)
  1705. X};
  1706. X#endif  /* ASCIIGRAPH */
  1707. X
  1708. X#ifdef TERMLIB
  1709. Xvoid NDECL((*decgraphics_mode_callback)) = 0;  /* set in tty_start_screen() */
  1710. X
  1711. Xstatic uchar dec_graphics[MAXPCHARS] = {
  1712. X/* 0*/    g_FILLER(S_stone),
  1713. X    0xf8,    /* S_vwall:    meta-x, vertical rule */
  1714. X    0xf1,    /* S_hwall:    meta-q, horizontal rule */
  1715. X    0xec,    /* S_tlcorn:    meta-l, top left corner */
  1716. X    0xeb,    /* S_trcorn:    meta-k, top right corner */
  1717. X    0xed,    /* S_blcorn:    meta-m, bottom left */
  1718. X    0xea,    /* S_brcorn:    meta-j, bottom right */
  1719. X    0xee,    /* S_crwall:    meta-n, cross */
  1720. X    0xf6,    /* S_tuwall:    meta-v, T up */
  1721. X    0xf7,    /* S_tdwall:    meta-w, T down */
  1722. X/*10*/    0xf5,    /* S_tlwall:    meta-u, T left */
  1723. X    0xf4,    /* S_trwall:    meta-t, T right */
  1724. X    0xfe,    /* S_ndoor:    meta-~, centered dot */
  1725. X    0xe1,    /* S_vodoor:    meta-a, solid block */
  1726. X    0xe1,    /* S_hodoor:    meta-a, solid block */
  1727. X    g_FILLER(S_vcdoor),
  1728. X    g_FILLER(S_hcdoor),
  1729. X    0xfe,    /* S_room:    meta-~, centered dot */
  1730. X    g_FILLER(S_corr),
  1731. X    g_FILLER(S_litcorr),
  1732. X/*20*/    g_FILLER(S_upstair),
  1733. X    g_FILLER(S_dnstair),
  1734. X    g_FILLER(S_upladder),
  1735. X    g_FILLER(S_dnladder),
  1736. X    g_FILLER(S_trap),
  1737. X    g_FILLER(S_web),    /* 0xbd, /* \E)3: meta-=, int'l currency */
  1738. X    g_FILLER(S_altar),    /* 0xc3, /* \E)3: meta-C, dagger */
  1739. X    g_FILLER(S_throne),
  1740. X    g_FILLER(S_sink),
  1741. X    g_FILLER(S_fountain),   /* 0xdb, /* \E)3: meta-[, integral top half */
  1742. X/*30*/    0xe0,    /* S_pool:    meta-\, diamond */
  1743. X    0xfe,    /* S_ice:    meta-~, centered dot */
  1744. X    0xe0,    /* S_lava:    meta-\, diamond */
  1745. X    0xfe,    /* S_vodbridge:    meta-~, centered dot */
  1746. X    0xfe,    /* S_hodbridge:    meta-~, centered dot */
  1747. X    g_FILLER(S_vcdbridge),
  1748. X    g_FILLER(S_hcdbridge),
  1749. X    g_FILLER(S_air),
  1750. X    g_FILLER(S_cloud),
  1751. X    0xe0,    /* S_water:    meta-\, diamond */
  1752. X/*40*/    0xf8,   /* S_vbeam:     meta-x, vertical rule */
  1753. X    0xf1,    /* S_hbeam:    meta-q, horizontal rule */
  1754. X    g_FILLER(S_lslant),
  1755. X    g_FILLER(S_rslant),
  1756. X    g_FILLER(S_digbeam),
  1757. X    g_FILLER(S_flashbeam),
  1758. X    g_FILLER(S_boomleft),
  1759. X    g_FILLER(S_boomright),
  1760. X    g_FILLER(S_ss1),
  1761. X    g_FILLER(S_ss2),
  1762. X/*50*/    g_FILLER(S_ss3),
  1763. X    g_FILLER(S_ss4),
  1764. X    g_FILLER(S_sw_tl),
  1765. X    0xef,    /* S_sw_tc:    meta-o, high horizontal line */
  1766. X    g_FILLER(S_sw_tr),
  1767. X    0xf8,    /* S_sw_ml:    meta-x, vertical rule */
  1768. X    0xf8,    /* S_sw_mr:    meta-x, vertical rule */
  1769. X    g_FILLER(S_sw_bl),
  1770. X    0xf3,    /* S_sw_bc:    meta-s, low horizontal line */
  1771. X    g_FILLER(S_sw_br),
  1772. X/*60*/    g_FILLER(S_explode1),
  1773. X    0xef,    /* S_explode2:    meta-o, high horizontal line */
  1774. X    g_FILLER(S_explode3),
  1775. X    0xf8,    /* S_explode4:    meta-x, vertical rule */
  1776. X    g_FILLER(S_explode5),
  1777. X    0xf8,    /* S_explode6:    meta-x, vertical rule */
  1778. X    g_FILLER(S_explode7),
  1779. X    0xf3,    /* S_explode8:    meta-s, low horizontal line */
  1780. X    g_FILLER(S_explode9)
  1781. X};
  1782. X#endif  /* TERMLIB */
  1783. X
  1784. X#ifdef MAC_GRAPHICS_ENV
  1785. Xstatic uchar mac_graphics[MAXPCHARS] = {
  1786. X/* 0*/    g_FILLER(S_stone),
  1787. X    0xba,    /* S_vwall */
  1788. X    0xcd,    /* S_hwall */
  1789. X    0xc9,    /* S_tlcorn */
  1790. X    0xbb,    /* S_trcorn */
  1791. X    0xc8,    /* S_blcorn */
  1792. X    0xbc,    /* S_brcorn */
  1793. X    0xce,    /* S_crwall */
  1794. X    0xca,    /* S_tuwall */
  1795. X    0xcb,    /* S_tdwall */
  1796. X/*10*/    0xb9,    /* S_tlwall */
  1797. X    0xcc,    /* S_trwall */
  1798. X    0xb0,    /* S_ndoor */
  1799. X    0xee,    /* S_vodoor */
  1800. X    0xee,    /* S_hodoor */
  1801. X    0xef,    /* S_vcdoor */
  1802. X    0xef,    /* S_hcdoor */
  1803. X    g_FILLER(S_Room),
  1804. X    0xB0,    /* S_corr */
  1805. X    g_FILLER(S_litcorr),
  1806. X/*20*/    g_FILLER(S_upstair),
  1807. X    g_FILLER(S_dnstair),
  1808. X    g_FILLER(S_upladder),
  1809. X    g_FILLER(S_dnladder),
  1810. X    g_FILLER(S_trap),
  1811. X    g_FILLER(S_web),
  1812. X    g_FILLER(S_altar),
  1813. X    g_FILLER(S_throne),
  1814. X    g_FILLER(S_sink),
  1815. X    g_FILLER(S_fountain),
  1816. X/*30*/    0xe0,
  1817. X    g_FILLER(S_ice),
  1818. X    g_FILLER(S_lava),
  1819. X    g_FILLER(S_vodbridge),
  1820. X    g_FILLER(S_hodbridge),
  1821. X    g_FILLER(S_vcdbridge),
  1822. X    g_FILLER(S_hcdbridge),
  1823. X    g_FILLER(S_air),
  1824. X    g_FILLER(S_cloud),
  1825. X    g_FILLER(S_water),
  1826. X/*40*/    g_FILLER(S_vbeam),
  1827. X    g_FILLER(S_hbeam),
  1828. X    g_FILLER(S_lslant),
  1829. X    g_FILLER(S_rslant),
  1830. X    g_FILLER(S_digbeam),
  1831. X    g_FILLER(S_flashbeam),
  1832. X    g_FILLER(S_boomleft),
  1833. X    g_FILLER(S_boomright),
  1834. X    g_FILLER(S_ss1),
  1835. X    g_FILLER(S_ss2),
  1836. X/*50*/    g_FILLER(S_ss3),
  1837. X    g_FILLER(S_ss4),
  1838. X    g_FILLER(S_sw_tl),
  1839. X    g_FILLER(S_sw_tc),
  1840. X    g_FILLER(S_sw_tr),
  1841. X    g_FILLER(S_sw_ml),
  1842. X    g_FILLER(S_sw_mr),
  1843. X    g_FILLER(S_sw_bl),
  1844. X    g_FILLER(S_sw_bc),
  1845. X    g_FILLER(S_sw_br),
  1846. X/*60*/    g_FILLER(S_explode1),
  1847. X    g_FILLER(S_explode2),
  1848. X    g_FILLER(S_explode3),
  1849. X    g_FILLER(S_explode4),
  1850. X    g_FILLER(S_explode5),
  1851. X    g_FILLER(S_explode6),
  1852. X    g_FILLER(S_explode7),
  1853. X    g_FILLER(S_explode8),
  1854. X    g_FILLER(S_explode9)
  1855. X};
  1856. X#endif  /* MAC_GRAPHICS_ENV */
  1857. X
  1858. X/*
  1859. X * Convert the given character to an object class.  If the character is not
  1860. X * recognized, then MAXOCLASSES is returned.  Used in invent.c, options.c,
  1861. X * pickup.c, sp_lev.c, and lev_main.c.
  1862. X */
  1863. Xint
  1864. Xdef_char_to_objclass(ch)
  1865. X    char ch;
  1866. X{
  1867. X    int i;
  1868. X    for (i = 1; i < MAXOCLASSES; i++)
  1869. X    if (ch == def_oc_syms[i]) break;
  1870. X    return i;
  1871. X}
  1872. X
  1873. X/*
  1874. X * Convert a character into a monster class.  This returns the _first_
  1875. X * match made.  If there are are no matches, return MAXMCLASSES.
  1876. X */
  1877. Xint
  1878. Xdef_char_to_monclass(ch)
  1879. X    char ch;
  1880. X{
  1881. X    int i;
  1882. X    for (i = 1; i < MAXMCLASSES; i++)
  1883. X    if (def_monsyms[i] == ch) break;
  1884. X    return i;
  1885. X}
  1886. X
  1887. Xvoid
  1888. Xassign_graphics(graph_chars, glth)
  1889. Xregister uchar *graph_chars;
  1890. Xregister int glth;
  1891. X{
  1892. X    register int i;
  1893. X
  1894. X    for (i = 0; i < MAXPCHARS; i++)
  1895. X    showsyms[i] = (((i < glth) && graph_chars[i]) ?
  1896. X               graph_chars[i] : defsyms[i].sym);
  1897. X}
  1898. X
  1899. Xvoid
  1900. Xswitch_graphics(gr_set_flag)
  1901. Xint gr_set_flag;
  1902. X{
  1903. X    switch (gr_set_flag) {
  1904. X    default:
  1905. X    case ASCII_GRAPHICS:
  1906. X        assign_graphics((uchar *)0, 0);
  1907. X        break;
  1908. X#ifdef ASCIIGRAPH
  1909. X    case IBM_GRAPHICS:
  1910. X/*
  1911. X * Use the nice IBM Extended ASCII line-drawing characters (codepage 437).
  1912. X *
  1913. X * OS/2 defaults to a multilingual character set (codepage 850, corresponding
  1914. X * to the ISO 8859 character set.  We should probably do a VioSetCp() call to
  1915. X * set the codepage to 437.
  1916. X */
  1917. X        flags.IBMgraphics = TRUE;
  1918. X        flags.DECgraphics = FALSE;
  1919. X        assign_graphics(ibm_graphics, SIZE(ibm_graphics));
  1920. X        break;
  1921. X#endif /* ASCIIGRAPH */
  1922. X#ifdef TERMLIB
  1923. X    case DEC_GRAPHICS:
  1924. X/*
  1925. X * Use the VT100 line drawing character set.
  1926. X */
  1927. X        flags.DECgraphics = TRUE;
  1928. X        flags.IBMgraphics = FALSE;
  1929. X        assign_graphics(dec_graphics, SIZE(dec_graphics));
  1930. X        if (decgraphics_mode_callback) (*decgraphics_mode_callback)();
  1931. X        break;
  1932. X#endif /* TERMLIB */
  1933. X#ifdef MAC_GRAPHICS_ENV
  1934. X    case MAC_GRAPHICS:
  1935. X        assign_graphics(mac_graphics, SIZE(mac_graphics));
  1936. X        break;
  1937. X#endif
  1938. X    }
  1939. X    return;
  1940. X}
  1941. X
  1942. X
  1943. X#ifdef REINCARNATION
  1944. X
  1945. X/*
  1946. X * saved display symbols for objects & features.
  1947. X */
  1948. Xstatic uchar save_oc_syms[MAXOCLASSES] = DUMMY;
  1949. Xstatic uchar save_showsyms[MAXPCHARS]  = DUMMY;
  1950. Xstatic uchar save_monsyms[MAXPCHARS]   = DUMMY;
  1951. X
  1952. Xstatic const uchar r_oc_syms[MAXOCLASSES] = {
  1953. X/* 0*/    '\0',
  1954. X    ILLOBJ_SYM,
  1955. X    WEAPON_SYM,
  1956. X    ']',            /* armor */
  1957. X    RING_SYM,
  1958. X/* 5*/    ',',            /* amulet */
  1959. X    TOOL_SYM,
  1960. X    ':',            /* food */
  1961. X    POTION_SYM,
  1962. X    SCROLL_SYM,
  1963. X/*10*/    SPBOOK_SYM,
  1964. X    WAND_SYM,
  1965. X    GEM_SYM,        /* gold -- yes it's the same as gems */
  1966. X    GEM_SYM,
  1967. X    ROCK_SYM,
  1968. X/*15*/    BALL_SYM,
  1969. X    CHAIN_SYM,
  1970. X    VENOM_SYM
  1971. X};
  1972. X
  1973. X# ifdef ASCIIGRAPH
  1974. Xstatic const uchar IBM_r_oc_syms[MAXOCLASSES] = {    /* a la EPYX Rogue */
  1975. X/* 0*/    '\0',
  1976. X    ILLOBJ_SYM,
  1977. X    0x18,            /* weapon: up arrow */
  1978. X/*    0x0a, */ ARMOR_SYM,    /* armor:  Vert rect with o */
  1979. X/*    0x09, */ RING_SYM,    /* ring:   circle with arrow */
  1980. X/* 5*/    0x0c,            /* amulet: "female" symbol */
  1981. X    TOOL_SYM,
  1982. X    0x05,            /* food:   club (as in cards) */
  1983. X    0xad,            /* potion: upside down '!' */
  1984. X    0x0e,            /* scroll: musical note */
  1985. X/*10*/    SPBOOK_SYM,
  1986. X    0xe7,            /* wand:   greek tau */
  1987. X    0x0f,            /* gold:   yes it's the same as gems */
  1988. X    0x0f,            /* gems:   fancy '*' */
  1989. X    ROCK_SYM,
  1990. X/*15*/    BALL_SYM,
  1991. X    CHAIN_SYM,
  1992. X    VENOM_SYM
  1993. X};
  1994. X# endif /* ASCIIGRAPH */
  1995. X
  1996. Xvoid
  1997. Xassign_rogue_graphics(is_rlevel)
  1998. Xboolean is_rlevel;
  1999. X{
  2000. X    /* Adjust graphics display characters on Rogue levels */
  2001. X
  2002. X    if (is_rlevel) {
  2003. X    register int i;
  2004. X
  2005. X    (void) memcpy((genericptr_t)save_showsyms,
  2006. X              (genericptr_t)showsyms, sizeof showsyms);
  2007. X    (void) memcpy((genericptr_t)save_oc_syms,
  2008. X              (genericptr_t)oc_syms, sizeof oc_syms);
  2009. X    (void) memcpy((genericptr_t)save_monsyms,
  2010. X              (genericptr_t)monsyms, sizeof monsyms);
  2011. X
  2012. X    /* Use a loop: char != uchar on some machines. */
  2013. X    for (i = 0; i < MAXMCLASSES; i++)
  2014. X        monsyms[i] = def_monsyms[i];
  2015. X    for (i = 0; i < MAXPCHARS; i++)
  2016. X        showsyms[i] = defsyms[i].sym;
  2017. X
  2018. X/*
  2019. X * Some day if these rogue showsyms get much more extensive than this,
  2020. X * we may want to create r_showsyms, and IBM_r_showsyms arrays to hold
  2021. X * all of this info and to simply initialize it via a for() loop like r_oc_syms.
  2022. X */
  2023. X
  2024. X# ifdef ASCIIGRAPH
  2025. X    if (!flags.IBMgraphics) {
  2026. X# endif
  2027. X        showsyms[S_vodoor]  = showsyms[S_hodoor]  = showsyms[S_ndoor] = '+';
  2028. X        showsyms[S_upstair] = showsyms[S_dnstair] = '%';
  2029. X# ifdef ASCIIGRAPH
  2030. X    } else {
  2031. X        /* a la EPYX Rogue */
  2032. X        showsyms[S_vwall]   = 0xba; /* all walls now use    */
  2033. X        showsyms[S_hwall]   = 0xcd; /* double line graphics    */
  2034. X        showsyms[S_tlcorn]  = 0xc9;
  2035. X        showsyms[S_trcorn]  = 0xbb;
  2036. X        showsyms[S_blcorn]  = 0xc8;
  2037. X        showsyms[S_brcorn]  = 0xbc;
  2038. X        showsyms[S_crwall]  = 0xce;
  2039. X        showsyms[S_tuwall]  = 0xca;
  2040. X        showsyms[S_tdwall]  = 0xcb;
  2041. X        showsyms[S_trwall]  = 0xcc;
  2042. X        showsyms[S_tlwall]  = 0xb9;
  2043. X        showsyms[S_corr]    = 0xb1;
  2044. X        showsyms[S_litcorr] = 0xb2;
  2045. X        showsyms[S_upstair] = 0xf0; /* Greek Xi */
  2046. X        showsyms[S_dnstair] = 0xf0;
  2047. X        showsyms[S_trap]    = 0x04; /* diamond (cards) */
  2048. X        showsyms[S_vodoor]  = 0xce;
  2049. X        showsyms[S_hodoor]  = 0xce;
  2050. X        showsyms[S_ndoor]   = 0xce;
  2051. X    }
  2052. X#endif /* ASCIIGRAPH */
  2053. X
  2054. X    for (i = 0; i < MAXOCLASSES; i++) {
  2055. X#ifdef ASCIIGRAPH
  2056. X        if (flags.IBMgraphics)
  2057. X        oc_syms[i] = IBM_r_oc_syms[i];
  2058. X        else
  2059. X#endif /* ASCIIGRAPH */
  2060. X        oc_syms[i] = r_oc_syms[i];
  2061. X    }
  2062. X
  2063. X    } else {
  2064. X    (void) memcpy((genericptr_t)showsyms,
  2065. X              (genericptr_t)save_showsyms, sizeof showsyms);
  2066. X    (void) memcpy((genericptr_t)oc_syms,
  2067. X              (genericptr_t)save_oc_syms, sizeof oc_syms);
  2068. X    (void) memcpy((genericptr_t)monsyms,
  2069. X              (genericptr_t)save_monsyms, sizeof monsyms);
  2070. X    }
  2071. X}
  2072. X#endif /* REINCARNATION */
  2073. X
  2074. X/*drawing.c*/
  2075. END_OF_FILE
  2076. if test 19138 -ne `wc -c <'src/drawing.c'`; then
  2077.     echo shar: \"'src/drawing.c'\" unpacked with wrong size!
  2078. fi
  2079. # end of 'src/drawing.c'
  2080. fi
  2081. echo shar: End of archive 65 \(of 108\).
  2082. cp /dev/null ark65isdone
  2083. MISSING=""
  2084. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  2085. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  2086. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  2087. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  2088. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  2089. 101 102 103 104 105 106 107 108 ; do
  2090.     if test ! -f ark${I}isdone ; then
  2091.     MISSING="${MISSING} ${I}"
  2092.     fi
  2093. done
  2094. if test "${MISSING}" = "" ; then
  2095.     echo You have unpacked all 108 archives.
  2096.     echo "Now execute 'rebuild.sh'"
  2097.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  2098. else
  2099.     echo You still need to unpack the following archives:
  2100.     echo "        " ${MISSING}
  2101. fi
  2102. ##  End of shell archive.
  2103. exit 0
  2104.