billr@saab.CNA.TEK.COM (Bill Randle) (07/12/90)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 10, Issue 59
Archive-name: nethack3p9/Part14
Supersedes: NetHack3: Volume 7, Issue 56-93
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 14 (of 56)."
# Contents: src/lock.c src/monst.c1
# Wrapped by billr@saab on Wed Jul 11 17:11:09 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'src/lock.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/lock.c'\"
else
echo shar: Extracting \"'src/lock.c'\" \(17068 characters\)
sed "s/^X//" >'src/lock.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)lock.c 3.0 88/10/22
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "hack.h"
X
XSTATIC_PTR int NDECL(picklock);
XSTATIC_PTR int NDECL(forcelock);
X
XSTATIC_VAR struct xlock_s {
X int door_or_box, picktyp;
X struct rm *door;
X struct obj *box;
X int chance, usedtime;
X} NEARDATA xlock;
X
X#ifdef OVLB
X
Xstatic boolean FDECL(obstructed,(int,int));
X
XSTATIC_PTR
Xint
Xpicklock() { /* try to open/close a lock */
X
X if(!xlock.door_or_box) { /* box */
X
X if((xlock.box->ox != u.ux) || (xlock.box->oy != u.uy)) {
X return((xlock.usedtime = 0)); /* you or it moved */
X }
X } else { /* door */
X if(xlock.door != &(levl[u.ux+u.dx][u.uy+u.dy])) {
X return((xlock.usedtime = 0)); /* you moved */
X }
X switch (xlock.door->doormask) {
X case D_NODOOR:
X pline("This doorway has no door.");
X return((xlock.usedtime = 0));
X case D_ISOPEN:
X pline("Picking the lock of an open door is pointless.");
X return((xlock.usedtime = 0));
X case D_BROKEN:
X pline("This door is broken.");
X return((xlock.usedtime = 0));
X }
X }
X
X if(xlock.usedtime++ >= 50
X#ifdef POLYSELF
X || nohands(uasmon)
X#endif
X ) {
X You("give up your attempt to %s the lock.",
X (xlock.door_or_box ? !(xlock.door->doormask & D_LOCKED) :
X !xlock.box->olocked) ? "lock" :
X ((xlock.picktyp == LOCK_PICK) ? "pick" : "open" ));
X
X return((xlock.usedtime = 0));
X }
X
X if(rn2(100) > xlock.chance) return(1); /* still busy */
X
X if(xlock.door_or_box) {
X You("succeed in %sing the lock.",
X !(xlock.door->doormask & D_LOCKED) ? "lock" :
X ((xlock.picktyp == LOCK_PICK) ? "pick" : "open" ));
X if(xlock.door->doormask & D_TRAPPED) {
X b_trapped("door");
X xlock.door->doormask = D_NODOOR;
X mnewsym(u.ux+u.dx, u.uy+u.dy);
X prl(u.ux+u.dx, u.uy+u.dy);
X } else if(xlock.door->doormask == D_LOCKED)
X xlock.door->doormask = D_CLOSED;
X else xlock.door->doormask = D_LOCKED;
X } else {
X You("succeed in %sing the lock.",
X (!xlock.box->olocked) ? "lock" :
X (xlock.picktyp == LOCK_PICK) ? "pick" : "open" );
X xlock.box->olocked = !xlock.box->olocked;
X if(xlock.box->otrapped)
X (void) chest_trap(xlock.box, FINGER);
X }
X return((xlock.usedtime = 0));
X}
X
XSTATIC_PTR
Xint
Xforcelock() { /* try to force a locked chest */
X
X register struct obj *otmp, *otmp2;
X register struct obj *probj = fcobj; /* initialize to make lint happy */
X
X if((xlock.box->ox != u.ux) || (xlock.box->oy != u.uy))
X return((xlock.usedtime = 0)); /* you or it moved */
X
X if(xlock.usedtime++ >= 50 || !uwep
X#ifdef POLYSELF
X || nohands(uasmon)
X#endif
X ) {
X You("give up your attempt to force the lock.");
X
X return((xlock.usedtime = 0));
X }
X
X if(xlock.picktyp) { /* blade */
X
X if(rn2(1000-uwep->spe) > 992 && !uwep->cursed) {
X /* for a +0 weapon, probability that it survives an unsuccessful
X * attempt to force the lock is (.992)^50 = .67
X */
X pline("%sour %s broke!",
X (uwep->quan > 1) ? "One of y" : "Y", xname(uwep));
X useup(uwep);
X You("give up your attempt to force the lock.");
X return((xlock.usedtime = 0));
X }
X } else /* blunt */
X wake_nearby(); /* due to hammering on the container */
X
X if(rn2(100) > xlock.chance) return(1); /* still busy */
X
X You("succeed in forcing the lock.");
X xlock.box->olocked = !xlock.box->olocked;
X if(!xlock.picktyp && !rn2(3)) {
X
X pline("In fact, you've totally destroyed the %s.",
X xname(xlock.box));
X for(otmp = fcobj; otmp; otmp = otmp2) {
X
X otmp2 = otmp->nobj;
X if(otmp->cobj == xlock.box) {
X
X /* unlink it from the "contained" list */
X if(otmp == fcobj) fcobj = otmp2;
X else probj->nobj = otmp2;
X
X if(!rn2(3) || otmp->olet == POTION_SYM)
X free((genericptr_t) otmp);
X else { /* spill it onto the floor */
X otmp->nobj = xlock.box->nobj;
X xlock.box->nobj = otmp;
X otmp->cobj = (struct obj *)0;
X place_object(otmp, u.ux, u.uy);
X stackobj(otmp);
X }
X } else probj = otmp;
X }
X delobj(xlock.box);
X }
X return((xlock.usedtime = 0));
X}
X
X#endif /* OVLB */
X#ifdef OVL0
X
Xvoid
Xreset_pick() { xlock.usedtime = 0; }
X
X#endif /* OVL0 */
X#ifdef OVLB
X
Xint
Xpick_lock(pick) /* pick a lock with a given object */
X register struct obj *pick;
X{
X register int x, y, picktyp, c, ch;
X register struct rm *door;
X register struct obj *otmp;
X
X#ifdef __GNULINT__
X ch = 0; /* GCC myopia */
X#endif
X picktyp = pick->otyp;
X if(xlock.usedtime && picktyp == xlock.picktyp) {
X
X You("resume your attempt to %s the lock.",
X (xlock.door_or_box ? !(xlock.door->doormask & D_LOCKED) :
X !xlock.box->olocked) ? "lock" :
X ((xlock.picktyp == LOCK_PICK) ? "pick" : "open" ));
X
X set_occupation(picklock,
X (picktyp == LOCK_PICK) ? "picking the lock" :
X "opening the lock", 0);
X return(1);
X }
X
X#ifdef POLYSELF
X if(nohands(uasmon)) {
X You("can't hold a %s - you have no hands!", xname(pick));
X return(0);
X }
X#endif
X if((picktyp != LOCK_PICK && picktyp != CREDIT_CARD &&
X picktyp != SKELETON_KEY && picktyp != KEY)) {
X impossible("picking lock with object %d?", picktyp);
X return(0);
X }
X if(!getdir(1)) return(0);
X
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X if((x == u.ux) && (y == u.uy)) { /* pick the lock on a container */
X c = 'n'; /* in case there are no boxes here */
X for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere)
X if(Is_box(otmp) &&
X /* credit cards are only good for unlocking */
X (picktyp != CREDIT_CARD || otmp->olocked)) {
X pline("There is %s here, %s the lock? ",
X doname(otmp), (!otmp->olocked) ? "close" :
X ((picktyp == LOCK_PICK) ? "pick" : "open" ));
X
X c = ynq();
X if(c == 'q') return(0);
X if(c == 'n') continue;
X
X if(picktyp == KEY && otmp->spe != pick->spe) {
X pline("The %s won't fit the lock.",xname(pick));
X return(1);
X }
X switch(picktyp) {
X case CREDIT_CARD:
X ch = ACURR(A_DEX)+(20*(pl_character[0] == 'R'));
X break;
X case LOCK_PICK:
X ch = 4*ACURR(A_DEX)+(25*(pl_character[0] == 'R'));
X break;
X case SKELETON_KEY:
X ch = 75 + ACURR(A_DEX);
X break;
X case KEY:
X ch = 1000;
X break;
X default: ch = 0;
X }
X if(otmp->cursed) ch /= 2;
X
X xlock.door_or_box = 0;
X xlock.picktyp = picktyp;
X xlock.box = otmp;
X break;
X }
X if(c != 'y')
X return(0); /* decided against all boxes */
X } else { /* pick the lock in a door */
X struct monst *mtmp;
X
X door = &levl[x][y];
X if ((mtmp = m_at(x,y)) && canseemon(mtmp) && !mtmp->mimic) {
X if (picktyp == CREDIT_CARD &&
X#ifdef ORACLE
X (mtmp->isshk || mtmp->data == &mons[PM_ORACLE]))
X#else
X mtmp->isshk)
X#endif
X verbalize("No checks, no credit, no problem.");
X else
X kludge("I don't think %s would appreciate that.", mon_nam(mtmp));
X return(0);
X }
X if(!IS_DOOR(door->typ)) {
X#ifdef STRONGHOLD
X if (is_drawbridge_wall(x,y) >= 0)
X You("%s no lock on the drawbridge.",
X Blind ? "feel" : "see");
X else
X#endif
X You("%s no door there.",
X Blind ? "feel" : "see");
X return(0);
X }
X switch (door->doormask) {
X case D_NODOOR:
X pline("This doorway has no door.");
X return(0);
X case D_ISOPEN:
X pline("Picking the lock of an open door is pointless.");
X return(0);
X case D_BROKEN:
X pline("This door is broken.");
X return(0);
X default:
X /* credit cards are only good for unlocking */
X if(picktyp == CREDIT_CARD && !(door->doormask & D_LOCKED)) {
X You("can't lock a door with a credit card.");
X return(0);
X }
X
X pline("%sock it? ", (door->doormask & D_LOCKED) ? "Unl" : "L" );
X
X c = yn();
X if(c == 'n') return(0);
X
X switch(picktyp) {
X case CREDIT_CARD:
X ch = 2*ACURR(A_DEX)+(20*(pl_character[0] == 'R'));
X break;
X case LOCK_PICK:
X ch = 3*ACURR(A_DEX)+(30*(pl_character[0] == 'R'));
X break;
X case SKELETON_KEY:
X ch = 70 + ACURR(A_DEX);
X break;
X case KEY:
X pline("The %s won't fit the door.", xname(pick));
X return(1);
X default: ch = 0;
X }
X xlock.door_or_box = 1;
X xlock.door = door;
X }
X }
X flags.move = 0;
X xlock.chance = ch;
X xlock.picktyp = picktyp;
X xlock.usedtime = 0;
X set_occupation(picklock,
X (picktyp == LOCK_PICK) ? "picking the lock" :
X "opening the lock", 0);
X return(1);
X}
X
Xint
Xdoforce() { /* try to force a chest with your weapon */
X
X register struct obj *otmp;
X register int c, picktyp;
X
X if(!uwep || /* proper type test */
X (uwep->olet != WEAPON_SYM && uwep->olet != ROCK_SYM &&
X uwep->otyp != PICK_AXE) ||
X (uwep->otyp < DAGGER) ||
X (uwep->otyp > VOULGE && uwep->olet != ROCK_SYM &&
X uwep->otyp != PICK_AXE)
X ) {
X You("can't force anything without a %sweapon.",
X (uwep) ? "proper " : "");
X return(0);
X }
X
X picktyp = (uwep->otyp >= DAGGER && uwep->otyp <= KATANA);
X if(xlock.usedtime && xlock.box && picktyp == xlock.picktyp) {
X You("resume your attempt to force the lock.");
X set_occupation(forcelock, "forcing the lock", 0);
X return(1);
X }
X
X /* A lock is made only for the honest man, the thief will break it. */
X xlock.box = (struct obj *)0;
X for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere)
X if(Is_box(otmp)) {
X if(otmp->olocked)
X pline("There is %s here, force the lock? ", doname(otmp));
X else {
X pline("There is a %s here, but it's already unlocked.",
X xname(otmp));
X continue;
X }
X
X c = ynq();
X if(c == 'q') return(0);
X if(c == 'n') continue;
X
X if(picktyp)
X You("force your %s into a crack and pry.", xname(uwep));
X else
X You("start bashing it with your %s.", xname(uwep));
X xlock.box = otmp;
X xlock.chance = objects[otmp->otyp].wldam * 2;
X xlock.picktyp = picktyp;
X xlock.usedtime = 0;
X break;
X }
X
X if(xlock.box) set_occupation(forcelock, "forcing the lock", 0);
X else You("decide not to force the issue.");
X return(1);
X}
X
Xint
Xdoopen() { /* try to open a door */
X register int x, y;
X register struct rm *door;
X struct monst *mtmp;
X
X if(!getdir(1)) return(0);
X
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X if((x == u.ux) && (y == u.uy)) return(0);
X
X if((mtmp = m_at(x,y)) && mtmp->mimic &&
X mtmp->m_ap_type == M_AP_FURNITURE &&
X mtmp->mappearance == S_cdoor &&
X !Protection_from_shape_changers) {
X stumble_onto_mimic(mtmp);
X return(1);
X }
X
X door = &levl[x][y];
X
X if(!IS_DOOR(door->typ)) {
X#ifdef STRONGHOLD
X if (is_db_wall(x,y)) {
X pline("There is no obvious way to open the drawbridge.");
X return(0);
X }
X#endif
X You("%s no door there.",
X Blind ? "feel" : "see");
X return(0);
X }
X
X if(!(door->doormask & D_CLOSED)) {
X switch(door->doormask) {
X case D_BROKEN: pline("This door is broken."); break;
X case D_NODOOR: pline("This doorway has no door."); break;
X case D_ISOPEN: pline("This door is already open."); break;
X default: pline("This door is locked."); break;
X }
X return(0);
X }
X
X#ifdef POLYSELF
X if(verysmall(uasmon)) {
X pline("You're too small to pull the door open.");
X return(0);
X }
X#endif
X /* door is known to be CLOSED */
X if (rnl(20) < (ACURR(A_STR)+ACURR(A_DEX)+ACURR(A_CON))/3) {
X pline("The door opens.");
X if(door->doormask & D_TRAPPED) {
X b_trapped("door");
X door->doormask = D_NODOOR;
X } else
X door->doormask = D_ISOPEN;
X mnewsym(x,y);
X prl(x,y);
X } else {
X pline("The door resists!");
X }
X
X return(1);
X}
X
Xstatic
Xboolean
Xobstructed(x,y)
Xregister int x, y;
X{
X if(MON_AT(x, y)) {
X if (m_at(x,y)->mimic) goto obj;
X pline("%s stands in the way!", Blind ?
X "Some creature" : Monnam(m_at(x,y)));
X return(TRUE);
X }
X if (OBJ_AT(x, y) || levl[x][y].gmask) {
Xobj:
X pline("Something's in the way.");
X return(TRUE);
X }
X return(FALSE);
X}
X
Xint
Xdoclose() { /* try to close a door */
X register int x, y;
X register struct rm *door;
X struct monst *mtmp;
X
X if(!getdir(1)) return(0);
X
X x = u.ux + u.dx;
X y = u.uy + u.dy;
X if((x == u.ux) && (y == u.uy)) {
X You("are in the way!");
X return(1);
X }
X
X if((mtmp = m_at(x,y)) && mtmp->mimic &&
X mtmp->m_ap_type == M_AP_FURNITURE &&
X mtmp->mappearance == S_cdoor &&
X !Protection_from_shape_changers) {
X stumble_onto_mimic(mtmp);
X return(1);
X }
X
X door = &levl[x][y];
X
X if(!IS_DOOR(door->typ)) {
X#ifdef STRONGHOLD
X if (door->typ == DRAWBRIDGE_DOWN)
X pline("There is no obvious way to close the drawbridge.");
X else
X#endif
X You("%s no door there.",
X Blind ? "feel" : "see");
X return(0);
X }
X
X if(door->doormask == D_NODOOR) {
X pline("This doorway has no door.");
X return(0);
X }
X
X if(obstructed(x, y)) return(0);
X
X if(door->doormask == D_BROKEN) {
X pline("This door is broken.");
X return(0);
X }
X
X if(door->doormask & (D_CLOSED | D_LOCKED)) {
X pline("This door is already closed.");
X return(0);
X }
X
X if(door->doormask == D_ISOPEN) {
X#ifdef POLYSELF
X if(verysmall(uasmon)) {
X pline("You're too small to push the door closed.");
X return(0);
X }
X#endif
X if (rn2(25) < (ACURR(A_STR)+ACURR(A_DEX)+ACURR(A_CON))/3) {
X pline("The door closes.");
X door->doormask = D_CLOSED;
X mnewsym(x,y);
X prl(x,y);
X }
X else pline("The door resists!");
X }
X
X return(1);
X}
X
Xint
Xboxlock(obj, otmp) /* box obj was hit with spell effect otmp */
X /* returns 1 if something happened */
X register struct obj *obj, *otmp; /* obj *is* a box */
X{
X register boolean res = 0;
X
X switch(otmp->otyp) {
X case WAN_LOCKING:
X#ifdef SPELLS
X case SPE_WIZARD_LOCK:
X#endif
X if(!obj->olocked) {
X pline("Klunk!");
X obj->olocked = !(obj->olocked);
X res = 1;
X } else res = 0;
X break;
X case WAN_OPENING:
X#ifdef SPELLS
X case SPE_KNOCK:
X#endif
X if(obj->olocked) {
X pline("Klick!");
X obj->olocked = !(obj->olocked);
X res = 1;
X } else res = 0;
X break;
X }
X return(res);
X}
X
Xint
Xdoorlock(otmp,x,y) /* door was hit with spell effect otmp */
X register struct obj *otmp;
X int x, y;
X{
X register struct rm *door = &levl[x][y];
X boolean res = 1;
X
X if(door->typ == SDOOR) {
X if(otmp->otyp == WAN_OPENING
X#ifdef SPELLS
X || otmp->otyp == SPE_KNOCK
X#endif /* SPELLS /**/
X ) {
X door->typ = DOOR;
X door->doormask = D_CLOSED | (door->doormask & D_TRAPPED);
X if(cansee(x,y)) pline("A section of the wall opens up!");
X mnewsym(x,y);
X return(1);
X } else
X return(0);
X }
X
X#ifdef STRONGHOLD
X /* make sure it isn't an open drawbridge */
X if (is_maze_lev && find_drawbridge(&x,&y)) {
X if(otmp->otyp == WAN_OPENING
X#ifdef SPELLS
X || otmp->otyp == SPE_KNOCK
X#endif /* SPELLS /**/
X )
X (void) open_drawbridge(x,y);
X else
X (void) close_drawbridge(x,y);
X return 1;
X }
X#endif
X
X switch(otmp->otyp) {
X case WAN_LOCKING:
X#ifdef SPELLS
X case SPE_WIZARD_LOCK:
X#endif
X if(obstructed(x,y)) return 0;
X if (cansee(x,y))
X switch (door->doormask & ~D_TRAPPED) {
X case D_CLOSED:
X pline("The door locks!");
X break;
X case D_ISOPEN:
X pline("The door swings shut, and locks!");
X break;
X case D_BROKEN:
X pline("The broken door reassembles and locks!");
X break;
X case D_NODOOR:
X pline("A cloud of dust springs up and assembles itself into a door!");
X break;
X default: res = 0;
X }
X door->doormask = D_LOCKED | (door->doormask & D_TRAPPED);
X mnewsym(x,y);
X if(cansee(x,y)) prl(x,y);
X break;
X case WAN_OPENING:
X#ifdef SPELLS
X case SPE_KNOCK:
X#endif
X if(door->doormask & D_LOCKED) {
X door->doormask = D_CLOSED | (door->doormask & D_TRAPPED);
X if(cansee(x,y)) pline("The door unlocks!");
X } else res = 0;
X break;
X case WAN_STRIKING:
X#ifdef SPELLS
X case SPE_FORCE_BOLT:
X#endif
X if(door->doormask & (D_LOCKED | D_CLOSED)) {
X if(door->doormask & D_TRAPPED) {
X if (MON_AT(x, y))
X (void) mb_trapped(m_at(x,y));
X else if (flags.verbose)
X if (cansee(x,y))
X pline("KABOOM!! You see a door explode.");
X else if (flags.soundok)
X You("hear a distant explosion.");
X door->doormask = D_NODOOR;
X mnewsym(x,y);
X if (cansee(x,y)) prl(x,y);
X break;
X }
X door->doormask = D_BROKEN;
X if (flags.verbose)
X if (cansee(x,y))
X pline("The door crashes open!");
X else if (flags.soundok)
X You("hear a crashing sound.");
X mnewsym(x,y);
X if (cansee(x,y)) prl(x,y);
X } else res = 0;
X break;
X default: impossible("magic (%d) attempted on door.", otmp->otyp);
X }
X return res;
X}
X
X#ifdef STUPID_CPP /* otherwise these functions are macros in obj.h */
Xint
XIs_container(otmp) struct obj * otmp; {
X return(otmp->otyp >= ICE_BOX && otmp->otyp <= BAG_OF_TRICKS);
X}
X
Xint
XIs_box(otmp) struct obj * otmp; {
X return(otmp->otyp == LARGE_BOX || otmp->otyp == CHEST);
X}
X
Xint
XIs_mbag(otmp) struct obj * otmp; {
X return(otmp->otyp == BAG_OF_HOLDING || otmp->otyp == BAG_OF_TRICKS);
X}
X
Xint
Xis_sword(otmp) struct obj * otmp; {
X return(otmp->otyp >= SHORT_SWORD && otmp->otyp <= KATANA);
X}
X
Xint
Xbimanual(otmp) struct obj * otmp; {
X return((otmp->olet == WEAPON_SYM || otmp->otyp == UNICORN_HORN)
X && objects[otmp->otyp].oc_bimanual);
X}
X#endif /* STUPID_CPP */
X
X#endif /* OVLB */
END_OF_FILE
if test 17068 -ne `wc -c <'src/lock.c'`; then
echo shar: \"'src/lock.c'\" unpacked with wrong size!
fi
# end of 'src/lock.c'
fi
if test -f 'src/monst.c1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/monst.c1'\"
else
echo shar: Extracting \"'src/monst.c1'\" \(39701 characters\)
sed "s/^X//" >'src/monst.c1' <<'END_OF_FILE'
X/* SCCS Id: @(#)monst.c 3.0 89/11/21
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "config.h"
X#include "permonst.h"
X#include "monsym.h"
X#include "eshk.h"
X#include "vault.h"
X#include "epri.h"
X
X#define NO_ATTK { 0, 0, 0, 0 }
X
X#ifdef C
X#undef C
X#endif
X#ifdef TEXTCOLOR
X#include "color.h"
X#define C(color) color
X#define HI_DOMESTIC WHITE /* use for player + friendlies */
X#define HI_LORD MAGENTA
X#else
X#define C(color)
X#endif
X
X#ifndef SPLITMON_2
Xstruct permonst NEARDATA playermon = { /* used by weapons bonus code */
X "player", S_HUMAN, 1, 10, 10, 0, 0, G_GENO | G_NOGEN,
X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 45, 400, PL_NSIZ, MS_SILENT, MZ_HUMAN,
X M1_NEEDPICK | M1_HUMANOID | M1_COLLECT,
X M2_HUMAN | M2_STRONG, C(HI_DOMESTIC)
X}, NEARDATA *uasmon = &playermon;
X#endif /* SPLITMON_2 */
X
X/*
X * Rule #1: monsters of a given class are contiguous in the
X * mons[] array.
X *
X * Rule #2: monsters of a given class are presented in ascending
X * order of strength.
X *
X * Rule #3: monster frequency is included in the geno mask;
X * the frequency can be from 0 to 7. 0's will also
X * be skipped during generation.
X *
X * Guidelines for color assignment:
X *
X * * Use the same color for all `growth stages' of a monster (ex.
X * little dog/big dog, baby naga/full-grown naga.
X *
X * * Use colors given in names wherever possible. If the class has `real'
X * members with strong color associations, use those.
X *
X * * Favor `cool' colors for cold-resistent monsters, `warm' ones for
X * fire-resistent ones.
X *
X * * Try to reserve purple (magenta) for powerful `ruler' monsters (queen
X * bee, kobold lord, &c.).
X *
X * * Subject to all these constraints, try to use color to make as many
X * distinctions as the / command (that is, within a monster letter
X * distinct names should map to distinct colors).
X *
X * The aim in assigning colors is to be consistent enough so a player can
X * become `intuitive' about them, deducing some or all of these rules
X * unconsciously. Use your common sense.
X */
X
X#if defined(SMALLDATA) && !defined(MAKEDEFS_C)
X /* if it's for SMALLDATA, say so, right? (KL) */
Xstruct permonst *mons; /* for SMALLDATA - mons data stored in NetHack app */
X#else
X#ifndef SPLITMON_2
Xstruct permonst NEARDATA mons[] = {
X/* ants */
X { "giant ant", S_ANT, 2, 18, 3, 0, 0, (G_GENO | G_SGROUP | 3),
X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 1, 10, 0, MS_SILENT, MZ_TINY, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE | M2_EGGS, C(BROWN) },
X { "soldier ant", S_ANT, 3, 18, 3, 0, 0, (G_GENO | G_SGROUP | 2),
X { { AT_BITE, AD_PHYS, 2, 4 }, { AT_STNG, AD_DRST, 3, 4 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 2, 20, 0, MS_SILENT, MZ_TINY,
X M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_POIS_RES,
X M2_HOSTILE | M2_CARNIVORE | M2_EGGS, C(BLUE) },
X { "fire ant", S_ANT, 3, 18, 3, 10, 0, (G_GENO | G_SGROUP | 1),
X { { AT_BITE, AD_FIRE, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 3, 30, 0, MS_SILENT, MZ_TINY, M1_ANIMAL | M1_NOHANDS | M1_FIRE_RES,
X M2_HOSTILE | M2_CARNIVORE | M2_EGGS, C(RED) },
X { "giant beetle", S_ANT, 5, 6, 4, 0, 0, (G_GENO | 3),
X { { AT_BITE, AD_PHYS, 3, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 1, 10, 0, MS_SILENT, MZ_LARGE, M1_ANIMAL | M1_NOHANDS | M1_POIS |
X M1_POIS_RES, M2_HOSTILE | M2_CARNIVORE, C(BLACK) },
X { "killer bee", S_ANT, 1, 18, -1, 0, 0, (G_GENO | G_LGROUP | 2),
X { { AT_STNG, AD_DRST, 1, 3 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 1, 10, 0, MS_BUZZ, MZ_TINY, M1_ANIMAL | M1_FLY | M1_NOHANDS |
X M1_POIS | M1_POIS_RES, M2_HOSTILE, C(YELLOW) },
X { "queen bee", S_ANT, 9, 24, -4, 0, 0, (G_GENO | G_NOGEN),
X { { AT_STNG, AD_DRST, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 1, 10, 0, MS_BUZZ, MZ_TINY, M1_ANIMAL | M1_FLY | M1_NOHANDS |
X M1_POIS | M1_POIS_RES, M2_HOSTILE | M2_PRINCE, C(HI_LORD) },
X/* blobs */
X { "acid blob", S_BLOB, 1, 3, 8, 0, 0, (G_GENO | 2),
X { { AT_NONE, AD_ACID, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 3, 30, 0, MS_SILENT, MZ_TINY,
X M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_SLEE_RES | M1_STON_RES |
X M1_ACID, M2_WANDER, C(GREEN) },
X { "quivering blob", S_BLOB, 5, 1, 8, 0, 0, (G_GENO | 2),
X { { AT_TUCH, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_SILENT, MZ_SMALL,
X M1_NOEYES | M1_NOLIMBS | M1_POIS_RES,
X M2_WANDER | M2_HOSTILE, C(WHITE) },
X { "gelatinous cube", S_BLOB, 6, 6, 8, 0, 0, (G_GENO | 2),
X { { AT_TUCH, AD_PLYS, 2, 4 }, { AT_NONE, AD_PLYS, 1, 4 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_SILENT, MZ_LARGE,
X M1_NOEYES | M1_NOLIMBS | M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES |
X M1_SLEE_RES, M2_WANDER | M2_HOSTILE | M2_OMNIVORE, C(CYAN) },
X/* cockatrice */
X { "cockatrice", S_COCKATRICE, 5, 6, 6, 30, 0, (G_GENO | 5),
X { { AT_BITE, AD_PHYS, 1, 3 }, { AT_TUCH, AD_STON, 0, 0 },
X { AT_NONE, AD_STON, 0, 0 }, NO_ATTK, NO_ATTK },
X 3, 30, 0, MS_HISS, MZ_SMALL,
X M1_ANIMAL | M1_NOHANDS | M1_POIS_RES | M1_STON_RES,
X M2_HOSTILE | M2_EGGS, C(YELLOW) },
X/* dog */
X { "little dog", S_DOG, 2, 18, 6, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 15, 150, 0, MS_BARK, MZ_SMALL,
X M1_ANIMAL | M1_NOHANDS, M2_CARNIVORE | M2_DOMESTIC, C(HI_DOMESTIC) },
X { "dog", S_DOG, 4, 16, 5, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 1 ,6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_BARK, MZ_MEDIUM,
X M1_ANIMAL | M1_NOHANDS, M2_CARNIVORE | M2_DOMESTIC, C(HI_DOMESTIC) },
X { "large dog", S_DOG, 6, 15, 4, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_BARK, MZ_MEDIUM,
X M1_ANIMAL | M1_NOHANDS, M2_STRONG | M2_CARNIVORE | M2_DOMESTIC,
X C(HI_DOMESTIC) },
X { "jackal", S_DOG, 0, 12, 7, 0, 0, (G_GENO | G_SGROUP | 3),
X { { AT_BITE, AD_PHYS, 1, 2 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_BARK, MZ_SMALL,
X M1_ANIMAL | M1_NOHANDS, M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "jackalwere", S_DOG, 2, 12, 7, 10, -7, G_NOGEN | G_NOCORPSE,
X { { AT_BITE, AD_WERE, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_BARK, MZ_SMALL,
X M1_NOPOLY | M1_NOHANDS | M1_POIS | M1_REGEN,
X M2_WERE | M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "wolf", S_DOG, 5, 12, 4, 0, 0, (G_GENO | G_SGROUP | 2),
X { { AT_BITE, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_BARK, MZ_SMALL,
X M1_ANIMAL | M1_NOHANDS, M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "wolfwere", S_DOG, 5, 12, 4, 20, -7, G_NOGEN | G_NOCORPSE,
X { { AT_BITE, AD_WERE, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_BARK, MZ_MEDIUM,
X M1_NOPOLY | M1_NOHANDS | M1_POIS | M1_REGEN,
X M2_WERE | M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "winter wolf", S_DOG, 7, 12, 4, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 2, 6 }, { AT_BREA, AD_COLD, 2, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK, },
X 30, 300, 0, MS_BARK, MZ_LARGE, M1_ANIMAL | M1_NOHANDS | M1_COLD_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(CYAN) },
X { "warg", S_DOG, 7, 12, 4, 0, -5, (G_GENO | G_SGROUP | 2),
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 35, 350, 0, MS_BARK, MZ_MEDIUM, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "hell hound pup", S_DOG, 7, 12, 4, 20, -5,
X (G_HELL | G_GENO | G_SGROUP | 1),
X { { AT_BITE, AD_PHYS, 2, 6 }, { AT_BREA, AD_FIRE, 2, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_BARK, MZ_SMALL, M1_ANIMAL | M1_NOHANDS | M1_FIRE_RES,
X M2_HOSTILE | M2_CARNIVORE, C(RED) },
X { "hell hound", S_DOG, 12, 14, 2, 20, 0, (G_HELL | G_GENO | 1),
X { { AT_BITE, AD_PHYS, 3, 6 }, { AT_BREA, AD_FIRE, 3, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK, },
X 30, 300, 0, MS_BARK, MZ_MEDIUM, M1_ANIMAL | M1_NOHANDS | M1_FIRE_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(RED) },
X#ifdef CHARON
X { "Cerberus", S_DOG, 12, 10, 2, 20, -7, (G_HELL | G_UNIQ | 1),
X { { AT_BITE, AD_PHYS, 3, 6 }, { AT_BITE, AD_PHYS, 3, 6 },
X { AT_BITE, AD_PHYS, 3, 6 }, NO_ATTK, NO_ATTK },
X 50, 350, 0, MS_BARK, MZ_LARGE,
X M1_NOPOLY | M1_ANIMAL | M1_NOHANDS | M1_FIRE_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_PNAME, C(RED) },
X#endif
X/* eyes */
X { "floating eye", S_EYE, 2, 1, 9, 10, 0, (G_GENO | 5),
X { { AT_NONE, AD_PLYS, 0, 70 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 1, 10, 0, MS_SILENT, MZ_SMALL,
X M1_FLY | M1_NOLIMBS, M2_HOSTILE, C(BLUE) },
X { "freezing sphere", S_EYE, 6, 13, 4, 0, 0, (G_GENO | 2),
X { { AT_EXPL, AD_COLD, 4, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 1, 10, 0, MS_SILENT, MZ_SMALL,
X M1_FLY | M1_NOLIMBS | M1_COLD_RES, M2_HOSTILE, C(WHITE) },
X/* felines */
X { "kitten", S_FELINE, 2, 18, 6, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 15, 150, 0, MS_MEW, MZ_SMALL, M1_ANIMAL | M1_NOHANDS,
X M2_WANDER | M2_CARNIVORE | M2_DOMESTIC, C(HI_DOMESTIC) },
X { "housecat", S_FELINE, 4, 16, 5, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_MEW, MZ_SMALL, M1_ANIMAL | M1_NOHANDS,
X M2_CARNIVORE | M2_DOMESTIC, C(HI_DOMESTIC) },
X { "large cat", S_FELINE, 6, 15, 4, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_MEW, MZ_SMALL, M1_ANIMAL | M1_NOHANDS,
X M2_STRONG | M2_CARNIVORE | M2_DOMESTIC, C(HI_DOMESTIC) },
X { "jaguar", S_FELINE, 4, 15, 6, 0, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
X { AT_BITE, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_GROWL, MZ_LARGE, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "tiger", S_FELINE, 6, 12, 6, 0, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
X { AT_BITE, AD_PHYS, 1, 10 }, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_GROWL, MZ_LARGE, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE, C(YELLOW) },
X/* gremlins */
X { "gremlin", S_GREMLIN, 5, 12, 2, 25, -9, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 },
X { AT_BITE, AD_PHYS, 1, 4 }, { AT_CLAW, AD_CURS, 0, 0 }, NO_ATTK },
X 10, 30, 0, MS_LAUGH, MZ_SMALL,
X M1_SWIM | M1_HUMANOID | M1_POIS, M2_STALK, C(GREEN) },
X/* humanoids */
X#ifdef TOLKIEN
X { "hobbit", S_HUMANOID, 1, 9, 7, 0, 6, (G_GENO | 2),
X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_HUMANOID, MZ_SMALL,
X M1_HUMANOID | M1_COLLECT, 0, C(GREEN) },
X#endif
X { "bugbear", S_HUMANOID, 3, 9, 5, 0, -6, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_GROWL, MZ_LARGE, M1_HUMANOID | M1_COLLECT,
X M2_STRONG, C(BROWN) },
X { "dwarf", S_HUMANOID, 2, 6, 4, 10, 4, (G_GENO | 3),
X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_HUMANOID, MZ_HUMAN,
X M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_GREEDY | M1_JEWELS |
X M1_COLLECT, M2_DWARF | M2_STRONG, C(RED) },
X { "dwarf lord", S_HUMANOID, 4, 6, 4, 10, 5, (G_GENO | 2),
X { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_HUMANOID, MZ_HUMAN,
X M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_GREEDY | M1_JEWELS |
X M1_COLLECT, M2_DWARF | M2_STRONG | M2_LORD, C(BLUE) },
X { "dwarf king", S_HUMANOID, 6, 6, 4, 20, 6, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_HUMANOID, MZ_HUMAN,
X M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_GREEDY | M1_JEWELS |
X M1_COLLECT, M2_DWARF | M2_STRONG | M2_PRINCE, C(HI_LORD) },
X/* imps & other minor demons/devils */
X { "manes", S_IMP, 1, 3, 7, 0, -7, (G_GENO | G_LGROUP | G_NOCORPSE | 1),
X { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
X { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_CUSS, MZ_SMALL, M1_POIS, M2_STALK, C(RED) },
X { "homunculus", S_IMP, 2, 12, 6, 10, -7, (G_GENO | 2),
X { { AT_BITE, AD_SLEE, 1, 3 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_SILENT, MZ_TINY,
X M1_FLY | M1_POIS | M1_POIS_RES | M1_SLEE_RES, M2_STALK, C(GREEN) },
X { "lemure", S_IMP, 3, 3, 7, 0, -7,
X (G_HELL | G_GENO | G_LGROUP | G_NOCORPSE | 1),
X { { AT_CLAW, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_SILENT, MZ_MEDIUM, M1_POIS | M1_SLEE_RES | M1_REGEN,
X M2_HOSTILE | M2_WANDER | M2_STALK, C(BROWN) },
X { "imp", S_IMP, 3, 12, 2, 20, -7, (G_GENO | 1),
X { { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 1, 10, 0, MS_CUSS, MZ_TINY, M1_REGEN, M2_WANDER | M2_STALK, C(RED) },
X { "quasit", S_IMP, 3, 15, 2, 20, -7, (G_GENO | 2),
X { { AT_CLAW, AD_DRDX, 1, 2 }, { AT_CLAW, AD_DRDX, 1, 2 },
X { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_SILENT, MZ_SMALL,
X M1_POIS_RES | M1_REGEN, M2_STALK, C(BLUE) },
X { "tengu", S_IMP, 6, 13, 5, 30, 7, (G_GENO | 3),
X { { AT_BITE, AD_PHYS, 1, 7 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_SQAWK, MZ_SMALL,
X M1_POIS_RES | M1_TPORT | M1_TPORT_CONTROL, M2_STALK, C(CYAN) },
X/* jellies */
X { "blue jelly", S_JELLY, 4, 0, 8, 10, 0, (G_GENO | 2),
X { { AT_NONE, AD_COLD, 0, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 2, 20, 0, MS_SILENT, MZ_MEDIUM,
X M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_COLD_RES | M1_POIS_RES,
X M2_HOSTILE | M2_OMNIVORE, C(BLUE) },
X { "spotted jelly", S_JELLY, 5, 0, 8, 10, 0, (G_GENO | 1),
X { { AT_NONE, AD_ACID, 0, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 2, 20, 0, MS_SILENT, MZ_MEDIUM,
X M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_STON_RES | M1_ACID,
X M2_HOSTILE | M2_OMNIVORE, C(GREEN) },
X { "ochre jelly", S_JELLY, 6, 3, 8, 20, 0, (G_GENO | 2),
X { { AT_ENGL, AD_ACID, 3, 6 }, { AT_NONE, AD_ACID, 0, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 2, 20, 0, MS_SILENT, MZ_MEDIUM,
X M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_STON_RES | M1_ACID,
X M2_HOSTILE | M2_OMNIVORE, C(BROWN) },
X/* kobolds */
X { "kobold", S_KOBOLD, 0, 6, 7, 0, -2, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_ORC, MZ_SMALL, M1_HUMANOID | M1_POIS | M1_COLLECT,
X M2_HOSTILE, C(BROWN) },
X { "large kobold", S_KOBOLD, 1, 6, 6, 0, -3, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 15, 150, 0, MS_ORC, MZ_SMALL, M1_HUMANOID | M1_POIS | M1_COLLECT,
X M2_HOSTILE, C(RED) },
X { "kobold lord", S_KOBOLD, 2, 6, 5, 0, -4, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_ORC, MZ_SMALL, M1_HUMANOID | M1_POIS | M1_COLLECT,
X M2_HOSTILE | M2_LORD, C(HI_LORD) },
X { "kobold shaman", S_KOBOLD, 1, 6, 6, 10, -4, (G_GENO | 1),
X { { AT_MAGC, AD_SPEL, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 15, 150, 0, MS_ORC, MZ_SMALL, M1_HUMANOID | M1_POIS | M1_MAGIC,
X M2_HOSTILE, C(HI_ZAP) },
X/* leprechauns */
X { "leprechaun", S_LEPRECHAUN, 5, 15, 8, 20, 0, (G_GENO | 4),
X { { AT_CLAW, AD_SGLD, 1, 2 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_LAUGH, MZ_TINY, M1_HUMANOID | M1_TPORT | M1_GREEDY,
X M2_HOSTILE, C(GREEN) },
X/* mimics */
X { "small mimic", S_MIMIC, 7, 3, 7, 0, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 3, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_SILENT, MZ_MEDIUM,
X M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS,
X M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "large mimic", S_MIMIC, 8, 3, 7, 10, 0, (G_GENO | 1),
X { { AT_CLAW, AD_STCK, 3, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 40, 400, 0, MS_SILENT, MZ_LARGE,
X M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(RED) },
X { "giant mimic", S_MIMIC, 9, 3, 7, 20, 0, (G_GENO | 1),
X { { AT_CLAW, AD_STCK, 3, 6 }, { AT_CLAW, AD_STCK, 3, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 60, 500, 0, MS_SILENT, MZ_LARGE,
X M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(HI_LORD) },
X/* nymphs */
X { "wood nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2),
X { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE, MZ_HUMAN,
X M1_HUMANOID | M1_TPORT | M1_COLLECT, M2_HOSTILE | M2_FEM, C(GREEN) },
X { "water nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2),
X { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE, MZ_HUMAN,
X M1_HUMANOID | M1_TPORT | M1_COLLECT | M1_SWIM,
X M2_HOSTILE | M2_FEM, C(BLUE) },
X { "mountain nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2),
X { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE, MZ_HUMAN,
X M1_HUMANOID | M1_TPORT | M1_COLLECT, M2_HOSTILE | M2_FEM, C(BROWN) },
X/* orcs */
X { "goblin", S_ORC, 0, 6, 6, 0, -3, (G_GENO | 2),
X { { AT_WEAP, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_ORC, MZ_SMALL,
X M1_HUMANOID | M1_COLLECT, M2_ORC, C(GRAY) },
X { "hobgoblin", S_ORC, 1, 9, 6, 0, -4, (G_GENO | 2),
X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_ORC, MZ_HUMAN,
X M1_HUMANOID | M1_COLLECT, M2_ORC | M2_STRONG, C(BROWN) },
X /* "orc" for zombie corpses only; they don't get created at random */
X { "orc", S_ORC, 1, 9, 6, 0, -3, (G_GENO | G_NOGEN | G_LGROUP),
X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 15, 150, 0, MS_ORC, MZ_HUMAN,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG, C(RED) },
X { "hill orc", S_ORC, 2, 9, 6, 0, -4, (G_GENO | G_LGROUP | 2),
X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_ORC, MZ_HUMAN,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG, C(YELLOW) },
X#ifdef TOLKIEN
X { "Mordor orc", S_ORC, 3, 5, 6, 0, -5, (G_GENO | G_LGROUP | 1),
X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_ORC, MZ_HUMAN,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG, C(BLUE) },
X { "Uruk-hai", S_ORC, 3, 7, 5, 0, -4, (G_GENO | G_LGROUP | 1),
X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_ORC, MZ_HUMAN,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG, C(BLACK) },
X#endif
X { "orc shaman", S_ORC, 3, 9, 5, 10, -5, (G_GENO | 1),
X { { AT_MAGC, AD_SPEL, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_ORC, MZ_HUMAN,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_ORC | M2_HOSTILE | M2_STRONG, C(HI_ZAP) },
X { "orc-captain", S_ORC, 5, 5, 4, 0, -5, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 35, 350, 0, MS_ORC, MZ_HUMAN,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG, C(HI_LORD) },
X/* piercers */
X { "rock piercer", S_PIERCER, 3, 1, 3, 0, 0, (G_GENO | 2),
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_SILENT, MZ_SMALL,
X M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS,
X M2_HOSTILE | M2_CARNIVORE, C(GRAY) },
X { "iron piercer", S_PIERCER, 5, 1, 0, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 3, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 40, 300, 0, MS_SILENT, MZ_MEDIUM,
X M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS,
X M2_HOSTILE | M2_CARNIVORE, C(CYAN) },
X/* quadrupeds (generic) */
X { "rothe", S_QUADRUPED, 2, 9, 7, 0, 0, (G_GENO | G_SGROUP | 4),
X { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_BITE, AD_PHYS, 1, 3 },
X { AT_BITE, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_SILENT, MZ_LARGE, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE, C(GRAY) },
X#ifdef TOLKIEN
X { "mumakil", S_QUADRUPED, 5, 9, 0, 0, -2, (G_GENO | 1),
X { { AT_BUTT, AD_PHYS, 4, 12 }, { AT_BITE, AD_PHYS, 2, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 70, 500, 0, MS_SILENT, MZ_LARGE,
X M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(GRAY) },
X#endif
X { "leocrotta", S_QUADRUPED, 6, 18, 4, 10, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 2, 6 }, { AT_BITE, AD_PHYS, 2, 6 },
X { AT_CLAW, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_IMITATE, MZ_LARGE, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(RED) },
X { "wumpus", S_QUADRUPED, 8, 3, 2, 10, 0, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 3, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_SILENT, MZ_LARGE, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(CYAN) },
X { "titanothere", S_QUADRUPED, 12, 12, 6, 0, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 2, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 65, 650, 0, MS_SILENT, MZ_LARGE,
X M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(GRAY) },
X { "baluchitherium", S_QUADRUPED, 14, 12, 5, 0, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 5, 4 }, { AT_CLAW, AD_PHYS, 5, 4 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 80, 800, 0, MS_SILENT, MZ_LARGE,
X M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_HERBIVORE, C(GRAY) },
X/* rodents */
X { "sewer rat", S_RODENT, 0, 12, 7, 0, 0, (G_GENO | G_SGROUP | 1),
X { { AT_BITE, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 2, 20, 0, MS_SQEEK, MZ_TINY, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "giant rat", S_RODENT, 1, 10, 7, 0, 0, (G_GENO | G_SGROUP | 2),
X { { AT_BITE, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 3, 30, 0, MS_SQEEK, MZ_TINY, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "rabid rat", S_RODENT, 2, 12, 6, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_DRCO, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 3, 10, 0, MS_SQEEK, MZ_TINY, M1_ANIMAL | M1_NOHANDS | M1_POIS,
X M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "ratwere", S_RODENT, 2, 12, 6, 10, -7, G_NOGEN | G_NOCORPSE,
X { { AT_BITE, AD_WERE, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 3, 30, 0, MS_SQEEK, MZ_TINY, M1_NOHANDS | M1_NOPOLY |
X M1_POIS | M1_REGEN, M2_WERE | M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X { "rock mole", S_RODENT, 3, 3, 0, 20, 0, (G_GENO | 2),
X { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 3, 30, 0, MS_SILENT, MZ_SMALL,
X M1_TUNNEL | M1_ANIMAL | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_COLLECT, M2_HOSTILE | M2_METALLIVORE, C(GRAY) },
X/* spiders and scorpions */
X { "cave spider", S_SPIDER, 1, 12, 3, 0, 0, (G_GENO | G_SGROUP | 2),
X { { AT_BITE, AD_PHYS, 1, 2 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 5, 50, 0, MS_SILENT, MZ_TINY,
X M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_POIS_RES,
X M2_HOSTILE | M2_CARNIVORE | M2_EGGS, C(GRAY) },
X { "scorpion", S_SPIDER, 5, 15, 3, 0, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 1, 2 }, { AT_CLAW, AD_PHYS, 1, 2 },
X { AT_STNG, AD_DRST, 1, 4 }, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_SILENT, MZ_SMALL,
X M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_POIS,
X M2_HOSTILE | M2_CARNIVORE | M2_EGGS, C(RED) },
X { "giant spider", S_SPIDER, 5, 15, 4, 0, 0, (G_GENO | 1),
X { { AT_BITE, AD_DRST, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_SILENT, MZ_LARGE,
X M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_POIS_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_EGGS, C(MAGENTA) },
X/* trappers, lurkers, &c. */
X { "lurker above", S_TRAPPER, 10, 3, 3, 0, 0, (G_GENO | 2),
X { { AT_ENGL, AD_DGST, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 40, 350, 0, MS_SILENT, MZ_HUGE,
X M1_HIDE | M1_FLY | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS,
X M2_HOSTILE | M2_STALK | M2_STRONG | M2_CARNIVORE, C(GRAY) },
X { "trapper", S_TRAPPER, 12, 3, 3, 0, 0, (G_GENO | 2),
X { { AT_ENGL, AD_DGST, 1, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 40, 350, 0, MS_SILENT, MZ_HUGE,
X M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS,
X M2_HOSTILE | M2_STALK | M2_STRONG | M2_CARNIVORE, C(GREEN) },
X/* unicorns */
X { "white unicorn", S_UNICORN, 4, 24, 2, 70, 7, (G_GENO | 2),
X { { AT_BUTT, AD_PHYS, 1, 12 }, { AT_KICK, AD_PHYS, 1, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_NEIGH, MZ_LARGE, M1_NOHANDS | M1_POIS_RES | M1_JEWELS,
X M2_WANDER | M2_STRONG | M2_HERBIVORE, C(WHITE) },
X { "gray unicorn", S_UNICORN, 4, 24, 2, 70, 0, (G_GENO | 1),
X { { AT_BUTT, AD_PHYS, 1, 12 }, { AT_KICK, AD_PHYS, 1, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_NEIGH, MZ_LARGE, M1_NOHANDS | M1_POIS_RES | M1_JEWELS,
X M2_WANDER | M2_STRONG | M2_HERBIVORE, C(GRAY) },
X { "black unicorn", S_UNICORN, 4, 24, 2, 70, -7, (G_GENO | 1),
X { { AT_BUTT, AD_PHYS, 1, 12 }, { AT_KICK, AD_PHYS, 1, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_NEIGH, MZ_LARGE, M1_NOHANDS | M1_POIS_RES | M1_JEWELS,
X M2_WANDER | M2_STRONG | M2_HERBIVORE, C(BLACK) },
X/* vortices */
X { "fog cloud", S_VORTEX, 3, 1, 0, 0, 0, (G_GENO | G_NOCORPSE | 2),
X { { AT_ENGL, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 10, 0, 0, MS_SILENT, MZ_HUGE,
X M1_FLY | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES,
X M2_HOSTILE, C(GRAY) },
X { "dust vortex", S_VORTEX, 4, 20, 2, 30, 0, (G_GENO | G_NOCORPSE | 2),
X { { AT_ENGL, AD_BLND, 2, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 0, 0, MS_SILENT, MZ_HUGE,
X M1_FLY | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES, M2_HOSTILE, C(BROWN) },
X { "energy vortex", S_VORTEX, 6, 20, 2, 30, 0, (G_GENO | G_NOCORPSE | 1),
X { { AT_ENGL, AD_ELEC, 1, 6 }, { AT_ENGL, AD_DREN, 0, 0 },
X { AT_NONE, AD_ELEC, 0, 4 }, NO_ATTK, NO_ATTK },
X 20, 0, 0, MS_SILENT, MZ_HUGE,
X M1_FLY | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES | M1_ELEC_RES,
X M2_HOSTILE, C(HI_ZAP) },
X { "ice vortex", S_VORTEX, 5, 20, 2, 30, 0, (G_GENO | G_NOCORPSE | 1),
X { { AT_ENGL, AD_COLD, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 0, 0, MS_SILENT, MZ_HUGE,
X M1_FLY | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES | M1_COLD_RES,
X M2_HOSTILE, C(CYAN) },
X { "steam vortex", S_VORTEX, 7, 22, 2, 30, 0,
X (G_HELL | G_GENO | G_NOCORPSE | 2),
X { { AT_ENGL, AD_FIRE, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 0, 0, MS_SILENT, MZ_HUGE,
X M1_FLY | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES | M1_FIRE_RES,
X M2_HOSTILE, C(BLUE) },
X { "fire vortex", S_VORTEX, 8, 22, 2, 30, 0,
X (G_HELL | G_GENO | G_NOCORPSE | 1),
X { { AT_ENGL, AD_FIRE, 1, 10 }, { AT_NONE, AD_FIRE, 0, 4 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 0, 0, MS_SILENT, MZ_HUGE,
X M1_FLY | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES | M1_FIRE_RES,
X M2_HOSTILE, C(YELLOW) },
X/* worms */
X#ifdef WORM
X { "baby long worm", S_WORM, 8, 3, 5, 0, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_SILENT, MZ_LARGE, M1_ANIMAL | M1_SLITHY | M1_NOLIMBS,
X M2_HOSTILE | M2_CARNIVORE, C(BROWN) },
X#endif
X { "baby purple worm", S_WORM, 8, 3, 5, 0, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_SILENT, MZ_LARGE, M1_ANIMAL | M1_SLITHY | M1_NOLIMBS,
X M2_HOSTILE | M2_CARNIVORE, C(MAGENTA) },
X#ifdef WORM
X { "long worm", S_WORM, 8, 3, 5, 10, 0, (G_GENO | 2),
X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_SILENT, MZ_GIGANTIC,
X M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_NOPOLY,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS,
X C(BROWN) },
X#endif
X { "purple worm", S_WORM, 15, 9, 6, 20, 0, (G_GENO | 2),
X { { AT_BITE, AD_PHYS, 2, 8 }, { AT_ENGL, AD_DGST, 1, 10 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 70, 700, 0, MS_SILENT, MZ_GIGANTIC,
X M1_ANIMAL | M1_SLITHY | M1_NOLIMBS,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS,
X C(MAGENTA) },
X/* xan, &c. */
X { "grid bug", S_XAN, 0, 12, 9, 0, 0,
X (G_GENO | G_SGROUP | G_NOCORPSE | 3),
X { { AT_BITE, AD_ELEC, 1, 1 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 5, 50, 0, MS_BUZZ, MZ_TINY, M1_ANIMAL | M1_ELEC_RES, M2_HOSTILE,
X C(MAGENTA) },
X { "xan", S_XAN, 7, 18, -4, 0, 0, (G_GENO | 3),
X { { AT_STNG, AD_LEGS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_BUZZ, MZ_TINY, M1_FLY | M1_ANIMAL | M1_NOHANDS |
X M1_POIS | M1_POIS_RES, M2_HOSTILE, C(RED) },
X/* yellow light */
X { "yellow light", S_YLIGHT, 3, 15, 0, 0, 0, (G_GENO | 4),
X { { AT_EXPL, AD_BLND, 10, 20 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 1, 10, 0, MS_SILENT, MZ_SMALL,
X M1_FLY | M1_NOLIMBS, M2_HOSTILE, C(BRIGHT|YELLOW) },
X/* zruty */
X { "zruty", S_ZRUTY, 9, 8, 3, 0, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 },
X { AT_BITE, AD_PHYS, 3, 6 }, NO_ATTK, NO_ATTK },
X 60, 600, 0, MS_SILENT, MZ_LARGE, M1_ANIMAL | M1_HUMANOID,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(BROWN) },
X/* Apes */
X { "ape", S_APE, 4, 12, 6, 0, 0, (G_GENO | G_SGROUP | 2),
X { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
X { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_GROWL, MZ_LARGE, M1_ANIMAL | M1_HUMANOID,
X M2_STRONG | M2_CARNIVORE, C(BROWN) },
X { "carnivorous ape", S_APE, 5, 12, 6, 0, 0, (G_GENO | 1),
X { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
X { AT_HUGS, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK },
X 55, 550, 0, MS_GROWL, MZ_LARGE, M1_ANIMAL | M1_HUMANOID,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(BROWN) },
X/* Bats */
X { "bat", S_BAT, 0, 22, 8, 0, 0, (G_GENO | G_SGROUP | 1),
X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 2, 20, 0, MS_SQEEK, MZ_TINY, M1_FLY | M1_ANIMAL | M1_NOHANDS,
X M2_WANDER | M2_CARNIVORE, C(BROWN) },
X { "giant bat", S_BAT, 2, 22, 7, 0, 0, (G_GENO | 2),
X { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 3, 30, 0, MS_SQEEK, MZ_MEDIUM, M1_FLY | M1_ANIMAL | M1_NOHANDS,
X M2_WANDER | M2_HOSTILE | M2_CARNIVORE, C(RED) },
X { "vampire bat", S_BAT, 5, 20, 6, 0, 0, (G_GENO | 2),
X { { AT_BITE, AD_PHYS, 1, 6 }, { AT_BITE, AD_DRST, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 3, 20, 0, MS_SQEEK, MZ_TINY,
X M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_REGEN,
X M2_UNDEAD | M2_HOSTILE, C(BLACK) },
X/* Centaurs */
X { "plains centaur", S_CENTAUR, 4, 18, 4, 0, 0, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_KICK, AD_PHYS, 1, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK},
X 50, 500, 0, MS_SILENT, MZ_LARGE, M1_COLLECT | M1_GREEDY, M2_STRONG,
X C(BROWN) },
X { "forest centaur", S_CENTAUR, 5, 18, 3, 10, -1, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 1, 8 }, { AT_KICK, AD_PHYS, 1, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK},
X 55, 600, 0, MS_SILENT, MZ_LARGE, M1_COLLECT | M1_GREEDY, M2_STRONG,
X C(GREEN) },
X { "mountain centaur", S_CENTAUR, 6, 20, 2, 10, -3, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 1, 10 }, { AT_KICK, AD_PHYS, 1, 6 },
X { AT_KICK, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK },
X 55, 500, 0, MS_SILENT, MZ_LARGE, M1_COLLECT | M1_GREEDY, M2_STRONG,
X C(CYAN) },
X/* Dragons */
X { "baby gray dragon", S_DRAGON, 12, 9, 2, 10, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_ROAR, MZ_HUGE,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(GRAY) },
X { "baby red dragon", S_DRAGON, 12, 9, 2, 10, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_ROAR, MZ_HUGE,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_FIRE_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(RED) },
X { "baby white dragon", S_DRAGON, 12, 9, 2, 10, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_ROAR, MZ_HUGE,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_COLD_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(WHITE) },
X { "baby blue dragon", S_DRAGON, 12, 9, 2, 10, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_ROAR, MZ_HUGE,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_ELEC_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(BLUE) },
X { "baby green dragon", S_DRAGON, 12, 9, 2, 10, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_ROAR, MZ_HUGE,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_POIS | M1_POIS_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(GREEN) },
X { "baby orange dragon", S_DRAGON, 12, 9, 2, 10, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_ROAR, MZ_HUGE,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_SLEE_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(ORANGE_COLORED) },
X { "baby black dragon", S_DRAGON, 12, 9, 2, 10, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_ROAR, MZ_HUGE,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(BLACK) },
X { "baby yellow dragon", S_DRAGON, 12, 9, 2, 10, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 500, 0, MS_ROAR, MZ_HUGE,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_ACID | M1_STON_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE, C(YELLOW) },
X { "gray dragon", S_DRAGON, 10, 9, -1, 20, 4, (G_GENO | 1),
X { { AT_BREA, AD_MAGM, 4, 6 }, { AT_BITE, AD_PHYS, 3, 8 },
X { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK },
X 150, 1500, 0, MS_ROAR, MZ_GIGANTIC,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_MAGIC | M1_SEE_INVIS,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS, C(GRAY) },
X { "red dragon", S_DRAGON, 10, 9, -1, 20, -4, (G_GENO | 1),
X { { AT_BREA, AD_FIRE, 6, 6 }, { AT_BITE, AD_PHYS, 3, 8 },
X { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK },
X 150, 1500, 0, MS_ROAR, MZ_GIGANTIC,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_MAGIC | M1_SEE_INVIS | M1_FIRE_RES,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS, C(RED) },
X { "orange dragon", S_DRAGON, 10, 9, -1, 20, 5, (G_GENO | 1),
X { { AT_BREA, AD_SLEE, 4, 25 }, { AT_BITE, AD_PHYS, 3, 8 },
X { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK },
X 150, 1500, 0, MS_ROAR, MZ_GIGANTIC,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_MAGIC | M1_SEE_INVIS | M1_SLEE_RES,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS,
X C(ORANGE_COLORED) },
X { "white dragon", S_DRAGON, 10, 9, -1, 20, -5, (G_GENO | 1),
X { { AT_BREA, AD_COLD, 4, 6 }, { AT_BITE, AD_PHYS, 3, 8 },
X { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK },
X 150, 1500, 0, MS_ROAR, MZ_GIGANTIC,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_MAGIC | M1_SEE_INVIS | M1_COLD_RES,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS,
X C(WHITE) },
X { "black dragon", S_DRAGON, 10, 9, -1, 20, -6, (G_GENO | 1),
X { { AT_BREA, AD_DISN, 4, 10 }, { AT_BITE, AD_PHYS, 3, 8 },
X { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK },
X 150, 1500, 0, MS_ROAR, MZ_GIGANTIC,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_MAGIC | M1_SEE_INVIS,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS,
X C(BLACK) },
X { "blue dragon", S_DRAGON, 10, 9, -1, 20, -7, (G_GENO | 1),
X { { AT_BREA, AD_ELEC, 4, 6 }, { AT_BITE, AD_PHYS, 3, 8 },
X { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK },
X 150, 1500, 0, MS_ROAR, MZ_GIGANTIC,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_MAGIC | M1_SEE_INVIS | M1_ELEC_RES,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS,
X C(BLUE) },
X { "green dragon", S_DRAGON, 10, 9, -1, 20, 6, (G_GENO | 1),
X { { AT_BREA, AD_DRST, 4, 6 }, { AT_BITE, AD_PHYS, 3, 8 },
X { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK },
X 150, 1500, 0, MS_ROAR, MZ_GIGANTIC,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_MAGIC | M1_SEE_INVIS | M1_POIS | M1_POIS_RES,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS,
X C(GREEN) },
X { "yellow dragon", S_DRAGON, 10, 9, -1, 20, 7, (G_GENO | 1),
X { { AT_BREA, AD_ACID, 4, 6 }, { AT_BITE, AD_PHYS, 3, 8 },
X { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK },
X 150, 1500, 0, MS_ROAR, MZ_GIGANTIC,
X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_GREEDY | M1_JEWELS |
X M1_MAGIC | M1_SEE_INVIS | M1_ACID | M1_STON_RES,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_EGGS,
X C(YELLOW) },
X/* Elementals */
X { "air elemental", S_ELEMENTAL, 8, 36, 2, 30, 0, (G_NOCORPSE | 1),
X { { AT_ENGL, AD_PHYS, 2, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 5, 0, 0, MS_SILENT, MZ_HUGE,
X M1_FLY | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES, M2_STRONG, C(CYAN) },
X { "fire elemental", S_ELEMENTAL, 8, 12, 2, 30, 0, (G_NOCORPSE | 1),
X { { AT_CLAW, AD_FIRE, 3, 6 }, { AT_NONE, AD_FIRE, 0, 4 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 5, 0, 0, MS_SILENT, MZ_HUGE,
X M1_FLY | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES | M1_FIRE_RES,
X M2_STRONG, C(YELLOW) },
X { "earth elemental", S_ELEMENTAL, 8, 6, 2, 30, 0, (G_NOCORPSE | 1),
X { { AT_CLAW, AD_PHYS, 4, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 0, 0, MS_SILENT, MZ_HUGE,
X M1_WALLWALK | M1_NOEYES | M1_NOLIMBS | M1_POIS_RES | M1_THICK_HIDE |
X M1_STON_RES,
X M2_STRONG, C(BROWN) },
X { "water elemental", S_ELEMENTAL, 8, 6, 2, 30, 0, (G_NOCORPSE | 1),
X { { AT_CLAW, AD_PHYS, 5, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 50, 0, 0, MS_SILENT, MZ_HUGE,
X M1_NOEYES | M1_NOLIMBS | M1_POIS_RES | M1_SWIM, M2_STRONG, C(BLUE) },
X/* Fungi */
X { "violet fungus", S_FUNGUS, 3, 1, 7, 0, 0, (G_GENO | 2),
X { { AT_TUCH, AD_PHYS, 1, 4 }, { AT_TUCH, AD_STCK, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 10, 100, 0, MS_SILENT, MZ_SMALL,
X M1_NOEYES | M1_NOLIMBS | M1_POIS_RES,
X M2_HOSTILE | M2_OMNIVORE, C(MAGENTA) },
X { "brown mold", S_FUNGUS, 1, 0, 9, 0, 0, (G_GENO | 1),
X { { AT_NONE, AD_COLD, 0, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 5, 30, 0, MS_SILENT, MZ_SMALL,
X M1_NOEYES | M1_NOLIMBS | M1_COLD_RES | M1_POIS_RES,
X M2_HOSTILE | M2_OMNIVORE, C(BROWN) },
X { "yellow mold", S_FUNGUS, 1, 0, 9, 0, 0, (G_GENO | 2),
X { { AT_NONE, AD_STUN, 0, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 5, 30, 0, MS_SILENT, MZ_SMALL,
X M1_NOEYES | M1_NOLIMBS | M1_POIS | M1_POIS_RES,
X M2_HOSTILE | M2_OMNIVORE, C(YELLOW) },
X { "green mold", S_FUNGUS, 1, 0, 9, 0, 0, (G_GENO | 1),
X { { AT_NONE, AD_ACID, 0, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 5, 30, 0, MS_SILENT, MZ_SMALL,
X M1_NOEYES | M1_NOLIMBS | M1_ACID | M1_STON_RES,
X M2_HOSTILE | M2_OMNIVORE, C(GREEN) },
X { "red mold", S_FUNGUS, 1, 0, 9, 0, 0, (G_GENO | 1),
X { { AT_NONE, AD_FIRE, 0, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 5, 30, 0, MS_SILENT, MZ_SMALL,
X M1_NOEYES | M1_NOLIMBS | M1_FIRE_RES | M1_POIS_RES,
X M2_HOSTILE | M2_OMNIVORE, C(RED) },
X/* Gnomes */
X { "gnome", S_GNOME, 1, 6, 5, 4, 0, (G_GENO | G_SGROUP | 1),
X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_ORC, MZ_SMALL,
X M1_HUMANOID | M1_COLLECT, 0, C(BROWN) },
X { "gnome lord", S_GNOME, 3, 8, 4, 4, 0, (G_GENO | 2),
X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 15, 120, 0, MS_ORC, MZ_SMALL,
X M1_HUMANOID | M1_COLLECT, M2_LORD, C(BLUE) },
X { "gnome king", S_GNOME, 5, 10, 2, 20, 0, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 150, 0, MS_ORC, MZ_SMALL,
X M1_HUMANOID | M1_COLLECT, M2_PRINCE, C(HI_LORD) },
X { "gnomish wizard", S_GNOME, 3, 10, 4, 10, 0, (G_GENO | 1),
X { { AT_MAGC, AD_SPEL, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 15, 120, 0, MS_ORC, MZ_SMALL,
X M1_HUMANOID | M1_MAGIC, 0, C(HI_ZAP) },
X#ifdef SPLITMON_1
X};
X#endif
X#endif /* !SPLITMON_2 */
X
END_OF_FILE
if test 39701 -ne `wc -c <'src/monst.c1'`; then
echo shar: \"'src/monst.c1'\" unpacked with wrong size!
fi
# end of 'src/monst.c1'
fi
echo shar: End of archive 14 \(of 56\).
cp /dev/null ark14isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 56 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0