home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / part40 < prev    next >
Internet Message Format  |  1993-02-01  |  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: v16i048:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part40/108
  5. Message-ID: <4342@master.CNA.TEK.COM>
  6. Date: 30 Jan 93 01:12:44 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1462
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1597
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 48
  14. Archive-name: nethack31/Part40
  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 40 (of 108)."
  27. # Contents:  src/ball.c src/monst.c2
  28. # Wrapped by billr@saab on Wed Jan 27 16:09:02 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'src/ball.c' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'src/ball.c'\"
  32. else
  33. echo shar: Extracting \"'src/ball.c'\" \(15527 characters\)
  34. sed "s/^X//" >'src/ball.c' <<'END_OF_FILE'
  35. X/*    SCCS Id: @(#)ball.c    3.1    92/11/04    */
  36. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  37. X/* NetHack may be freely redistributed.  See license for details. */
  38. X
  39. X/* Ball & Chain =============================================================*/
  40. X
  41. X#include "hack.h"
  42. X
  43. Xstatic void NDECL(litter);
  44. X
  45. Xvoid
  46. Xballfall()
  47. X{
  48. X    boolean gets_hit;
  49. X
  50. X    gets_hit = (((uball->ox != u.ux) || (uball->oy != u.uy)) &&
  51. X            ((uwep == uball)? FALSE : (boolean)rn2(5)));
  52. X    if (carried(uball)) {
  53. X        pline("Startled, you drop the iron ball.");
  54. X        if (uwep == uball)
  55. X            setuwep((struct obj *)0);
  56. X        if (uwep != uball)
  57. X            freeinv(uball);
  58. X    }
  59. X    if(gets_hit){
  60. X        int dmg = rn1(7,25);
  61. X        pline("The iron ball falls on your %s.",
  62. X            body_part(HEAD));
  63. X        if (uarmh)
  64. X            if(is_metallic(uarmh)) {
  65. X            pline("Fortunately, you are wearing a hard helmet.");
  66. X            dmg = 3;
  67. X            } else if (flags.verbose)
  68. X            Your("%s does not protect you.", xname(uarmh));
  69. X        losehp(dmg, "Crunched in the head by an iron ball",
  70. X            NO_KILLER_PREFIX);
  71. X    }
  72. X}
  73. X
  74. X/*
  75. X *  To make this work, we have to mess with the hero's mind.  The rules for
  76. X *  ball&chain are:
  77. X *
  78. X *    1. If the hero can see them, fine.
  79. X *    2. If the hero can't see either, it isn't seen.
  80. X *    3. If either is felt it is seen.
  81. X *    4. If either is felt and moved, it disappears.
  82. X *
  83. X *  If the hero can see, then when a move is done, the ball and chain are
  84. X *  first picked up, the positions under them are corrected, then they
  85. X *  are moved after the hero moves.  Not too bad
  86. X *
  87. X *  If the hero is blind, then she can "feel" the ball and/or chain at any
  88. X *  time.  However, when the hero moves, the felt ball and/or chain become
  89. X *  unfelt and whatever was felt "under" the ball&chain appears.  Pretty
  90. X *  nifty, but it requires that the ball&chain "remember" what was under
  91. X *  them --- i.e. they pick-up glyphs when they are felt and drop them when
  92. X *  moved (and felt).  When swallowed, the ball&chain are pulled completely
  93. X *  off of the dungeon, but are still on the object chain.  They are placed
  94. X *  under the hero when she is expelled.
  95. X */
  96. X
  97. X/*
  98. X *  Place the ball & chain under the hero.  Make sure that the ball & chain
  99. X *  variables are set (actually only needed when blind, but what the heck).
  100. X *  It is assumed that when this is called, the ball and chain are NOT
  101. X *  attached to the object list.
  102. X */
  103. Xvoid
  104. Xplacebc()
  105. X{
  106. X    if (!uchain || !uball) {
  107. X    impossible("Where are your ball and chain?");
  108. X    return;
  109. X    }
  110. X
  111. X    uchain->nobj = fobj;        /* put chain on object list */
  112. X    fobj = uchain;
  113. X
  114. X    if (carried(uball))        /* the ball is carried */
  115. X    u.bc_order = 0;            /* chain & ball at different pos */
  116. X    else {            /* the ball is NOT carried */
  117. X    uball->nobj = fobj;        /* put ball on object list */
  118. X    fobj = uball;
  119. X
  120. X    place_object(uball, u.ux, u.uy);
  121. X    u.bc_order = 1;            /* chain on top */
  122. X    }
  123. X
  124. X    place_object(uchain, u.ux, u.uy);
  125. X
  126. X    u.bglyph = u.cglyph = levl[u.ux][u.uy].glyph;   /* pick up glyph */
  127. X
  128. X    newsym(u.ux,u.uy);
  129. X}
  130. X
  131. Xvoid
  132. Xunplacebc()
  133. X{
  134. X    if (u.uswallow) return;    /* ball&chain not placed while swallowed */
  135. X
  136. X    if (!carried(uball)) {
  137. X    freeobj(uball);
  138. X    if (Blind && (u.bc_felt & BC_BALL))        /* drop glyph */
  139. X        levl[uball->ox][uball->oy].glyph = u.bglyph;
  140. X
  141. X    newsym(uball->ox,uball->oy);
  142. X    }
  143. X    freeobj(uchain);
  144. X    if (Blind && (u.bc_felt & BC_CHAIN))        /* drop glyph */
  145. X    levl[uchain->ox][uchain->oy].glyph = u.cglyph;
  146. X
  147. X    newsym(uchain->ox,uchain->oy);
  148. X    u.bc_felt = 0;                    /* feel nothing */
  149. X}
  150. X
  151. X
  152. X/*
  153. X *  bc_order()
  154. X *
  155. X *  Return the stacking of the hero's ball & chain.  This assumes that the
  156. X *  hero is being punished.
  157. X *
  158. X *  Return values:
  159. X *    0   ball & chain not at same location
  160. X *    1   chain on top
  161. X *    2   ball on top
  162. X */
  163. Xint
  164. Xbc_order()
  165. X{
  166. X    int order;
  167. X    struct obj *obj;
  168. X
  169. X    if (uchain->ox != uball->ox || uchain->oy != uball->oy || carried(uball))
  170. X    return 0;
  171. X
  172. X    obj = level.objects[uchain->ox][uchain->oy];
  173. X
  174. X    for (order = -1; obj; obj = obj->nexthere) {
  175. X    if (obj == uchain) {
  176. X        order = 1;
  177. X        break;
  178. X    }
  179. X    if (obj == uball) {
  180. X        order = 2;
  181. X        break;
  182. X    }
  183. X    }
  184. X    if (order < 0) {
  185. X    impossible("bc_order:  ball&chain not in same location!");
  186. X    order = 0;
  187. X    }
  188. X    return order;
  189. X}
  190. X
  191. X/*
  192. X *  set_bc()
  193. X *
  194. X *  The hero is either about to go blind or already blind and just punished.
  195. X *  Set up the ball and chain variables so that the ball and chain are "felt".
  196. X */
  197. Xvoid
  198. Xset_bc(already_blind)
  199. Xint already_blind;
  200. X{
  201. X    int ball_on_floor = !carried(uball);
  202. X    u.bc_order = bc_order();                /* get the order */
  203. X    u.bc_felt = ball_on_floor ? BC_BALL|BC_CHAIN : BC_CHAIN;    /* felt */
  204. X
  205. X    if (already_blind) {
  206. X    u.cglyph = u.bglyph = levl[u.ux][u.uy].glyph;
  207. X    return;
  208. X    }
  209. X
  210. X    /*
  211. X     *  Since we can still see, remove the ball&chain and get the glyph that
  212. X     *  would be beneath them.  Then put the ball&chain back.  This is pretty
  213. X     *  disgusting, but it will work.
  214. X     */
  215. X    remove_object(uchain);
  216. X    if (ball_on_floor) remove_object(uball);
  217. X
  218. X    newsym(uchain->ox, uchain->oy);
  219. X    u.cglyph = levl[uchain->ox][uchain->oy].glyph;
  220. X
  221. X    if (u.bc_order) {            /* same location (ball not carried) */
  222. X    u.bglyph = u.cglyph;
  223. X    if (u.bc_order == 1) {
  224. X        place_object(uball,  uball->ox, uball->oy);
  225. X        place_object(uchain, uchain->ox, uchain->oy);
  226. X    } else {
  227. X        place_object(uchain, uchain->ox, uchain->oy);
  228. X        place_object(uball,  uball->ox, uball->oy);
  229. X    }
  230. X    newsym(uball->ox, uball->oy);
  231. X    } else {                    /* different locations */
  232. X    place_object(uchain, uchain->ox, uchain->oy);
  233. X    newsym(uchain->ox, uchain->oy);
  234. X    if (ball_on_floor) {
  235. X        newsym(uball->ox, uball->oy);        /* see under ball */
  236. X        u.bglyph = levl[uball->ox][uball->oy].glyph;
  237. X        place_object(uball,  uball->ox, uball->oy);
  238. X        newsym(uball->ox, uball->oy);        /* restore ball */
  239. X    }
  240. X    }
  241. X}
  242. X
  243. X
  244. X/*
  245. X *  move_bc()
  246. X *
  247. X *  Move the ball and chain.  This is called twice for every move.  The first
  248. X *  time to pick up the ball and chain before the move, the second time to
  249. X *  place the ball and chain after the move.  If the ball is carried, this
  250. X *  function should never have BC_BALL as part of it's control.
  251. X */
  252. Xvoid
  253. Xmove_bc(before, control, ballx, bally, chainx, chainy)
  254. Xint   before, control;
  255. Xxchar ballx, bally, chainx, chainy;
  256. X{
  257. X    if (Blind) {
  258. X    /*
  259. X     *  The hero is blind.  Time to work hard.  The ball and chain that
  260. X     *  are attached to the hero are very special.  The hero knows that
  261. X     *  they are attached, so when they move, the hero knows that they
  262. X     *  aren't at the last position remembered.  This is complicated
  263. X     *  by the fact that the hero can "feel" the surrounding locations
  264. X     *  at any time, hence, making one or both of them show up again.
  265. X     *  So, we have to keep track of which is felt at any one time and
  266. X     *  act accordingly.
  267. X     */
  268. X    if (!before) {
  269. X        if ((control & BC_CHAIN) && (control & BC_BALL)) {
  270. X        /*
  271. X         *  Both ball and chain moved.  If felt, drop glyph.
  272. X         */
  273. X        if (u.bc_felt & BC_BALL)            /* ball felt */
  274. X            levl[uball->ox][uball->oy].glyph = u.bglyph;
  275. X        if (u.bc_felt & BC_CHAIN)            /* chain felt */
  276. X            levl[uchain->ox][uchain->oy].glyph = u.cglyph;
  277. X        u.bc_felt = 0;
  278. X
  279. X        /* Pick up glyph a new location. */
  280. X        u.bglyph = levl[ballx][bally].glyph;
  281. X        u.cglyph = levl[chainx][chainy].glyph;
  282. X
  283. X        movobj(uball,ballx,bally);
  284. X        movobj(uchain,chainx,chainy);
  285. X        } else if (control & BC_BALL) {
  286. X        if (u.bc_felt & BC_BALL) {    /* ball felt */
  287. X            if (!u.bc_order) {            /* ball by itself */
  288. X            levl[uball->ox][uball->oy].glyph = u.bglyph;
  289. X            } else if (u.bc_order == 2) {    /* ball on top */
  290. X            if (u.bc_felt & BC_CHAIN) {    /* chain felt */
  291. X                map_object(uchain, 0);
  292. X            } else {
  293. X                levl[uball->ox][uball->oy].glyph = u.bglyph;
  294. X            }
  295. X            }
  296. X            u.bc_felt &= ~BC_BALL;    /* no longer feel the ball */
  297. X        }
  298. X
  299. X        /* Pick up glyph at new position. */
  300. X        u.bglyph = (ballx != chainx || bally != chainy) ?
  301. X                    levl[ballx][bally].glyph : u.cglyph;
  302. X
  303. X        movobj(uball,ballx,bally);
  304. X        } else if (control & BC_CHAIN) {
  305. X        if (u.bc_felt & BC_CHAIN) {    /* chain felt */
  306. X            if (!u.bc_order) {            /* chain by itself */
  307. X            levl[uchain->ox][uchain->oy].glyph = u.cglyph;
  308. X            } else if (u.bc_order == 1) {   /* chain on top */
  309. X            if (u.bc_felt & BC_BALL) {    /* ball felt */
  310. X                map_object(uball, 0);
  311. X            } else {
  312. X                levl[uchain->ox][uchain->oy].glyph = u.cglyph;
  313. X            }
  314. X            }
  315. X            u.bc_felt &= ~BC_CHAIN;
  316. X        }
  317. X        /* Pick up glyph beneath at new position. */
  318. X        u.cglyph = (ballx != chainx || bally != chainy) ?
  319. X                    levl[chainx][chainy].glyph : u.bglyph;
  320. X
  321. X        movobj(uchain,chainx,chainy);
  322. X        }
  323. X
  324. X        u.bc_order = bc_order();    /* reset the order */
  325. X    }
  326. X
  327. X    } else {
  328. X    /*
  329. X     *  The hero is not blind.  To make this work correctly, we need to
  330. X     *  pick up the ball and chain before the hero moves, then put them
  331. X     *  in their new positions after the hero moves.
  332. X     */
  333. X    if (before) {
  334. X        /*
  335. X         *  Neither ball nor chain moved, so remember which was on top.
  336. X         *  Use the variable 'u.bc_order' since it is only valid when
  337. X         *  blind.
  338. X         */
  339. X        if (!control) u.bc_order = bc_order();
  340. X
  341. X        remove_object(uchain);
  342. X        newsym(uchain->ox, uchain->oy);
  343. X        if (!carried(uball)) {
  344. X        remove_object(uball);
  345. X        newsym(uball->ox,  uball->oy);
  346. X        }
  347. X    } else {
  348. X        int on_floor = !carried(uball);
  349. X
  350. X        if ((control & BC_CHAIN) || (!control && u.bc_order == 1)) {
  351. X        /* If the chain moved or nothing moved & chain on top. */
  352. X        if (on_floor) place_object(uball,  ballx, bally);
  353. X        place_object(uchain, chainx, chainy);    /* chain on top */
  354. X        } else {
  355. X        place_object(uchain, chainx, chainy);
  356. X        if (on_floor) place_object(uball,  ballx, bally);
  357. X                                /* ball on top */
  358. X        }
  359. X        newsym(chainx, chainy);
  360. X        if (on_floor) newsym(ballx, bally);
  361. X    }
  362. X    }
  363. X}
  364. X
  365. X/* return TRUE if ball could be dragged */
  366. Xboolean
  367. Xdrag_ball(x, y, bc_control, ballx, bally, chainx, chainy)
  368. Xxchar x, y;
  369. Xint *bc_control;
  370. Xxchar *ballx, *bally, *chainx, *chainy;
  371. X{
  372. X    struct trap *t = (struct trap *)0;
  373. X
  374. X    *ballx  = uball->ox;
  375. X    *bally  = uball->oy;
  376. X    *chainx = uchain->ox;
  377. X    *chainy = uchain->oy;
  378. X    *bc_control = 0;
  379. X
  380. X    if (dist2(x, y, uchain->ox, uchain->oy) <= 2) {
  381. X        *bc_control = 0;    /* nothing moved */
  382. X        move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy);
  383. X        return TRUE;
  384. X    }
  385. X
  386. X    if (carried(uball) || dist2(x, y, uball->ox, uball->oy) < 3 ||
  387. X        (uball->ox == uchain->ox && uball->oy == uchain->oy)) {
  388. X        *chainx = u.ux;
  389. X        *chainy = u.uy;
  390. X        *bc_control = BC_CHAIN;
  391. X        move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy);
  392. X        return TRUE;
  393. X    }
  394. X
  395. X    if (near_capacity() > SLT_ENCUMBER) {
  396. X        You("cannot %sdrag the heavy iron ball.",
  397. X                invent ? "carry all that and also " : "");
  398. X        nomul(0);
  399. X        return FALSE;
  400. X    }
  401. X
  402. X    if ((is_pool(uchain->ox, uchain->oy) &&
  403. X            (levl[uchain->ox][uchain->oy].typ == POOL ||
  404. X             !is_pool(uball->ox, uball->oy) || 
  405. X             levl[uball->ox][uball->oy].typ == POOL))
  406. X        || ((t = t_at(uchain->ox, uchain->oy)) && 
  407. X            (t->ttyp == PIT ||
  408. X             t->ttyp == SPIKED_PIT ||
  409. X             t->ttyp == TRAPDOOR)) ) {
  410. X
  411. X        if (Levitation) {
  412. X        You("feel a tug from your iron ball.");
  413. X        if (t) t->tseen = 1;
  414. X        } else {
  415. X        struct monst *victim;
  416. X
  417. X        You("are jerked back by your iron ball!");
  418. X        if (victim = m_at(uchain->ox, uchain->oy)) {
  419. X            int tmp;
  420. X
  421. X            tmp = -2 + Luck + find_mac(victim);
  422. X
  423. X            if (victim->msleep) {
  424. X            victim->msleep = 0;
  425. X            tmp += 2;
  426. X            }
  427. X            if (!victim->mcanmove) {
  428. X            tmp += 4;
  429. X            if (!rn2(10)) {
  430. X                victim->mcanmove = 1;
  431. X                victim->mfrozen = 0;
  432. X            }
  433. X            }
  434. X            if (tmp >= rnd(20))
  435. X            (void) hmon(victim,uball,1); 
  436. X            else 
  437. X            miss(xname(uball), victim);
  438. X
  439. X        }         /* now check again in case mon died */
  440. X        if (!m_at(uchain->ox, uchain->oy)) {
  441. X            u.ux = uchain->ox;
  442. X            u.uy = uchain->oy;
  443. X            newsym(u.ux0, u.uy0);
  444. X        }
  445. X        nomul(0);
  446. X
  447. X        *ballx = uchain->ox;
  448. X        *bally = uchain->oy;
  449. X        *bc_control = BC_BALL;
  450. X        move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy);
  451. X        move_bc(0, *bc_control, *ballx, *bally, *chainx, *chainy);
  452. X        spoteffects();
  453. X        return FALSE;
  454. X        } 
  455. X    }
  456. X
  457. X    *ballx  = uchain->ox;
  458. X    *bally  = uchain->oy;
  459. X    *chainx = u.ux;
  460. X    *chainy = u.uy;
  461. X    *bc_control = BC_BALL|BC_CHAIN;;
  462. X    nomul(-2);
  463. X    nomovemsg = "";
  464. X
  465. X    move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy);
  466. X    return TRUE;
  467. X}
  468. X
  469. X/*
  470. X *  drop_ball()
  471. X *
  472. X *  The punished hero drops or throws her iron ball.  If the hero is
  473. X *  blind, we must reset the order and glyph.  Check for side effects.
  474. X *  This routine expects the ball to be already placed.
  475. X */
  476. Xvoid
  477. Xdrop_ball(x, y)
  478. Xxchar x, y;
  479. X{
  480. X    if (Blind) {
  481. X    u.bc_order = bc_order();            /* get the order */
  482. X                            /* pick up glyph */
  483. X    u.bglyph = (u.bc_order) ? u.cglyph : levl[x][y].glyph;
  484. X    }
  485. X
  486. X    if (x != u.ux || y != u.uy) {
  487. X    struct trap *t;
  488. X    const char *pullmsg = "The ball pulls you out of the %s!";
  489. X
  490. X    if (u.utrap && u.utraptype != TT_INFLOOR) {
  491. X        switch(u.utraptype) {
  492. X        case TT_PIT:
  493. X        pline(pullmsg, "pit");
  494. X        break;
  495. X        case TT_WEB:
  496. X        pline(pullmsg, "web");
  497. X        pline("The web is destroyed!");
  498. X        deltrap(t_at(u.ux,u.uy));
  499. X        break;
  500. X        case TT_LAVA:
  501. X        pline(pullmsg, "lava");
  502. X        break;
  503. X        case TT_BEARTRAP: {
  504. X        register long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
  505. X        pline(pullmsg, "bear trap");
  506. X        Your("%s %s is severely damaged.",
  507. X                    (side == LEFT_SIDE) ? "left" : "right",
  508. X                    body_part(LEG));
  509. X        set_wounded_legs(side, rn1(1000, 500));
  510. X        losehp(2, "leg damage from being pulled out of a bear trap",
  511. X                    KILLED_BY);
  512. X        break;
  513. X          }
  514. X        }
  515. X        u.utrap = 0;
  516. X        fill_pit(u.ux, u.uy);
  517. X    }
  518. X
  519. X    u.ux0 = u.ux;
  520. X    u.uy0 = u.uy;
  521. X    if (!Levitation && !MON_AT(x, y) && !u.utrap &&
  522. X                (is_pool(x, y) ||
  523. X                 ((t = t_at(x, y)) &&
  524. X                  ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT) ||
  525. X                   (t->ttyp == TRAPDOOR))))) {
  526. X        u.ux = x;
  527. X        u.uy = y;
  528. X    } else {
  529. X        u.ux = x - u.dx;
  530. X        u.uy = y - u.dy;
  531. X    }
  532. X    vision_full_recalc = 1;    /* hero has moved, recalculate vision later */
  533. X
  534. X    if (Blind) {
  535. X        /* drop glyph under the chain */
  536. X        if (u.bc_felt & BC_CHAIN)
  537. X        levl[uchain->ox][uchain->oy].glyph = u.cglyph;
  538. X        u.bc_felt  = 0;        /* feel nothing */
  539. X        u.bc_order = bc_order();    /* reset bc order */
  540. X    }
  541. X    movobj(uchain,u.ux,u.uy);    /* has a newsym */
  542. X    newsym(u.ux0,u.uy0);        /* clean up old position */
  543. X    spoteffects();
  544. X    }
  545. X}
  546. X
  547. X
  548. Xstatic void
  549. Xlitter()
  550. X{
  551. X    struct obj *otmp = invent, *nextobj;
  552. X    int capacity = weight_cap();
  553. X
  554. X    while (otmp) {
  555. X        nextobj = otmp->nobj;
  556. X        if ((otmp != uball) && (rnd(capacity) <= otmp->owt)) {
  557. X            if (otmp == uwep)
  558. X                setuwep((struct obj *)0);
  559. X            if ((otmp != uwep) && (canletgo(otmp, ""))) {
  560. X                Your("%s you down the stairs.",
  561. X                     aobjnam(otmp, "follow"));
  562. X                dropx(otmp);
  563. X            }
  564. X        }
  565. X        otmp = nextobj;
  566. X    }
  567. X}
  568. X
  569. Xvoid
  570. Xdrag_down()
  571. X{
  572. X    boolean forward;
  573. X    uchar dragchance = 3;
  574. X
  575. X    /* 
  576. X     *    Assume that the ball falls forward if:
  577. X     *
  578. X     *    a) the character is wielding it, or
  579. X     *    b) the character has both hands available to hold it (i.e. is 
  580. X     *       not wielding any weapon), or 
  581. X     *    c) (perhaps) it falls forward out of his non-weapon hand
  582. X     */
  583. X
  584. X    forward = (!(carried(uball))? 
  585. X          FALSE : ((uwep == uball) || (!uwep))? 
  586. X              TRUE : (boolean)(rn2(3) / 2));
  587. X
  588. X    if (carried(uball)) 
  589. X        You("lose your grip on the iron ball.");
  590. X
  591. X    if (forward) {
  592. X        if(rn2(6)) {
  593. X            You("get dragged downstairs by the iron ball.");
  594. X            losehp(rnd(6), "dragged downstairs by an iron ball",
  595. X                NO_KILLER_PREFIX);
  596. X            litter();
  597. X        }
  598. X    } else {
  599. X        if(rn2(2)) {
  600. X            pline("The iron ball smacks into you!");
  601. X            losehp(rnd(20), "iron ball collision", KILLED_BY_AN);
  602. X            exercise(A_STR, FALSE);
  603. X            dragchance -= 2;
  604. X        } 
  605. X        if( (int) dragchance >= rnd(6)) {
  606. X            You("get dragged downstairs by the iron ball.");
  607. X            losehp(rnd(3), "dragged downstairs by an iron ball",
  608. X                NO_KILLER_PREFIX);
  609. X            exercise(A_STR, FALSE);
  610. X            litter();
  611. X        }
  612. X    }
  613. X}
  614. X
  615. X/*ball.c*/
  616. END_OF_FILE
  617. if test 15527 -ne `wc -c <'src/ball.c'`; then
  618.     echo shar: \"'src/ball.c'\" unpacked with wrong size!
  619. fi
  620. # end of 'src/ball.c'
  621. fi
  622. if test -f 'src/monst.c2' -a "${1}" != "-c" ; then 
  623.   echo shar: Will not clobber existing file \"'src/monst.c2'\"
  624. else
  625. echo shar: Extracting \"'src/monst.c2'\" \(39362 characters\)
  626. sed "s/^X//" >'src/monst.c2' <<'END_OF_FILE'
  627. X/* horrible kludge alert:
  628. X * This is a compiler-specific kludge to allow the compilation of monst.o in
  629. X * two pieces, by defining first SPLITMON_1 and then SPLITMON_2. The
  630. X * resulting assembler files (monst1.s and monst2.s) are then run through
  631. X * sed to change local symbols, concatenated together, and assembled to
  632. X * produce monst.o. THIS ONLY WORKS WITH THE ATARI GCC, and should only
  633. X * be done if you don't have enough memory to compile monst.o the "normal"
  634. X * way.  --ERS
  635. X */
  636. X
  637. X#ifndef SPLITMON_1
  638. X#ifdef SPLITMON_2
  639. Xstruct permonst _mons2[] = {
  640. X#endif
  641. X/*    giant Humanoids */
  642. X    { "giant", S_GIANT, 6, 6, 0, 0, 2, (G_GENO | G_NOGEN | 1),
  643. X      { { AT_WEAP, AD_PHYS, 2, 10 }, NO_ATTK, NO_ATTK,
  644. X        NO_ATTK, NO_ATTK, NO_ATTK },
  645. X      2250, 750, 0, MS_SILENT, MZ_HUGE, 0, 0,
  646. X      M1_HUMANOID,
  647. X      M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT |
  648. X      M2_JEWELS, 0, C(RED) },
  649. X    { "stone giant", S_GIANT, 6, 6, 0, 0, 2, (G_GENO | G_SGROUP | 1),
  650. X      { { AT_WEAP, AD_PHYS, 2, 10 }, NO_ATTK, NO_ATTK,
  651. X        NO_ATTK, NO_ATTK, NO_ATTK },
  652. X      2250, 750, 0, MS_SILENT, MZ_HUGE, 0, 0,
  653. X      M1_HUMANOID,
  654. X      M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT |
  655. X      M2_JEWELS, 0, C(GRAY) },
  656. X    { "hill giant", S_GIANT, 8, 10, 6, 0, -2, (G_GENO | G_SGROUP | 1),
  657. X      { { AT_WEAP, AD_PHYS, 2, 8 }, NO_ATTK, NO_ATTK,
  658. X        NO_ATTK, NO_ATTK, NO_ATTK },
  659. X      2200, 700, 0, MS_SILENT, MZ_HUGE, 0, 0,
  660. X      M1_HUMANOID,
  661. X      M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT |
  662. X      M2_JEWELS, 0, C(CYAN) },
  663. X    { "fire giant", S_GIANT, 9, 12, 4, 5, 2, (G_GENO | G_SGROUP | 1),
  664. X      { { AT_WEAP, AD_PHYS, 2, 10 }, NO_ATTK, NO_ATTK,
  665. X        NO_ATTK, NO_ATTK, NO_ATTK },
  666. X      2250, 750, 0, MS_SILENT, MZ_HUGE, MR_FIRE, MR_FIRE,
  667. X      M1_HUMANOID,
  668. X      M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT |
  669. X      M2_JEWELS, 0, C(YELLOW) },
  670. X    { "frost giant", S_GIANT, 10, 12, 3, 10, -3, (G_GENO | G_SGROUP | 1),
  671. X      { { AT_WEAP, AD_PHYS, 2, 12 }, NO_ATTK, NO_ATTK,
  672. X        NO_ATTK, NO_ATTK, NO_ATTK },
  673. X      2250, 750, 0, MS_SILENT, MZ_HUGE, MR_COLD, MR_COLD,
  674. X      M1_HUMANOID,
  675. X      M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT |
  676. X      M2_JEWELS, 0, C(WHITE) },
  677. X    { "ettin", S_GIANT, 10, 12, 3, 0, 0, (G_GENO | 1),
  678. X      { { AT_WEAP, AD_PHYS, 2, 8 }, { AT_WEAP, AD_PHYS, 3, 6 },
  679. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  680. X      1700, 500, 0, MS_GRUNT, MZ_HUGE, 0, 0,
  681. X      M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
  682. X      M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, 0, C(BROWN) },
  683. X    { "titan", S_GIANT, 16, 18, -3, 70, 9, 1,
  684. X      { { AT_WEAP, AD_PHYS, 2, 8 }, { AT_MAGC, AD_SPEL, 0, 0 },
  685. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  686. X      2300, 900, 0, MS_SILENT, MZ_HUGE, 0, 0,
  687. X      M1_FLY | M1_HUMANOID, M2_STRONG | M2_ROCKTHROW | M2_NASTY |
  688. X      M2_COLLECT | M2_MAGIC, 0, C(MAGENTA) },
  689. X    { "minotaur", S_GIANT, 15, 15, 6, 0, 0, (G_GENO | G_NOGEN),
  690. X      { { AT_CLAW, AD_PHYS, 3, 10 }, { AT_CLAW, AD_PHYS, 3, 10 },
  691. X        { AT_BUTT, AD_PHYS, 2, 8}, NO_ATTK, NO_ATTK, NO_ATTK },
  692. X      1500, 700, 0, MS_SILENT, MZ_LARGE, 0, 0,
  693. X      M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
  694. X      M2_HOSTILE | M2_STRONG | M2_NASTY, 0, C(BROWN) },
  695. X/*    Invisible stalker    */
  696. X    { "stalker", S_STALKER, 8, 12, 3, 0, 0, (G_GENO | 3),
  697. X      { { AT_CLAW, AD_PHYS, 4, 4 }, NO_ATTK, NO_ATTK,
  698. X        NO_ATTK, NO_ATTK, NO_ATTK },
  699. X      900, 400, 0, MS_SILENT, MZ_LARGE, 0, 0,
  700. X      M1_ANIMAL | M1_FLY | M1_SEE_INVIS,
  701. X      M2_WANDER | M2_STALK | M2_HOSTILE | M2_STRONG, 0, C(WHITE) },
  702. X/*    Jabberwock */
  703. X    { "jabberwock", S_JABBERWOCK, 15, 12, -2, 50, 0, (G_GENO | 1),
  704. X      { { AT_BITE, AD_PHYS, 2, 10 }, { AT_BITE, AD_PHYS, 2, 10 },
  705. X        { AT_CLAW, AD_PHYS, 2, 10 }, { AT_CLAW, AD_PHYS, 2, 10 },
  706. X        NO_ATTK, NO_ATTK },
  707. X      1300, 600, 0, MS_BURBLE, MZ_LARGE, 0, 0,
  708. X      M1_ANIMAL | M1_FLY | M1_CARNIVORE,
  709. X      M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT,
  710. X      0, C(ORANGE_COLORED) },
  711. X/*    Kops    */
  712. X#ifdef KOPS
  713. X    { "Keystone Kop", S_KOP, 1, 6, MARM(10,7), 10, 9,
  714. X      (G_GENO | G_LGROUP | G_NOGEN),
  715. X      { { AT_WEAP, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  716. X        NO_ATTK, NO_ATTK, NO_ATTK },
  717. X      WT_HUMAN, 200, 0, MS_ARREST, MZ_HUMAN, 0, 0, M1_HUMANOID,
  718. X      M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_MALE | M2_COLLECT,
  719. X      0, C(BLUE) },
  720. X    { "Kop Sergeant", S_KOP, 2, 8, MARM(10,6), 10, 10,
  721. X      (G_GENO | G_SGROUP | G_NOGEN),
  722. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  723. X        NO_ATTK, NO_ATTK, NO_ATTK },
  724. X      WT_HUMAN, 200, 0, MS_ARREST, MZ_HUMAN, 0, 0, M1_HUMANOID,
  725. X      M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
  726. X      0, C(BLUE) },
  727. X    { "Kop Lieutenant", S_KOP, 3, 10, MARM(10,5), 20, 11,
  728. X      (G_GENO | G_NOGEN),
  729. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  730. X        NO_ATTK, NO_ATTK, NO_ATTK },
  731. X      WT_HUMAN, 200, 0, MS_ARREST, MZ_HUMAN, 0, 0, M1_HUMANOID,
  732. X      M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
  733. X      0, C(CYAN) },
  734. X    { "Kop Kaptain", S_KOP, 4, 12, MARM(10,4), 20, 12, (G_GENO | G_NOGEN),
  735. X      { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK,
  736. X        NO_ATTK, NO_ATTK, NO_ATTK },
  737. X      WT_HUMAN, 200, 0, MS_ARREST, MZ_HUMAN, 0, 0, M1_HUMANOID,
  738. X      M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
  739. X      0, C(HI_LORD) },
  740. X#endif
  741. X/*    Liches     */
  742. X    { "lich", S_LICH, 11, 6, 0, 30, -9, (G_GENO | 1),
  743. X      { { AT_TUCH, AD_COLD, 1, 10 }, { AT_MAGC, AD_SPEL, 0, 0 },
  744. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  745. X      1200, 100, 0, MS_MUMBLE, MZ_HUMAN,
  746. X      MR_COLD | MR_SLEEP | MR_POISON, MR_COLD,
  747. X      M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
  748. X      M2_UNDEAD | M2_HOSTILE | M2_MAGIC, 0, C(BROWN) },
  749. X    { "demilich", S_LICH, 14, 9, -2, 60, -12, (G_GENO | 1),
  750. X      { { AT_TUCH, AD_COLD, 3, 4 }, { AT_MAGC, AD_SPEL, 0, 0 },
  751. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  752. X      1200, 100, 0, MS_MUMBLE, MZ_HUMAN,
  753. X      MR_COLD | MR_SLEEP | MR_POISON, MR_COLD,
  754. X      M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
  755. X      M2_UNDEAD | M2_HOSTILE | M2_MAGIC, 0, C(RED) },
  756. X    { "master lich", S_LICH, 17, 9, -4, 90, -15, (G_HELL | G_GENO | 1),
  757. X      { { AT_TUCH, AD_COLD, 3, 6 }, { AT_MAGC, AD_SPEL, 0, 0 },
  758. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  759. X      1200, 100, 0, MS_MUMBLE, MZ_HUMAN,
  760. X      MR_FIRE | MR_COLD | MR_SLEEP | MR_POISON, MR_FIRE | MR_COLD,
  761. X      M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
  762. X      M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK, C(HI_LORD) },
  763. X/*    Mummies     */
  764. X    { "kobold mummy", S_MUMMY, 3, 8, 6, 20, -2, (G_GENO | G_NOCORPSE | 1),
  765. X      { { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  766. X        NO_ATTK, NO_ATTK, NO_ATTK },
  767. X      400, 50, 0, MS_SILENT, MZ_SMALL,
  768. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  769. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  770. X      M2_UNDEAD | M2_HOSTILE, 0, C(BROWN) },
  771. X    { "gnome mummy", S_MUMMY, 4, 10, 6, 20, -3, (G_GENO | G_NOCORPSE | 1),
  772. X      { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  773. X        NO_ATTK, NO_ATTK, NO_ATTK },
  774. X      650, 50, 0, MS_SILENT, MZ_SMALL,
  775. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  776. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  777. X      M2_UNDEAD | M2_HOSTILE, 0, C(RED) },
  778. X    { "orc mummy", S_MUMMY, 5, 10, 5, 20, -4, (G_GENO | G_NOCORPSE | 1),
  779. X      { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  780. X        NO_ATTK, NO_ATTK, NO_ATTK },
  781. X      850, 75, 0, MS_SILENT, MZ_HUMAN,
  782. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  783. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  784. X      M2_UNDEAD | M2_HOSTILE | M2_ORC | M2_GREEDY | M2_JEWELS, 0, C(GRAY) },
  785. X    { "elf mummy", S_MUMMY, 6, 12, 4, 30, -5, (G_GENO | G_NOCORPSE | 1),
  786. X      { { AT_CLAW, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  787. X        NO_ATTK, NO_ATTK, NO_ATTK },
  788. X      WT_ELF, 175, 0, MS_SILENT, MZ_HUMAN,
  789. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  790. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  791. X      M2_UNDEAD | M2_HOSTILE | M2_ELF, 0, C(GREEN) },
  792. X    { "human mummy", S_MUMMY, 6, 12, 4, 30, -5, (G_GENO | G_NOCORPSE | 1),
  793. X      { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
  794. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  795. X      WT_HUMAN, 200, 0, MS_SILENT, MZ_HUMAN,
  796. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  797. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  798. X      M2_UNDEAD | M2_HOSTILE, 0, C(GRAY) },
  799. X    { "ettin mummy", S_MUMMY, 7, 12, 4, 30, -6, (G_GENO | G_NOCORPSE | 1),
  800. X      { { AT_CLAW, AD_PHYS, 2, 6 }, { AT_CLAW, AD_PHYS, 2, 6 },
  801. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  802. X      1700, 250, 0, MS_SILENT, MZ_HUGE,
  803. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  804. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  805. X      M2_UNDEAD | M2_HOSTILE | M2_STRONG, 0, C(BLUE) },
  806. X    { "giant mummy", S_MUMMY, 8, 14, 3, 30, -7, (G_GENO | G_NOCORPSE | 1),
  807. X      { { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 },
  808. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  809. X      2050, 375, 0, MS_SILENT, MZ_HUGE,
  810. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  811. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  812. X      M2_UNDEAD | M2_HOSTILE | M2_GIANT | M2_STRONG | M2_JEWELS,
  813. X      0, C(CYAN) },
  814. X/*    Nagas    */
  815. X    { "red naga hatchling", S_NAGA, 3, 10, 6, 0, 0, G_GENO,
  816. X      { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  817. X        NO_ATTK, NO_ATTK, NO_ATTK },
  818. X      500, 100, 0, MS_MUMBLE, MZ_LARGE,
  819. X      MR_FIRE | MR_POISON, MR_FIRE | MR_POISON,
  820. X      M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE, M2_STRONG, 0, C(RED) },
  821. X    { "black naga hatchling", S_NAGA, 3, 10, 6, 0, 0, G_GENO,
  822. X      { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  823. X        NO_ATTK, NO_ATTK, NO_ATTK },
  824. X      500, 100, 0, MS_MUMBLE, MZ_LARGE,
  825. X      MR_POISON | MR_ACID | MR_STONE, MR_POISON | MR_STONE,
  826. X      M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE, M2_STRONG, 0, C(BLACK) },
  827. X    { "golden naga hatchling", S_NAGA, 3, 10, 6, 0, 0, G_GENO,
  828. X      { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  829. X        NO_ATTK, NO_ATTK, NO_ATTK },
  830. X      500, 100, 0, MS_MUMBLE, MZ_LARGE, MR_POISON, MR_POISON,
  831. X      M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE, M2_STRONG, 0, C(HI_GOLD) },
  832. X    { "guardian naga hatchling", S_NAGA, 3, 10, 6, 0, 0, G_GENO,
  833. X      { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  834. X        NO_ATTK, NO_ATTK, NO_ATTK },
  835. X      500, 100, 0, MS_MUMBLE, MZ_LARGE, MR_POISON, MR_POISON,
  836. X      M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE, M2_STRONG, 0, C(GREEN) },
  837. X    { "red naga", S_NAGA, 6, 12, 4, 0, -4, (G_GENO | 1),
  838. X      { { AT_BITE, AD_PHYS, 2, 4 }, { AT_BREA, AD_FIRE, 2, 6 },
  839. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  840. X      2600, 400, 0, MS_MUMBLE, MZ_HUGE,
  841. X      MR_FIRE | MR_POISON, MR_FIRE | MR_POISON,
  842. X      M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS,
  843. X      M2_STRONG, 0, C(RED) },
  844. X    { "black naga", S_NAGA, 8, 14, 2, 10, 4, (G_GENO | 1),
  845. X      { { AT_BITE, AD_PHYS, 2, 6 }, { AT_SPIT, AD_ACID, 0, 0 },
  846. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  847. X      2600, 400, 0, MS_MUMBLE, MZ_HUGE,
  848. X      MR_POISON | MR_ACID | MR_STONE, MR_POISON | MR_STONE,
  849. X      M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_ACID,
  850. X      M2_STRONG, 0, C(BLACK) },
  851. X    { "golden naga", S_NAGA, 10, 14, 2, 70, 5, (G_GENO | 1),
  852. X      { { AT_BITE, AD_PHYS, 2, 6 }, { AT_MAGC, AD_SPEL, 4, 6 },
  853. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  854. X      2600, 400, 0, MS_MUMBLE, MZ_HUGE, MR_POISON, MR_POISON,
  855. X      M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS,
  856. X      M2_STRONG, 0, C(HI_GOLD) },
  857. X    { "guardian naga", S_NAGA, 12, 16, 0, 50, 7, (G_GENO | 1),
  858. X      { { AT_BITE, AD_PLYS, 1, 6 }, { AT_HUGS, AD_PHYS, 2, 4 },
  859. X        { AT_SPIT, AD_DRST, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  860. X      2600, 400, 0, MS_MUMBLE, MZ_HUGE, MR_POISON, MR_POISON,
  861. X      M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_POIS,
  862. X      M2_STRONG, 0, C(GREEN) },
  863. X/*    Ogres    */
  864. X    { "ogre", S_OGRE, 5, 10, 5, 0, -3, (G_SGROUP | G_GENO | 1),
  865. X      { { AT_WEAP, AD_PHYS, 2, 5 }, NO_ATTK, NO_ATTK,
  866. X        NO_ATTK, NO_ATTK, NO_ATTK },
  867. X      1600, 500, 0, MS_GRUNT, MZ_LARGE, 0, 0,
  868. X      M1_HUMANOID, M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
  869. X      0, C(BROWN) },
  870. X    { "ogre lord", S_OGRE, 7, 12, 3, 30, -5, (G_GENO | 2),
  871. X      { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK,
  872. X        NO_ATTK, NO_ATTK, NO_ATTK },
  873. X      1700, 700, 0, MS_GRUNT, MZ_LARGE, 0, 0, M1_HUMANOID,
  874. X      M2_STRONG | M2_LORD | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT,
  875. X      0, C(RED) },
  876. X    { "ogre king", S_OGRE, 7, 14, 4, 60, -7, (G_GENO | 2),
  877. X      { { AT_WEAP, AD_PHYS, 3, 5 }, NO_ATTK, NO_ATTK,
  878. X        NO_ATTK, NO_ATTK, NO_ATTK },
  879. X      1700, 750, 0, MS_GRUNT, MZ_LARGE, 0, 0, M1_HUMANOID,
  880. X      M2_STRONG | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT,
  881. X      0, C(HI_LORD) },
  882. X/*    Puddings */
  883. X    { "gray ooze", S_PUDDING, 3, 1, 8, 0, 0, (G_GENO | 2),
  884. X      { { AT_BITE, AD_RUST, 2, 8 }, NO_ATTK, NO_ATTK,
  885. X        NO_ATTK, NO_ATTK, NO_ATTK },
  886. X      500, 250, 0, MS_SILENT, MZ_MEDIUM,
  887. X      MR_FIRE | MR_COLD | MR_POISON | MR_ACID | MR_STONE,
  888. X      MR_FIRE | MR_COLD | MR_POISON,
  889. X      M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD |
  890. X      M1_MINDLESS | M1_OMNIVORE | M1_ACID,
  891. X      M2_HOSTILE | M2_NEUTER, 0, C(GRAY) },
  892. X    { "brown pudding", S_PUDDING, 5, 3, 8, 0, 0, (G_GENO | 1),
  893. X      { { AT_BITE, AD_DCAY, 0, 0 }, NO_ATTK, NO_ATTK,
  894. X        NO_ATTK, NO_ATTK, NO_ATTK },
  895. X      500, 250, 0, MS_SILENT, MZ_MEDIUM,
  896. X      MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE,
  897. X      MR_COLD | MR_ELEC | MR_POISON,
  898. X      M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD |
  899. X      M1_MINDLESS | M1_OMNIVORE | M1_ACID,
  900. X      M2_HOSTILE | M2_NEUTER, 0, C(BROWN) },
  901. X    { "black pudding", S_PUDDING, 10, 6, 6, 0, 0, (G_GENO | 1),
  902. X      { { AT_BITE, AD_RUST, 3, 8 }, { AT_NONE, AD_RUST, 0, 0 },
  903. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  904. X      900, 250, 0, MS_SILENT, MZ_LARGE,
  905. X      MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE,
  906. X      MR_COLD | MR_ELEC | MR_POISON,
  907. X      M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD |
  908. X      M1_MINDLESS | M1_OMNIVORE | M1_ACID,
  909. X      M2_HOSTILE | M2_NEUTER, 0, C(BLACK) },
  910. X/*    Quantum Mechanics    */
  911. X    { "quantum mechanic", S_QUANTMECH, 7, 12, 3, 10, 0, (G_GENO | 3),
  912. X      { { AT_CLAW, AD_TLPT, 1, 4 }, NO_ATTK, NO_ATTK,
  913. X        NO_ATTK, NO_ATTK, NO_ATTK },
  914. X      WT_HUMAN, 20, 0, MS_HUMANOID, MZ_HUMAN, MR_POISON, 0,
  915. X      M1_HUMANOID | M1_POIS | M1_TPORT, M2_HOSTILE, 0, C(CYAN) },
  916. X/*    Rust Monster    */
  917. X    { "rust monster", S_RUSTMONST, 5, 18, 2, 0, 0, (G_GENO | 2),
  918. X      { { AT_TUCH, AD_RUST, 0, 0 }, { AT_TUCH, AD_RUST, 0, 0 },
  919. X        { AT_NONE, AD_RUST, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK },
  920. X      1000, 250, 0, MS_SILENT, MZ_MEDIUM, 0, 0,
  921. X      M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, M2_HOSTILE,
  922. X      0, C(BROWN) },
  923. X/*    Snakes    */
  924. X    { "garter snake", S_SNAKE, 1, 8, 8, 0, 0, (G_LGROUP | G_GENO | 1),
  925. X      { { AT_BITE, AD_PHYS, 1, 2 }, NO_ATTK, NO_ATTK,
  926. X        NO_ATTK, NO_ATTK, NO_ATTK },
  927. X      50, 60, 0, MS_HISS, MZ_TINY, 0, 0,
  928. X      M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY |
  929. X      M1_OVIPAROUS | M1_CARNIVORE, 0, 0, C(GREEN) },
  930. X    { "snake", S_SNAKE, 4, 15, 3, 0, 0, (G_GENO | 2),
  931. X      { { AT_BITE, AD_DRST, 1, 6 }, NO_ATTK, NO_ATTK,
  932. X        NO_ATTK, NO_ATTK, NO_ATTK },
  933. X      100, 80, 0, MS_HISS, MZ_SMALL, MR_POISON, MR_POISON,
  934. X      M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS |
  935. X      M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, 0, C(BROWN) },
  936. X    { "water moccasin", S_SNAKE, 4, 15, 3, 0, 0,
  937. X      (G_GENO | G_NOGEN | G_LGROUP),
  938. X      { { AT_BITE, AD_DRST, 1, 6 }, NO_ATTK, NO_ATTK,
  939. X        NO_ATTK, NO_ATTK, NO_ATTK },
  940. X      150, 80, 0, MS_HISS, MZ_SMALL, MR_POISON, MR_POISON,
  941. X      M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS |
  942. X      M1_CARNIVORE | M1_OVIPAROUS, M2_HOSTILE, 0, C(RED) },
  943. X    { "pit viper", S_SNAKE, 6, 15, 2, 0, 0, (G_GENO | 1),
  944. X      { { AT_BITE, AD_DRST, 1, 4 }, { AT_BITE, AD_DRST, 1, 4 },
  945. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  946. X      100, 60, 0, MS_HISS, MZ_MEDIUM,
  947. X      MR_POISON, MR_POISON,
  948. X      M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS |
  949. X      M1_CARNIVORE | M1_OVIPAROUS, M2_HOSTILE, 0, C(BLUE) },
  950. X    { "python", S_SNAKE, 6, 3, 5, 0, 0, (G_GENO | 1),
  951. X      { { AT_BITE, AD_DRST, 1, 4 }, {AT_BITE, AD_PHYS, 1, 4},
  952. X        { AT_HUGS, AD_WRAP, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
  953. X      250, 100, 0, MS_HISS, MZ_LARGE, MR_POISON, MR_POISON,
  954. X      M1_SWIM | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS |
  955. X      M1_CARNIVORE | M1_OVIPAROUS, M2_HOSTILE | M2_STRONG, 0, C(MAGENTA) },
  956. X    { "cobra", S_SNAKE, 6, 18, 2, 0, 0, (G_GENO | 1),
  957. X      { { AT_BITE, AD_DRST, 2, 4 }, { AT_SPIT, AD_BLND, 0, 0 },
  958. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  959. X      250, 100, 0, MS_HISS, MZ_MEDIUM,
  960. X      MR_POISON, MR_POISON,
  961. X      M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS |
  962. X      M1_CARNIVORE | M1_OVIPAROUS, M2_HOSTILE, 0, C(BLUE) },
  963. X/*    Trolls    */
  964. X    { "troll", S_TROLL, 7, 12, 4, 0, -3, (G_GENO | 2),
  965. X      { { AT_CLAW, AD_PHYS, 4, 2 }, { AT_CLAW, AD_PHYS, 4, 2 },
  966. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  967. X      800, 350, 0, MS_GRUNT, MZ_LARGE, 0, 0,
  968. X      M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
  969. X      M2_STRONG | M2_STALK | M2_HOSTILE, 0, C(BROWN) },
  970. X    { "ice troll", S_TROLL, 9, 10, 2, 20, -3, (G_GENO | 1),
  971. X      { { AT_CLAW, AD_PHYS, 2, 6 }, { AT_CLAW, AD_COLD, 2, 6 },
  972. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  973. X      1000, 300, 0, MS_GRUNT, MZ_LARGE, MR_COLD, MR_COLD,
  974. X      M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
  975. X      M2_STRONG | M2_STALK | M2_HOSTILE, 0, C(WHITE) },
  976. X    { "rock troll", S_TROLL, 9, 12, 0, 0, -3, (G_GENO | 1),
  977. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_WEAP, AD_PHYS, 3, 6 },
  978. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  979. X      1200, 300, 0, MS_GRUNT, MZ_LARGE, 0, 0,
  980. X      M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
  981. X      M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, C(CYAN) },
  982. X    { "water troll", S_TROLL, 11, 14, 4, 40, -3, (G_NOGEN | G_GENO),
  983. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 },
  984. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  985. X      1200, 350, 0, MS_GRUNT, MZ_LARGE, 0, 0,
  986. X      M1_HUMANOID | M1_REGEN | M1_CARNIVORE | M1_SWIM,
  987. X      M2_STRONG | M2_STALK | M2_HOSTILE, 0, C(BLUE) },
  988. X    { "Olog-hai", S_TROLL, 13, 12, -4, 0, -7, (G_GENO | 1),
  989. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_WEAP, AD_PHYS, 3, 6 },
  990. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  991. X      1500, 400, 0, MS_GRUNT, MZ_LARGE, 0, 0,
  992. X      M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
  993. X      M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, C(HI_LORD) },
  994. X/*    Umber Hulk    */
  995. X    { "umber hulk", S_UMBER, 9, 6, 2, 25, 0, (G_GENO | 2),
  996. X      { { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 },
  997. X        { AT_BITE, AD_PHYS, 2, 5 }, { AT_GAZE, AD_CONF, 0, 0 },
  998. X        NO_ATTK, NO_ATTK },
  999. X      1200, 500, 0, MS_SILENT, MZ_LARGE, 0, 0,
  1000. X      M1_TUNNEL | M1_CARNIVORE, M2_STRONG, 0, C(BROWN) },
  1001. X/*    Vampires    */
  1002. X    { "vampire", S_VAMPIRE, 10, 12, 1, 25, -8, (G_GENO | 1),
  1003. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_BITE, AD_DRLI, 1, 6 },
  1004. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1005. X      WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN, MR_SLEEP | MR_POISON, 0,
  1006. X      M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
  1007. X      M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY, 0, C(RED) },
  1008. X    { "vampire lord", S_VAMPIRE, 12, 14, 0, 50, -9, (G_GENO | 1),
  1009. X      { { AT_CLAW, AD_PHYS, 1, 8 }, { AT_BITE, AD_DRLI, 1, 8 },
  1010. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1011. X      WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN, MR_SLEEP | MR_POISON, 0,
  1012. X      M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
  1013. X      M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY |
  1014. X      M2_LORD | M2_MALE, 0, C(BLUE) },
  1015. X    { "Vlad the Impaler", S_VAMPIRE, 14, 18, -3, 80, -10,
  1016. X      (G_NOGEN | G_NOCORPSE | G_UNIQ),
  1017. X      { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_BITE, AD_DRLI, 1, 6 },
  1018. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1019. X      WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN, MR_SLEEP | MR_POISON, 0,
  1020. X      M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
  1021. X      M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG |
  1022. X      M2_NASTY | M2_PRINCE | M2_MALE, M3_WANTSBOOK, C(HI_LORD) },
  1023. X/*    Wraiths     */
  1024. X    { "barrow wight", S_WRAITH, 3, 12, 5, 5, -3, (G_GENO | G_NOCORPSE | 1),
  1025. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_MAGC, AD_SPEL, 0, 0 },
  1026. X        { AT_WEAP, AD_DRLI, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1027. X      1200, 0, 0, MS_SILENT, MZ_HUMAN, MR_COLD | MR_SLEEP | MR_POISON, 0,
  1028. X      M1_BREATHLESS | M1_HUMANOID,
  1029. X      M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, C(GRAY) },
  1030. X    { "wraith", S_WRAITH, 6, 12, 4, 15, -6, (G_GENO | 2),
  1031. X      { { AT_TUCH, AD_DRLI, 1, 6 }, NO_ATTK, NO_ATTK,
  1032. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1033. X      0, 0, 0, MS_SILENT, MZ_HUMAN,
  1034. X      MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0,
  1035. X      M1_BREATHLESS | M1_FLY | M1_HUMANOID | M1_UNSOLID,
  1036. X      M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, C(BLACK) },
  1037. X    { "Nazgul", S_WRAITH, 13, 12, 0, 25, -17, (G_GENO | G_NOCORPSE | 1),
  1038. X      { { AT_WEAP, AD_DRLI, 1, 4 }, { AT_BREA, AD_SLEE, 0, 0 },
  1039. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1040. X      WT_HUMAN, 0, 0, MS_SILENT, MZ_HUMAN,
  1041. X      MR_COLD | MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_HUMANOID,
  1042. X      M2_UNDEAD | M2_STALK | M2_STRONG | M2_HOSTILE | M2_MALE | M2_COLLECT,
  1043. X      0, C(HI_LORD) },
  1044. X/*    Xorn    */
  1045. X    { "xorn", S_XORN, 8, 9,-2, 20, 0, (G_GENO | 1),
  1046. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  1047. X        { AT_CLAW, AD_PHYS, 1, 3 }, { AT_BITE, AD_PHYS, 4, 6 },
  1048. X        NO_ATTK, NO_ATTK }, 1200, 700, 0, MS_SILENT, MZ_MEDIUM,
  1049. X      MR_FIRE | MR_COLD | MR_STONE, MR_FIRE | MR_COLD | MR_STONE,
  1050. X      M1_BREATHLESS | M1_WALLWALK | M1_THICK_HIDE | M1_METALLIVORE,
  1051. X      M2_HOSTILE | M2_STRONG, 0, C(BROWN) },
  1052. X/*    Yeti, Apes and other large beasts */
  1053. X    { "ape", S_YETI, 4, 12, 6, 0, 0, (G_GENO | G_SGROUP | 2),
  1054. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  1055. X        { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1056. X      1100, 500, 0, MS_GROWL, MZ_LARGE, 0, 0,
  1057. X      M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
  1058. X      M2_STRONG, 0, C(BROWN) },
  1059. X    { "owlbear", S_YETI, 5, 12, 5, 0, 0, (G_GENO | 3),
  1060. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 },
  1061. X        { AT_HUGS, AD_PHYS, 2, 8 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1062. X      1700, 700, 0, MS_SILENT, MZ_LARGE, 0, 0,
  1063. X      M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
  1064. X      M2_HOSTILE | M2_STRONG | M2_NASTY, 0, C(BROWN) },
  1065. X    { "yeti", S_YETI, 5, 15, 6, 0, 0, (G_GENO | 2),
  1066. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 },
  1067. X        { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1068. X      1600, 700, 0, MS_GROWL, MZ_LARGE, MR_COLD, MR_COLD,
  1069. X      M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
  1070. X      M2_HOSTILE | M2_STRONG, 0, C(WHITE) },
  1071. X    { "carnivorous ape", S_YETI, 6, 12, 6, 0, 0, (G_GENO | 1),
  1072. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  1073. X        { AT_HUGS, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1074. X      1250, 550, 0, MS_GROWL, MZ_LARGE, 0, 0,
  1075. X      M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
  1076. X      M2_HOSTILE | M2_STRONG, 0, C(BLACK) },
  1077. X    { "sasquatch", S_YETI, 7, 15, 6, 0, 2, (G_GENO | 1),
  1078. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 },
  1079. X        { AT_KICK, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1080. X      1550, 750, 0, MS_GROWL, MZ_LARGE, 0, 0,
  1081. X      M1_ANIMAL | M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
  1082. X      M2_STRONG, 0, C(GRAY) },
  1083. X/*    Zombies     */
  1084. X    { "kobold zombie", S_ZOMBIE, 0, 6, 10, 0, -2, (G_GENO | G_NOCORPSE | 1),
  1085. X      { { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  1086. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1087. X      400, 50, 0, MS_SILENT, MZ_SMALL,
  1088. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  1089. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  1090. X      M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, C(BROWN) },
  1091. X    { "gnome zombie", S_ZOMBIE, 1, 6, 10, 0, -2, (G_GENO | G_NOCORPSE | 1),
  1092. X      { { AT_CLAW, AD_PHYS, 1, 5 }, NO_ATTK, NO_ATTK,
  1093. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1094. X      650, 50, 0, MS_SILENT, MZ_SMALL,
  1095. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  1096. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  1097. X      M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, C(BROWN) },
  1098. X    { "orc zombie", S_ZOMBIE, 2, 6, 9, 0, -3,
  1099. X      (G_GENO | G_SGROUP | G_NOCORPSE | 1),
  1100. X      { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1101. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1102. X      850, 75, 0, MS_SILENT, MZ_HUMAN,
  1103. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  1104. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
  1105. X      M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ORC, 0, C(GRAY) },
  1106. X    { "elf zombie", S_ZOMBIE, 3, 6, 9, 0, -3,
  1107. X      (G_GENO | G_SGROUP | G_NOCORPSE | 1),
  1108. X      { { AT_CLAW, AD_PHYS, 1, 7 }, NO_ATTK, NO_ATTK,
  1109. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1110. X      WT_ELF, 175, 0, MS_SILENT, MZ_HUMAN,
  1111. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  1112. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
  1113. X      M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ELF, 0, C(GREEN) },
  1114. X    { "human zombie", S_ZOMBIE, 4, 6, 8, 0, -3,
  1115. X      (G_GENO | G_SGROUP | G_NOCORPSE | 1),
  1116. X      { { AT_CLAW, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1117. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1118. X      WT_HUMAN, 200, 0, MS_SILENT, MZ_HUMAN,
  1119. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  1120. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
  1121. X      M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, C(HI_DOMESTIC) },
  1122. X    { "ettin zombie", S_ZOMBIE, 6, 8, 6, 0, -4, (G_GENO | G_NOCORPSE | 1),
  1123. X      { { AT_CLAW, AD_PHYS, 1, 10 }, { AT_CLAW, AD_PHYS, 1, 10 },
  1124. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1125. X      1700, 250, 0, MS_SILENT, MZ_HUGE,
  1126. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  1127. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
  1128. X      M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG, 0, C(BLUE) },
  1129. X    { "giant zombie", S_ZOMBIE, 8, 8, 6, 0, -4, (G_GENO | G_NOCORPSE | 1),
  1130. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 },
  1131. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1132. X      2050, 375, 0, MS_SILENT, MZ_HUGE,
  1133. X      MR_COLD | MR_SLEEP | MR_POISON, 0,
  1134. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
  1135. X      M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GIANT | M2_STRONG,
  1136. X      0, C(CYAN) },
  1137. X    { "skeleton", S_ZOMBIE, 12, 8, 4, 0, 0, (G_NOCORPSE | G_NOGEN),
  1138. X      { { AT_WEAP, AD_PHYS, 2, 6 }, { AT_TUCH, AD_SLOW, 1, 6},
  1139. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1140. X      300, 5, 0, MS_BONES, MZ_HUMAN,
  1141. X      MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0,
  1142. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
  1143. X      M2_UNDEAD | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_COLLECT,
  1144. X      0, C(WHITE) },
  1145. X/*    Golems    */
  1146. X    { "straw golem", S_GOLEM, 3, 12, 10, 0, 0, (G_GENO | G_NOCORPSE | 1),
  1147. X      { { AT_CLAW, AD_PHYS, 1, 2 }, { AT_CLAW, AD_PHYS, 1, 2 },
  1148. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1149. X      400, 0, 0, MS_SILENT, MZ_LARGE,
  1150. X      MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
  1151. X      M2_HOSTILE | M2_NEUTER, 0, C(YELLOW) },
  1152. X    { "rope golem", S_GOLEM, 4, 9, 8, 0, 0, (G_GENO | G_NOCORPSE | 1),
  1153. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_HUGS, AD_PHYS, 6, 1 },
  1154. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1155. X      450, 0, 0, MS_SILENT, MZ_LARGE,
  1156. X      MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
  1157. X      M2_HOSTILE | M2_NEUTER, 0, C(BROWN) },
  1158. X    { "leather golem", S_GOLEM, 6, 6, 6, 0, 0, (G_GENO | G_NOCORPSE | 1),
  1159. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 },
  1160. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1161. X      800, 0, 0, MS_SILENT, MZ_LARGE,
  1162. X      MR_SLEEP | MR_POISON, 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
  1163. X      M2_HOSTILE | M2_NEUTER, 0, C(HI_LEATHER) },
  1164. X    { "wood golem", S_GOLEM, 7, 3, 4, 0, 0, (G_GENO | G_NOCORPSE | 1),
  1165. X      { { AT_CLAW, AD_PHYS, 3, 4 }, NO_ATTK, NO_ATTK,
  1166. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1167. X      900, 0, 0, MS_SILENT, MZ_LARGE,
  1168. X      MR_SLEEP | MR_POISON, 0,
  1169. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
  1170. X      M2_HOSTILE | M2_NEUTER, 0, C(HI_WOOD) },
  1171. X    { "flesh golem", S_GOLEM, 9, 8, 9, 30, 0, (G_GENO | 1),
  1172. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 },
  1173. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1174. X      1400, 600, 0, MS_SILENT, MZ_LARGE,
  1175. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON,
  1176. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON,
  1177. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
  1178. X      M2_HOSTILE | M2_STRONG, 0, C(RED) },
  1179. X    { "clay golem", S_GOLEM, 11, 7, 7, 40, 0, (G_GENO | G_NOCORPSE | 1),
  1180. X      { { AT_CLAW, AD_PHYS, 3, 10 }, NO_ATTK, NO_ATTK,
  1181. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1182. X      1550, 0, 0, MS_SILENT, MZ_LARGE,
  1183. X      MR_SLEEP | MR_POISON, 0,
  1184. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
  1185. X      M2_HOSTILE | M2_STRONG, 0, C(BROWN) },
  1186. X    { "stone golem", S_GOLEM, 14, 6, 5, 50, 0, (G_GENO | G_NOCORPSE | 1),
  1187. X      { { AT_CLAW, AD_PHYS, 3, 8 }, NO_ATTK, NO_ATTK,
  1188. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1189. X      1900, 0, 0, MS_SILENT, MZ_LARGE,
  1190. X      MR_SLEEP | MR_POISON | MR_STONE, 0,
  1191. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
  1192. X      M2_HOSTILE | M2_STRONG, 0, C(GRAY) },
  1193. X    { "iron golem", S_GOLEM, 18, 6, 3, 60, 0, (G_GENO | G_NOCORPSE | 1),
  1194. X      { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_BREA, AD_DRST, 4, 6 },
  1195. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1196. X      2000, 0, 0, MS_SILENT, MZ_LARGE,
  1197. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
  1198. X      M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE | M1_POIS,
  1199. X      M2_HOSTILE | M2_STRONG | M2_COLLECT, 0, C(HI_METAL) },
  1200. X/*    Humans        */
  1201. X    { "human", S_HUMAN, 0, 12, 10, 0, 0, G_NOGEN, /* for corpses */
  1202. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK,
  1203. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1204. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1205. X      M1_HUMANOID | M1_OMNIVORE,
  1206. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1207. X      0, C(HI_DOMESTIC) },
  1208. X    { "wererat", S_HUMAN, 2, 12, MARM(10,7), 10, -7, 1,
  1209. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1210. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1211. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN, MR_POISON, 0,
  1212. X      M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
  1213. X      M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, 0, C(BROWN) },
  1214. X    { "werejackal", S_HUMAN, 2, 12, MARM(10,7), 10, -7, 1,
  1215. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1216. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1217. X      WT_HUMAN, 400, 0, MS_BARK, MZ_HUMAN, MR_POISON, 0,
  1218. X      M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
  1219. X      M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, 0, C(RED) },
  1220. X    { "werewolf", S_HUMAN, 5, 12, MARM(10,6), 20, -7, 1,
  1221. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1222. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1223. X      WT_HUMAN, 400, 0, MS_BARK, MZ_HUMAN, MR_POISON, 0,
  1224. X      M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
  1225. X      M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT,
  1226. X      0, C(ORANGE_COLORED) },
  1227. X    { "Woodland-elf", S_HUMAN, 4, 12, MARM(10,5), 10, -5,
  1228. X      (G_GENO | G_SGROUP | 2),
  1229. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1230. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1231. X      WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
  1232. X      M1_HUMANOID | M1_OMNIVORE, M2_ELF | M2_COLLECT, 0, C(GREEN) },
  1233. X    { "Green-elf", S_HUMAN, 5, 12, MARM(10,5), 10, -6,
  1234. X      (G_GENO | G_SGROUP | 2),
  1235. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1236. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1237. X      WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
  1238. X      M1_HUMANOID | M1_OMNIVORE, M2_ELF | M2_COLLECT, 0, C(BRIGHT_GREEN) },
  1239. X    { "Grey-elf", S_HUMAN, 6, 12, MARM(10,5), 10, -7,
  1240. X      (G_GENO | G_SGROUP | 2),
  1241. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1242. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1243. X      WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
  1244. X      M1_HUMANOID | M1_OMNIVORE, M2_ELF | M2_COLLECT, 0, C(GRAY) },
  1245. X    { "elf-lord", S_HUMAN, 8, 12, MARM(10,5), 20, -9,
  1246. X      (G_GENO | G_SGROUP | 2),
  1247. X      { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
  1248. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1249. X      WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
  1250. X      M1_HUMANOID | M1_OMNIVORE,
  1251. X      M2_ELF | M2_STRONG | M2_LORD | M2_MALE | M2_COLLECT,
  1252. X      0, C(BRIGHT_BLUE) },
  1253. X    { "Elvenking", S_HUMAN, 9, 12, MARM(10,5), 25, -10, (G_GENO | 1),
  1254. X      { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4},
  1255. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1256. X      WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN,
  1257. X      MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE,
  1258. X      M2_ELF | M2_STRONG | M2_PRINCE | M2_MALE | M2_COLLECT, 0,
  1259. X      C(HI_LORD) },
  1260. X    { "nurse", S_HUMAN, 11, 6, 0, 0, 0, (G_GENO | 3),
  1261. X      { { AT_CLAW, AD_HEAL, 2, 6 }, NO_ATTK, NO_ATTK,
  1262. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1263. X      WT_HUMAN, 400, 0, MS_NURSE, MZ_HUMAN, MR_POISON, MR_POISON,
  1264. X      M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE,
  1265. X      0, C(HI_DOMESTIC) },
  1266. X    { "shopkeeper", S_HUMAN, 12, 18, 0, 50, 0, G_NOGEN,
  1267. X      { { AT_WEAP, AD_PHYS, 4, 4 }, { AT_WEAP, AD_PHYS, 4, 4 },
  1268. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1269. X      WT_HUMAN, 400, sizeof(struct eshk), MS_SELL, MZ_HUMAN, 0, 0,
  1270. X      M1_HUMANOID | M1_OMNIVORE,
  1271. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
  1272. X      M2_COLLECT | M2_MAGIC,
  1273. X      0, C(HI_DOMESTIC) },
  1274. X    { "guard", S_HUMAN, 12, 12, MARM(10,-1), 40, 10, G_NOGEN,
  1275. X      { { AT_WEAP, AD_PHYS, 4, 10 }, NO_ATTK, NO_ATTK,
  1276. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1277. X      WT_HUMAN, 400, sizeof(struct egd), MS_GUARD, MZ_HUMAN,
  1278. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1279. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1280. X      0, C(BLUE) },
  1281. X    { "oracle", S_HUMAN, 12, 0, 0, 50, 0, G_NOGEN | G_UNIQ,
  1282. X      { { AT_NONE, AD_MAGM, 0, 4 }, NO_ATTK, NO_ATTK,
  1283. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1284. X      WT_HUMAN, 400, 0, MS_ORACLE, MZ_HUMAN, 0, 0,
  1285. X      M1_HUMANOID | M1_OMNIVORE,
  1286. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_FEMALE, 0, C(HI_ZAP) },
  1287. X    { "aligned priest", S_HUMAN, 12, 12, MARM(10,0), 50, 0, G_NOGEN,
  1288. X      { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_KICK, AD_PHYS, 1, 4 },
  1289. X        { AT_MAGC, AD_CLRC, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1290. X      WT_HUMAN, 400, sizeof(struct epri), MS_PRIEST, MZ_HUMAN,
  1291. X      MR_ELEC, MR_ELEC, M1_HUMANOID | M1_OMNIVORE,
  1292. X      M2_NOPOLY | M2_HUMAN | M2_LORD | M2_PEACEFUL | M2_COLLECT,
  1293. X      0, C(WHITE) },
  1294. X    { "high priest", S_HUMAN, 25, 15, MARM(7,-3), 70, 0,
  1295. X       (G_NOGEN | G_UNIQ),
  1296. X      { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_KICK, AD_PHYS, 2, 8 },
  1297. X        { AT_MAGC, AD_CLRC, 2, 8 }, { AT_MAGC, AD_CLRC, 2, 8 },
  1298. X        NO_ATTK, NO_ATTK },
  1299. X      WT_HUMAN, 400, sizeof(struct epri), MS_PRIEST, MZ_HUMAN,
  1300. X      MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON,
  1301. X      MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON,
  1302. X      M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
  1303. X      M2_NOPOLY | M2_HUMAN | M2_MINION | M2_PRINCE | M2_NASTY |
  1304. X      M2_COLLECT | M2_MAGIC, 0, C(WHITE) },
  1305. X#ifndef MUSE
  1306. X    { "unarmored watchman", S_HUMAN, 6, 4, 10, 0, -2, G_NOGEN,
  1307. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1308. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1309. X      WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN,
  1310. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1311. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_PEACEFUL | M2_STRONG |
  1312. X      M2_COLLECT, 0, C(BROWN) },
  1313. X#endif
  1314. X#ifdef ARMY
  1315. X# ifndef MUSE
  1316. X    { "unarmored soldier", S_HUMAN, 6, 4, 10, 0, -2, G_NOGEN,
  1317. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1318. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1319. X      WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN,
  1320. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1321. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG |
  1322. X      M2_COLLECT, 0, C(BROWN) },
  1323. X# endif
  1324. X    { "soldier", S_HUMAN, 6, 4, MARM(10,3), 0, -2, (G_SGROUP | G_GENO | 1),
  1325. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1326. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1327. X      WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN,
  1328. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1329. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG |
  1330. X      M2_COLLECT, 0, C(GRAY) },
  1331. X    { "sergeant", S_HUMAN, 8, 4, MARM(10,0), 5, -3, (G_SGROUP | G_GENO | 1),
  1332. X      { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK,
  1333. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1334. X      WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN,
  1335. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1336. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG |
  1337. X      M2_COLLECT, 0, C(RED) },
  1338. X    { "lieutenant", S_HUMAN, 10, 4, MARM(10,-2), 15, -4, (G_GENO | 1),
  1339. X      { { AT_WEAP, AD_PHYS, 3, 4 }, { AT_WEAP, AD_PHYS, 3, 4 },
  1340. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1341. X      WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN,
  1342. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1343. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG |
  1344. X      M2_COLLECT, 0, C(GREEN) },
  1345. X    { "captain", S_HUMAN, 12, 4, MARM(10,-3), 15, -5, (G_GENO | 1),
  1346. X      { { AT_WEAP, AD_PHYS, 4, 4 }, { AT_WEAP, AD_PHYS, 4, 4 },
  1347. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1348. X      WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN,
  1349. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1350. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_HOSTILE | M2_STRONG |
  1351. X      M2_COLLECT, 0, C(BLUE) },
  1352. X#endif
  1353. X/*
  1354. X *    Keep these separate - some of the mkroom code assumes that all
  1355. X *    the soldiers are contiguous.
  1356. X */
  1357. X    { "watchman", S_HUMAN, 6, 4, MARM(10,3), 0, -2, (G_SGROUP | G_NOGEN | G_GENO | 1),
  1358. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1359. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1360. X      WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN,
  1361. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1362. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_PEACEFUL | M2_STRONG |
  1363. X      M2_COLLECT, 0, C(GRAY) },
  1364. X    { "watch captain", S_HUMAN, 10, 4, MARM(10,-2), 15, -4, (G_NOGEN | G_GENO | 1),
  1365. X      { { AT_WEAP, AD_PHYS, 3, 4 }, { AT_WEAP, AD_PHYS, 3, 4 },
  1366. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1367. X      WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN,
  1368. X      0, 0, M1_HUMANOID | M1_OMNIVORE,
  1369. X      M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK | M2_PEACEFUL | M2_STRONG |
  1370. X      M2_COLLECT, 0, C(GREEN) },
  1371. X    { "Medusa", S_HUMAN, 20, 12, 2, 50, -15, G_NOGEN | G_UNIQ,
  1372. X      { { AT_CLAW, AD_PHYS, 1, 8 }, { AT_GAZE, AD_STON, 0, 0 },
  1373. X        { AT_BITE, AD_DRST, 1, 6 }, { AT_WEAP, AD_PHYS, 2, 4 },
  1374. X        NO_ATTK, NO_ATTK },
  1375. X      WT_HUMAN, 400, 0, MS_HISS, MZ_LARGE,
  1376. X      MR_POISON | MR_STONE, MR_POISON | MR_STONE, M1_SWIM |
  1377. X      M1_AMPHIBIOUS | M1_HUMANOID | M1_SLITHY | M1_POIS | M1_OMNIVORE,
  1378. X      M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_FEMALE,
  1379. X      0, C(BRIGHT_GREEN) },
  1380. X    { "Wizard of Yendor", S_HUMAN, 30, 12, -8, 100, A_NONE, G_NOGEN,
  1381. X      { { AT_CLAW, AD_SAMU, 2, 12 }, { AT_MAGC, AD_SPEL, 0, 0 },
  1382. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1383. X      WT_HUMAN, 400, 0, MS_CUSS, MZ_HUMAN,
  1384. X      MR_FIRE | MR_POISON, MR_FIRE | MR_POISON,
  1385. X      M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS |
  1386. X      M1_TPORT | M1_TPORT_CNTRL | M1_OMNIVORE,
  1387. X      M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY |
  1388. X      M2_PRINCE | M2_MALE | M2_MAGIC,
  1389. X      M3_COVETOUS | M3_WAITFORU, C(HI_LORD) },
  1390. X#ifdef MULDGN
  1391. X    { "Croesus", S_HUMAN, 20, 15, 0, 40, 15, (G_UNIQ | G_NOGEN),
  1392. X      { { AT_WEAP, AD_PHYS, 4, 10 }, NO_ATTK, NO_ATTK,
  1393. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1394. X      WT_HUMAN, 400, 0, MS_GUARD, MZ_HUMAN,
  1395. X      MR_STONE, MR_STONE, M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
  1396. X      M2_NOPOLY | M2_HUMAN | M2_STALK | M2_PEACEFUL | M2_STRONG | M2_NASTY |
  1397. X      M2_PNAME | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT |
  1398. X      M2_MAGIC, 0, C(HI_LORD) },
  1399. X#endif
  1400. X#ifdef CHARON
  1401. X    { "Charon", S_HUMAN, 76, 18, -5, 120, 0,
  1402. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  1403. X      { { AT_WEAP, AD_PHYS, 1, 8 }, { AT_TUCH, AD_PLYS, 1, 8 },
  1404. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1405. X      WT_HUMAN, 400, 0, MS_FERRY, MZ_HUMAN,
  1406. X      MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0,
  1407. X      M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID,
  1408. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_PNAME | M2_MALE | M2_GREEDY |
  1409. X      M2_COLLECT,
  1410. X      0, C(WHITE) },
  1411. X#endif
  1412. X/*    Ghosts        */
  1413. X    { "ghost", S_GHOST, 10, 3, -5, 50, -5, (G_NOCORPSE | G_NOGEN),
  1414. X      { { AT_TUCH, AD_PHYS, 1, 1 }, NO_ATTK, NO_ATTK,
  1415. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1416. X      WT_HUMAN, 0, PL_NSIZ, MS_SILENT, MZ_HUMAN,
  1417. X      MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0,
  1418. X      M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID,
  1419. X      M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, C(GRAY) },
  1420. X    { "shade", S_GHOST, 12, 10, 10, 0, 0, (G_NOCORPSE | G_NOGEN),
  1421. X      { { AT_TUCH, AD_PLYS, 2, 6 }, { AT_TUCH, AD_SLOW, 1, 6},
  1422. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1423. X      WT_HUMAN, 0, 0, MS_WAIL, MZ_HUMAN,
  1424. X      MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0,
  1425. X      M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID |
  1426. X      M1_SEE_INVIS,
  1427. X      M2_NOPOLY | M2_UNDEAD | M2_WANDER | M2_STALK | M2_HOSTILE,
  1428. X      0, C(BLACK) },
  1429. X/*    (major) Demons    */
  1430. X    { "water demon", S_DEMON, 8, 12,-4, 30, -7, (G_NOCORPSE | G_NOGEN),
  1431. X      { { AT_WEAP, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  1432. X        { AT_BITE, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1433. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN,
  1434. X      MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_SWIM,
  1435. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
  1436. X      0, C(BLUE) },
  1437. X    /* standard demons & devils */
  1438. X    { "horned devil", S_DEMON, 6, 9, -5, 50, 11, (G_HELL | G_NOCORPSE | 2),
  1439. X      { { AT_WEAP, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  1440. X        { AT_BITE, AD_PHYS, 2, 3 }, { AT_STNG, AD_PHYS, 1, 3 },
  1441. X        NO_ATTK, NO_ATTK },
  1442. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN,
  1443. X      MR_FIRE | MR_POISON, 0, M1_POIS | M1_THICK_HIDE,
  1444. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(BROWN) },
  1445. END_OF_FILE
  1446. if test 39362 -ne `wc -c <'src/monst.c2'`; then
  1447.     echo shar: \"'src/monst.c2'\" unpacked with wrong size!
  1448. fi
  1449. # end of 'src/monst.c2'
  1450. fi
  1451. echo shar: End of archive 40 \(of 108\).
  1452. cp /dev/null ark40isdone
  1453. MISSING=""
  1454. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1455. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1456. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1457. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1458. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1459. 101 102 103 104 105 106 107 108 ; do
  1460.     if test ! -f ark${I}isdone ; then
  1461.     MISSING="${MISSING} ${I}"
  1462.     fi
  1463. done
  1464. if test "${MISSING}" = "" ; then
  1465.     echo You have unpacked all 108 archives.
  1466.     echo "Now execute 'rebuild.sh'"
  1467.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1468. else
  1469.     echo You still need to unpack the following archives:
  1470.     echo "        " ${MISSING}
  1471. fi
  1472. ##  End of shell archive.
  1473. exit 0
  1474.