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