home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / part69 < 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: v16i077:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part69/108
  5. Message-ID: <4380@master.CNA.TEK.COM>
  6. Date: 1 Feb 93 19:51:51 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1869
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1627
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 77
  14. Archive-name: nethack31/Part69
  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 69 (of 108)."
  27. # Contents:  src/monmove.c sys/msdos/MakeMSC.src
  28. # Wrapped by billr@saab on Wed Jan 27 16:09:14 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'src/monmove.c' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'src/monmove.c'\"
  32. else
  33. echo shar: Extracting \"'src/monmove.c'\" \(30715 characters\)
  34. sed "s/^X//" >'src/monmove.c' <<'END_OF_FILE'
  35. X/*    SCCS Id: @(#)monmove.c    3.1    92/12/06    */
  36. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  37. X/* NetHack may be freely redistributed.  See license for details. */
  38. X
  39. X#include "hack.h"
  40. X#include "mfndpos.h"
  41. X#include "artifact.h"
  42. X
  43. X#ifdef OVL0
  44. X
  45. Xstatic int FDECL(disturb,(struct monst *));
  46. Xstatic void FDECL(distfleeck,(struct monst *,int *,int *,int *));
  47. X
  48. X#endif /* OVL0 */
  49. X#ifdef OVL1
  50. X
  51. XSTATIC_OVL boolean FDECL(mdig_tunnel,(struct monst *));
  52. X
  53. X#endif /* OVL1 */
  54. X#ifdef OVLB
  55. X
  56. Xboolean /* TRUE : mtmp died */
  57. Xmb_trapped(mtmp)
  58. Xregister struct monst *mtmp;
  59. X{
  60. X    if (flags.verbose) {
  61. X        if (cansee(mtmp->mx, mtmp->my))
  62. X           pline("KABOOM!!  You see a door explode.");
  63. X        else if (flags.soundok)
  64. X               You("hear a distant explosion.");
  65. X    }
  66. X    mtmp->mstun = 1;
  67. X    mtmp->mhp -= rnd(15);
  68. X    if(mtmp->mhp <= 0) {
  69. X        mondied(mtmp);
  70. X        return(TRUE);
  71. X    }
  72. X    return(FALSE);
  73. X}
  74. X
  75. X#endif /* OVLB */
  76. X#ifdef OVL1
  77. X
  78. X/* Return TRUE if monster died, FALSE otherwise. */
  79. XSTATIC_OVL boolean
  80. Xmdig_tunnel(mtmp)
  81. Xregister struct monst *mtmp;
  82. X{
  83. X    register struct rm *here;
  84. X    register int pile;
  85. X
  86. X    here = &levl[mtmp->mx][mtmp->my];
  87. X    if (here->typ == SDOOR) here->typ = DOOR;
  88. X
  89. X    /* Eats away door if present & closed or locked */
  90. X    if(closed_door(mtmp->mx, mtmp->my)) {
  91. X        if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE))
  92. X        add_damage(mtmp->mx, mtmp->my, 0L);
  93. X        unblock_point(mtmp->mx,mtmp->my);    /* vision */
  94. X        if(here->doormask & D_TRAPPED) {
  95. X        here->doormask = D_NODOOR;
  96. X        if(mb_trapped(mtmp)) {    /* mtmp is killed */
  97. X            newsym(mtmp->mx,mtmp->my);
  98. X            return TRUE;
  99. X        }
  100. X        } else {
  101. X        if(!rn2(3) && flags.verbose)    /* not too often.. */
  102. X            You("feel an unexpected draft of air.");
  103. X        here->doormask = D_BROKEN;
  104. X        }
  105. X        newsym(mtmp->mx,mtmp->my);
  106. X        return FALSE;
  107. X    } else
  108. X    if (!IS_ROCK(here->typ)) /* no dig */
  109. X        return(FALSE);
  110. X
  111. X    /* Only rock and walls fall through to this point. */
  112. X    if ((here->diggable & W_NONDIGGABLE)) {
  113. X        impossible("mdig_tunnel:  %s at (%d,%d) is undiggable",
  114. X               (IS_WALL(here->typ) ? "wall" : "stone"),
  115. X               (int) mtmp->mx, (int) mtmp->my);
  116. X        return FALSE;    /* still alive */
  117. X    }
  118. X
  119. X    if(IS_WALL(here->typ)) {
  120. X        if(flags.soundok && flags.verbose && !rn2(5))
  121. X        You("hear the sound of crashing rock.");
  122. X        if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE))
  123. X            add_damage(mtmp->mx, mtmp->my, 0L);
  124. X        if (level.flags.is_maze_lev) {
  125. X        here->typ = ROOM;
  126. X        } else if (level.flags.is_cavernous_lev) {
  127. X        here->typ = CORR;
  128. X        } else {
  129. X        here->typ = DOOR;
  130. X        here->doormask = D_NODOOR;
  131. X        }
  132. X    } else    
  133. X        here->typ = CORR;
  134. X
  135. X    pile = rnd(12);
  136. X    if(pile < 5)    /* leave behind some rocks? */
  137. X        (void) mksobj_at((pile == 1)? BOULDER : ROCK, 
  138. X                 mtmp->mx, mtmp->my, TRUE);
  139. X    newsym(mtmp->mx,mtmp->my);
  140. X    if(sobj_at(BOULDER, mtmp->mx, mtmp->my) == (struct obj *)0)
  141. X        unblock_point(mtmp->mx,mtmp->my);    /* vision */
  142. X    return FALSE ;
  143. X}
  144. X
  145. Xint
  146. Xdochugw(mtmp)
  147. X    register struct monst *mtmp;
  148. X{
  149. X    register int x = mtmp->mx;
  150. X    register int y = mtmp->my;
  151. X    register int rd = dochug(mtmp);
  152. X    register int dd;
  153. X
  154. X    if(Warning && !rd && !mtmp->mpeaceful &&
  155. X            (dd = distu(mtmp->mx,mtmp->my)) < distu(x,y) &&
  156. X            dd < 100 && !canseemon(mtmp)) {
  157. X        /* Note: this assumes we only want to warn against the monster to
  158. X         * which the weapon does extra damage, as there is no "monster
  159. X         * which the weapon warns against" field.
  160. X         */
  161. X        if(spec_ability(uwep,SPFX_WARN) && spec_dbon(uwep,mtmp->data,1))
  162. X        warnlevel = 100;
  163. X        else if ((int) (mtmp->m_lev / 4) > warnlevel)
  164. X        warnlevel = (mtmp->m_lev / 4);
  165. X    }
  166. X    /* check whether hero notices monster and stops current activity */
  167. X    if (occupation && !rd && !Confusion &&
  168. X        (!mtmp->mpeaceful || Hallucination) &&
  169. X        canseemon(mtmp) && !cansee(x,y) &&
  170. X        distu(mtmp->mx,mtmp->my) <= (BOLT_LIM+1)*(BOLT_LIM+1))
  171. X        stop_occupation();
  172. X
  173. X    return(rd);
  174. X}
  175. X
  176. X#endif /* OVL1 */
  177. X#ifdef OVL2
  178. X
  179. Xboolean
  180. Xonscary(x, y, mtmp)
  181. Xint x, y;
  182. Xstruct monst *mtmp;
  183. X{
  184. X    if (mtmp->isshk || mtmp->isgd || mtmp->iswiz || !mtmp->mcansee ||
  185. X            is_lminion(mtmp->data) || is_rider(mtmp->data) ||
  186. X            mtmp->data->mlet == S_HUMAN || mtmp->mpeaceful ||
  187. X            mtmp->data == &mons[PM_MINOTAUR])
  188. X        return(FALSE);
  189. X    return(
  190. X#ifdef ELBERETH
  191. X           sengr_at("Elbereth", x, y) ||
  192. X#endif
  193. X            sobj_at(SCR_SCARE_MONSTER, x, y) != (struct obj *)0);
  194. X}
  195. X
  196. X#endif /* OVL2 */
  197. X#ifdef OVL0
  198. X
  199. X/*
  200. X * Possibly awaken the given monster.  Return a 1 if the monster has been
  201. X * jolted awake.
  202. X */
  203. Xstatic int
  204. Xdisturb(mtmp)
  205. X    register struct monst *mtmp;
  206. X{
  207. X    /*
  208. X     * + Ettins are hard to surprise.
  209. X     * + Nymphs, jabberwocks, and leprechauns do not easily wake up.
  210. X     *
  211. X     * Wake up if:
  212. X     *    in direct LOS                        AND
  213. X     *    within 10 squares                    AND
  214. X     *    not stealthy or (mon is an ettin and 9/10)        AND
  215. X     *    (mon is not a nymph, jabberwock, or leprechaun) or 1/50    AND
  216. X     *    Aggravate or mon is (dog or human) or
  217. X     *        (1/7 and mon is not mimicing furniture or object)
  218. X     */
  219. X    if(couldsee(mtmp->mx,mtmp->my) &&
  220. X        distu(mtmp->mx,mtmp->my) <= 100 &&
  221. X        (!Stealth || (mtmp->data == &mons[PM_ETTIN] && rn2(10))) &&
  222. X        (!(mtmp->data->mlet == S_NYMPH
  223. X            || mtmp->data == &mons[PM_JABBERWOCK]
  224. X            || mtmp->data->mlet == S_LEPRECHAUN) || !rn2(50)) &&
  225. X        (Aggravate_monster
  226. X            || (mtmp->data->mlet == S_DOG ||
  227. X                mtmp->data->mlet == S_HUMAN)
  228. X            || (!rn2(7) && mtmp->m_ap_type != M_AP_FURNITURE &&
  229. X                mtmp->m_ap_type != M_AP_OBJECT) )) {
  230. X
  231. X        mtmp->msleep = 0;
  232. X        return(1);
  233. X    }
  234. X    return(0);
  235. X}
  236. X
  237. Xstatic void
  238. Xdistfleeck(mtmp,inrange,nearby,scared)
  239. Xregister struct monst *mtmp;
  240. Xint *inrange, *nearby, *scared;
  241. X{
  242. X    int seescaryx, seescaryy;
  243. X
  244. X    *inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <=
  245. X                            (BOLT_LIM * BOLT_LIM));
  246. X    *nearby = *inrange && monnear(mtmp, mtmp->mux, mtmp->muy);
  247. X
  248. X    /* Note: if your image is displaced, the monster sees the Elbereth
  249. X     * at your displaced position, thus never attacking your displaced
  250. X     * position, but possibly attacking you by accident.  If you are
  251. X     * invisible, it sees the Elbereth at your real position, thus never
  252. X     * running into you by accident but possibly attacking the spot
  253. X     * where it guesses you are.
  254. X     */
  255. X    if (Invis && !perceives(mtmp->data)) {
  256. X        seescaryx = mtmp->mux;
  257. X        seescaryy = mtmp->muy;
  258. X    } else {
  259. X        seescaryx = u.ux;
  260. X        seescaryy = u.uy;
  261. X    }
  262. X    *scared = (*nearby && (onscary(seescaryx, seescaryy, mtmp) ||
  263. X                   (!mtmp->mpeaceful &&
  264. X                    in_your_sanctuary(mtmp->mx, mtmp->my))));
  265. X
  266. X    if(*scared && !mtmp->mflee) {
  267. X#ifdef POLYSELF
  268. X        if (!sticks(uasmon))
  269. X#endif
  270. X            unstuck(mtmp);    /* monster lets go when fleeing */
  271. X        mtmp->mflee = 1;
  272. X#ifdef STUPID
  273. X        if (rn2(7))
  274. X            mtmp->mfleetim = rnd(10);
  275. X        else
  276. X            mtmp->mfleetim = rnd(100);
  277. X#else
  278. X        mtmp->mfleetim = rnd(rn2(7) ? 10 : 100);
  279. X#endif
  280. X    }
  281. X
  282. X}
  283. X
  284. X/* returns 1 if monster died moving, 0 otherwise */
  285. X/* The whole dochugw/m_move/distfleeck/mfndpos section is serious spaghetti
  286. X * code. --KAA
  287. X */
  288. Xint
  289. Xdochug(mtmp)
  290. Xregister struct monst *mtmp;
  291. X{
  292. X    register struct permonst *mdat = mtmp->data;
  293. X    register int tmp=0;
  294. X    int inrange, nearby, scared;
  295. X
  296. X/*    Pre-movement adjustments    */
  297. X
  298. X    if(mtmp->cham && !rn2(6))    /* polymorph chameleons */
  299. X        (void) newcham(mtmp, (struct permonst *)0);
  300. X
  301. X    /* regenerate monsters */
  302. X    if (mtmp->mhp < mtmp->mhpmax && (!(moves%20) || regenerates(mdat)))
  303. X        mtmp->mhp++;
  304. X    if(mtmp->mspec_used) mtmp->mspec_used--;
  305. X
  306. X    /* polymorph lycanthropes */
  307. X    were_change(mtmp);
  308. X
  309. X    /* check for waitmask status change */
  310. X    if((mtmp->data->mflags3 & M3_WAITFORU) &&
  311. X       (m_canseeu(mtmp) || mtmp->mhp < mtmp->mhpmax))
  312. X        mtmp->data->mflags3 &= ~M3_WAITFORU;
  313. X
  314. X#ifdef MULDGN
  315. X    /* update quest status flags */
  316. X    quest_stat_check(mtmp);
  317. X#endif
  318. X
  319. X    if(!mtmp->mcanmove || (mtmp->data->mflags3 & M3_WAITMASK)) {
  320. X        if (Hallucination) newsym(mtmp->mx,mtmp->my);
  321. X#ifdef MULDGN
  322. X        if(mtmp->mcanmove && (mtmp->data->mflags3 & M3_CLOSE) &&
  323. X           !mtmp->msleep && monnear(mtmp, u.ux, u.uy))
  324. X        quest_talk(mtmp);    /* give the leaders a chance to speak */
  325. X#endif
  326. X        return(0);    /* other frozen monsters can't do anything */
  327. X    }
  328. X
  329. X    /* there is a chance we will wake it */
  330. X    if(mtmp->msleep && !disturb(mtmp)) {
  331. X        if (Hallucination) newsym(mtmp->mx,mtmp->my);
  332. X        return(0);
  333. X    }
  334. X
  335. X    /* not frozen or sleeping: wipe out texts written in the dust */
  336. X    wipe_engr_at(mtmp->mx, mtmp->my, 1);
  337. X
  338. X    /* confused monsters get unconfused with small probability */
  339. X    if(mtmp->mconf && !rn2(50)) mtmp->mconf = 0;
  340. X
  341. X    /* stunned monsters get un-stunned with larger probability */
  342. X    if(mtmp->mstun && !rn2(10)) mtmp->mstun = 0;
  343. X
  344. X    /* some monsters teleport */
  345. X    if(mtmp->mflee && !rn2(40) && can_teleport(mdat) && !mtmp->iswiz) {
  346. X        rloc(mtmp);
  347. X        return(0);
  348. X    }
  349. X    if(mdat->msound == MS_SHRIEK && !um_dist(mtmp->mx, mtmp->my, 1))
  350. X        m_respond(mtmp);
  351. X    if(mdat->mmove < rnd(6)) return(0);
  352. X
  353. X    /* fleeing monsters might regain courage */
  354. X    if(mtmp->mflee && !mtmp->mfleetim
  355. X       && mtmp->mhp == mtmp->mhpmax && !rn2(25)) mtmp->mflee = 0;
  356. X
  357. X    set_apparxy(mtmp);
  358. X    /* Must be done after you move and before the monster does.  The
  359. X     * set_apparxy() call in m_move() doesn't suffice since the variables
  360. X     * inrange, etc. all depend on stuff set by set_apparxy().
  361. X     */
  362. X
  363. X    /* Monsters that want to acquire things */
  364. X    /* may teleport, so do it before inrange is set */
  365. X    if(is_covetous(mtmp->data)) (void) tactics(mtmp);
  366. X
  367. X    /* check distance and scariness of attacks */
  368. X    distfleeck(mtmp,&inrange,&nearby,&scared);
  369. X
  370. X#ifdef MUSE
  371. X    if(find_defensive(mtmp)) {
  372. X        if (use_defensive(mtmp) != 0)
  373. X            return 1;
  374. X    } else if(find_misc(mtmp)) {
  375. X        if (use_misc(mtmp) != 0)
  376. X            return 1;
  377. X    }
  378. X#endif
  379. X
  380. X    /* Demonic Blackmail! */
  381. X    if(nearby && mdat->msound == MS_BRIBE &&
  382. X       mtmp->mpeaceful && !mtmp->mtame) {
  383. X        if (mtmp->mux != u.ux || mtmp->muy != u.uy) {
  384. X            pline("%s whispers something to thin air.",
  385. X                cansee(mtmp->mux, mtmp->muy) ? Monnam(mtmp) : "It");
  386. X#ifdef POLYSELF
  387. X            if (is_demon(uasmon)) rloc(mtmp);
  388. X              /* "Good hunting, brother" */
  389. X            else {
  390. X#endif
  391. X                mtmp->minvis = 0;
  392. X                /* Why?  For the same reason in real demon talk */
  393. X                pline("%s gets angry.", Amonnam(mtmp));
  394. X                mtmp->mpeaceful = 0;
  395. X                /* since no way is an image going to pay it off */
  396. X#ifdef POLYSELF
  397. X            }
  398. X#endif
  399. X        } else if(demon_talk(mtmp)) return(1);    /* you paid it off */
  400. X    }
  401. X
  402. X    if (mdat == &mons[PM_MIND_FLAYER] && !rn2(20)) {
  403. X        struct monst *m2, *nmon = (struct monst *)0;
  404. X
  405. X        if (canseemon(mtmp))
  406. X            pline("%s concentrates.", Monnam(mtmp));
  407. X        if (distu(mtmp->mx, mtmp->my) > BOLT_LIM * BOLT_LIM) {
  408. X            You("sense a faint wave of psychic energy.");
  409. X            goto toofar;
  410. X        }
  411. X        You("sense a wave of psychic energy pouring over you!");
  412. X        if (mtmp->mpeaceful &&
  413. X            (!Conflict || resist(mtmp, RING_CLASS, 0, 0)))
  414. X            pline("It seems quite soothing.");
  415. X        else {
  416. X            register boolean m_sen = sensemon(mtmp);
  417. X
  418. X            if (m_sen || (Telepat && rn2(2)) || !rn2(10)) {
  419. X                int dmg;
  420. X                pline("It locks in on your %s!",
  421. X                    m_sen ? "telepathy" :
  422. X                    Telepat ? "latent telepathy" : "mind");
  423. X                dmg = rnd(15);
  424. X                if (Half_spell_damage) dmg = (dmg+1) / 2;
  425. X                losehp(dmg, "psychic blast", KILLED_BY_AN);
  426. X            }
  427. X        }
  428. X        for(m2=fmon; m2; m2 = nmon) {
  429. X            nmon = m2->nmon;
  430. X            if (m2->mpeaceful != mtmp->mpeaceful) continue;
  431. X            if (mindless(m2->data)) continue;
  432. X            if (m2 == mtmp) continue;
  433. X            if ((telepathic(m2->data) &&
  434. X                (rn2(2) || m2->mblinded)) || !rn2(10)) {
  435. X                if (cansee(m2->mx, m2->my))
  436. X                    pline("It locks in on %s.", mon_nam(m2));
  437. X                m2->mhp -= rnd(15);
  438. X                if (m2->mhp <= 0)
  439. X                    monkilled(m2, "", AD_DRIN);
  440. X            }
  441. X        }
  442. X    }
  443. Xtoofar:
  444. X#ifdef MUSE
  445. X    /* If monster is nearby you, and has to wield a weapon, do so.   This
  446. X     * costs the monster a move, of course.
  447. X     */
  448. X    if((!mtmp->mpeaceful || Conflict) && inrange &&
  449. X       dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= 8
  450. X       && attacktype(mdat, AT_WEAP)) {
  451. X        if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) {
  452. X        mtmp->weapon_check = NEED_HTH_WEAPON;
  453. X        if (mon_wield_item(mtmp) != 0) return(0);
  454. X        }
  455. X    }
  456. X#endif
  457. X/*    Now the actual movement phase    */
  458. X
  459. X    if(!nearby || mtmp->mflee || scared ||
  460. X       mtmp->mconf || mtmp->mstun || (mtmp->minvis && !rn2(3)) ||
  461. X       (mdat->mlet == S_LEPRECHAUN && !u.ugold && (mtmp->mgold || rn2(2))) ||
  462. X       (is_wanderer(mdat) && !rn2(4)) || (Conflict && !mtmp->iswiz) ||
  463. X       (!mtmp->mcansee && !rn2(4)) || mtmp->mpeaceful) {
  464. X
  465. X        tmp = m_move(mtmp, 0);
  466. X        distfleeck(mtmp,&inrange,&nearby,&scared);    /* recalc */
  467. X
  468. X        switch (tmp) {
  469. X
  470. X            case 0:    /* no movement, but it can still attack you */
  471. X            case 3:    /* absolutely no movement */
  472. X                /* for pets, case 0 and 3 are equivalent */
  473. X             /* During hallucination, monster appearance should
  474. X              * still change - even if it doesn't move.
  475. X               */
  476. X             if(Hallucination) newsym(mtmp->mx,mtmp->my);
  477. X             break;
  478. X             case 1:    /* monster moved */
  479. X            /* Maybe it stepped on a trap and fell asleep... */
  480. X            if(mtmp->msleep || !mtmp->mcanmove) return(0);
  481. X             if(!nearby && ranged_attk(mdat)) break;
  482. X             else if(mdat->mmove <= 12) {
  483. X                /* a monster that's digesting you can move at the
  484. X                 * same time -dlc
  485. X                 */
  486. X                if(u.uswallow && mtmp == u.ustuck)
  487. X                return(mattacku(mtmp));
  488. X                return(0);
  489. X            }
  490. X             break;
  491. X             case 2:    /* monster died */
  492. X             return(1);
  493. X         }
  494. X    }
  495. X
  496. X/*    Now, attack the player if possible - one attack set per monst    */
  497. X
  498. X    if (!mtmp->mpeaceful ||
  499. X        (Conflict && !resist(mtmp, RING_CLASS, 0, 0))) {
  500. X        if(inrange && !noattacks(mdat) && u.uhp > 0 && !scared && tmp != 3)
  501. X        if(mattacku(mtmp)) return(1); /* monster died (e.g. exploded) */
  502. X
  503. X        if(mtmp->wormno) wormhitu(mtmp);
  504. X    }
  505. X#ifdef MULDGN
  506. X    /* special speeches for quest monsters */
  507. X    if(!mtmp->msleep && mtmp->mcanmove && nearby)
  508. X        quest_talk(mtmp);
  509. X    else
  510. X#endif
  511. X        /* extra emotional attack for vile monsters */
  512. X        if(inrange && mtmp->data->msound == MS_CUSS && !mtmp->mpeaceful &&
  513. X           couldsee(mtmp->mx, mtmp->my) && !mtmp->minvis && !rn2(5))
  514. X        cuss(mtmp);
  515. X
  516. X    /* extra movement for fast monsters */
  517. X    if(mdat->mmove-12 > rnd(12)) tmp = m_move(mtmp, 1);
  518. X    return(tmp == 2);
  519. X}
  520. X
  521. Xstatic const char NEARDATA practical[] = { WEAPON_CLASS, ARMOR_CLASS, GEM_CLASS, FOOD_CLASS, 0 };
  522. Xstatic const char NEARDATA magical[] = {
  523. X    AMULET_CLASS, POTION_CLASS, SCROLL_CLASS, WAND_CLASS, RING_CLASS,
  524. X    SPBOOK_CLASS, 0 };
  525. Xstatic const char NEARDATA indigestion[] = { BALL_CLASS, ROCK_CLASS, 0 };
  526. X
  527. X#ifdef POLYSELF
  528. Xboolean
  529. Xitsstuck(mtmp)
  530. Xregister struct monst *mtmp;
  531. X{
  532. X    if (sticks(uasmon) && mtmp==u.ustuck && !u.uswallow) {
  533. X        pline("%s cannot escape from you!", Monnam(mtmp));
  534. X        return(TRUE);
  535. X    }
  536. X    return(FALSE);
  537. X}
  538. X#endif
  539. X
  540. Xint
  541. Xm_move(mtmp, after)
  542. Xregister struct monst *mtmp;
  543. Xregister int after;
  544. X{
  545. X    register int appr;
  546. X    xchar gx,gy,nix,niy,chcnt;
  547. X    int chi;    /* could be schar except for stupid Sun-2 compiler */
  548. X    boolean likegold=0, likegems=0, likeobjs=0, likemagic=0, conceals=0;
  549. X    boolean likerock=0, can_tunnel=0;
  550. X    boolean can_open=0, can_unlock=0, doorbuster=0;
  551. X#ifdef MUSE
  552. X    boolean uses_items=0;
  553. X#endif
  554. X    struct permonst *ptr;
  555. X    schar mmoved = 0;    /* not strictly nec.: chi >= 0 will do */
  556. X    long info[9];
  557. X    long flag;
  558. X    int  omx = mtmp->mx, omy = mtmp->my;
  559. X#ifdef MUSE
  560. X    struct obj *mw_tmp;
  561. X#endif
  562. X
  563. X    if(mtmp->mtrapped) {
  564. X        int i = mintrap(mtmp);
  565. X        if(i >= 2) { newsym(mtmp->mx,mtmp->my); return(2); }/* it died */
  566. X        if(i == 1) return(0);    /* still in trap, so didn't move */
  567. X    }
  568. X    ptr = mtmp->data; /* mintrap() can change mtmp->data -dlc */
  569. X    if(hides_under(ptr) && OBJ_AT(mtmp->mx, mtmp->my) && rn2(10))
  570. X        return(0);        /* do not leave hiding place */
  571. X    if(mtmp->meating) {
  572. X        mtmp->meating--;
  573. X        return(3);            /* still eating */
  574. X    }
  575. X
  576. X    set_apparxy(mtmp);
  577. X    /* where does mtmp think you are? */
  578. X    /* Not necessary if m_move called from this file, but necessary in
  579. X     * other calls of m_move (ex. leprechauns dodging)
  580. X     */
  581. X    can_tunnel = tunnels(ptr) &&
  582. X#ifdef REINCARNATION
  583. X        !Is_rogue_level(&u.uz) &&
  584. X#endif
  585. X#ifdef MUSE
  586. X        (!needspick(ptr) ||
  587. X         (m_carrying(mtmp, PICK_AXE) &&
  588. X          (mtmp->weapon_check != NO_WEAPON_WANTED ||
  589. X           !(mw_tmp = MON_WEP(mtmp)) || mw_tmp->otyp == PICK_AXE)));
  590. X#else
  591. X        (!needspick(ptr) || m_carrying(mtmp, PICK_AXE));
  592. X#endif
  593. X    can_open = !(nohands(ptr) || verysmall(ptr));
  594. X    can_unlock = ((can_open && m_carrying(mtmp, SKELETON_KEY)) || mtmp->iswiz);
  595. X    doorbuster = is_giant(ptr);
  596. X    if(mtmp->wormno) goto not_special;
  597. X    /* my dog gets special treatment */
  598. X    if(mtmp->mtame) {
  599. X        mmoved = dog_move(mtmp, after);
  600. X        goto postmov;
  601. X    }
  602. X
  603. X    /* likewise for shopkeeper */
  604. X    if(mtmp->isshk) {
  605. X        mmoved = shk_move(mtmp);
  606. X        if(mmoved == -2) return(2);
  607. X        if(mmoved >= 0) goto postmov;
  608. X        mmoved = 0;        /* follow player outside shop */
  609. X    }
  610. X
  611. X    /* and for the guard */
  612. X    if(mtmp->isgd) {
  613. X        mmoved = gd_move(mtmp);
  614. X        if(mmoved == -2) return(2);
  615. X        if(mmoved >= 0) goto postmov;
  616. X        mmoved = 0;
  617. X    }
  618. X
  619. X    /* and the acquisitive monsters get special treatment */
  620. X    if(is_covetous(ptr)) {
  621. X        xchar tx = (xchar)((mtmp->mstrategy >> 16) & 0xff),
  622. X          ty = (xchar)((mtmp->mstrategy >> 8) & 0xff);
  623. X        struct monst *intruder = m_at(tx, ty);
  624. X        /*
  625. X         * if there's a monster on the object or in possesion of it,
  626. X         * attack it.
  627. X         */
  628. X        if((dist2(mtmp->mx, mtmp->my, tx, ty) < 2) &&
  629. X           intruder && (intruder != mtmp)) {
  630. X
  631. X        if(mattackm(mtmp, intruder) == 2) return(2);
  632. X        mmoved = 1;
  633. X        } else mmoved = 0;
  634. X        goto postmov;
  635. X    }
  636. X
  637. X    /* and for the priest */
  638. X    if(mtmp->ispriest) {
  639. X        mmoved = pri_move(mtmp);
  640. X        if(mmoved == -2) return(2);
  641. X        if(mmoved >= 0) goto postmov;
  642. X        mmoved = 0;
  643. X    }
  644. X
  645. X#ifdef MAIL
  646. X    if(ptr == &mons[PM_MAIL_DAEMON]) {
  647. X        if(flags.soundok && canseemon(mtmp))
  648. X        verbalize("I'm late!");
  649. X        mongone(mtmp);
  650. X        return(2);        
  651. X    }
  652. X#endif
  653. X
  654. X    /* teleport if that lies in our nature */
  655. X    if(ptr == &mons[PM_TENGU] && !rn2(5) && !mtmp->mcan) {
  656. X        if(mtmp->mhp < 7 || mtmp->mpeaceful || rn2(2))
  657. X        rloc(mtmp);
  658. X        else
  659. X        mnexto(mtmp);
  660. X        mmoved = 1;
  661. X        goto postmov;
  662. X    }
  663. Xnot_special:
  664. X    if(u.uswallow && !mtmp->mflee && u.ustuck != mtmp) return(1);
  665. X    appr = 1;
  666. X    omx = mtmp->mx;
  667. X    omy = mtmp->my;
  668. X    gx = mtmp->mux;
  669. X    gy = mtmp->muy;
  670. X    if(mtmp->mflee) appr = -1;
  671. X    if (mtmp->mconf || (u.uswallow && mtmp == u.ustuck))
  672. X        appr = 0;
  673. X    else {
  674. X        boolean should_see = (couldsee(omx, omy) &&     
  675. X                          (levl[gx][gy].lit || 
  676. X                       !levl[omx][omy].lit) &&
  677. X                      (dist2(omx, omy, gx, gy) <= 36));
  678. X
  679. X        if (!mtmp->mcansee || 
  680. X                (should_see && Invis && !perceives(ptr)) || 
  681. X#ifdef POLYSELF
  682. X                (u.usym == S_MIMIC_DEF) || u.uundetected ||
  683. X#endif
  684. X                (mtmp->mpeaceful && !mtmp->isshk) ||  /* allow shks to follow */
  685. X                ((ptr->mlet == S_STALKER || ptr->mlet == S_BAT ||
  686. X              ptr->mlet == S_LIGHT) && !rn2(3)))
  687. X            appr = 0;  
  688. X    
  689. X            if(monsndx(ptr) == PM_LEPRECHAUN && (appr == 1) && 
  690. X               (mtmp->mgold > u.ugold))
  691. X            appr = -1;
  692. X
  693. X        if (!should_see && can_track(ptr)) {
  694. X            register coord *cp;
  695. X
  696. X            cp = gettrack(omx,omy);
  697. X            if (cp) {
  698. X                    gx = cp->x;
  699. X                    gy = cp->y;
  700. X            }
  701. X        }
  702. X    }
  703. X
  704. X#ifdef REINCARNATION
  705. X    if (!Is_rogue_level(&u.uz))
  706. X#endif
  707. X    {
  708. X        register int pctload = (curr_mon_load(mtmp) * 100) /
  709. X            max_mon_load(mtmp);
  710. X
  711. X        /* look for gold or jewels nearby */
  712. X        likegold = (likes_gold(ptr) && pctload < 95);
  713. X        likegems = (likes_gems(ptr) && pctload < 85);
  714. X#ifdef MUSE
  715. X        uses_items = (!mindless(ptr) && !is_animal(ptr)
  716. X            && pctload < 75);
  717. X#endif
  718. X        likeobjs = (likes_objs(ptr) && pctload < 75);
  719. X        likemagic = (likes_magic(ptr) && pctload < 85);
  720. X        likerock = (throws_rocks(ptr) && pctload < 50);
  721. X        conceals = hides_under(ptr);
  722. X    }
  723. X
  724. X#define SQSRCHRADIUS    5
  725. X
  726. X      { register int minr = SQSRCHRADIUS;    /* not too far away */
  727. X    register struct obj *otmp;
  728. X    register int xx, yy;
  729. X    int oomx, oomy, lmx, lmy;
  730. X
  731. X    /* cut down the search radius if it thinks character is closer. */
  732. X    if(distmin(mtmp->mux, mtmp->muy, omx, omy) < SQSRCHRADIUS &&
  733. X        !mtmp->mpeaceful) minr--;
  734. X    /* guards shouldn't get too distracted */
  735. X    if(!mtmp->mpeaceful && is_mercenary(ptr)) minr = 1;
  736. X
  737. X    if((likegold || likegems || likeobjs || likemagic || likerock || conceals)
  738. X          && (!*in_rooms(omx, omy, SHOPBASE) || (!rn2(25) && !mtmp->isshk))) {
  739. X    look_for_obj:
  740. X        oomx = min(COLNO-1, omx+minr);
  741. X        oomy = min(ROWNO-1, omy+minr);
  742. X        lmx = max(1, omx-minr);
  743. X        lmy = max(0, omy-minr);
  744. X        for(otmp = fobj; otmp; otmp = otmp->nobj) {
  745. X        xx = otmp->ox;
  746. X        yy = otmp->oy;
  747. X        if(xx >= lmx && xx <= oomx && yy >= lmy && yy <= oomy) {
  748. X            if(((likegold && otmp->otyp == GOLD_PIECE) ||
  749. X               (likeobjs && index(practical, otmp->oclass)) ||
  750. X               (likemagic && index(magical, otmp->oclass)) ||
  751. X#ifdef MUSE
  752. X               (uses_items && searches_for_item(mtmp, otmp)) ||
  753. X#endif
  754. X               (likerock && otmp->otyp == BOULDER) ||
  755. X               (likegems && otmp->oclass == GEM_CLASS &&
  756. X            objects[otmp->otyp].oc_material != MINERAL) ||
  757. X               (conceals && !cansee(otmp->ox,otmp->oy)) ||
  758. X               (ptr == &mons[PM_GELATINOUS_CUBE] &&
  759. X            !index(indigestion, otmp->oclass) &&
  760. X            !(otmp->otyp == CORPSE &&
  761. X              otmp->corpsenm == PM_COCKATRICE))
  762. X              ) && touch_artifact(otmp,mtmp)) {
  763. X            if(can_carry(mtmp,otmp) &&
  764. X               (throws_rocks(ptr) ||
  765. X                !sobj_at(BOULDER,xx,yy)) &&
  766. X               (ptr->mlet != S_UNICORN ||
  767. X                objects[otmp->otyp].oc_material == GEMSTONE)) {
  768. X                minr = distmin(omx,omy,xx,yy);
  769. X                oomx = min(COLNO-1, omx+minr);
  770. X                oomy = min(ROWNO-1, omy+minr);
  771. X                lmx = max(1, omx-minr);
  772. X                lmy = max(0, omy-minr);
  773. X                gx = otmp->ox;
  774. X                gy = otmp->oy;
  775. X            }
  776. X            }
  777. X        }
  778. X        }
  779. X    } else if(likegold) {
  780. X        /* don't try to pick up anything else, but use the same loop */
  781. X#ifdef MUSE
  782. X        uses_items =
  783. X#endif
  784. X        likegems = likeobjs = likemagic = likerock = conceals = 0;
  785. X        goto look_for_obj;
  786. X    }
  787. X
  788. X    if(minr < SQSRCHRADIUS && appr == -1) {
  789. X        if(distmin(omx,omy,mtmp->mux,mtmp->muy) <= 3) {
  790. X        gx = mtmp->mux;
  791. X        gy = mtmp->muy;
  792. X        } else
  793. X        appr = 1;
  794. X    }
  795. X      }
  796. X    nix = omx;
  797. X    niy = omy;
  798. X    flag = ALLOW_TRAPS;
  799. X    if (mtmp->mpeaceful && (!Conflict || resist(mtmp, RING_CLASS, 0, 0)))
  800. X        flag |= (ALLOW_SANCT | ALLOW_SSM);
  801. X    else flag |= ALLOW_U;
  802. X    if (ptr->mlet == S_UNICORN) flag |= NOTONL;
  803. X    if (passes_walls(ptr)) flag |= (ALLOW_WALL | ALLOW_ROCK);
  804. X    if (can_tunnel) flag |= ALLOW_DIG;
  805. X    if (is_human(ptr) || ptr == &mons[PM_MINOTAUR]) flag |= ALLOW_SSM;
  806. X    if (is_undead(ptr)) flag |= NOGARLIC;
  807. X    if (throws_rocks(ptr)) flag |= ALLOW_ROCK;
  808. X    if (can_open) flag |= OPENDOOR;
  809. X    if (can_unlock) flag |= UNLOCKDOOR;
  810. X    if (doorbuster) flag |= BUSTDOOR;
  811. X    {
  812. X        register int i, j, nx, ny, nearer;
  813. X        int jcnt, cnt;
  814. X        int ndist, nidist;
  815. X        register coord *mtrk;
  816. X        coord poss[9];
  817. X
  818. X        cnt = mfndpos(mtmp, poss, info, flag);
  819. X        chcnt = 0;
  820. X        jcnt = min(MTSZ, cnt-1);
  821. X        chi = -1;
  822. X        nidist = dist2(nix,niy,gx,gy);
  823. X        /* allow monsters be shortsighted on some levels for balance */
  824. X        if(!mtmp->mpeaceful && level.flags.shortsighted &&
  825. X           nidist > (couldsee(nix,niy) ? 144 : 36) && appr == 1) appr = 0;
  826. X
  827. X        for(i=0; i < cnt; i++) {
  828. X        nx = poss[i].x;
  829. X        ny = poss[i].y;
  830. X
  831. X        if (appr != 0) {
  832. X            mtrk = &mtmp->mtrack[0];
  833. X            for(j=0; j < jcnt; mtrk++, j++)
  834. X            if(nx == mtrk->x && ny == mtrk->y)
  835. X                if(rn2(4*(cnt-j)))
  836. X                goto nxti;
  837. X        }
  838. X
  839. X        nearer = ((ndist = dist2(nx,ny,gx,gy)) < nidist);
  840. X
  841. X        if((appr == 1 && nearer) || (appr == -1 && !nearer) ||
  842. X           (!appr && !rn2(++chcnt)) || !mmoved) {
  843. X            nix = nx;
  844. X            niy = ny;
  845. X            nidist = ndist;
  846. X            chi = i;
  847. X            mmoved = 1;
  848. X        }
  849. X        nxti:    ;
  850. X        }
  851. X    }
  852. X
  853. X    if(mmoved) {
  854. X        register int j;
  855. X#ifdef POLYSELF
  856. X        if (mmoved==1 && (u.ux != nix || u.uy != niy) && itsstuck(mtmp))
  857. X        return(3);
  858. X#endif
  859. X#ifdef MUSE
  860. X        if (mmoved==1 && can_tunnel && needspick(ptr) &&
  861. X        (!(mw_tmp = MON_WEP(mtmp)) || mw_tmp->otyp != PICK_AXE)) {
  862. X        mtmp->weapon_check = NEED_PICK_AXE;
  863. X        (void)mon_wield_item(mtmp);
  864. X        }
  865. X#endif
  866. X        /* If ALLOW_U is set, either it's trying to attack you, or it
  867. X         * thinks it is.  In either case, attack this spot in preference to
  868. X         * all others.
  869. X         */
  870. X        if(info[chi] & ALLOW_U) {
  871. X        nix = mtmp->mux;
  872. X        niy = mtmp->muy;
  873. X        }
  874. X        if (nix == u.ux && niy == u.uy) {
  875. X        mtmp->mux = u.ux;
  876. X        mtmp->muy = u.uy;
  877. X        return(0);
  878. X        }
  879. X        /* The monster may attack another based on 1 of 2 conditions:
  880. X         * 1 - It may be confused.
  881. X         * 2 - It may mistake the monster for your (displaced) image.
  882. X         * Pets get taken care of above and shouldn't reach this code.
  883. X         * Conflict gets handled even farther away (movemon()).
  884. X         */
  885. X        if((info[chi] & ALLOW_M) ||
  886. X           (nix == mtmp->mux && niy == mtmp->muy)) {
  887. X        struct monst *mtmp2;
  888. X        int stat;
  889. X        mtmp2 = m_at(nix,niy);
  890. X
  891. X        stat = mattackm(mtmp, mtmp2);
  892. X
  893. X        if (stat & MM_AGR_DIED)        /* aggressor died */
  894. X            return 2;
  895. X
  896. X        if ((stat & MM_HIT) && !(stat & MM_DEF_DIED)  &&
  897. X            rn2(4) && mtmp2->mlstmv != monstermoves) {
  898. X            stat = mattackm(mtmp2, mtmp);    /* return attack */
  899. X            if (stat & MM_DEF_DIED)
  900. X            return 2;
  901. X        }
  902. X        return 3;
  903. X        }
  904. X
  905. X        remove_monster(omx, omy);
  906. X        place_monster(mtmp, nix, niy);
  907. X        for(j = MTSZ-1; j > 0; j--)
  908. X        mtmp->mtrack[j] = mtmp->mtrack[j-1];
  909. X        mtmp->mtrack[0].x = omx;
  910. X        mtmp->mtrack[0].y = omy;
  911. X        /* Place a segment at the old position. */
  912. X        if (mtmp->wormno) worm_move(mtmp);
  913. X    } else {
  914. X        if(ptr->mlet == S_UNICORN && rn2(2)) {
  915. X        rloc(mtmp);
  916. X        return(1);
  917. X        }
  918. X        if(mtmp->wormno) worm_nomove(mtmp);
  919. X    }
  920. Xpostmov:
  921. X    if(mmoved == 1) {
  922. X        boolean canseeit = cansee(mtmp->mx, mtmp->my);
  923. X        boolean abstain = (mtmp->mpeaceful && !mtmp->mtame);
  924. X
  925. X        newsym(omx,omy);        /* update the old position */
  926. X        if (mintrap(mtmp) >= 2) {
  927. X        if(mtmp->mx) newsym(mtmp->mx,mtmp->my);
  928. X        return(2);    /* it died */
  929. X        }
  930. X        ptr = mtmp->data;
  931. X
  932. X        /* open a door, or crash through it, if you can */
  933. X        if(IS_DOOR(levl[mtmp->mx][mtmp->my].typ)
  934. X            && !passes_walls(ptr) /* doesn't need to open doors */
  935. X            && !can_tunnel /* taken care of below */
  936. X          ) {
  937. X        struct rm *here = &levl[mtmp->mx][mtmp->my];
  938. X        boolean btrapped = (here->doormask & D_TRAPPED);
  939. X
  940. X        if(here->doormask & (D_LOCKED|D_CLOSED) && amorphous(ptr)) {
  941. X            if (flags.verbose && canseeit)
  942. X            pline("%s %ss under the door.", Monnam(mtmp),
  943. X                  (ptr == &mons[PM_FOG_CLOUD] ||
  944. X                   ptr == &mons[PM_YELLOW_LIGHT])
  945. X                  ? "flow" : "ooze");
  946. X        } else if(here->doormask & D_LOCKED && can_unlock) {
  947. X            if(btrapped) {
  948. X            here->doormask = D_NODOOR;
  949. X            newsym(mtmp->mx, mtmp->my);
  950. X            unblock_point(mtmp->mx,mtmp->my); /* vision */
  951. X            if(mb_trapped(mtmp)) return(2);
  952. X            } else {
  953. X            if (flags.verbose) {
  954. X                if (canseeit)
  955. X                  You("see a door being unlocked and opened.");
  956. X                else if (flags.soundok)
  957. X                   You("hear a door being unlocked and opened.");
  958. X                }
  959. X                here->doormask = D_ISOPEN;
  960. X            /* newsym(mtmp->mx, mtmp->my); */
  961. X            unblock_point(mtmp->mx,mtmp->my); /* vision */
  962. X            }
  963. X        } else if (here->doormask == D_CLOSED && can_open) {
  964. X            if(btrapped) {
  965. X            here->doormask = D_NODOOR;
  966. X            newsym(mtmp->mx, mtmp->my);
  967. X            unblock_point(mtmp->mx,mtmp->my); /* vision */
  968. X            if(mb_trapped(mtmp)) return(2);
  969. X            } else {
  970. X                if (flags.verbose) {
  971. X                if (canseeit)
  972. X                     You("see a door being opened.");
  973. X                else if (flags.soundok)
  974. X                     You("hear the sound of a door opening.");
  975. X                }
  976. X                here->doormask = D_ISOPEN;
  977. X            /* newsym(mtmp->mx, mtmp->my); */  /* done below */
  978. X            unblock_point(mtmp->mx,mtmp->my); /* vision */
  979. X            }
  980. X        } else if (here->doormask & (D_LOCKED|D_CLOSED)) {
  981. X            /* mfndpos guarantees this must be a doorbuster */
  982. X            if(btrapped) {
  983. X            here->doormask = D_NODOOR;
  984. X            newsym(mtmp->mx, mtmp->my);
  985. X            unblock_point(mtmp->mx,mtmp->my); /* vision */
  986. X            if(mb_trapped(mtmp)) return(2);
  987. X            } else {
  988. X                if (flags.verbose) {
  989. X                if (canseeit)
  990. X                    You("see a door crash open.");
  991. X                else if (flags.soundok)
  992. X                    You("hear the sound of a door crashing open.");
  993. X                }
  994. X                if (here->doormask & D_LOCKED && !rn2(2))
  995. X                    here->doormask = D_NODOOR;
  996. X                else here->doormask = D_BROKEN;
  997. X            /* newsym(mtmp->mx, mtmp->my); */ /* done below */
  998. X            unblock_point(mtmp->mx,mtmp->my); /* vision */
  999. X            }
  1000. X        }
  1001. X        }
  1002. X
  1003. X        /* possibly dig */
  1004. X        if (can_tunnel && mdig_tunnel(mtmp))
  1005. X            return(2);    /* mon died (position already updated) */
  1006. X
  1007. X        /* set also in domove(), hack.c */
  1008. X        if (u.uswallow && mtmp == u.ustuck &&
  1009. X                    (mtmp->mx != omx || mtmp->my != omy)) {
  1010. X        /* If the monster moved, then update */
  1011. X        u.ux0 = u.ux;
  1012. X        u.uy0 = u.uy;
  1013. X        u.ux = mtmp->mx;
  1014. X        u.uy = mtmp->my;
  1015. X        swallowed(0);
  1016. X        } else
  1017. X        newsym(mtmp->mx,mtmp->my);
  1018. X
  1019. X        if(OBJ_AT(mtmp->mx, mtmp->my) && mtmp->mcanmove) {
  1020. X        /* Maybe a rock mole just ate some metal object */
  1021. X        if(metallivorous(ptr)) meatgold(mtmp);
  1022. X
  1023. X        if(g_at(mtmp->mx,mtmp->my) && likegold &&
  1024. X                    (!abstain || !rn2(10))) mpickgold(mtmp);
  1025. X
  1026. X        /* Maybe a cube ate just about anything */
  1027. X        if(ptr == &mons[PM_GELATINOUS_CUBE]) meatobj(mtmp);
  1028. X
  1029. X        if((!abstain || !rn2(10)) && 
  1030. X           (!*in_rooms(mtmp->mx, mtmp->my, SHOPBASE) || !rn2(25))) {
  1031. X            if(likeobjs) mpickstuff(mtmp, practical);
  1032. X            if(likemagic) mpickstuff(mtmp, magical);
  1033. X            if(likerock || likegems) mpickgems(mtmp);
  1034. X#ifdef MUSE
  1035. X            if(uses_items) mpickstuff(mtmp, (char *)0);
  1036. X#endif
  1037. X        }
  1038. X
  1039. X        if(mtmp->minvis) {
  1040. X            newsym(mtmp->mx, mtmp->my);
  1041. X            if (mtmp->wormno) see_wsegs(mtmp);
  1042. X        }
  1043. X        }
  1044. X
  1045. X        if(hides_under(ptr)) {
  1046. X        mtmp->mundetected = OBJ_AT(mtmp->mx, mtmp->my);
  1047. X        newsym(mtmp->mx, mtmp->my);
  1048. X        }
  1049. X    }
  1050. X    return(mmoved);
  1051. X}
  1052. X
  1053. X#endif /* OVL0 */
  1054. X#ifdef OVL2
  1055. X
  1056. Xboolean
  1057. Xclosed_door(x, y)
  1058. Xregister int x, y;
  1059. X{
  1060. X    return(IS_DOOR(levl[x][y].typ) &&
  1061. X            (levl[x][y].doormask & (D_LOCKED | D_CLOSED)));
  1062. X}
  1063. X
  1064. Xboolean
  1065. Xaccessible(x, y)
  1066. Xregister int x, y;
  1067. X{
  1068. X    return(ACCESSIBLE(levl[x][y].typ) && !closed_door(x, y));
  1069. X}
  1070. X
  1071. X#endif /* OVL2 */
  1072. X#ifdef OVL0
  1073. X
  1074. Xvoid
  1075. Xset_apparxy(mtmp)        /* where does mtmp think you are standing? */
  1076. X    register struct monst *mtmp;
  1077. X{
  1078. X#define notseen (Invis && !perceives(mtmp->data))
  1079. X/*    add cases as required.  eg. Displacement ... */
  1080. X    register int disp = (Underwater ? 3 : notseen ? 1 : Displaced ? 2 : 0);
  1081. X
  1082. X/*     without something like the following, invis. and displ. are too */
  1083. X/*    powerful. */
  1084. X    register boolean gotu =
  1085. X        (notseen ? !rn2(3) : Displaced ? !rn2(4) : FALSE);
  1086. X
  1087. X/*    Monsters which know where you are don't suddenly forget, if you
  1088. X    didn't move away. */
  1089. X    if (mtmp->mux==u.ux && mtmp->muy==u.uy) gotu = 1;
  1090. X
  1091. X/*     your dog follows your smell */
  1092. X    if(!disp || mtmp->mtame || gotu ||
  1093. X/*     Monsters touching you know where you are */
  1094. X       mtmp == u.ustuck ||
  1095. X/*    If invisible but not displaced, staying around gets you 'discovered' */
  1096. X        (!Displaced && u.dx == 0 && u.dy == 0)) {
  1097. X        mtmp->mux = u.ux;
  1098. X        mtmp->muy = u.uy;
  1099. X    }
  1100. X    else do {
  1101. X        mtmp->mux = u.ux - disp + rn2(2*disp+1);
  1102. X        mtmp->muy = u.uy - disp + rn2(2*disp+1);
  1103. X    } while((mtmp->mux != u.ux || mtmp->muy != u.uy) &&
  1104. X            ( (!passes_walls(mtmp->data) &&
  1105. X              (!ACCESSIBLE(levl[mtmp->mux][mtmp->muy].typ) ||
  1106. X               (closed_door(mtmp->mux, mtmp->muy) &&
  1107. X            !amorphous(mtmp->data)
  1108. X               )
  1109. X              )
  1110. X          ) ||
  1111. X          (disp==1 && mtmp->mux == mtmp->mx && mtmp->muy == mtmp->my)
  1112. X            )
  1113. X           );
  1114. X}
  1115. X
  1116. X#endif /* OVL0 */
  1117. X
  1118. X/*monmove.c*/
  1119. END_OF_FILE
  1120. if test 30715 -ne `wc -c <'src/monmove.c'`; then
  1121.     echo shar: \"'src/monmove.c'\" unpacked with wrong size!
  1122. fi
  1123. # end of 'src/monmove.c'
  1124. fi
  1125. if test -f 'sys/msdos/MakeMSC.src' -a "${1}" != "-c" ; then 
  1126.   echo shar: Will not clobber existing file \"'sys/msdos/MakeMSC.src'\"
  1127. else
  1128. echo shar: Extracting \"'sys/msdos/MakeMSC.src'\" \(23509 characters\)
  1129. sed "s/^X//" >'sys/msdos/MakeMSC.src' <<'END_OF_FILE'
  1130. X# SCCS Id: @(#)MakeMSC.src    3.1    93/01/18
  1131. X# Copyright (c) NetHack PC Development Team 1992, 1993
  1132. X# PC NetHack 3.1 Makefile for Microsoft(tm) "C" >= 6.0ax
  1133. X#
  1134. X# Nota Bene:    Before you get to here you should have already read
  1135. X#         the Install.dos file located in the sys/msdos directory.
  1136. X
  1137. X# This Makefile supports two different overlay management schemes.
  1138. X# You must select either the one that supports Microsoft C
  1139. X# version 6 or version 7.  By default this Makefile is set up
  1140. X# for version 7 or greater.  Certain sections particular to
  1141. X# each compiler are marked either MSC7 or MSC6.  If you are
  1142. X# using Microsoft C version 7, make sure that all the MSC6
  1143. X# sections are commented out and pay particular attention
  1144. X# to all sections marked MSC7, uncommenting all the variables.
  1145. X# Do the same thing for MSC6 if you are using that version of
  1146. X# the compiler.
  1147. X#
  1148. X# MSC6 Notes:
  1149. X#    As it is set up, this makefile requires that exesmurf (the
  1150. X#    NetHack overlay-aware .exe header editor) be on your path or in the
  1151. X#    $(SRC) directory. If you wish to change the path or use Microsoft
  1152. X#    EXEMOD instead, see the symbols EXEPATCH and EXEFLAGS.
  1153. X#
  1154. X
  1155. X#
  1156. X# Game Installation Variables.
  1157. X# NOTE: Make sure GAMEDIR exists before make is started.
  1158. X#
  1159. X
  1160. XGAME    = NetHack
  1161. XGAMEDIR = c:\games\nethack
  1162. Xdefault: $(GAME)
  1163. X
  1164. X#
  1165. X#    Source code and data file directories.
  1166. X#
  1167. X
  1168. XDAT    = ..\dat
  1169. XINCL    = ..\include
  1170. XSRC    = .
  1171. XOBJ    = $(SRC)\o
  1172. XSYS    = ..\sys\msdos
  1173. XSSYS    = ..\sys\share
  1174. XUTL    = ..\util
  1175. XWIN    = ..\win\tty
  1176. X
  1177. X#
  1178. X#    Exe File Info.
  1179. X#    ($(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.)
  1180. X#
  1181. X
  1182. XASM    = masm        # Assembler
  1183. XCC    = cl        # Compiler
  1184. XLINK    = link        # Linker
  1185. XMAKEBIN = make45l    # Make Utility
  1186. X
  1187. X#
  1188. X# Make the necessary changes in *one* of the two sections below.
  1189. X#
  1190. X
  1191. X
  1192. X#### MSC7 Section Only #####
  1193. X# MSC7 Compiler Flags are set up in the setup.bat file using
  1194. X# the CL environment variable as the total lenth of the compiler
  1195. X# command line exceeds the MSDOS 128 character limit.
  1196. X#
  1197. XCFLAGS    = /c
  1198. XLFLAGS    = /noi /seg:512 /map /st:5120 /DYNAMIC:1100 /INFO
  1199. XOVLMUCKING =    # None required
  1200. XMSC6MUCK =     # None required
  1201. X############################
  1202. X
  1203. X
  1204. X#### MSC6 Section Only #####
  1205. X#
  1206. X# First comment out the MSC7 section.  And uncomment much of what is below.
  1207. X#
  1208. X
  1209. X#
  1210. X# CC    There was a register bug, to be safe remove stack probes.
  1211. X# /Gt18 is currently about the largest value that keeps the initialised
  1212. X#    data segment below 64K (and keeps the linker happy).
  1213. X# /G2    286 or higher machines can use the /G2 CFLAG option for better
  1214. X#    performance.
  1215. X#
  1216. X#CFLAGS    = /AL /c /Os /Gs /Gt18 /Zp1 /W0 /I$(INCL)
  1217. X#LFLAGS    = /noi /seg:512 /map /st:4096
  1218. X#EXEPATCH = exesmurf    # Executable Massager
  1219. X#EXEFLAGS = /max4500 /min4500
  1220. X#OVLMUCKING = $(EXEPATCH) ovlmgr.obj
  1221. X#MSC6MUCK = msc6muck
  1222. X
  1223. X#
  1224. X# For Microsoft C version <= 6.00ax, we use a custom overlay
  1225. X# manager, which requires the lower line to be uncommented.
  1226. XOVLMGR    =
  1227. X#OVLMGR    = ovlmgr.obj
  1228. X
  1229. X#
  1230. X# Switch the following $(OBJ)\$(OVLMGR): lines if you don't have a
  1231. X# MASM compatible assembler.
  1232. X$(OBJ)\$(OVLMGR):
  1233. X# $(OBJ)\$(OVLMGR): ; copy $(SYS)\$(OVLMGR) $(OBJ)\$(OVLMGR)
  1234. X
  1235. X#
  1236. X# If you need to recompile ovlmgr.asm you may want to change
  1237. X# some of the flags.
  1238. XAFLAGS = /MX
  1239. X# /Di386    = Use 386 specific enhancements
  1240. X# /DNOEMS    = Do not use EMS memory
  1241. X# /DDEBUG    = Report memory usage on startup
  1242. X# /DNOSPLIT    = EXE file is not split out to OVL files
  1243. X
  1244. X#
  1245. X# Uncomment these sections.
  1246. X#
  1247. X#$(EXEPATCH): $(EXEPATCH).exe
  1248. X#$(EXEPATCH).exe: $(OBJ)\$(EXEPATCH).o
  1249. X#    $(LINK) $(OBJ)\$*.o, $*.exe;
  1250. X
  1251. X#
  1252. X#$(OBJ)\$(EXEPATCH).o: $(SYS)\$(EXEPATCH).c
  1253. X#    $(CC) /W0 /Fo$(OBJ)\$*.o $(SYS)\$*.c
  1254. X############################
  1255. X
  1256. X#
  1257. X#    Optional high-quality BSD random number generation routines
  1258. X#    (see pcconf.h).    Set to nothing if not used.
  1259. X#
  1260. X
  1261. XRANDOM    = $(OBJ)\random.o
  1262. X# RANDOM    =
  1263. X
  1264. X#
  1265. X# If TERMLIB is NOT #defined in the source, comment out the
  1266. X# lower line and uncomment the upper.  Make sure that TERMLIB
  1267. X# contains the full pathname to the termcap library.
  1268. X
  1269. X#TERMLIB =
  1270. XTERMLIB = $(SSYS)\termcap.lib
  1271. X
  1272. X#
  1273. X#    Nothing below this line should have to be changed.
  1274. X#
  1275. X
  1276. X#
  1277. X#    Make Roolz dude.
  1278. X#    Due to an NDMake inadequacy these must accord with a topological
  1279. X#    sort of the generated-from relation... output on the left, input
  1280. X#    on the right. Trust me.
  1281. X#
  1282. X
  1283. X.SUFFIXES: .exe .0 .0-1 .0-2 .0-3 .1 .1-2 .1-3 .1-b .2 .2-3 .2-b .3 .3-b .b \
  1284. X       .o .c .y .l .obj .asm
  1285. X
  1286. X.c.o:
  1287. X    $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
  1288. X.c.0:
  1289. X    $(CC) $(CFLAGS) /DOVL0 /NT$*.0 /Fo$(OBJ)\$*.0 $*.c
  1290. X.c.0-1:
  1291. X    $(CC) $(CFLAGS) /DOVL0 /DOVL1 /NT$*.0-1 /Fo$(OBJ)\$*.0-1 $*.c
  1292. X.c.0-2:
  1293. X    $(CC) $(CFLAGS) /DOVL0 /DOVL1 /DOVL2 /NT$*.0-2 /Fo$(OBJ)\$*.0-2 $*.c
  1294. X.c.0-3:
  1295. X    $(CC) $(CFLAGS) /DOVL0 /DOVL1 /DOVL2 /DOVL3 /NT$*.0-3 /Fo$(OBJ)\$*.0-3 $*.c
  1296. X.c.1:
  1297. X    $(CC) $(CFLAGS) /DOVL1 /NT$*.1 /Fo$(OBJ)\$*.1 $*.c
  1298. X.c.1-2:
  1299. X    $(CC) $(CFLAGS) /DOVL1 /DOVL2 /NT$*.1-2 /Fo$(OBJ)\$*.1-2 $*.c
  1300. X.c.1-3:
  1301. X    $(CC) $(CFLAGS) /DOVL1 /DOVL2 /DOVL3 /NT$*.1-3 /Fo$(OBJ)\$*.1-3 $*.c
  1302. X.c.1-b:
  1303. X    $(CC) $(CFLAGS) /DOVL1 /DOVL2 /DOVL3 /DOVLB /NT$*.1-b /Fo$(OBJ)\$*.1-b $*.c
  1304. X.c.2:
  1305. X    $(CC) $(CFLAGS) /DOVL2 /NT$*.2 /Fo$(OBJ)\$*.2 $*.c
  1306. X.c.2-3:
  1307. X    $(CC) $(CFLAGS) /DOVL2 /DOVL3 /NT$*.2-3 /Fo$(OBJ)\$*.2-3 $*.c
  1308. X.c.2-b:
  1309. X    $(CC) $(CFLAGS) /DOVL2 /DOVL3 /DOVLB /NT$*.2-b /Fo$(OBJ)\$*.2-b $*.c
  1310. X.c.3:
  1311. X    $(CC) $(CFLAGS) /DOVL3 /NT$*.3 /Fo$(OBJ)\$*.3 $*.c
  1312. X.c.3-b:
  1313. X    $(CC) $(CFLAGS) /DOVL3 /DOVLB /NT$*.3-b /Fo$(OBJ)\$*.3-b $*.c
  1314. X.c.b:
  1315. X    $(CC) $(CFLAGS) /DOVLB /NT$*.b /Fo$(OBJ)\$*.b $*.c
  1316. X.asm.obj:
  1317. X    $(ASM) $(AFLAGS) $(SYS)\$*.asm, $(OBJ)\$*.obj ;
  1318. X
  1319. X#
  1320. X#    Header Objects.
  1321. X#
  1322. X
  1323. XCONFIG_H   = $(GLOBAL_H)    $(INCL)\tradstdc.h    $(INCL)\config.h
  1324. XDECL_H       = $(YOU_H)        $(INCL)\spell.h        $(INCL)\color.h    \
  1325. X         $(INCL)\obj.h    $(INCL)\onames.h    $(INCL)\pm.h \
  1326. X         $(INCL)\decl.h
  1327. XDGN_FILE_H = $(INCL)\align.h    $(INCL)\dgn_file.h
  1328. XDISPLAY_H  = $(MONDATA_H)    $(INCL)\vision.h    $(INCL)\display.h
  1329. XDUNGEON_H  = $(INCL)\align.h    $(INCL)\dungeon.h
  1330. XEMIN_H       = $(DUNGEON_H)    $(INCL)\emin.h
  1331. XEPRI_H       = $(DUNGEON_H)    $(INCL)\align.h        $(INCL)\epri.h
  1332. XESHK_H       = $(DUNGEON_H)    $(INCL)\eshk.h
  1333. XGLOBAL_H   = $(PCCONF_H)    $(INCL)\coord.h        $(INCL)\global.h
  1334. XHACK_H       = $(CONFIG_H)    $(DUNGEON_H)        $(DECL_H) \
  1335. X         $(DISPLAY_H)    $(INCL)\monsym.h    $(INCL)\mkroom.h \
  1336. X         $(INCL)\objclass.h    $(INCL)\trap.h        $(INCL)\flag.h    \
  1337. X         $(RM_H)        $(INCL)\vision.h    $(INCL)\wintype.h \
  1338. X         $(INCL)\engrave.h    $(INCL)\rect.h \
  1339. X         $(INCL)\trampoli.h    $(INCL)\hack.h
  1340. XMONDATA_H  = $(INCL)\align.h    $(INCL)\mondata.h
  1341. XMONST_H       = $(INCL)\align.h    $(INCL)\monst.h
  1342. XPCCONF_H   = $(INCL)\micro.h    $(INCL)\system.h    $(INCL)\pcconf.h
  1343. XPERMONST_H = $(INCL)\monattk.h    $(INCL)\monflag.h    $(INCL)\align.h    \
  1344. X         $(INCL)\permonst.h
  1345. XRM_H       = $(INCL)\align.h    $(INCL)\rm.h
  1346. XSP_LEV_H   = $(INCL)\align.h    $(INCL)\sp_lev.h
  1347. XVAULT_H       = $(DUNGEON_H)    $(INCL)\vault.h
  1348. XYOU_H       = $(MONST_H)        $(YOUPROP_H)        $(INCL)\align.h    \
  1349. X         $(INCL)\attrib.h    $(INCL)\you.h
  1350. XYOUPROP_H  = $(PERMONST_H)    $(MONDATA_H)        $(INCL)\prop.h    \
  1351. X         $(INCL)\pm.h    $(INCL)\youprop.h
  1352. X
  1353. X#
  1354. X#    Overlay Objects.
  1355. X#
  1356. X
  1357. XROOT =    $(OBJ)\main.o $(OBJ)\msdos.0 $(OBJ)\dungeon.0 \
  1358. X    $(OBJ)\alloc.o $(OBJ)\random.o $(OBJ)\decl.o $(OBJ)\dbridge.0 \
  1359. X    $(OBJ)\objects.o $(OBJ)\invent.0 $(OBJ)\mkobj.0 $(OBJ)\mkroom.0 \
  1360. X    $(OBJ)\rnd.0 $(OBJ)\termcap.0 $(OBJ)\mondata.0 $(OBJ)\muse.o \
  1361. X    $(OBJ)\engrave.0 $(OBJ)\explode.o $(OBJ)\display.o $(OBJ)\vision.o \
  1362. X    $(OBJ)\attrib.0 $(OBJ)\rect.o $(OBJ)\vis_tab.o $(OBJ)\hacklib.0 \
  1363. X    $(OBJ)\monst.o $(OBJ)\hack.3 $(OBJ)\topl.0 $(OBJ)\trap.0 \
  1364. X    $(OBJ)\wintty.o $(OBJ)\monmove.0 $(OBJ)\dogmove.0
  1365. X
  1366. X# These could use to go in root, but are in OLV1 to make
  1367. X# the game loadable in under 512 free ram.
  1368. X# rhack and friends
  1369. XOVL01 = $(OBJ)\allmain.0 $(OBJ)\artifact.0 $(OBJ)\attrib.1 $(OBJ)\cmd.1 \
  1370. X    $(OBJ)\do.1 $(OBJ)\do.3 $(OBJ)\eat.0 $(OBJ)\engrave.2 \
  1371. X    $(OBJ)\getline.0-1 $(OBJ)\hack.1-2 \
  1372. X    $(OBJ)\botl.1 $(OBJ)\sounds.0 $(OBJ)\timeout.0 \
  1373. X    $(OBJ)\track.1 $(OBJ)\vault.0 $(OBJ)\wizard.0 $(OBJ)\hacklib.1
  1374. X# startup
  1375. XOVL02 = $(OBJ)\dungeon.1 $(OBJ)\files.o $(OBJ)\pcsys.o \
  1376. X    $(OBJ)\monstr.o $(OBJ)\msdos.b
  1377. X# main monster code
  1378. XOVL03 = $(OBJ)\cmd.0 $(OBJ)\engrave.1 $(OBJ)\mondata.1 \
  1379. X    $(OBJ)\mthrowu.0 $(OBJ)\priest.0 $(OBJ)\track.0 \
  1380. X    $(OBJ)\trap.1 $(OBJ)\were.0
  1381. X# monster movement
  1382. XOVL04 = $(OBJ)\mon.0-1 $(OBJ)\monmove.1
  1383. X# pet monster movement
  1384. XOVL05 = $(OBJ)\dog.1 $(OBJ)\dogmove.1-b
  1385. X# advanced monsters
  1386. XOVL06 = $(OBJ)\minion.o $(OBJ)\mcastu.o
  1387. XOVL07 = $(OBJ)\priest.1-b $(OBJ)\shk.1-b
  1388. XOVL08 = $(OBJ)\were.1-b
  1389. XOVL09 = $(OBJ)\wizard.1-b
  1390. XOVL10 = $(OBJ)\worm.o
  1391. X# 11-15 around the movement loop
  1392. X# domove and friends
  1393. XOVL11 = $(OBJ)\hack.0 $(OBJ)\apply.0 $(OBJ)\do_wear.1 $(OBJ)\lock.0 \
  1394. X    $(OBJ)\cmd.2
  1395. XOVL12 = $(OBJ)\detect.o
  1396. XOVL13 = $(OBJ)\attrib.2-b $(OBJ)\exper.o
  1397. XOVL14 = $(OBJ)\eat.1 $(OBJ)\invent.1
  1398. XOVL15 = $(OBJ)\makemon.0-2 $(OBJ)\mkobj.1
  1399. XOVL16 = $(OBJ)\makemon.b $(OBJ)\mplayer.o $(OBJ)\mkobj.2-b
  1400. XOVL17 = $(OBJ)\mhitm.1-b
  1401. XOVL18 = $(OBJ)\mthrowu.1
  1402. XOVL19 = $(OBJ)\mthrowu.2-b
  1403. XOVL20 = $(OBJ)\allmain.1 $(OBJ)\mhitm.0 $(OBJ)\mhitu.0-1 $(OBJ)\rnd.1 \
  1404. X    $(OBJ)\weapon.0-1
  1405. XOVL21 = $(OBJ)\mon.2-b
  1406. XOVL22 = $(OBJ)\artifact.1 $(OBJ)\uhitm.o $(OBJ)\weapon.2-b
  1407. XOVL23 = $(OBJ)\do_wear.0 $(OBJ)\mhitu.2-b
  1408. XOVL24 = $(OBJ)\steal.0-1
  1409. XOVL25 = $(OBJ)\monmove.2-b $(OBJ)\steal.2-b
  1410. XOVL26 = $(OBJ)\rnd.2-b
  1411. XOVL27 = $(OBJ)\do_wear.2 $(OBJ)\mondata.2 $(OBJ)\objnam.0-1 \
  1412. X    $(OBJ)\polyself.0-1
  1413. XOVL28 = $(OBJ)\do_name.0
  1414. XOVL29 = $(OBJ)\objnam.2-b $(OBJ)\hacklib.2-b
  1415. XOVL30 = $(OBJ)\pager.o
  1416. XOVL31 = $(OBJ)\botl.0
  1417. XOVL32 = $(OBJ)\botl.b $(OBJ)\topl.b $(OBJ)\termcap.1 $(OBJ)\windows.o
  1418. XOVL33 = $(OBJ)\topl.1-2
  1419. XOVL34 = $(OBJ)\pline.o
  1420. XOVL35 = $(OBJ)\termcap.2-b
  1421. XOVL36 = $(OBJ)\quest.o $(OBJ)\questpgr.o
  1422. XOVL37 = $(OBJ)\invent.b
  1423. XOVL38 = $(OBJ)\hack.b
  1424. XOVL39 = $(OBJ)\mondata.b $(OBJ)\timeout.1-b $(OBJ)\dog.b $(OBJ)\sounds.1-b
  1425. XOVL40 = $(OBJ)\do.0 $(OBJ)\invent.3
  1426. XOVL41 = $(OBJ)\cmd.b $(OBJ)\getline.2 $(OBJ)\write.o
  1427. XOVL42 = $(OBJ)\apply.2-b
  1428. XOVL43 = $(OBJ)\do.b $(OBJ)\drawing.o
  1429. XOVL44 = $(OBJ)\dokick.o
  1430. XOVL45 = $(OBJ)\dothrow.o
  1431. XOVL46 = $(OBJ)\eat.2-b
  1432. XOVL47 = $(OBJ)\invent.2 $(OBJ)\pickup.o
  1433. XOVL48 = $(OBJ)\lock.1-b
  1434. XOVL49 = $(OBJ)\polyself.2-b
  1435. XOVL50 = $(OBJ)\potion.o
  1436. XOVL51 = $(OBJ)\pray.o
  1437. XOVL52 = $(OBJ)\read.1-b $(OBJ)\spell.o
  1438. XOVL53 = $(OBJ)\ball.o
  1439. X# clothing stuff
  1440. XOVL54 = $(OBJ)\do_wear.b $(OBJ)\wield.o $(OBJ)\worn.o
  1441. X# Zappage
  1442. XOVL55 = $(OBJ)\zap.o
  1443. XOVL56 = $(OBJ)\dbridge.1-b
  1444. XOVL57 = $(OBJ)\trap.b
  1445. X# Unusual circumstances
  1446. XOVL58 = $(OBJ)\artifact.b $(OBJ)\do_name.1-b $(OBJ)\fountain.o $(OBJ)\music.o \
  1447. X    $(OBJ)\rumors.o $(OBJ)\sit.o $(OBJ)\vault.1-b
  1448. X# Uppers and Downers
  1449. XOVL59 = $(OBJ)\apply.1 $(OBJ)\bones.o $(OBJ)\mklev.o
  1450. XOVL60 = $(OBJ)\save.o $(OBJ)\restore.o
  1451. XOVL61 = $(OBJ)\mkmaze.o $(OBJ)\mkroom.1-b $(OBJ)\mkmap.o
  1452. X# Note: version.o is in OVL62, but in a special way.  See below.
  1453. XOVL62 = $(OBJ)\allmain.2-b $(OBJ)\end.o $(OBJ)\engrave.b \
  1454. X    $(OBJ)\o_init.o $(OBJ)\options.o $(OBJ)\rip.o \
  1455. X    $(OBJ)\shknam.o $(OBJ)\topten.o $(OBJ)\tty.o \
  1456. X    $(OBJ)\u_init.o $(OBJ)\unix.1-b
  1457. X# Levelling
  1458. XOVL63 = $(OBJ)\do.2 $(OBJ)\dog.2 $(OBJ)\extralev.o \
  1459. X    $(OBJ)\sp_lev.o $(OBJ)\track.2-b
  1460. X
  1461. X#
  1462. X#    Make Objects.
  1463. X#
  1464. X
  1465. XMOBJ = $(OVL01) $(OVL02) $(OVL03) $(OVL04) $(OVL05) $(OVL06) $(OVL07) $(OVL08)\
  1466. X       $(OVL09) $(OVL10) $(OVL11) $(OVL12) $(OVL13) $(OVL14) $(OVL15) $(OVL16)\
  1467. X       $(OVL17) $(OVL18) $(OVL19) $(OVL20) $(OVL21) $(OVL22) $(OVL23) $(OVL24)\
  1468. X       $(OVL25) $(OVL26) $(OVL27) $(OVL28) $(OVL29) $(OVL30) $(OVL31) $(OVL32)\
  1469. X       $(OVL33) $(OVL34) $(OVL35) $(OVL36) $(OVL37) $(OVL38) $(OVL39) $(OVL40)\
  1470. X       $(OVL41) $(OVL42) $(OVL43) $(OVL44) $(OVL45) $(OVL46) $(OVL47) $(OVL48)\
  1471. X       $(OVL49) $(OVL50) $(OVL51) $(OVL52) $(OVL53) $(OVL54) $(OVL55) $(OVL56)\
  1472. X       $(OVL57) $(OVL58) $(OVL59) $(OVL60) $(OVL61) $(OVL62) $(OVL63)
  1473. X
  1474. XVOBJ = $(ROOT)    $(MOBJ)
  1475. X
  1476. XHOBJ = $(VOBJ)    $(OBJ)\version.o
  1477. X
  1478. XOVERLAYS = ($(OVL01)) ($(OVL02)) ($(OVL03)) ($(OVL04)) ($(OVL05)) ($(OVL06)) \
  1479. X       ($(OVL07)) ($(OVL08)) ($(OVL09)) ($(OVL10)) ($(OVL11)) ($(OVL12)) \
  1480. X       ($(OVL13)) ($(OVL14)) ($(OVL15)) ($(OVL16)) ($(OVL17)) ($(OVL18)) \
  1481. X       ($(OVL19)) ($(OVL20)) ($(OVL21)) ($(OVL22)) ($(OVL23)) ($(OVL24)) \
  1482. X       ($(OVL25)) ($(OVL26)) ($(OVL27)) ($(OVL28)) ($(OVL29)) ($(OVL30)) \
  1483. X       ($(OVL31)) ($(OVL32)) ($(OVL33)) ($(OVL34)) ($(OVL35)) ($(OVL36)) \
  1484. X       ($(OVL37)) ($(OVL38)) ($(OVL39)) ($(OVL40)) ($(OVL41)) ($(OVL42)) \
  1485. X       ($(OVL43)) ($(OVL44)) ($(OVL45)) ($(OVL46)) ($(OVL47)) ($(OVL48)) \
  1486. X       ($(OVL49)) ($(OVL50)) ($(OVL51)) ($(OVL52)) ($(OVL53)) ($(OVL54)) \
  1487. X       ($(OVL55)) ($(OVL56)) ($(OVL57)) ($(OVL58)) ($(OVL59)) ($(OVL60)) \
  1488. X       ($(OVL61)) ($(OVL62)    $(OBJ)\version.o) ($(OVL63))
  1489. X
  1490. X#
  1491. X#    Primary make targets.
  1492. X#
  1493. X
  1494. XGAMEFILE = $(GAMEDIR)\$(GAME).exe
  1495. X
  1496. Xall: install
  1497. X
  1498. Xinstall: $(DAT)\sp_lev.tag    $(GAMEFILE)    $(MSC6MUCK)    install.tag
  1499. X    @echo Don't forget to check HACKDIR in $(GAMEDIR)\NetHack.cnf.
  1500. X    @echo Done.
  1501. X
  1502. Xinstall.tag: $(GAMEFILE) $(MSC6MUCK)
  1503. X    copy $(SSYS)\termcap        $(GAMEDIR)
  1504. X    copy $(DAT)\*.?            $(GAMEDIR)
  1505. X    copy $(DAT)\*.dat        $(GAMEDIR)
  1506. X    copy $(DAT)\*.lev        $(GAMEDIR)
  1507. X    copy $(SSYS)\NetHack.cnf    $(GAMEDIR)
  1508. X    copy $(UTL)\recover.exe        $(GAMEDIR)
  1509. X    del  $(GAMEDIR)\makefile
  1510. X    echo install done > install.tag
  1511. X
  1512. X$(GAME): $(GAMEFILE) $(MSC6MUCK)
  1513. X
  1514. X$(GAME).exe: $(GAMEFILE) $(MSC6MUCK)
  1515. X
  1516. X$(GAMEFILE): $(UTL)\utility.tag $(OBJ) $(OVLMUCKING) $(HOBJ)
  1517. X    @echo Loading....
  1518. X    $(LINK) $(LFLAGS) $(ROOT) $(OVERLAYS),$(GAMEFILE),$(GAME),$(TERMLIB);
  1519. X    @del $(GAMEDIR)\$(GAME).bak > NUL
  1520. X    @echo $(GAME) is up to date.
  1521. X
  1522. Xmsc6muck:
  1523. X    $(EXEPATCH) $(GAMEFILE) $(EXEFLAGS)
  1524. X    $(EXEPATCH) $(GAMEFILE) 1 40
  1525. X
  1526. X#
  1527. X#    Secondary Targets.
  1528. X#
  1529. X
  1530. Xclean:
  1531. X    del $(OBJ)\*.o
  1532. X    del $(OBJ)\*.0
  1533. X    del $(OBJ)\*.0-1
  1534. X    del $(OBJ)\*.0-2
  1535. X    del $(OBJ)\*.0-3
  1536. X    del $(OBJ)\*.1
  1537. X    del $(OBJ)\*.1-2
  1538. X    del $(OBJ)\*.1-3
  1539. X    del $(OBJ)\*.1-b
  1540. X    del $(OBJ)\*.2
  1541. X    del $(OBJ)\*.2-3
  1542. X    del $(OBJ)\*.2-b
  1543. X    del $(OBJ)\*.3
  1544. X    del $(OBJ)\*.3-b
  1545. X    del $(OBJ)\*.b
  1546. X    del $(OBJ)\*.obj
  1547. X    rmdir $(OBJ)
  1548. X
  1549. Xspotless: clean
  1550. X    del *.exe
  1551. X    del *.bak
  1552. X    del *.tag
  1553. X    del *.map
  1554. X    del *.obj
  1555. X    del *.lib
  1556. X    del *.txt
  1557. X
  1558. X$(OBJ):
  1559. X    if not exist $(OBJ)\*.* mkdir $(OBJ)
  1560. X
  1561. X#
  1562. X# I'm not too fond of using this `attrib .foo` command to stop make,
  1563. X# but I can't think of any better generic way to do it.
  1564. X# It works for DOS 3.3, 4.00, & 5.0.
  1565. X# If you find a better one please feel free to implement it.
  1566. X#
  1567. X$(UTL)\utility.tag: monst.c    alloc.c            objects.c \
  1568. X    $(UTL)\makedefs.c    $(UTL)\panic.c        $(UTL)\recover.c \
  1569. X    $(UTL)\dgn_main.c    $(UTL)\dgn_comp.l    $(UTL)\dgn_comp.y \
  1570. X    $(UTL)\lev_main.c    $(UTL)\lev_comp.l    $(UTL)\lev_comp.y \
  1571. X    $(HACK_H)
  1572. X    @echo You must first "$(MAKEBIN) all" in the $(UTL) directory.
  1573. X    @attrib .foo
  1574. X
  1575. X$(DAT)\sp_lev.tag: $(UTL)\utility.tag
  1576. X    @echo You must first "$(MAKEBIN) all" in the $(DAT) directory.
  1577. X    @attrib .foo
  1578. X
  1579. X#
  1580. X# Other dependencies
  1581. X#
  1582. X
  1583. X$(INCL)\date.h: $(VOBJ)
  1584. X    $(UTL)\makedefs -v
  1585. X
  1586. X#
  1587. X#    Overlay/PC source code dependencies.
  1588. X#
  1589. X
  1590. X#
  1591. X#    $(SYS) files.
  1592. X#
  1593. X
  1594. X$(OBJ)\msdos.0: $(HACK_H) $(INCL)\termcap.h $(SYS)\msdos.c
  1595. X    $(CC) $(CFLAGS) /DOVL0 /NT$*.0 /Fo$(OBJ)\$*.0 $(SYS)\$*.c
  1596. X
  1597. X$(OBJ)\msdos.b: $(HACK_H) $(INCL)\termcap.h $(SYS)\msdos.c
  1598. X    $(CC) $(CFLAGS) /DOVLB /NT$*.b /Fo$(OBJ)\$*.b $(SYS)\$*.c
  1599. X
  1600. X$(OBJ)\trampoli.o: $(HACK_H)    $(SYS)\trampoli.c
  1601. X    $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $(SYS)\$*.c
  1602. X
  1603. X#
  1604. X#    $(SSYS) files.
  1605. X#
  1606. X
  1607. X$(OBJ)\main.o: $(HACK_H)    $(SSYS)\pcmain.c
  1608. X    $(CC) $(CFLAGS) /Fo$(OBJ)\main.o $(SSYS)\pcmain.c
  1609. X
  1610. X$(OBJ)\pcsys.o:    $(HACK_H)    $(INCL)\wintty.h    $(SSYS)\pcsys.c
  1611. X    $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $(SSYS)\$*.c
  1612. X
  1613. X$(OBJ)\random.o: $(SSYS)\random.c
  1614. X    $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $(SSYS)\$*.c
  1615. X
  1616. X$(OBJ)\tty.o: $(HACK_H)        $(INCL)\wintty.h    $(SSYS)\pctty.c
  1617. X    $(CC) $(CFLAGS) /Fo$(OBJ)\tty.o    $(SSYS)\pctty.c
  1618. X
  1619. X$(OBJ)\unix.0: $(HACK_H)    $(SSYS)\pcunix.c
  1620. X    $(CC) $(CFLAGS) /DOVL0 /Fo$(OBJ)\unix.0 $(SSYS)\pcunix.c
  1621. X
  1622. X$(OBJ)\unix.1-b: $(HACK_H)    $(SSYS)\pcunix.c
  1623. X    $(CC) $(CFLAGS) /DOVL1 /DOVL2 /DOVL3 /DOVLB /Fo$(OBJ)\unix.1-b $(SSYS)\pcunix.c
  1624. X
  1625. X#
  1626. X#    $(WIN) files.
  1627. X#
  1628. X
  1629. X$(OBJ)\getline.0-1: $(HACK_H)    $(INCL)\wintty.h    $(INCL)\func_tab.h \
  1630. X    $(WIN)\getline.c
  1631. X    $(CC) $(CFLAGS) /DOVL0 /DOVL1 /NT$*.0-1 /Fo$(OBJ)\$*.0-1 $(WIN)\$*.c
  1632. X
  1633. X$(OBJ)\getline.2: $(HACK_H)    $(INCL)\wintty.h    $(INCL)\func_tab.h \
  1634. X    $(WIN)\getline.c
  1635. X    $(CC) $(CFLAGS) /DOVL2 /NT$*.2 /Fo$(OBJ)\$*.2 $(WIN)\$*.c
  1636. X
  1637. X$(OBJ)\getline.b: $(HACK_H)    $(INCL)\wintty.h    $(INCL)\func_tab.h \
  1638. X    $(WIN)\getline.c
  1639. X    $(CC) $(CFLAGS) /DOVLB /NT$*.b /Fo$(OBJ)\getline.b $(WIN)\$*.c
  1640. X
  1641. X$(OBJ)\termcap.0: $(HACK_H)    $(INCL)\wintty.h    $(INCL)\termcap.h \
  1642. X    $(WIN)\termcap.c
  1643. X    $(CC) $(CFLAGS) /DOVL0 /NT$*.0 /Fo$(OBJ)\$*.0 $(WIN)\$*.c
  1644. X
  1645. X$(OBJ)\termcap.1: $(HACK_H)    $(INCL)\wintty.h    $(INCL)\termcap.h \
  1646. X    $(WIN)\termcap.c
  1647. X    $(CC) $(CFLAGS) /DOVL1 /NT$*.1 /Fo$(OBJ)\$*.1 $(WIN)\$*.c
  1648. X
  1649. X$(OBJ)\termcap.2-b: $(HACK_H)    $(INCL)\wintty.h    $(INCL)\termcap.h \
  1650. X    $(WIN)\termcap.c
  1651. X    $(CC) $(CFLAGS) /DOVL2 /DOVLB /NT$*.2-b /Fo$(OBJ)\$*.2-b $(WIN)\$*.c
  1652. X
  1653. X$(OBJ)\topl.0: $(HACK_H)    $(INCL)\termcap.h    $(INCL)\wintty.h \
  1654. X    $(WIN)\topl.c
  1655. X    $(CC) $(CFLAGS) /DOVL0 /NT$*.0 /Fo$(OBJ)\$*.0 $(WIN)\$*.c
  1656. X
  1657. X$(OBJ)\topl.1-2: $(HACK_H)    $(INCL)\termcap.h    $(INCL)\wintty.h \
  1658. X    $(WIN)\topl.c
  1659. X    $(CC) $(CFLAGS) /DOVL1 /DOVL2 /NT$*.1-2 /Fo$(OBJ)\$*.1-2 $(WIN)\$*.c
  1660. X
  1661. X$(OBJ)\topl.b: $(HACK_H)    $(INCL)\termcap.h    $(INCL)\wintty.h \
  1662. X    $(WIN)\topl.c
  1663. X    $(CC) $(CFLAGS) /DOVLB /NT$*.b /Fo$(OBJ)\$*.b $(WIN)\$*.c
  1664. X
  1665. X$(OBJ)\wintty.o: $(HACK_H)    $(INCL)\wintty.h    $(INCL)\termcap.h \
  1666. X    $(WIN)\wintty.c
  1667. X    $(CC) $(CFLAGS) /DOVL0 /DOVL1 /DOVL2 /DOVLB /Fo$(OBJ)\$*.o $(WIN)\$*.c
  1668. X
  1669. X#
  1670. X#    $(SRC) files.
  1671. X#
  1672. X# DO NOT DELETE THIS LINE
  1673. X#
  1674. X
  1675. X$(OBJ)\allmain.0:    $(HACK_H)
  1676. X$(OBJ)\allmain.1:    $(HACK_H)
  1677. X$(OBJ)\allmain.2-b:    $(HACK_H)
  1678. X$(OBJ)\alloc.o:        $(CONFIG_H)
  1679. X$(OBJ)\apply.0:        $(HACK_H)    $(INCL)\edog.h
  1680. X$(OBJ)\apply.1:        $(HACK_H)    $(INCL)\edog.h
  1681. X$(OBJ)\apply.2-b:    $(HACK_H)    $(INCL)\edog.h
  1682. X$(OBJ)\artifact.0:    $(HACK_H)    $(INCL)\artifact.h  $(INCL)\artilist.h
  1683. X$(OBJ)\artifact.1:    $(HACK_H)    $(INCL)\artifact.h  $(INCL)\artilist.h
  1684. X$(OBJ)\artifact.2:    $(HACK_H)    $(INCL)\artifact.h  $(INCL)\artilist.h
  1685. X$(OBJ)\artifact.b:    $(HACK_H)    $(INCL)\artifact.h  $(INCL)\artilist.h
  1686. X$(OBJ)\attrib.0:    $(HACK_H)
  1687. X$(OBJ)\attrib.1:    $(HACK_H)
  1688. X$(OBJ)\attrib.2-b:    $(HACK_H)
  1689. X$(OBJ)\ball.o:        $(HACK_H)
  1690. X$(OBJ)\bones.o:        $(HACK_H)
  1691. X$(OBJ)\botl.0:        $(HACK_H)
  1692. X$(OBJ)\botl.1:        $(HACK_H)
  1693. X$(OBJ)\botl.2:        $(HACK_H)
  1694. X$(OBJ)\botl.b:        $(HACK_H)
  1695. X$(OBJ)\cmd.0:        $(HACK_H)    $(INCL)\func_tab.h
  1696. X$(OBJ)\cmd.1:        $(HACK_H)    $(INCL)\func_tab.h
  1697. X$(OBJ)\cmd.b:        $(HACK_H)    $(INCL)\func_tab.h
  1698. X$(OBJ)\dbridge.0:    $(HACK_H)
  1699. X$(OBJ)\dbridge.1-b:    $(HACK_H)
  1700. X$(OBJ)\decl.o:        $(HACK_H)    $(INCL)\quest.h
  1701. X$(OBJ)\detect.o:    $(HACK_H)    $(INCL)\artifact.h
  1702. X$(OBJ)\display.o:    $(HACK_H)
  1703. X$(OBJ)\do.0:        $(HACK_H)    $(INCL)\lev.h
  1704. X$(OBJ)\do.1:        $(HACK_H)    $(INCL)\lev.h
  1705. X$(OBJ)\do.2:        $(HACK_H)    $(INCL)\lev.h
  1706. X$(OBJ)\do.3:        $(HACK_H)    $(INCL)\lev.h
  1707. X$(OBJ)\do.b:        $(HACK_H)    $(INCL)\lev.h
  1708. X$(OBJ)\do_name.0:    $(HACK_H)
  1709. X$(OBJ)\do_name.1-b:    $(HACK_H)
  1710. X$(OBJ)\do_wear.0-1:    $(HACK_H)
  1711. X$(OBJ)\do_wear.2:    $(HACK_H)
  1712. X$(OBJ)\do_wear.b:    $(HACK_H)
  1713. X$(OBJ)\dog.0:        $(HACK_H)    $(INCL)\edog.h
  1714. X$(OBJ)\dog.1:        $(HACK_H)    $(INCL)\edog.h
  1715. X$(OBJ)\dog.2:        $(HACK_H)    $(INCL)\edog.h
  1716. X$(OBJ)\dog.b:        $(HACK_H)    $(INCL)\edog.h
  1717. X$(OBJ)\dogmove.0:    $(HACK_H)    $(INCL)\mfndpos.h    $(INCL)\edog.h
  1718. X$(OBJ)\dogmove.1-b:    $(HACK_H)    $(INCL)\mfndpos.h    $(INCL)\edog.h
  1719. X$(OBJ)\dokick.o:    $(HACK_H)    $(ESHK_H)
  1720. X$(OBJ)\dothrow.o:    $(HACK_H)
  1721. X$(OBJ)\drawing.o:    $(HACK_H)    $(INCL)\termcap.h
  1722. X$(OBJ)\dungeon.o:    $(HACK_H)    $(DGN_FILE_H)
  1723. X$(OBJ)\eat.0:        $(HACK_H)
  1724. X$(OBJ)\eat.1:        $(HACK_H)
  1725. X$(OBJ)\eat.2-b:        $(HACK_H)
  1726. X$(OBJ)\end.o:        $(HACK_H)    $(ESHK_H)
  1727. X$(OBJ)\engrave.0-1:    $(HACK_H)    $(INCL)\lev.h
  1728. X$(OBJ)\engrave.2:    $(HACK_H)    $(INCL)\lev.h
  1729. X$(OBJ)\engrave.b:    $(HACK_H)    $(INCL)\lev.h
  1730. X$(OBJ)\exper.o:        $(HACK_H)
  1731. X$(OBJ)\explode.o:    $(HACK_H)
  1732. X$(OBJ)\extralev.o:    $(HACK_H)
  1733. X$(OBJ)\files.o:        $(HACK_H)
  1734. X$(OBJ)\fountain.o:    $(HACK_H)
  1735. X$(OBJ)\hack.0:        $(HACK_H)
  1736. X$(OBJ)\hack.1:        $(HACK_H)
  1737. X$(OBJ)\hack.2:        $(HACK_H)
  1738. X$(OBJ)\hack.b:        $(HACK_H)
  1739. X$(OBJ)\hacklib.0:    $(HACK_H)
  1740. X$(OBJ)\hacklib.1:    $(HACK_H)
  1741. X$(OBJ)\hacklib.2-b:    $(HACK_H)
  1742. X$(OBJ)\invent.0:    $(HACK_H)    $(INCL)\artifact.h
  1743. X$(OBJ)\invent.1:    $(HACK_H)    $(INCL)\artifact.h
  1744. X$(OBJ)\invent.2:    $(HACK_H)    $(INCL)\artifact.h
  1745. X$(OBJ)\invent.3:    $(HACK_H)    $(INCL)\artifact.h
  1746. X$(OBJ)\invent.b:    $(HACK_H)    $(INCL)\artifact.h
  1747. X$(OBJ)\lock.0:        $(HACK_H)
  1748. X$(OBJ)\lock.1-b:    $(HACK_H)
  1749. X$(OBJ)\mail.0:        $(HACK_H)    $(INCL)\mail.h
  1750. X$(OBJ)\mail.1-b:    $(HACK_H)    $(INCL)\mail.h
  1751. X$(OBJ)\makemon.0-2:    $(HACK_H)    $(EPRI_H)    $(EMIN_H)
  1752. X$(OBJ)\makemon.b:    $(HACK_H)    $(EPRI_H)    $(EMIN_H)
  1753. X$(OBJ)\mcastu.o:    $(HACK_H)
  1754. X$(OBJ)\mhitm.0:        $(HACK_H)    $(INCL)\artifact.h    $(INCL)\edog.h
  1755. X$(OBJ)\mhitm.1-b:    $(HACK_H)    $(INCL)\artifact.h    $(INCL)\edog.h
  1756. X$(OBJ)\mhitu.0-1:    $(HACK_H)    $(INCL)\artifact.h    $(INCL)\edog.h
  1757. X$(OBJ)\mhitu.2-b:    $(HACK_H)    $(INCL)\artifact.h    $(INCL)\edog.h
  1758. X$(OBJ)\minion.o:    $(HACK_H)    $(EMIN_H)
  1759. X$(OBJ)\mklev.o:        $(HACK_H)
  1760. X$(OBJ)\mkmaze.o:    $(HACK_H)    $(SP_LEV_H)
  1761. X$(OBJ)\mkobj.0:        $(HACK_H)    $(INCL)\artifact.h    $(INCL)\prop.h
  1762. X$(OBJ)\mkobj.1:        $(HACK_H)    $(INCL)\artifact.h    $(INCL)\prop.h
  1763. X$(OBJ)\mkobj.2-b:    $(HACK_H)    $(INCL)\artifact.h    $(INCL)\prop.h
  1764. X$(OBJ)\mkroom.0:    $(HACK_H)
  1765. X$(OBJ)\mkroom.1-b:    $(HACK_H)
  1766. X$(OBJ)\mon.0-1:        $(HACK_H)    $(INCL)\mfndpos.h    $(INCL)\edog.h
  1767. X$(OBJ)\mon.2-b:        $(HACK_H)    $(INCL)\mfndpos.h    $(INCL)\edog.h
  1768. X$(OBJ)\mondata.0-1:    $(HACK_H)    $(ESHK_H)    $(EPRI_H)
  1769. X$(OBJ)\mondata.2:    $(HACK_H)    $(ESHK_H)    $(EPRI_H)
  1770. X$(OBJ)\mondata.b:    $(HACK_H)    $(ESHK_H)    $(EPRI_H)
  1771. X$(OBJ)\monmove.0-1:    $(HACK_H)    $(INCL)\mfndpos.h $(INCL)\artifact.h
  1772. X$(OBJ)\monmove.2-b:    $(HACK_H)    $(INCL)\mfndpos.h $(INCL)\artifact.h
  1773. X$(OBJ)\monst.o:        $(CONFIG_H)    $(PERMONST_H)    $(INCL)\monsym.h \
  1774. X            $(ESHK_H)    $(VAULT_H)    $(EPRI_H) \
  1775. X            $(INCL)\color.h
  1776. X$(OBJ)\monstr.o:    $(CONFIG_H)
  1777. X$(OBJ)\mplayer.o:    $(HACK_H)
  1778. X$(OBJ)\mthrowu.0:    $(HACK_H)
  1779. X$(OBJ)\mthrowu.1:    $(HACK_H)
  1780. X$(OBJ)\mthrowu.2-b:    $(HACK_H)
  1781. X$(OBJ)\muse.o:        $(HACK_H)
  1782. X$(OBJ)\music.o:        $(HACK_H)
  1783. X$(OBJ)\o_init.o:    $(HACK_H)
  1784. X$(OBJ)\objects.o:    $(CONFIG_H)    $(INCL)\obj.h    $(INCL)\objclass.h \
  1785. X            $(INCL)\prop.h    $(INCL)\color.h
  1786. X$(OBJ)\objnam.0-1:    $(HACK_H)
  1787. X$(OBJ)\objnam.2-b:    $(HACK_H)
  1788. X$(OBJ)\options.o:    $(HACK_H)    $(INCL)\termcap.h
  1789. X$(OBJ)\pager.o:        $(HACK_H)
  1790. X    $(CC) $(CFLAGS) /Od /Fo$(OBJ)\$*.o $*.c
  1791. X$(OBJ)\pickup.o:    $(HACK_H)
  1792. X$(OBJ)\pline.o:        $(HACK_H)    $(EPRI_H)
  1793. X$(OBJ)\polyself.0-1:    $(HACK_H)
  1794. X$(OBJ)\polyself.2-b:    $(HACK_H)
  1795. X$(OBJ)\potion.o:    $(HACK_H)
  1796. X$(OBJ)\pray.o:        $(HACK_H)    $(EPRI_H)
  1797. X$(OBJ)\priest.0:    $(HACK_H)    $(INCL)\mfndpos.h    $(ESHK_H) \
  1798. X            $(EPRI_H)    $(EMIN_H)
  1799. X$(OBJ)\priest.1-b:    $(HACK_H)    $(INCL)\mfndpos.h    $(ESHK_H) \
  1800. X            $(EPRI_H)    $(EMIN_H)
  1801. X$(OBJ)\quest.o:        $(HACK_H)    $(INCL)\quest.h    $(INCL)\qtext.h
  1802. X$(OBJ)\questpgr.o:    $(HACK_H)    $(INCL)\qtext.h
  1803. X$(OBJ)\read.0:        $(HACK_H)
  1804. X$(OBJ)\read.1-b:    $(HACK_H)
  1805. X$(OBJ)\rect.o:        $(HACK_H)
  1806. X$(OBJ)\restore.o:    $(HACK_H)    $(INCL)\lev.h    $(INCL)\termcap.h \
  1807. X            $(INCL)\quest.h
  1808. X$(OBJ)\rip.o:        $(HACK_H)
  1809. X$(OBJ)\rnd.0:        $(HACK_H)
  1810. X$(OBJ)\rnd.1:        $(HACK_H)
  1811. X$(OBJ)\rnd.2-b:        $(HACK_H)
  1812. X$(OBJ)\rumors.o:    $(HACK_H)
  1813. X$(OBJ)\save.o:        $(HACK_H)    $(INCL)\lev.h    $(INCL)\quest.h
  1814. X$(OBJ)\shk.0:        $(HACK_H)    $(ESHK_H)
  1815. X$(OBJ)\shk.1-b:        $(HACK_H)    $(ESHK_H)
  1816. X$(OBJ)\shknam.0:    $(HACK_H)    $(ESHK_H)
  1817. X$(OBJ)\shknam.1-b:    $(HACK_H)    $(ESHK_H)
  1818. X$(OBJ)\sit.o:        $(HACK_H)    $(INCL)\artifact.h
  1819. X$(OBJ)\sounds.0:    $(HACK_H)    $(INCL)\edog.h    $(ESHK_H)
  1820. X$(OBJ)\sounds.1-b:    $(HACK_H)    $(INCL)\edog.h    $(ESHK_H)
  1821. X$(OBJ)\sp_lev.o:    $(HACK_H)    $(SP_LEV_H)    $(INCL)\rect.h
  1822. X$(OBJ)\spell.o:        $(HACK_H)
  1823. X$(OBJ)\steal.0-1:    $(HACK_H)
  1824. X$(OBJ)\steal.2-b:    $(HACK_H)
  1825. X$(OBJ)\timeout.0:    $(HACK_H)
  1826. X$(OBJ)\timeout.1-b:    $(HACK_H)
  1827. X$(OBJ)\topten.o:    $(HACK_H)
  1828. X$(OBJ)\track.0:        $(HACK_H)
  1829. X$(OBJ)\track.1:        $(HACK_H)
  1830. X$(OBJ)\track.2-b:    $(HACK_H)
  1831. X$(OBJ)\trap.0-1:    $(HACK_H)    $(INCL)\edog.h
  1832. X$(OBJ)\trap.2:        $(HACK_H)    $(INCL)\edog.h
  1833. X$(OBJ)\trap.b:        $(HACK_H)    $(INCL)\edog.h
  1834. X$(OBJ)\u_init.o:    $(HACK_H)
  1835. X$(OBJ)\uhitm.o:        $(HACK_H)    $(INCL)\artifact.h
  1836. X$(OBJ)\vault.0:        $(HACK_H)    $(VAULT_H)
  1837. X$(OBJ)\vault.1-b:    $(HACK_H)    $(VAULT_H)
  1838. X$(OBJ)\version.o:    $(HACK_H)    $(INCL)\date.h    $(INCL)\patchlev.h
  1839. X$(OBJ)\vision.o:    $(HACK_H)    $(INCL)\vis_tab.h
  1840. X$(OBJ)\vis_tab.o:    $(HACK_H)    $(INCL)\vis_tab.h
  1841. X$(OBJ)\weapon.0-1:    $(HACK_H)
  1842. X$(OBJ)\weapon.2-b:    $(HACK_H)
  1843. X$(OBJ)\were.0:        $(HACK_H)
  1844. X$(OBJ)\were.1-b:    $(HACK_H)
  1845. X$(OBJ)\wield.o:        $(HACK_H)
  1846. X$(OBJ)\wizard.0:    $(HACK_H)    $(INCL)\qtext.h
  1847. X$(OBJ)\wizard.1-b:    $(HACK_H)    $(INCL)\qtext.h
  1848. X$(OBJ)\worm.o:        $(HACK_H)    $(INCL)\lev.h
  1849. X$(OBJ)\worn.o:        $(HACK_H)
  1850. X$(OBJ)\write.o:        $(HACK_H)
  1851. X$(OBJ)\zap.o:        $(HACK_H)
  1852. END_OF_FILE
  1853. if test 23509 -ne `wc -c <'sys/msdos/MakeMSC.src'`; then
  1854.     echo shar: \"'sys/msdos/MakeMSC.src'\" unpacked with wrong size!
  1855. fi
  1856. # end of 'sys/msdos/MakeMSC.src'
  1857. fi
  1858. echo shar: End of archive 69 \(of 108\).
  1859. cp /dev/null ark69isdone
  1860. MISSING=""
  1861. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1862. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1863. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1864. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1865. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1866. 101 102 103 104 105 106 107 108 ; do
  1867.     if test ! -f ark${I}isdone ; then
  1868.     MISSING="${MISSING} ${I}"
  1869.     fi
  1870. done
  1871. if test "${MISSING}" = "" ; then
  1872.     echo You have unpacked all 108 archives.
  1873.     echo "Now execute 'rebuild.sh'"
  1874.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1875. else
  1876.     echo You still need to unpack the following archives:
  1877.     echo "        " ${MISSING}
  1878. fi
  1879. ##  End of shell archive.
  1880. exit 0
  1881.