home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume16 / nethck31 / part60 < prev    next >
Encoding:
Internet Message Format  |  1993-02-03  |  57.4 KB

  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: v16i068:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part60/108
  5. Message-ID: <4371@master.CNA.TEK.COM>
  6. Date: 1 Feb 93 19:49:35 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1562
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1618
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 68
  14. Archive-name: nethack31/Part60
  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 60 (of 108)."
  27. # Contents:  src/dothrow.c src/monst.c3
  28. # Wrapped by billr@saab on Wed Jan 27 16:09:10 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'src/dothrow.c' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'src/dothrow.c'\"
  32. else
  33. echo shar: Extracting \"'src/dothrow.c'\" \(21479 characters\)
  34. sed "s/^X//" >'src/dothrow.c' <<'END_OF_FILE'
  35. X/*    SCCS Id: @(#)dothrow.c    3.1    92/12/10    */
  36. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  37. X/* NetHack may be freely redistributed.  See license for details. */
  38. X
  39. X/* Contains code for 't' (throw) */
  40. X
  41. X#include "hack.h"
  42. X
  43. Xstatic void FDECL(hitfloor, (struct obj *));
  44. Xstatic int FDECL(gem_accept, (struct monst *, struct obj *));
  45. Xstatic int FDECL(throw_gold, (struct obj *));
  46. Xstatic void FDECL(check_shop_obj, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P));
  47. X
  48. Xstatic const char NEARDATA toss_objs[] =
  49. X    { ALLOW_COUNT, GOLD_CLASS, ALL_CLASSES, WEAPON_CLASS, 0 };
  50. Xextern boolean notonhead;    /* for long worms */
  51. X
  52. Xint
  53. Xdothrow()
  54. X{
  55. X    register struct obj *obj;
  56. X
  57. X    if(check_capacity(NULL)) return(0);
  58. X    obj = getobj(toss_objs, "throw");
  59. X    /* it is also possible to throw food */
  60. X    /* (or jewels, or iron balls... ) */
  61. X
  62. X    if(!obj || !getdir(NULL)) {       /* ask "in what direction?" */
  63. X        if (obj && obj->oclass == GOLD_CLASS) {
  64. X            u.ugold += obj->quan;
  65. X            flags.botl = 1;
  66. X            dealloc_obj(obj);
  67. X        }
  68. X        return(0);
  69. X    }
  70. X
  71. X    if(obj->oclass == GOLD_CLASS) return(throw_gold(obj));
  72. X
  73. X    if(!canletgo(obj,"throw"))
  74. X        return(0);
  75. X    if (obj->oartifact == ART_MJOLLNIR && obj != uwep) {
  76. X        You("must be wielding %s in order to throw it.", xname(obj));
  77. X        return(0);
  78. X    }
  79. X    if ((obj->oartifact == ART_MJOLLNIR && ACURR(A_STR) != 125)
  80. X       || (obj->otyp == BOULDER
  81. X#ifdef POLYSELF
  82. X                    && !throws_rocks(uasmon)
  83. X#endif
  84. X                                )) {
  85. X        pline("It's too heavy.");
  86. X        return(1);
  87. X    }
  88. X    if(!u.dx && !u.dy && !u.dz) {
  89. X        You("cannot throw an object at yourself.");
  90. X        return(0);
  91. X    }
  92. X    u_wipe_engr(2);
  93. X
  94. X    if(obj == uwep) {
  95. X        if(welded(obj)) {
  96. X        weldmsg(obj, FALSE);
  97. X        return(1);
  98. X        }
  99. X        if(obj->quan > 1L)
  100. X        setuwep(splitobj(obj, 1L));
  101. X        else {
  102. X        setuwep((struct obj *)0);
  103. X        if (uwep) return(1); /* unwielded, died, rewielded */
  104. X        }
  105. X    }
  106. X    else if(obj->quan > 1L)
  107. X        (void) splitobj(obj, 1L);
  108. X    freeinv(obj);
  109. X    return(throwit(obj));
  110. X}
  111. X
  112. Xstatic void
  113. Xhitfloor(obj)
  114. Xregister struct obj *obj;
  115. X{
  116. X    if (IS_SOFT(levl[u.ux][u.uy].typ) || u.uinwater) {
  117. X        dropy(obj);
  118. X        if(*u.ushops)
  119. X            check_shop_obj(obj, obj->ox, obj->oy, FALSE);
  120. X        return;
  121. X    }
  122. X    if (IS_ALTAR(levl[u.ux][u.uy].typ)) doaltarobj(obj);
  123. X    else
  124. X        pline("%s hits the floor.", Doname2(obj));
  125. X    if (breaks(obj, TRUE)) return;
  126. X    else if(obj->oclass == POTION_CLASS) {
  127. X        pline("The flask breaks, and you smell a peculiar odor...");
  128. X        potionbreathe(obj);
  129. X        if(*u.ushops)
  130. X            check_shop_obj(obj, u.ux, u.uy, TRUE);
  131. X        obfree(obj, (struct obj *)0);
  132. X    } else {
  133. X        if(ship_object(obj, u.ux, u.uy, FALSE)) 
  134. X            return;
  135. X        dropy(obj);
  136. X        if(*u.ushops)
  137. X            check_shop_obj(obj, obj->ox, obj->oy, FALSE);
  138. X    }
  139. X}
  140. X
  141. X/*
  142. X * The player moves through the air for a few squares as a result of
  143. X * throwing or kicking something.  To simplify matters, bumping into monsters
  144. X * won't cause damage but will wake them and make them angry.
  145. X * Auto-pickup isn't done, since you don't have control over your movements
  146. X * at the time.
  147. X * dx and dy should be the direction of the hurtle, not of the original
  148. X * kick or throw.
  149. X */
  150. Xvoid
  151. Xhurtle(dx, dy, range)
  152. X    int dx, dy, range;
  153. X{
  154. X    register struct monst *mon;
  155. X    struct obj *obj;
  156. X    int nx, ny;
  157. X
  158. X    if(!range || (!dx && !dy) || u.ustuck) return; /* paranoia */
  159. X
  160. X    nomul(-range);
  161. X    You("%s in the opposite direction.", range > 1 ? "hurtle" : "float");
  162. X    while(range--) {
  163. X    nx = u.ux + dx;
  164. X    ny = u.uy + dy;
  165. X
  166. X    if(!isok(nx,ny)) break;
  167. X    if(IS_ROCK(levl[nx][ny].typ) || closed_door(nx,ny)) {
  168. X        pline("Ouch!");
  169. X        losehp(rnd(2+range), IS_ROCK(levl[nx][ny].typ) ?
  170. X           "bumping to a wall" : "bumping into a door", KILLED_BY);
  171. X        break;
  172. X    }
  173. X
  174. X    if (obj = sobj_at(BOULDER,nx,ny)) {
  175. X        You("bump into a %s.  Ouch!", xname(obj));
  176. X        losehp(rnd(2+range), "bumping to a boulder", KILLED_BY);
  177. X        break;
  178. X    }
  179. X
  180. X    u.ux = nx;
  181. X    u.uy = ny;
  182. X    newsym(u.ux - dx, u.uy - dy);
  183. X    if(mon = m_at(u.ux, u.uy)) {
  184. X        You("bump into %s.", a_monnam(mon));
  185. X        wakeup(mon);
  186. X        if(Is_airlevel(&u.uz))
  187. X        mnexto(mon);
  188. X        else {
  189. X        /* sorry, not ricochets */
  190. X        u.ux -= dx;
  191. X        u.uy -= dy;
  192. X        }
  193. X        range = 0;
  194. X    }
  195. X
  196. X    newsym(u.ux, u.uy);
  197. X
  198. X    if(range) {
  199. X        flush_screen(1);
  200. X        delay_output();
  201. X    }
  202. X    }
  203. X}
  204. X
  205. Xstatic void
  206. Xcheck_shop_obj(obj, x, y, broken)
  207. Xregister struct obj *obj;
  208. Xregister xchar x, y;
  209. Xregister boolean broken;
  210. X{
  211. X    register struct monst *shkp = 
  212. X            shop_keeper(*in_rooms(u.ux, u.uy, SHOPBASE));
  213. X
  214. X    if(!shkp) return;
  215. X    if(!inside_shop(u.ux, u.uy)) return;
  216. X
  217. X    if(broken) {
  218. X            if(obj->unpaid) {
  219. X            (void)stolen_value(obj, u.ux, u.uy, 
  220. X                 (shkp && shkp->mpeaceful), FALSE);
  221. X            subfrombill(obj, shkp);
  222. X        }
  223. X        return;
  224. X    }
  225. X
  226. X        if(!costly_spot(x, y) ||
  227. X               *in_rooms(u.ux, u.uy, 0) != *in_rooms(x, y, 0)) { 
  228. X            if(!inside_shop(x, y) && obj->unpaid) {
  229. X            (void)stolen_value(obj, u.ux, u.uy, 
  230. X                 (shkp && shkp->mpeaceful), FALSE);
  231. X            subfrombill(obj, shkp);
  232. X        }
  233. X    } else
  234. X            if(costly_spot(u.ux, u.uy) && costly_spot(x, y)) {
  235. X            if(obj->unpaid) subfrombill(obj, shkp);
  236. X            else if(!(x == shkp->mx && y == shkp->my))
  237. X                    sellobj(obj, x, y);
  238. X        }
  239. X}
  240. X
  241. X
  242. Xint
  243. Xthrowit(obj)
  244. Xregister struct obj *obj;
  245. X{
  246. X    register struct monst *mon;
  247. X    register int range, urange;
  248. X    boolean impaired = (Confusion || Stunned || Blind ||
  249. X               Hallucination || Fumbling);
  250. X    int do_death = 0;
  251. X
  252. X    if (obj->cursed && (u.dx || u.dy) && !rn2(7)) {
  253. X        boolean slipok = TRUE;
  254. X        if ((obj->oclass == WEAPON_CLASS || obj->oclass == GEM_CLASS)
  255. X        && uwep && (objects[obj->otyp].w_propellor > 0) &&
  256. X        (objects[obj->otyp].w_propellor ==
  257. X                                             -objects[uwep->otyp].w_propellor))
  258. X        pline("The %s misfires!", xname(obj));
  259. X        else {
  260. X        /* only slip if it's meant to be thrown */
  261. X        if((obj->otyp >= DART && obj->otyp <= JAVELIN) ||
  262. X           (obj->otyp >= DAGGER && obj->otyp <= CRYSKNIFE &&
  263. X            obj->otyp != ATHAME) || obj->otyp == WAR_HAMMER)
  264. X            pline("The %s slips as you throw it!", xname(obj));
  265. X        else slipok = FALSE;
  266. X        }
  267. X        if (slipok) {
  268. X        u.dx = rn2(3)-1;
  269. X        u.dy = rn2(3)-1;
  270. X        if (!u.dx && !u.dy) u.dz = 1;
  271. X        impaired = TRUE;
  272. X        }
  273. X    }
  274. X
  275. X    if(u.uswallow) {
  276. X        mon = u.ustuck;
  277. X        bhitpos.x = mon->mx;
  278. X        bhitpos.y = mon->my;
  279. X    } else if(u.dz) {
  280. X      if (u.dz < 0 && pl_character[0] == 'V' &&
  281. X          obj->oartifact == ART_MJOLLNIR && !impaired) {
  282. X          pline("%s hits the ceiling and returns to your hand!",
  283. X            The(xname(obj)));
  284. X          obj = addinv(obj);
  285. X          setuwep(obj);
  286. X          return(1);
  287. X      }
  288. X      if (u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) {
  289. X        pline("%s hits the ceiling, then falls back on top of your %s.",
  290. X        Doname2(obj),        /* note: obj->quan == 1 */
  291. X        body_part(HEAD));
  292. X        if(obj->oclass == POTION_CLASS)
  293. X        potionhit(&youmonst, obj);
  294. X        else {
  295. X            int dmg = rnd((int)(obj->owt));
  296. X          
  297. X        if (uarmh) {
  298. X            if(is_metallic(uarmh)) {
  299. X                pline("Fortunately, you are wearing a hard helmet.");
  300. X            dmg = 1;
  301. X            } else if (flags.verbose)
  302. X                Your("%s does not protect you.", xname(uarmh));
  303. X        } else if (obj->otyp == CORPSE &&
  304. X                obj->corpsenm == PM_COCKATRICE) {
  305. X#ifdef POLYSELF
  306. X            if(!resists_ston(uasmon))
  307. X            if(!(poly_when_stoned(uasmon) &&
  308. X                    polymon(PM_STONE_GOLEM))) {
  309. X#endif
  310. X            killer = doname(obj);
  311. X            You("turn to stone.");
  312. X            do_death = STONING;
  313. X#ifdef POLYSELF
  314. X            }
  315. X#endif
  316. X        }
  317. X
  318. X        if (!breaks(obj, TRUE)) {
  319. X            if(!ship_object(obj, u.ux, u.uy, FALSE)) {
  320. X            dropy(obj);
  321. X            if(*u.ushops)
  322. X                check_shop_obj(obj, obj->ox, obj->oy, FALSE);
  323. X            }
  324. X        }
  325. X        if (do_death == STONING)
  326. X            done(STONING);
  327. X        else
  328. X            losehp(dmg, "falling object", KILLED_BY_AN);
  329. X        }
  330. X      } else hitfloor(obj);
  331. X      return(1);
  332. X
  333. X    } else if(obj->otyp == BOOMERANG && !Underwater) {
  334. X        if(Is_airlevel(&u.uz) || Levitation) hurtle(-u.dx, -u.dy, 1);
  335. X        mon = boomhit(u.dx, u.dy);
  336. X        if(mon == &youmonst) {        /* the thing was caught */
  337. X            exercise(A_DEX, TRUE);
  338. X            (void) addinv(obj);
  339. X            return(1);
  340. X        }
  341. X    } else {
  342. X        urange = (int)(ACURRSTR)/2;
  343. X        range = urange - (int)(obj->owt/40);
  344. X        if (obj == uball) {
  345. X            if (u.ustuck) range = 1;
  346. X            else if (range >= 5) range = 5;
  347. X        }
  348. X        if (range < 1) range = 1;
  349. X
  350. X        if ((obj->oclass == WEAPON_CLASS || obj->oclass == GEM_CLASS)
  351. X                    && uwep && objects[obj->otyp].w_propellor) {
  352. X            if (objects[obj->otyp].w_propellor ==
  353. X                                 -objects[uwep->otyp].w_propellor)
  354. X            range++;
  355. X            else
  356. X            range /= 2;
  357. X        }
  358. X
  359. X        if (Is_airlevel(&u.uz) || Levitation) {
  360. X            /* action, reaction... */
  361. X            urange -= range;
  362. X            if(urange < 1) urange = 1;
  363. X            range -= urange;
  364. X            if(range < 1) range = 1;
  365. X        }
  366. X
  367. X#ifdef POLYSELF
  368. X        if (obj->otyp == BOULDER) range = 20;
  369. X#endif
  370. X        if (obj == uball && u.utrap && u.utraptype == TT_INFLOOR)
  371. X            range = 1;
  372. X
  373. X        if (Underwater) range = 1;
  374. X
  375. X        mon = bhit(u.dx,u.dy,range,THROWN_WEAPON,
  376. X               (int (*)()) 0,(int (*)()) 0,obj);
  377. X
  378. X        /* have to do this after bhit() so u.ux & u.uy are correct */
  379. X        if(Is_airlevel(&u.uz) || Levitation)
  380. X            hurtle(-u.dx, -u.dy, urange);
  381. X    }
  382. X    if(mon) {
  383. X        if(mon->isshk && (!inside_shop(u.ux, u.uy) ||
  384. X           !index(in_rooms(mon->mx, mon->my, SHOPBASE), *u.ushops))) { 
  385. X            if(obj->otyp == PICK_AXE) {
  386. X                register struct obj *otmp;
  387. X
  388. X            /* check if the pick axe was caught through  */
  389. X            /* a successful call to shkcatch() in bhit() */
  390. X                    for (otmp = mon->minvent; otmp; otmp = otmp->nobj)
  391. X                     if (otmp == obj) return(1);
  392. X            }
  393. X            wakeup(mon);
  394. X            hot_pursuit(mon);
  395. X        }
  396. X        (void) snuff_candle(obj);
  397. X        /* awake monster if sleeping */
  398. X        wakeup(mon);
  399. X        notonhead = (bhitpos.x != mon->mx || bhitpos.y != mon->my);
  400. X        if(thitmonst(mon, obj)) return(1);
  401. X    }
  402. X    if(!u.uswallow) {
  403. X        /* the code following might become part of dropy() */
  404. X        int obj_glyph = obj_to_glyph(obj);
  405. X        boolean gone = FALSE;
  406. X
  407. X        if (obj->oartifact == ART_MJOLLNIR && pl_character[0] == 'V') {
  408. X            /* we must be wearing Gauntlets of Power to get here */
  409. X            int x = bhitpos.x - u.dx, y = bhitpos.y - u.dy;
  410. X
  411. X            tmp_at(DISP_FLASH, obj_glyph);
  412. X            while(x != u.ux || y != u.uy) {
  413. X            tmp_at(x, y);
  414. X            delay_output();
  415. X            x -= u.dx; y -= u.dy;
  416. X            }
  417. X            tmp_at(DISP_END, 0);
  418. X
  419. X            if(!impaired) {
  420. X            pline("%s returns to your hand!", The(xname(obj)));
  421. X            obj = addinv(obj);
  422. X            setuwep(obj);
  423. X            if(cansee(bhitpos.x, bhitpos.y))
  424. X                newsym(bhitpos.x,bhitpos.y);
  425. X            } else {
  426. X            int dmg = rnd(4);
  427. X            if (Blind)
  428. X                pline("%s hits your %s!",
  429. X                  The(xname(obj)), body_part(ARM));
  430. X            else
  431. X                pline("%s flies back toward you, hitting your %s!",
  432. X                  The(xname(obj)), body_part(ARM));
  433. X            (void) artifact_hit((struct monst *) 0, &youmonst,
  434. X                        obj, &dmg, 0);
  435. X            losehp(dmg, xname(obj), KILLED_BY);
  436. X            if(ship_object(obj, u.ux, u.uy, FALSE)) 
  437. X                    return (1);
  438. X            dropy(obj);
  439. X            }
  440. X            return (1);
  441. X        }
  442. X        if (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ) && !u.uinwater &&
  443. X            obj->oclass == POTION_CLASS && rn2(2)) {
  444. X            if(distu(bhitpos.x, bhitpos.y) < 3 && rn2(5)) {
  445. X            pline("The flask breaks, and you smell a peculiar odor...");
  446. X            potionbreathe(obj);
  447. X            } else if(!Blind)
  448. X            pline("The flask breaks.");
  449. X            else pline("Crash!");
  450. X            if(*u.ushops)
  451. X                check_shop_obj(obj, bhitpos.x, bhitpos.y, TRUE);
  452. X            obfree(obj, (struct obj *)0);
  453. X            gone = TRUE;
  454. X        }
  455. X        if (gone || (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ) &&
  456. X                 breaks(obj, TRUE))) {
  457. X            tmp_at(DISP_FLASH, obj_glyph);
  458. X            tmp_at(bhitpos.x, bhitpos.y);
  459. X            delay_output();
  460. X            tmp_at(DISP_END, 0);
  461. X            return(1);
  462. X        }
  463. X        if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return(1);
  464. X        if(obj->otyp == CRYSKNIFE)
  465. X            obj->otyp = WORM_TOOTH;
  466. X            if(mon && mon->isshk && obj->otyp == PICK_AXE) {
  467. X                mpickobj(mon, obj);
  468. X            if(*u.ushops)
  469. X                check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE);
  470. X            return(1);
  471. X        }
  472. X        (void) snuff_candle(obj);
  473. X        if(!mon && obj != uball) {
  474. X            if(ship_object(obj, bhitpos.x, bhitpos.y, FALSE))
  475. X                return(1);
  476. X        }
  477. X        obj->nobj = fobj;
  478. X        fobj = obj;
  479. X        place_object(obj, bhitpos.x, bhitpos.y);
  480. X        if(*u.ushops && obj != uball)
  481. X            check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE);
  482. X        stackobj(obj);
  483. X        if (obj == uball) drop_ball(bhitpos.x, bhitpos.y);
  484. X        if(cansee(bhitpos.x, bhitpos.y)) newsym(bhitpos.x,bhitpos.y);
  485. X    } else {
  486. X        /* ball is not picked up by monster */
  487. X        if (obj != uball) mpickobj(u.ustuck,obj);
  488. X    }
  489. X    return(1);
  490. X}
  491. X
  492. Xint
  493. Xthitmonst(mon, obj)
  494. Xregister struct monst *mon;
  495. Xregister struct obj   *obj;
  496. X{
  497. X    register int    tmp; /* Base chance to hit */
  498. X    register int    disttmp; /* distance modifier */
  499. X
  500. X    /* Differences from melee weapons:
  501. X     *
  502. X     * Dex still gives a bonus, but strength does not.
  503. X     * Polymorphed players lacking attacks may still throw.
  504. X     * There's a base -1 to hit.
  505. X     * No bonuses for fleeing or stunned targets (they don't dodge
  506. X     *    melee blows as readily, but dodging arrows is hard anyway).
  507. X     * Not affected by traps, etc.
  508. X     * Certain items which don't in themselves do damage ignore tmp.
  509. X     * Distance and monster size affect chance to hit.
  510. X     */
  511. X    tmp = -1 + Luck + find_mac(mon);
  512. X#ifdef POLYSELF
  513. X    if (u.umonnum >= 0) tmp += uasmon->mlevel;
  514. X    else
  515. X#endif
  516. X        tmp += u.ulevel;
  517. X    if(ACURR(A_DEX) < 4) tmp -= 3;
  518. X    else if(ACURR(A_DEX) < 6) tmp -= 2;
  519. X    else if(ACURR(A_DEX) < 8) tmp -= 1;
  520. X    else if(ACURR(A_DEX) >= 14) tmp += (ACURR(A_DEX) - 14);
  521. X
  522. X    /* modify to-hit depending on distance; but keep it sane */
  523. X    disttmp = 3 - distmin(u.ux, u.uy, mon->mx, mon->my);
  524. X    if(disttmp < -4) disttmp = -4;
  525. X    tmp += disttmp;
  526. X
  527. X    /* it's easier to hit a larger target */
  528. X    if(bigmonst(mon->data)) tmp++;
  529. X
  530. X    if(mon->msleep) {
  531. X        mon->msleep = 0;
  532. X        tmp += 2;
  533. X    }
  534. X    if(!mon->mcanmove || !mon->data->mmove) {
  535. X        tmp += 4;
  536. X        if(!rn2(10)) {
  537. X            mon->mcanmove = 1;
  538. X            mon->mfrozen = 0;
  539. X        }
  540. X    }
  541. X    if (is_orc(mon->data) && pl_character[0]=='E') tmp++;
  542. X    if (u.uswallow && mon == u.ustuck) tmp += 1000; /* Guaranteed hit */
  543. X
  544. X    if(obj->oclass == GEM_CLASS && mon->data->mlet == S_UNICORN) {
  545. X        if (mon->mtame) {
  546. X            pline("%s catches and drops %s.",
  547. X                Monnam(mon), the(xname(obj)));
  548. X            return(0);
  549. X        } else {
  550. X            pline("%s catches %s.", Monnam(mon), the(xname(obj)));
  551. X            return(gem_accept(mon, obj));
  552. X        }
  553. X    }
  554. X    if(obj->oclass == WEAPON_CLASS || obj->otyp == PICK_AXE ||
  555. X       obj->otyp == UNICORN_HORN || obj->oclass == GEM_CLASS) {
  556. X        if(obj->otyp < DART || obj->oclass == GEM_CLASS) {
  557. X            if (!uwep ||
  558. X            objects[obj->otyp].w_propellor !=
  559. X            -objects[uwep->otyp].w_propellor) {
  560. X            tmp -= 4;
  561. X            } else {
  562. X            tmp += uwep->spe - uwep->oeroded;
  563. X            /*
  564. X             * Elves and Samurais are highly trained w/bows,
  565. X             * especially their own special types of bow.
  566. X             * Polymorphing won't make you a bow expert.
  567. X             */
  568. X            if ((pl_character[0] == 'E' || pl_character[0] == 'S')
  569. X                 && -objects[uwep->otyp].w_propellor == WP_BOW)
  570. X                tmp++;
  571. X            if (pl_character[0] == 'E' && uwep->otyp == ELVEN_BOW)
  572. X                tmp++;
  573. X            if (pl_character[0] == 'S' && uwep->otyp == YUMI)
  574. X                tmp++;
  575. X            }
  576. X        } else if(obj->otyp == BOOMERANG) tmp += 4;
  577. X        tmp += obj->spe;
  578. X        tmp += hitval(obj, mon->data);
  579. X        if(tmp >= rnd(20)) {
  580. X            if(hmon(mon,obj,1)){
  581. X              /* mon still alive */
  582. X              cutworm(mon, bhitpos.x, bhitpos.y, obj);
  583. X            }
  584. X            exercise(A_DEX, TRUE);
  585. X            /* projectiles thrown disappear sometimes */
  586. X            if((obj->otyp < BOOMERANG || obj->oclass == GEM_CLASS)
  587. X                                && rn2(3)) {
  588. X                    if(*u.ushops)
  589. X                             check_shop_obj(obj, bhitpos.x, 
  590. X                                   bhitpos.y, TRUE);
  591. X                /* check bill; free */
  592. X                obfree(obj, (struct obj *)0);
  593. X                return(1);
  594. X            }
  595. X        } else miss(xname(obj), mon);
  596. X    } else if(obj->otyp == HEAVY_IRON_BALL) {
  597. X        if(obj != uball) tmp += 2;
  598. X        exercise(A_STR, TRUE);
  599. X        if(tmp >= rnd(20)) {
  600. X            (void) hmon(mon,obj,1);
  601. X            exercise(A_DEX, TRUE);
  602. X        } else miss(xname(obj), mon);
  603. X    } else if (obj->otyp == BOULDER) {
  604. X        tmp += 6;  /* Likely to hit! */
  605. X        exercise(A_STR, TRUE);
  606. X        if(tmp >= rnd(20)) {
  607. X            (void) hmon(mon,obj,1);
  608. X            exercise(A_DEX, TRUE);
  609. X        } else miss(xname(obj), mon);
  610. X    } else if((obj->otyp == CREAM_PIE
  611. X#ifdef POLYSELF
  612. X            || obj->otyp == BLINDING_VENOM
  613. X#endif
  614. X                    ) && ACURR(A_DEX) >= rnd(10)) {
  615. X        (void) hmon(mon,obj,1); /* can't die from it */
  616. X#ifdef POLYSELF
  617. X    } else if(obj->otyp == ACID_VENOM && ACURR(A_DEX) >= rnd(10)) {
  618. X        (void) hmon(mon,obj,1);
  619. X#endif
  620. X    } else if(obj->oclass == POTION_CLASS && ACURR(A_DEX) >= rnd(15)) {
  621. X        potionhit(mon, obj);
  622. X        return(1);
  623. X    } else {
  624. X        pline("%s misses %s.", The(xname(obj)), mon_nam(mon));
  625. X        if(obj->oclass == FOOD_CLASS && is_domestic(mon->data))
  626. X            if(tamedog(mon,obj)) return(1);
  627. X    }
  628. X    return(0);
  629. X}
  630. X
  631. Xstatic int
  632. Xgem_accept(mon, obj)
  633. Xregister struct monst *mon;
  634. Xregister struct obj *obj;
  635. X{
  636. X    char buf[BUFSZ];
  637. X    boolean is_buddy = sgn(mon->data->maligntyp) == sgn(u.ualign.type);
  638. X    boolean is_gem = objects[obj->otyp].oc_material == GEMSTONE;
  639. X    int ret = 0;
  640. X    static const char NEARDATA nogood[] = " is not interested in your junk.";
  641. X    static const char NEARDATA acceptgift[] = " accepts your gift.";
  642. X    static const char NEARDATA maybeluck[] = " hesitatingly";
  643. X    static const char NEARDATA noluck[] = " graciously";
  644. X    static const char NEARDATA addluck[] = " gratefully";
  645. X
  646. X    Strcpy(buf,Monnam(mon));
  647. X
  648. X    mon->mpeaceful = 1;
  649. X
  650. X    /* object properly identified */
  651. X    if(obj->dknown && objects[obj->otyp].oc_name_known) {
  652. X        if(is_gem) {
  653. X            if(is_buddy) {
  654. X                Strcat(buf,addluck);
  655. X                change_luck(5);
  656. X            } else {
  657. X                Strcat(buf,maybeluck);
  658. X                change_luck(rn2(7)-3);
  659. X            }
  660. X        } else {
  661. X            Strcat(buf,nogood);
  662. X            goto nopick;
  663. X        }
  664. X    /* making guesses */
  665. X    } else if(obj->onamelth || objects[obj->otyp].oc_uname) {
  666. X        if(is_gem) {
  667. X            if(is_buddy) {
  668. X                Strcat(buf,addluck);
  669. X                change_luck(2);
  670. X            } else {
  671. X                Strcat(buf,maybeluck);
  672. X                change_luck(rn2(3)-1);
  673. X            }
  674. X        } else {
  675. X            Strcat(buf,nogood);
  676. X            goto nopick;
  677. X        }
  678. X    /* value completely unknown to @ */
  679. X    } else {
  680. X        if(is_gem) {
  681. X            if(is_buddy) {
  682. X                Strcat(buf,addluck);
  683. X                change_luck(1);
  684. X            } else {
  685. X                Strcat(buf,maybeluck);
  686. X                change_luck(rn2(3)-1);
  687. X            }
  688. X        } else {
  689. X            Strcat(buf,noluck);
  690. X        }
  691. X    }
  692. X     Strcat(buf,acceptgift);
  693. X    mpickobj(mon, obj);
  694. X    if(*u.ushops) check_shop_obj(obj, mon->mx, mon->my, TRUE);
  695. X    ret = 1;
  696. X
  697. Xnopick:
  698. X    if(!Blind) pline(buf);
  699. X    rloc(mon);
  700. X    return(ret);
  701. X}
  702. X
  703. X/* returns 0 if object doesn't break    */
  704. X/* returns 1 if object broke         */
  705. Xint
  706. Xbreaks(obj, loose)
  707. Xregister struct obj   *obj;
  708. Xregister boolean loose;        /* if not loose, obj is in fobj chain */
  709. X{
  710. X    switch(obj->otyp) {
  711. X        case MIRROR:
  712. X            change_luck(-2);    /* and fall through */
  713. X        case CRYSTAL_BALL:
  714. X#ifdef TOURIST
  715. X        case EXPENSIVE_CAMERA:
  716. X#endif
  717. X            if(!Blind)
  718. X                pline("%s shatters into a thousand pieces!",
  719. X                Doname2(obj));
  720. X            else You("hear something shatter!");
  721. X            break;
  722. X        case EGG:
  723. X            pline("Splat!");
  724. X            break;
  725. X        case CREAM_PIE:
  726. X            pline("What a mess!");
  727. X            break;
  728. X        case ACID_VENOM:
  729. X        case BLINDING_VENOM:
  730. X            pline("Splash!");
  731. X            break;
  732. X        default:
  733. X            return 0;
  734. X    }
  735. X
  736. X    /* it is currently assumed that 'loose' is co-extensive
  737. X     * with 'thrown'.  if this changes, an explicit 'thrown'
  738. X     * arg must be added to breaks() to ensure proper 
  739. X     * treatment of shop objs.
  740. X     */
  741. X    if(loose) {
  742. X        newsym(obj->ox,obj->oy);
  743. X        if(*u.ushops) 
  744. X                check_shop_obj(obj, obj->ox, obj->oy, TRUE);
  745. X        obfree(obj, (struct obj *)0);
  746. X    } else {
  747. X            /* it is assumed that the obj is a floor-object */ 
  748. X            register struct monst *shkp;
  749. X            boolean costly, insider;
  750. X        long loss = 0L;
  751. X
  752. X#ifdef GCC_WARN
  753. X        shkp = (struct monst *) 0;
  754. X#endif
  755. X
  756. X        costly = (costly_spot(obj->ox, obj->oy) && 
  757. X                   (shkp = shop_keeper(*in_rooms(obj->ox,
  758. X                  obj->oy, SHOPBASE))) != (struct monst *)0);
  759. X        insider = (*u.ushops && inside_shop(u.ux, u.uy) &&
  760. X             *in_rooms(obj->ox, obj->oy, SHOPBASE) == *u.ushops);
  761. X
  762. X        if(costly)
  763. X            loss = stolen_value(obj, u.ux, u.uy, 
  764. X                 (shkp && shkp->mpeaceful), FALSE);
  765. X        if(loss && !insider)
  766. X            make_angry_shk(shkp, obj->ox, obj->oy);
  767. X
  768. X        delobj(obj);
  769. X    }
  770. X    return(1);
  771. X}
  772. X
  773. X/*
  774. X *  Note that the gold object is *not* attached to the fobj chain.
  775. X */
  776. Xstatic int
  777. Xthrow_gold(obj)
  778. Xstruct obj *obj;
  779. X{
  780. X    int range, odx, ody;
  781. X    long zorks = obj->quan;
  782. X    register struct monst *mon;
  783. X
  784. X    if(u.uswallow) {
  785. X        pline(is_animal(u.ustuck->data) ?
  786. X            "%s in the %s's entrails." : "%s into %s.",
  787. X            "The gold disappears", mon_nam(u.ustuck));
  788. X        u.ustuck->mgold += zorks;
  789. X        dealloc_obj(obj);
  790. X        return(1);
  791. X    }
  792. X
  793. X    if(u.dz) {
  794. X          if(u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) {
  795. X    pline("The gold hits the ceiling, then falls back on top of your %s.",
  796. X            body_part(HEAD));
  797. X            /* some self damage? */
  798. X            if(uarmh) pline("Fortunately, you are wearing a helmet!");
  799. X        }
  800. X        if(flooreffects(obj,u.ux,u.uy,"fall")) return(1);
  801. X        if(u.dz > 0) pline("The gold hits the floor.");
  802. X        obj->nobj = fobj;    /* add the gold to the object list */
  803. X        fobj = obj;
  804. X        place_object(obj,u.ux,u.uy);
  805. X                if(*u.ushops) sellobj(obj, u.ux, u.uy);
  806. X        stackobj(obj);
  807. X        newsym(u.ux,u.uy);
  808. X        return 1;
  809. X    }
  810. X
  811. X    /* consistent with range for normal objects */
  812. X    range = (int)((ACURRSTR)/2 - obj->owt/40);
  813. X
  814. X    /* see if the gold has a place to move into */
  815. X    odx = u.ux + u.dx;
  816. X    ody = u.uy + u.dy;
  817. X    if(!ZAP_POS(levl[odx][ody].typ) || closed_door(odx, ody)) {
  818. X        bhitpos.x = u.ux;
  819. X        bhitpos.y = u.uy;
  820. X    } else {
  821. X        mon = bhit(u.dx, u.dy, range, THROWN_WEAPON,
  822. X                   (int (*)()) 0, (int (*)()) 0, obj);
  823. X        if(mon) {
  824. X            if (ghitm(mon, obj))    /* was it caught? */
  825. X            return 1;
  826. X        } else {
  827. X            if(ship_object(obj, bhitpos.x, bhitpos.y, FALSE)) 
  828. X                return 1;
  829. X        }
  830. X    }
  831. X
  832. X    if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return(1);
  833. X    obj->nobj = fobj;    /* add the gold to the object list */
  834. X    fobj = obj;
  835. X    place_object(obj,bhitpos.x,bhitpos.y);
  836. X        if(*u.ushops) sellobj(obj, bhitpos.x, bhitpos.y);
  837. X    stackobj(obj);
  838. X    newsym(bhitpos.x,bhitpos.y);
  839. X    return(1);
  840. X}
  841. X
  842. X/*dothrow.c*/
  843. END_OF_FILE
  844. if test 21479 -ne `wc -c <'src/dothrow.c'`; then
  845.     echo shar: \"'src/dothrow.c'\" unpacked with wrong size!
  846. fi
  847. # end of 'src/dothrow.c'
  848. fi
  849. if test -f 'src/monst.c3' -a "${1}" != "-c" ; then 
  850.   echo shar: Will not clobber existing file \"'src/monst.c3'\"
  851. else
  852. echo shar: Extracting \"'src/monst.c3'\" \(33131 characters\)
  853. sed "s/^X//" >'src/monst.c3' <<'END_OF_FILE'
  854. X#ifdef SEDUCE
  855. X    { "succubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
  856. X      { { AT_BITE, AD_SSEX, 0, 0 }, { AT_CLAW, AD_PHYS, 1, 3 },
  857. X        { AT_CLAW, AD_PHYS, 1, 3 }, NO_ATTK,
  858. X        NO_ATTK, NO_ATTK },
  859. X      WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN,
  860. X      MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
  861. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE, 0, C(GRAY) },
  862. X    { "incubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
  863. X      { { AT_BITE, AD_SSEX, 0, 0 }, { AT_CLAW, AD_PHYS, 1, 3 },
  864. X        { AT_CLAW, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK, NO_ATTK },
  865. X      WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN,
  866. X      MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
  867. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE, 0, C(GRAY) },
  868. X#else
  869. X    { "succubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
  870. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  871. X        { AT_BITE, AD_DRLI, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  872. X      WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN,
  873. X      MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY,
  874. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE, 0, C(GRAY) },
  875. X    { "incubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
  876. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  877. X        { AT_BITE, AD_DRLI, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  878. X      WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN,
  879. X      MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
  880. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE, 0, C(GRAY) },
  881. X#endif
  882. X    { "erinyes", S_DEMON, 7, 12, 2, 30, 10,
  883. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  884. X      { { AT_WEAP, AD_DRST, 2, 4 }, NO_ATTK, NO_ATTK,
  885. X        NO_ATTK, NO_ATTK, NO_ATTK },
  886. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN,
  887. X      MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS,
  888. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_FEMALE |
  889. X      M2_COLLECT, 0, C(RED) },
  890. X    { "barbed devil", S_DEMON, 8, 12, 0, 35, 8,
  891. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  892. X      { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
  893. X        { AT_STNG, AD_PHYS, 3, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
  894. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN,
  895. X      MR_FIRE | MR_POISON, 0, M1_POIS | M1_THICK_HIDE,
  896. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(RED) },
  897. X    { "marilith", S_DEMON, 7, 12, -6, 80, -12, (G_HELL | G_NOCORPSE | 1),
  898. X      { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
  899. X        { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
  900. X        { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 } },
  901. X      WT_HUMAN, 400, 0, MS_CUSS, MZ_LARGE,
  902. X      MR_FIRE | MR_POISON, 0,
  903. X      M1_HUMANOID | M1_SLITHY | M1_SEE_INVIS | M1_POIS,
  904. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE | M2_COLLECT,
  905. X      0, C(RED) },
  906. X    { "vrock", S_DEMON, 8, 12, 0, 50, -9,
  907. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  908. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  909. X        { AT_CLAW, AD_PHYS, 1, 8 }, { AT_CLAW, AD_PHYS, 1, 8 },
  910. X        { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK },
  911. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
  912. X      MR_FIRE | MR_POISON, 0, M1_POIS,
  913. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(RED) },
  914. X    { "hezrou", S_DEMON, 9, 6, -2, 55, -10,
  915. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  916. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  917. X        { AT_BITE, AD_PHYS, 4, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
  918. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
  919. X      MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS,
  920. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(RED) },
  921. X    { "bone devil", S_DEMON, 9, 15, -1, 40, -9,
  922. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  923. X      { { AT_WEAP, AD_PHYS, 3, 4 }, { AT_STNG, AD_DRST, 2, 4 },
  924. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  925. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
  926. X      MR_FIRE | MR_POISON, 0, M1_POIS,
  927. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
  928. X      0, C(GRAY) },
  929. X    { "ice devil", S_DEMON, 11, 6, -4, 55, -12, (G_HELL | G_NOCORPSE | 2),
  930. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  931. X        { AT_BITE, AD_PHYS, 2, 4 }, { AT_STNG, AD_COLD, 3, 4 },
  932. X        NO_ATTK, NO_ATTK },
  933. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
  934. X      MR_FIRE | MR_COLD | MR_POISON, 0, M1_SEE_INVIS | M1_POIS,
  935. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(WHITE) },
  936. X    { "nalfeshnee", S_DEMON, 11, 9, -1, 65, -11, (G_HELL | G_NOCORPSE | 1),
  937. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  938. X        { AT_BITE, AD_PHYS, 2, 4 }, { AT_MAGC, AD_SPEL, 0, 0 },
  939. X        NO_ATTK, NO_ATTK },
  940. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
  941. X      MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS,
  942. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(RED) },
  943. X    { "pit fiend", S_DEMON, 13, 6, -3, 65, -13, (G_HELL | G_NOCORPSE | 2),
  944. X      { { AT_WEAP, AD_PHYS, 4, 2 }, { AT_WEAP, AD_PHYS, 4, 2 },
  945. X        { AT_HUGS, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
  946. X      WT_HUMAN, 400, 0, MS_GROWL, MZ_LARGE,
  947. X      MR_FIRE | MR_POISON, 0, M1_SEE_INVIS | M1_POIS,
  948. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, 0, C(RED) },
  949. X    { "balrog", S_DEMON, 16, 5, -2, 75, -14, (G_HELL | G_NOCORPSE | 1),
  950. X      { { AT_WEAP, AD_PHYS, 8, 4 }, { AT_WEAP, AD_PHYS, 4, 6 },
  951. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  952. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
  953. X      MR_FIRE | MR_POISON, 0, M1_FLY | M1_SEE_INVIS | M1_POIS,
  954. X      M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT,
  955. X      0, C(RED) },
  956. X    /* Named demon lords & princes plus Arch-Devils */
  957. X    { "Juiblex", S_DEMON, 50, 3, -7, 65, -15,
  958. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  959. X      { { AT_ENGL, AD_DISE, 4, 10 }, { AT_SPIT, AD_ACID, 3, 6 },
  960. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  961. X      1500, 0, 0, MS_GURGLE, MZ_LARGE,
  962. X      MR_FIRE | MR_POISON | MR_ACID | MR_STONE, 0,
  963. X      M1_AMPHIBIOUS | M1_AMORPHOUS | M1_NOHEAD | M1_FLY | M1_SEE_INVIS |
  964. X      M1_ACID | M1_POIS,
  965. X      M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY |
  966. X      M2_LORD | M2_MALE,
  967. X      M3_WANTSAMUL, C(BRIGHT_GREEN) },
  968. X    { "Yeenoghu", S_DEMON, 56, 18, -5, 80, -15,
  969. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  970. X      { { AT_WEAP, AD_PHYS, 3, 6 }, { AT_WEAP, AD_CONF, 2, 8 },
  971. X        { AT_WEAP, AD_PLYS, 1, 6 }, { AT_MAGC, AD_MAGM, 2, 6 },
  972. X        NO_ATTK, NO_ATTK },
  973. X      900, 500, 0, MS_ORC, MZ_LARGE, MR_FIRE | MR_POISON, 0,
  974. X      M1_FLY | M1_SEE_INVIS | M1_POIS, M2_NOPOLY | M2_DEMON | M2_STALK |
  975. X      M2_HOSTILE | M2_PNAME | M2_NASTY | M2_LORD | M2_MALE | M2_COLLECT,
  976. X      M3_WANTSAMUL, C(HI_LORD) },
  977. X    { "Orcus", S_DEMON, 66, 9, -6, 85, -20,
  978. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  979. X      { { AT_MAGC, AD_SPEL, 8, 6 }, { AT_WEAP, AD_PHYS, 3, 6 },
  980. X        { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 },
  981. X        { AT_STNG, AD_DRST, 2, 4 }, NO_ATTK },
  982. X      1500, 500, 0, MS_ORC, MZ_HUGE,
  983. X      MR_FIRE | MR_POISON, 0,
  984. X      M1_FLY | M1_SEE_INVIS | M1_POIS, M2_NOPOLY | M2_DEMON | M2_STALK |
  985. X      M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE | M2_COLLECT,
  986. X      M3_WANTSBOOK | M3_WANTSAMUL, C(HI_LORD) },
  987. X    { "Geryon", S_DEMON, 72, 3, -3, 75, 15,
  988. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  989. X      { { AT_CLAW, AD_PHYS, 3, 6 }, { AT_CLAW, AD_PHYS, 3, 6 },
  990. X        { AT_STNG, AD_DRST, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
  991. X      1500, 500, 0, MS_BRIBE, MZ_HUGE,
  992. X      MR_FIRE | MR_POISON, 0,
  993. X      M1_FLY | M1_SEE_INVIS | M1_POIS | M1_SLITHY, M2_NOPOLY | M2_DEMON |
  994. X      M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE,
  995. X      M3_WANTSAMUL, C(HI_LORD) },
  996. X    { "Dispater", S_DEMON, 78, 15, -2, 80, 15,
  997. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  998. X      { { AT_WEAP, AD_PHYS, 4, 6 }, { AT_MAGC, AD_SPEL, 6, 6 },
  999. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1000. X      1500, 500, 0, MS_BRIBE, MZ_HUMAN,
  1001. X      MR_FIRE | MR_POISON, 0, M1_FLY | M1_SEE_INVIS | M1_POIS |
  1002. X      M1_HUMANOID, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE |
  1003. X      M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE | M2_COLLECT,
  1004. X      M3_WANTSAMUL, C(HI_LORD) },
  1005. X    { "Baalzebub", S_DEMON, 89, 9, -5, 85, 20,
  1006. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  1007. X      { { AT_BITE, AD_DRST, 2, 6 }, { AT_GAZE, AD_STUN, 2, 6 },
  1008. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1009. X      1500, 500, 0, MS_BRIBE, MZ_LARGE,
  1010. X      MR_FIRE | MR_POISON, 0, M1_FLY | M1_SEE_INVIS | M1_POIS,
  1011. X      M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY |
  1012. X      M2_PRINCE | M2_MALE, M3_WANTSAMUL | M3_WAITFORU, C(HI_LORD) },
  1013. X    { "Asmodeus", S_DEMON, 105, 12, -7, 90, 20,
  1014. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  1015. X      { { AT_CLAW, AD_PHYS, 4, 4 }, { AT_MAGC, AD_COLD, 6, 6 },
  1016. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1017. X      1500, 500, 0, MS_BRIBE, MZ_HUGE,
  1018. X      MR_FIRE | MR_COLD | MR_POISON, 0,
  1019. X      M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_POIS,
  1020. X      M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG |
  1021. X      M2_NASTY | M2_PRINCE | M2_MALE, M3_WANTSAMUL | M3_WAITFORU,
  1022. X      C(HI_LORD) },
  1023. X    { "Demogorgon", S_DEMON, 106, 15, -8, 95, -20,
  1024. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  1025. X      { { AT_MAGC, AD_SPEL, 8, 6 }, { AT_STNG, AD_DRLI, 1, 4 },
  1026. X        { AT_CLAW, AD_DISE, 1, 6 }, { AT_CLAW, AD_DISE, 1, 6 },
  1027. X        NO_ATTK, NO_ATTK },
  1028. X      1500, 500, 0, MS_GROWL, MZ_HUGE, MR_FIRE | MR_POISON, 0,
  1029. X      M1_FLY | M1_SEE_INVIS | M1_NOHANDS | M1_POIS, M2_NOPOLY | M2_DEMON |
  1030. X      M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE,
  1031. X      M3_WANTSAMUL, C(HI_LORD) },
  1032. X    { "Death", S_DEMON, 20, 3, 4, 95, 0, (G_UNIQ | G_NOGEN),
  1033. X      { { AT_TUCH, AD_DETH, 8, 8 }, { AT_TUCH, AD_DETH, 8, 8 },
  1034. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1035. X      WT_HUMAN, 0, 0, MS_DEATH, MZ_HUMAN,
  1036. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
  1037. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
  1038. X      M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_REGEN,
  1039. X      M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
  1040. X      0, C(HI_LORD) },
  1041. X    { "Pestilence", S_DEMON, 20, 3, 4, 95, 0, (G_UNIQ | G_NOGEN),
  1042. X      { { AT_TUCH, AD_PEST, 8, 8 }, { AT_TUCH, AD_PEST, 8, 8 },
  1043. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1044. X      WT_HUMAN, 0, 0, MS_PESTILENCE, MZ_HUMAN,
  1045. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
  1046. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
  1047. X      M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_REGEN,
  1048. X      M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
  1049. X      0, C(HI_LORD) },
  1050. X    { "Famine", S_DEMON, 20, 3, 4, 95, 0, (G_UNIQ | G_NOGEN),
  1051. X      { { AT_TUCH, AD_FAMN, 8, 8 }, { AT_TUCH, AD_FAMN, 8, 8 },
  1052. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1053. X      WT_HUMAN, 0, 0, MS_FAMINE, MZ_HUMAN,
  1054. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
  1055. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
  1056. X      M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_REGEN,
  1057. X      M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
  1058. X      0, C(HI_LORD) },
  1059. X#ifdef MAIL
  1060. X    { "mail daemon", S_DEMON, 56, 24, 10, 127, 0, (G_NOGEN | G_NOCORPSE),
  1061. X      { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1062. X      600, 300, 0, MS_SILENT, MZ_HUMAN,
  1063. X      MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
  1064. X      M1_FLY | M1_SWIM | M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID |
  1065. X      M1_POIS, M2_NOPOLY | M2_STALK | M2_PEACEFUL, 0, C(BRIGHT_BLUE) },
  1066. X/* Neither rain nor sleet nor gloom of night shall stay this courier... */
  1067. X#endif
  1068. X    { "djinni", S_DEMON, 7, 12, 4, 30, 0, (G_NOGEN | G_NOCORPSE),
  1069. X      { { AT_WEAP, AD_PHYS, 2, 8 }, NO_ATTK, NO_ATTK,
  1070. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1071. X      1500, 400, 0, MS_DJINNI, MZ_HUMAN, MR_POISON | MR_STONE, 0,
  1072. X      M1_HUMANOID | M1_FLY | M1_POIS,
  1073. X      M2_NOPOLY | M2_STALK | M2_COLLECT, 0, C(YELLOW) },
  1074. X/*    sea monsters        */
  1075. X    { "giant eel", S_EEL, 5, 9, -1, 0, 0, (G_GENO | G_NOGEN),
  1076. X      { { AT_BITE, AD_PHYS, 3, 6 }, { AT_TUCH, AD_WRAP, 0, 0 },
  1077. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1078. X      200, 250, 0, MS_SILENT, MZ_HUGE,
  1079. X      0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY |
  1080. X      M1_NOLIMBS | M1_CARNIVORE | M1_OVIPAROUS, M2_HOSTILE, 0, C(CYAN) },
  1081. X    { "electric eel", S_EEL, 7, 10, -3, 0, 0, (G_GENO | G_NOGEN),
  1082. X      { { AT_BITE, AD_ELEC, 4, 6 }, { AT_TUCH, AD_WRAP, 0, 0 },
  1083. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1084. X      200, 250, 0, MS_SILENT, MZ_HUGE, MR_ELEC, MR_ELEC,
  1085. X      M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS |
  1086. X      M1_CARNIVORE | M1_OVIPAROUS, M2_HOSTILE, 0, C(BLUE) },
  1087. X    { "kraken", S_EEL, 20, 3, 6, 0, -3, (G_GENO | G_NOGEN),
  1088. X      { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
  1089. X        { AT_HUGS, AD_WRAP, 2, 6 }, { AT_BITE, AD_PHYS, 5, 4 },
  1090. X        NO_ATTK, NO_ATTK },
  1091. X      1800, 1000, 0, MS_SILENT, MZ_HUGE, 0, 0,
  1092. X      M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
  1093. X      M2_NOPOLY | M2_HOSTILE | M2_STRONG, 0, C(RED) },
  1094. X/*    lizards     */
  1095. X    { "newt", S_LIZARD, 0, 6, 8, 0, 0, (G_GENO | 5),
  1096. X      { { AT_BITE, AD_PHYS, 1, 2 }, NO_ATTK, NO_ATTK,
  1097. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1098. X      10, 20, 0, MS_SILENT, MZ_TINY, 0, 0,
  1099. X      M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
  1100. X      M2_HOSTILE, 0, C(YELLOW) },
  1101. X    { "gecko", S_LIZARD, 1, 6, 8, 0, 0, (G_GENO | 5),
  1102. X      { { AT_BITE, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK,
  1103. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1104. X      10, 20, 0, MS_SQEEK, MZ_TINY, 0, 0,
  1105. X      M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, C(GREEN) },
  1106. X    { "iguana", S_LIZARD, 2, 6, 7, 0, 0, (G_GENO | 5),
  1107. X      { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  1108. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1109. X      30, 30, 0, MS_SILENT, MZ_TINY, 0, 0,
  1110. X      M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, C(BROWN) },
  1111. X    { "baby crocodile", S_LIZARD, 3, 6, 7, 0, 0, G_GENO,
  1112. X      { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
  1113. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1114. X      200, 200, 0, MS_SILENT, MZ_MEDIUM, 0, 0,
  1115. X      M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
  1116. X      M2_HOSTILE, 0, C(BROWN) },
  1117. X    { "lizard", S_LIZARD, 5, 6, 6, 10, 0, (G_GENO | 5),
  1118. X      { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1119. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1120. X      10, 40, 0, MS_SILENT, MZ_TINY, MR_STONE, MR_STONE,
  1121. X      M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, C(GREEN) },
  1122. X    { "chameleon", S_LIZARD, 6, 5, 6, 10, 0, (G_GENO | 2),
  1123. X      { { AT_BITE, AD_PHYS, 4, 2 }, NO_ATTK, NO_ATTK,
  1124. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1125. X      100, 100, 0, MS_SILENT, MZ_TINY,
  1126. X      0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
  1127. X      M2_NOPOLY | M2_HOSTILE, 0, C(BROWN) },
  1128. X    { "crocodile", S_LIZARD, 6, 9, 5, 0, 0, (G_GENO | 1),
  1129. X      { { AT_BITE, AD_PHYS, 4, 2 }, { AT_CLAW, AD_PHYS, 1, 12 },
  1130. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1131. X      WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE, 0, 0,
  1132. X      M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS |
  1133. X      M1_OVIPAROUS | M1_CARNIVORE, M2_STRONG | M2_HOSTILE, 0, C(BROWN) },
  1134. X
  1135. X/*    character classes */
  1136. X    { "archeologist", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
  1137. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1138. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1139. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1140. X      M1_HUMANOID | M1_TUNNEL | M1_NEEDPICK | M1_OMNIVORE,
  1141. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
  1142. X    { "barbarian", S_HUMAN, 1, 10, 10, 1, 0, G_NOGEN,
  1143. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1144. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1145. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, MR_POISON, MR_POISON,
  1146. X      M1_HUMANOID | M1_OMNIVORE,
  1147. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
  1148. X    { "caveman", S_HUMAN, 1, 10, 10, 0, 1, G_NOGEN,
  1149. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1150. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1151. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1152. X      M1_HUMANOID | M1_OMNIVORE,
  1153. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT, 0, C(RED) },
  1154. X    { "cavewoman", S_HUMAN, 1, 10, 10, 0, 1, G_NOGEN,
  1155. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1156. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1157. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1158. X      M1_HUMANOID | M1_OMNIVORE,
  1159. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
  1160. X      0, C(HI_DOMESTIC) },
  1161. X    /* Note: players who are elves still get normal carrying capacity,
  1162. X     * even though this is strictly speaking inconsistent.
  1163. X     */
  1164. X    { "elf", S_HUMAN, 1, 12, 10, 2, -3, G_NOGEN,
  1165. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1166. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1167. X      WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
  1168. X      M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
  1169. X      M2_NOPOLY | M2_ELF | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
  1170. X    { "healer", S_HUMAN, 1, 10, 10, 1, 0, G_NOGEN,
  1171. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1172. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1173. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, MR_POISON, MR_POISON,
  1174. X      M1_HUMANOID | M1_OMNIVORE,
  1175. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
  1176. X    { "knight", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
  1177. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1178. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1179. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1180. X      M1_HUMANOID | M1_OMNIVORE,
  1181. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
  1182. X    { "priest", S_HUMAN, 1, 10, 10, 2, 0, G_NOGEN,
  1183. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1184. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1185. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1186. X      M1_HUMANOID | M1_OMNIVORE,
  1187. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT,
  1188. X      0, C(HI_DOMESTIC) },
  1189. X    { "priestess", S_HUMAN, 1, 10, 10, 2, 0, G_NOGEN,
  1190. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1191. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1192. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1193. X      M1_HUMANOID | M1_OMNIVORE,
  1194. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
  1195. X      0, C(HI_DOMESTIC) },
  1196. X    { "rogue", S_HUMAN, 1, 10, 10, 1, -3, G_NOGEN,
  1197. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1198. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1199. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1200. X      M1_HUMANOID | M1_OMNIVORE,
  1201. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
  1202. X      0, C(HI_DOMESTIC) },
  1203. X    { "samurai", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
  1204. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1205. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1206. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1207. X      M1_HUMANOID | M1_OMNIVORE,
  1208. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
  1209. X#ifdef TOURIST
  1210. X    { "tourist", S_HUMAN, 1, 10, 10, 1, 0, G_NOGEN,
  1211. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1212. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1213. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1214. X      M1_HUMANOID | M1_OMNIVORE,
  1215. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
  1216. X#endif
  1217. X    { "valkyrie", S_HUMAN, 1, 10, 10, 1, -1, G_NOGEN,
  1218. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1219. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1220. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, MR_COLD, MR_COLD,
  1221. X      M1_HUMANOID | M1_OMNIVORE,
  1222. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
  1223. X      0, C(HI_DOMESTIC) },
  1224. X    { "wizard", S_HUMAN, 1, 10, 10, 3, 0, G_NOGEN,
  1225. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1226. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1227. X      WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
  1228. X      M1_HUMANOID | M1_OMNIVORE,
  1229. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MAGIC,
  1230. X      0, C(HI_DOMESTIC) },
  1231. X#ifdef MULDGN
  1232. X    { "Lord Carnarvon", S_HUMAN, 20, 12, 0, 30, 20, (G_NOGEN | G_UNIQ),
  1233. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1234. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1235. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
  1236. X      M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
  1237. X      M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
  1238. X      M2_COLLECT | M2_MAGIC,
  1239. X      M3_CLOSE, C(HI_LORD) },
  1240. X    { "Pelias", S_HUMAN, 20, 12, 0, 30, 0, (G_NOGEN | G_UNIQ),
  1241. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1242. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1243. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, MR_POISON, MR_POISON,
  1244. X      M1_HUMANOID | M1_OMNIVORE,
  1245. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
  1246. X      M2_COLLECT | M2_MAGIC,
  1247. X      M3_CLOSE, C(HI_LORD) },
  1248. X    { "Shaman Karnov", S_HUMAN, 20, 12, 0, 30, 20, (G_NOGEN | G_UNIQ),
  1249. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1250. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1251. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
  1252. X      M1_HUMANOID | M1_OMNIVORE,
  1253. X      M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
  1254. X      M2_COLLECT | M2_MAGIC,
  1255. X      M3_CLOSE, C(HI_LORD) },
  1256. X    /* Two for elves - one of each sex. */
  1257. X    { "Earendil", S_HUMAN, 20, 15, 0, 50, -20, (G_NOGEN | G_UNIQ),
  1258. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1259. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1260. X      WT_ELF, 350, 0, MS_LEADER, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
  1261. X      M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
  1262. X      M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG |
  1263. X      M2_MALE | M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
  1264. X    { "Elwing", S_HUMAN, 20, 15, 0, 50, -20, (G_NOGEN | G_UNIQ),
  1265. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1266. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1267. X      WT_ELF, 350, 0, MS_LEADER, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
  1268. X      M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
  1269. X      M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG |
  1270. X      M2_FEMALE | M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
  1271. X    { "Hippocrates", S_HUMAN, 20, 12, 0, 40, 0, (G_NOGEN | G_UNIQ),
  1272. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1273. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1274. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, MR_POISON, MR_POISON,
  1275. X      M1_HUMANOID | M1_OMNIVORE,
  1276. X      M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
  1277. X      M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
  1278. X    { "King Arthur", S_HUMAN, 20, 12, 0, 40, 20, (G_NOGEN | G_UNIQ),
  1279. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1280. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1281. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
  1282. X      M1_HUMANOID | M1_OMNIVORE,
  1283. X      M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
  1284. X      M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
  1285. X    { "Arch Priest", S_HUMAN, 25, 15, MARM(7,-3), 70, 0,
  1286. X       (G_NOGEN | G_UNIQ),
  1287. X      { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_KICK, AD_PHYS, 2, 8 },
  1288. X        { AT_MAGC, AD_CLRC, 2, 8 }, { AT_MAGC, AD_CLRC, 2, 8 },
  1289. X        NO_ATTK, NO_ATTK },
  1290. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN,
  1291. X      MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON,
  1292. X      MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON,
  1293. X      M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
  1294. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_NASTY |
  1295. X      M2_COLLECT | M2_MAGIC, M3_CLOSE, C(WHITE) },
  1296. X    { "Master of Thieves", S_HUMAN, 20, 15, 0, 30, -20, (G_NOGEN | G_UNIQ),
  1297. X      { { AT_WEAP, AD_PHYS, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK,
  1298. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1299. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
  1300. X      M1_HUMANOID | M1_OMNIVORE,
  1301. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE |
  1302. X      M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC,
  1303. X      M3_CLOSE, C(HI_LORD) },
  1304. X    { "Lord Sato", S_HUMAN, 20, 0, 0, 30, 20, (G_NOGEN | G_UNIQ),
  1305. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1306. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1307. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
  1308. X      M1_HUMANOID | M1_OMNIVORE,
  1309. X      M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
  1310. X      M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
  1311. X#ifdef TOURIST
  1312. X    { "Twoflower", S_HUMAN, 20, 10, 10, 20, 0, (G_NOGEN | G_UNIQ),
  1313. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK,
  1314. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1315. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
  1316. X      M1_HUMANOID | M1_OMNIVORE,
  1317. X      M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
  1318. X      M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_DOMESTIC) },
  1319. X#endif
  1320. X    { "Norn", S_HUMAN, 20, 15, 0, 80, 0, (G_NOGEN | G_UNIQ),
  1321. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1322. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1323. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, MR_COLD, MR_COLD,
  1324. X      M1_HUMANOID | M1_OMNIVORE,
  1325. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_FEMALE |
  1326. X      M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
  1327. X    { "Wizard of Balance", S_HUMAN, 20, 12, 0, 60, 0, (G_NOGEN | G_UNIQ),
  1328. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1329. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1330. X      WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
  1331. X      M1_HUMANOID | M1_OMNIVORE,
  1332. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
  1333. X      M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
  1334. X
  1335. X    /* The nemesis monsters */
  1336. X
  1337. X    { "Minion of Huhetol", S_DEMON, 16, 10, -2, 75, -14,
  1338. X      (G_NOCORPSE | G_NOGEN | G_UNIQ),
  1339. X      { { AT_WEAP, AD_PHYS, 8, 4 }, { AT_WEAP, AD_PHYS, 4, 6 },
  1340. X        { AT_MAGC, AD_SPEL, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1341. X      WT_HUMAN, 400, 0, MS_NEMESIS, MZ_LARGE, MR_FIRE | MR_POISON, 0,
  1342. X      M1_FLY | M1_SEE_INVIS | M1_POIS,
  1343. X      M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY |
  1344. X      M2_COLLECT, M3_WANTSARTI | M3_WAITFORU, C(RED) },
  1345. X    { "Thoth Amon", S_HUMAN, 16, 10, 0, 10, -14, (G_NOGEN | G_UNIQ),
  1346. X      { { AT_MAGC, AD_SPEL, 0, 0 }, { AT_MAGC, AD_SPEL, 0, 0 },
  1347. X        { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1348. X      WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN, MR_POISON, MR_POISON,
  1349. X      M1_HUMANOID | M1_OMNIVORE,
  1350. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_STALK | M2_HOSTILE | M2_NASTY |
  1351. X      M2_COLLECT | M2_MAGIC, M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
  1352. X    { "Chromatic Dragon", S_DRAGON, 16, 10, 0, 30, -14, (G_NOGEN | G_UNIQ),
  1353. X      { { AT_BREA, AD_RBRE, 6, 8 }, { AT_MAGC, AD_SPEL, 0, 0 },
  1354. X        { AT_BITE, AD_PHYS, 4, 8 }, { AT_BITE, AD_PHYS, 4, 8 },
  1355. X        { AT_BITE, AD_PHYS, 4, 8 }, { AT_STNG, AD_PHYS, 1, 6 } },
  1356. X      WT_DRAGON, 1700, 0, MS_NEMESIS, MZ_GIGANTIC,
  1357. X      MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_POISON,
  1358. X      MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_POISON,
  1359. X      M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS | M1_POIS,
  1360. X      M2_NOPOLY | M2_HOSTILE | M2_FEMALE | M2_PNAME | M2_STALK |
  1361. X      M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
  1362. X      M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
  1363. X    { "Goblin King", S_ORC, 15, 10, MARM(10,4), 0, -15, (G_NOGEN | G_UNIQ),
  1364. X      { { AT_WEAP, AD_PHYS, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 6 },
  1365. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1366. X      750, 350, 0, MS_NEMESIS, MZ_HUMAN, 0, 0, M1_HUMANOID | M1_OMNIVORE,
  1367. X      M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY |
  1368. X      M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC,
  1369. X      M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
  1370. X    { "Cyclops", S_GIANT, 18, 10, 0, 0, -15, (G_NOGEN | G_UNIQ),
  1371. X      { { AT_WEAP, AD_PHYS, 4, 8 }, { AT_WEAP, AD_PHYS, 4, 8 },
  1372. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1373. X      1900, 700, 0, MS_NEMESIS, MZ_HUGE, 0, 0,
  1374. X      M1_HUMANOID | M1_OMNIVORE,
  1375. X      M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK |
  1376. X      M2_HOSTILE | M2_NASTY | M2_MALE | M2_JEWELS | M2_COLLECT,
  1377. X      M3_WANTSARTI | M3_WAITFORU, C(GRAY) },
  1378. X    { "Ixoth", S_DRAGON, 15, 9, -1, 20, -14, (G_NOGEN | G_UNIQ),
  1379. X      { { AT_BREA, AD_FIRE, 8, 6 }, { AT_BITE, AD_PHYS, 4, 8 },
  1380. X        { AT_MAGC, AD_SPEL, 0, 0 }, { AT_CLAW, AD_PHYS, 2, 4 },
  1381. X        { AT_CLAW, AD_PHYS, 2, 4 }, NO_ATTK  },
  1382. X      WT_DRAGON, 1600, 0, MS_NEMESIS, MZ_GIGANTIC, MR_FIRE, MR_FIRE,
  1383. X      M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS,
  1384. X      M2_NOPOLY | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY | M2_STALK |
  1385. X      M2_GREEDY | M2_JEWELS | M2_MAGIC,
  1386. X      M3_WANTSARTI | M3_WAITFORU, C(RED) },
  1387. X    { "Nalzok", S_DEMON, 16, 10, -2, 85, -127,
  1388. X      (G_NOGEN | G_UNIQ | G_NOCORPSE),
  1389. X      { { AT_WEAP, AD_PHYS, 8, 4 }, { AT_WEAP, AD_PHYS, 4, 6 },
  1390. X        { AT_MAGC, AD_SPEL, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1391. X      WT_HUMAN, 400, 0, MS_NEMESIS, MZ_LARGE, MR_FIRE | MR_POISON, 0,
  1392. X      M1_FLY | M1_SEE_INVIS | M1_POIS,
  1393. X      M2_NOPOLY | M2_DEMON | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK |
  1394. X      M2_NASTY | M2_COLLECT, M3_WANTSARTI | M3_WAITFORU, C(RED) },
  1395. X    { "Master Assassin", S_HUMAN, 15, 15, 0, 30, 18, (G_NOGEN | G_UNIQ),
  1396. X      { { AT_WEAP, AD_DRST, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 8 }, NO_ATTK,
  1397. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1398. X      WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN, 0, 0,
  1399. X      M1_HUMANOID | M1_OMNIVORE,
  1400. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY |
  1401. X      M2_COLLECT | M2_MAGIC,
  1402. X      M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
  1403. X    /* A renegade daimyo who led a 13 year civil war against the shogun */
  1404. X    /* of his time. */
  1405. X    { "Ashikaga Takauji", S_HUMAN, 15, 15, 0, 40, -13, (G_NOGEN | G_UNIQ),
  1406. X      { { AT_WEAP, AD_PHYS, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK,
  1407. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1408. X      WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN, 0, 0,
  1409. X      M1_HUMANOID | M1_OMNIVORE,
  1410. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_PNAME | M2_HOSTILE | M2_STALK |
  1411. X      M2_NASTY | M2_MALE | M2_COLLECT | M2_MAGIC,
  1412. X      M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
  1413. X
  1414. X/*    NOTE: the Master of Thieves was defined above. */
  1415. X
  1416. X    { "Lord Surtur", S_GIANT, 15, 12, 2, 50, 12, (G_NOGEN | G_UNIQ),
  1417. X      { { AT_WEAP, AD_PHYS, 2, 10 }, { AT_WEAP, AD_PHYS, 2, 10 }, NO_ATTK,
  1418. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1419. X      2250, 850, 0, MS_NEMESIS, MZ_HUGE, MR_FIRE, MR_FIRE,
  1420. X      M1_HUMANOID | M1_OMNIVORE,
  1421. X      M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK |
  1422. X      M2_HOSTILE | M2_NASTY | M2_MALE | M2_PNAME | M2_COLLECT | M2_JEWELS,
  1423. X      M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
  1424. X    { "Dark One", S_HUMAN, 15, 10, 0, 80, -10, (G_NOGEN | G_UNIQ),
  1425. X      { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_MAGC, AD_SPEL, 0, 0 },
  1426. X        { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
  1427. X      WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN, 0, 0,
  1428. X      M1_HUMANOID | M1_OMNIVORE,
  1429. X      M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY |
  1430. X      M2_COLLECT | M2_MAGIC,
  1431. X      M3_WANTSARTI | M3_WAITFORU, C(BLACK) },
  1432. X
  1433. X/*    The "guards" */
  1434. X    { "student", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
  1435. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1436. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1437. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1438. X      M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
  1439. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1440. X      0, C(HI_DOMESTIC) },
  1441. X    { "chieftain", S_HUMAN, 5, 10, 10, 10, 0, G_NOGEN,
  1442. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1443. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1444. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, MR_POISON, MR_POISON,
  1445. X      M1_HUMANOID | M1_OMNIVORE,
  1446. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1447. X      0, C(HI_DOMESTIC) },
  1448. X    { "neanderthal", S_HUMAN, 5, 10, 10, 10, 1, G_NOGEN,
  1449. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
  1450. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1451. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1452. X      M1_HUMANOID | M1_OMNIVORE,
  1453. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1454. X      0, C(HI_DOMESTIC) },
  1455. X    { "High-elf", S_HUMAN, 5, 12, MARM(10,5), 10, -7, G_NOGEN,
  1456. X      { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_MAGC, AD_CLRC, 0, 0 },
  1457. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1458. X      WT_ELF, 350, 0, MS_GUARDIAN, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
  1459. X      M1_HUMANOID | M1_OMNIVORE,
  1460. X      M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT, 0, C(HI_DOMESTIC) },
  1461. X    { "intern", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
  1462. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1463. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1464. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, MR_POISON, MR_POISON,
  1465. X      M1_HUMANOID | M1_OMNIVORE,
  1466. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1467. X      0, C(HI_DOMESTIC) },
  1468. X    { "page", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
  1469. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1470. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1471. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1472. X      M1_HUMANOID | M1_OMNIVORE,
  1473. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1474. X      0, C(HI_DOMESTIC) },
  1475. X    { "acolyte", S_HUMAN, 5, 10, 10, 20, 0, G_NOGEN,
  1476. X      { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_MAGC, AD_CLRC, 0, 0 },
  1477. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1478. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1479. X      M1_HUMANOID | M1_OMNIVORE,
  1480. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1481. X      0, C(HI_DOMESTIC) },
  1482. X    { "thug", S_HUMAN, 5, 10, 10, 10, -3, G_NOGEN,
  1483. X      { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
  1484. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1485. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1486. X      M1_HUMANOID | M1_OMNIVORE,
  1487. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
  1488. X      M2_GREEDY | M2_COLLECT,
  1489. X      0, C(HI_DOMESTIC) },
  1490. X    { "ninja", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
  1491. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1492. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1493. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1494. X      M1_HUMANOID | M1_OMNIVORE,
  1495. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1496. X      0, C(HI_DOMESTIC) },
  1497. X    { "ronin", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
  1498. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1499. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1500. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1501. X      M1_HUMANOID | M1_OMNIVORE,
  1502. X      M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT,
  1503. X      0, C(HI_DOMESTIC) },
  1504. X#ifdef TOURIST
  1505. X    { "guide", S_HUMAN, 5, 10, 10, 20, 0, G_NOGEN,
  1506. X      { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_MAGC, AD_SPEL, 0, 0 },
  1507. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1508. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1509. X      M1_HUMANOID | M1_OMNIVORE,
  1510. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
  1511. X      M2_COLLECT | M2_MAGIC, 0, C(HI_DOMESTIC) },
  1512. X#endif
  1513. X    { "warrior", S_HUMAN, 5, 10, 10, 10, -1, G_NOGEN,
  1514. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
  1515. X        NO_ATTK, NO_ATTK, NO_ATTK },
  1516. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1517. X      M1_HUMANOID | M1_OMNIVORE,
  1518. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
  1519. X      0, C(HI_DOMESTIC) },
  1520. X    { "apprentice", S_HUMAN, 5, 10, 10, 30, 0, G_NOGEN,
  1521. X      { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_MAGC, AD_SPEL, 0, 0 },
  1522. X        NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1523. X      WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
  1524. X      M1_HUMANOID | M1_OMNIVORE,
  1525. X      M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
  1526. X      M2_COLLECT | M2_MAGIC, 0, C(HI_DOMESTIC) },
  1527. X#endif /* MULDGN /* */
  1528. X/*    ARRAY TERMINATOR    */
  1529. X    { "", 0, 0, 0, 0, 0, 0, 0,
  1530. X      { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  1531. X      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, C(0) }
  1532. X};
  1533. X#endif /* !SPLITMON_1 */
  1534. X
  1535. X#ifndef SPLITMON_1
  1536. X/* dummy routine used to force linkage */
  1537. Xvoid
  1538. Xmonst_init()
  1539. X{
  1540. X    return;
  1541. X}
  1542. X#endif
  1543. X
  1544. X/*monst.c*/
  1545. END_OF_FILE
  1546. if test 33131 -ne `wc -c <'src/monst.c3'`; then
  1547.     echo shar: \"'src/monst.c3'\" unpacked with wrong size!
  1548. fi
  1549. # end of 'src/monst.c3'
  1550. fi
  1551. echo shar: End of archive 60 \(of 108\).
  1552. cp /dev/null ark60isdone
  1553. MISSING=""
  1554. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1555. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1556. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1557. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1558. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1559. 101 102 103 104 105 106 107 108 ; do
  1560.     if test ! -f ark${I}isdone ; then
  1561.     MISSING="${MISSING} ${I}"
  1562.     fi
  1563. done
  1564. if test "${MISSING}" = "" ; then
  1565.     echo You have unpacked all 108 archives.
  1566.     echo "Now execute 'rebuild.sh'"
  1567.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1568. else
  1569.     echo You still need to unpack the following archives:
  1570.     echo "        " ${MISSING}
  1571. fi
  1572. ##  End of shell archive.
  1573. exit 0
  1574.