billr@saab.CNA.TEK.COM (Bill Randle) (07/24/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 7, Issue 60
Archive-name: NetHack3/Part05
#! /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 5 (of 38)."
# Contents: src/monst.c1 src/music.c
# Wrapped by billr@saab on Sun Jul 23 21:32:48 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
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'\" \(41770 characters\)
sed "s/^X//" >'src/monst.c1' <<'END_OF_FILE'
X/* SCCS Id: @(#)monst.c 3.0 89/03/11
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X/* since this file is also used in auxiliary programs, don't include all the
X * function declarations for all of nethack
X */
X#define EXTERN_H
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
Xstruct permonst 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 40, 400, PL_NSIZ, MS_SILENT, M1_HUMANOID | M1_COLLECT,
X M2_HUMAN | M2_STRONG | M2_NEEDPICK
X}, *uasmon = &playermon;
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
Xstruct permonst 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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS | M1_EGGS,
X M2_HOSTILE | M2_CARNIVORE },
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,
X M1_VSMALL | M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS | M1_EGGS |
X M1_FIRE_RES, M2_HOSTILE | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_NOHANDS | M1_POIS |
X M1_POIS_RES, M2_HOSTILE | M2_CARNIVORE },
X { "killer bee", S_ANT, 1, 18, -4, 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, M1_VSMALL | M1_ANIMAL | M1_FLY | M1_NOHANDS |
X M1_POIS | M1_POIS_RES, M2_HOSTILE },
X { "queen bee", S_ANT, 9, 24, -6, 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, M1_VSMALL | M1_ANIMAL | M1_FLY | M1_NOHANDS |
X M1_POIS | M1_POIS_RES | M1_PRINCE, M2_HOSTILE },
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, M1_VSMALL | M1_NOEYES | M1_NOHANDS |
X M1_POIS | M1_SLEE_RES | M1_STON_RES,
X M2_WANDER | M2_NOLIMBS | M2_AMORPHOUS },
X { "gelatinous cube", S_BLOB, 6, 6, 8, 0, 0, (G_GENO | 2),
X { { AT_TUCH, AD_PLYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 10, 100, 0, MS_SILENT, M1_BIG | M1_NOEYES | M1_NOHANDS |
X M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES | M1_SLEE_RES,
X M2_WANDER | M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE },
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 10, 100, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES,
X M2_WANDER | M2_HOSTILE | M2_NOLIMBS },
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 NO_ATTK, NO_ATTK, NO_ATTK }, 3, 30, 0, MS_HISS, M1_VSMALL |
X M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS_RES | M1_STON_RES,
X M2_HOSTILE },
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,
X M1_VSMALL | M1_ANIMAL | M1_NOHANDS, M2_CARNIVORE },
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, M1_ANIMAL | M1_NOHANDS, M2_CARNIVORE },
X { "large dog", S_DOG, 6, 15, 4, 0, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_BARK, M1_ANIMAL | M1_NOHANDS,
X M2_STRONG | M2_CARNIVORE },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_NOPOLY | M1_WERE | M1_NOHANDS | M1_POIS |
X M1_REGEN, M2_HOSTILE | M2_CARNIVORE },
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,
X M1_ANIMAL | M1_NOHANDS, M2_HOSTILE | M2_CARNIVORE },
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, M1_NOPOLY | M1_WERE | M1_NOHANDS | M1_POIS |
X M1_REGEN, M2_HOSTILE | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_NOHANDS | M1_COLD_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
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, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS | M1_FIRE_RES,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_NOHANDS | M1_FIRE_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
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, M1_NOPOLY | M1_ANIMAL | M1_NOHANDS | M1_FIRE_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
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, M1_FLY | M1_NOHANDS, M2_HOSTILE | M2_NOLIMBS },
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, M1_FLY | M1_NOHANDS | M1_COLD_RES, M2_HOSTILE |
X M2_NOLIMBS },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS,
X M2_WANDER | M2_CARNIVORE },
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, M1_ANIMAL | M1_NOHANDS, M2_CARNIVORE },
X { "large cat", S_FELINE, 6, 15, 4, 0, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 25, 250, 0, MS_MEW, M1_BIG | M1_ANIMAL | M1_NOHANDS,
X M2_STRONG | M2_CARNIVORE },
X { "jaguar", S_FELINE, 5, 15, 6, 0, 0, (G_GENO | 2),
X { { AT_CLAW, AD_PHYS, 1, 8 }, { AT_CLAW, AD_PHYS, 1, 8 },
X { AT_BITE, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_GROWL, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_VSMALL | M1_SWIM | M1_HUMANOID | M1_POIS |
X M1_STALK, 0 },
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, M1_HUMANOID | M1_COLLECT, 0 },
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, M1_BIG | M1_HUMANOID | M1_COLLECT,
X M2_STRONG },
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, M1_HUMANOID | M1_GREEDY | M1_JEWELS |
X M1_COLLECT, M2_DWARF | M2_TUNNEL | M2_NEEDPICK | M2_STRONG },
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,
X M1_HUMANOID | M1_LORD | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_DWARF | M2_TUNNEL | M2_NEEDPICK | M2_STRONG },
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,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT | M1_PRINCE,
X M2_DWARF | M2_TUNNEL | M2_NEEDPICK | M2_STRONG },
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 0, 0, 0, MS_JEER, M1_VSMALL | M1_POIS | M1_STALK, 0 },
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, M1_VSMALL | M1_FLY | M1_POIS | M1_POIS_RES |
X M1_SLEE_RES | M1_STALK, 0 },
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 0, 0, 0, MS_SILENT, M1_POIS | M1_SLEE_RES | M1_REGEN | M1_STALK,
X M2_HOSTILE | M2_WANDER },
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_JEER, M1_VSMALL | M1_REGEN | M1_STALK,
X M2_WANDER },
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, M1_VSMALL | M1_POIS_RES | M1_REGEN | M1_STALK,
X 0 },
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, M1_VSMALL | M1_POIS_RES | M1_TPORT |
X M1_TPORT_CONTROL | M1_STALK, 0 },
X/* j ??? */
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, M1_HUMANOID | M1_POIS | M1_COLLECT,
X M2_HOSTILE },
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, M1_HUMANOID | M1_POIS | M1_COLLECT,
X M2_HOSTILE },
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, M1_HUMANOID | M1_POIS | M1_COLLECT | M1_LORD,
X M2_HOSTILE },
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, M1_HUMANOID | M1_POIS | M1_MAGIC, M2_HOSTILE },
X/* liches */
X { "lich", S_LICH, 11, 6, 0, 30, -9, (G_GENO | 1),
X { { AT_TUCH, AD_COLD, 1, 10 }, { AT_MAGC, AD_SPEL, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 100, 0, MS_MUMBLE, M1_HUMANOID | M1_UNDEAD | M1_POIS |
X M1_COLD_RES | M1_REGEN, M2_HOSTILE },
X { "demilich", S_LICH, 14, 9, -2, 60, -12, (G_GENO | 1),
X { { AT_TUCH, AD_COLD, 3, 4 }, { AT_MAGC, AD_SPEL, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 100, 0, MS_MUMBLE, M1_HUMANOID | M1_UNDEAD | M1_POIS |
X M1_COLD_RES | M1_REGEN, M2_HOSTILE },
X { "master lich", S_LICH, 17, 9, -4, 90, -15, (G_HELL | G_GENO | 1),
X { { AT_TUCH, AD_COLD, 3, 6 }, { AT_MAGC, AD_SPEL, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 100, 0, MS_MUMBLE, M1_HUMANOID | M1_UNDEAD | M1_POIS |
X M1_FIRE_RES | M1_COLD_RES | M1_REGEN, M2_HOSTILE },
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, M1_ANIMAL | M1_NOEYES | M1_NOHANDS,
X M2_HOSTILE | M2_HIDE | M2_NOLIMBS | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_NOEYES | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_HIDE | M2_NOLIMBS | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_NOEYES | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_HIDE | M2_NOLIMBS | M2_CARNIVORE },
X/* nagas */
X { "red naga hatchling", S_NAGA, 3, 10, 6, 0, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 100, 0, MS_MUMBLE, M1_BIG | M1_NOHANDS | M1_POIS_RES |
X M1_FIRE_RES, M2_STRONG | M2_NOLIMBS | M2_THICK_HIDE },
X { "black naga hatchling", S_NAGA, 3, 10, 6, 0, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 100, 0, MS_MUMBLE, M1_BIG | M1_NOHANDS | M1_POIS_RES |
X M1_STON_RES, M2_STRONG | M2_NOLIMBS | M2_THICK_HIDE },
X { "golden naga hatchling", S_NAGA, 3, 10, 6, 0, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 100, 0, MS_MUMBLE, M1_BIG | M1_NOHANDS | M1_POIS_RES, M2_STRONG |
X M2_NOLIMBS | M2_THICK_HIDE },
X { "guardian naga hatchling", S_NAGA, 3, 10, 6, 0, 0, G_GENO,
X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 100, 0, MS_MUMBLE, M1_BIG | M1_NOHANDS | M1_POIS_RES, M2_STRONG |
X M2_NOLIMBS | M2_THICK_HIDE },
X { "red naga", S_NAGA, 6, 12, 4, 0, -4, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 2, 4 }, { AT_BREA, AD_FIRE, 2, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 60, 400, 0, MS_MUMBLE,
X M1_BIG | M1_NOHANDS | M1_EGGS | M1_POIS_RES | M1_FIRE_RES,
X M2_STRONG | M2_NOLIMBS | M2_THICK_HIDE },
X { "black naga", S_NAGA, 8, 14, 2, 10, 4, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 2, 6 }, { AT_SPIT, AD_ACID, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK }, 60, 400, 0, MS_MUMBLE,
X M1_BIG | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES | M1_STON_RES,
X M2_STRONG | M2_NOLIMBS | M2_THICK_HIDE },
X { "golden naga", S_NAGA, 10, 14, 2, 70, 5, (G_GENO | 1),
X { { AT_BITE, AD_PHYS, 2, 6 }, { AT_MAGC, AD_SPEL, 4, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 60, 400, 0, MS_MUMBLE, M1_BIG | M1_NOHANDS | M1_EGGS | M1_POIS_RES,
X M2_STRONG | M2_NOLIMBS | M2_THICK_HIDE },
X { "guardian naga", S_NAGA, 12, 16, 0, 50, 7, (G_GENO | 1),
X { { AT_BITE, AD_PLYS, 1, 6 }, { AT_HUGS, AD_PHYS, 2, 4 },
X { AT_SPIT, AD_ACID, 1, 6 }, NO_ATTK, NO_ATTK },
X 60, 400, 0, MS_MUMBLE, M1_BIG | M1_NOHANDS | M1_EGGS | M1_POIS_RES,
X M2_STRONG | M2_NOLIMBS | M2_THICK_HIDE },
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, M1_HUMANOID | M1_COLLECT, M2_ORC },
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, M1_HUMANOID | M1_COLLECT, M2_ORC | M2_STRONG },
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,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG },
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,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG },
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,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG },
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,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG },
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, M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_ORC | M2_HOSTILE | M2_STRONG },
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,
X M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
X M2_ORC | M2_HOSTILE | M2_STRONG },
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, M1_ANIMAL | M1_NOEYES | M1_NOHANDS,
X M2_HOSTILE | M2_HIDE | M2_NOLIMBS | M2_CARNIVORE },
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, M1_ANIMAL | M1_NOEYES | M1_NOHANDS,
X M2_HOSTILE | M2_HIDE | M2_NOLIMBS | M2_CARNIVORE },
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, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE },
X { "osquip", S_QUADRUPED, 3, 12, 7, 0, 0, (G_GENO | G_SGROUP | 3),
X { { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_SILENT, M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_ANIMAL | M1_NOHANDS | M1_BIG,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_STRONG | M2_HERBIVORE | M2_THICK_HIDE },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS | M1_POIS,
X M2_HOSTILE | M2_CARNIVORE },
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, M1_VSMALL | M1_WERE | M1_NOHANDS | M1_NOPOLY |
X M1_POIS | M1_REGEN, M2_HOSTILE | M2_CARNIVORE },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS |
X M1_GREEDY | M1_JEWELS | M1_COLLECT, M2_HOSTILE | M2_TUNNEL },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS | M1_EGGS |
X M1_POIS_RES, M2_HOSTILE | M2_CONCEAL | M2_CARNIVORE },
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, M1_VSMALL | M1_ANIMAL | M1_NOHANDS | M1_EGGS |
X M1_POIS, M2_HOSTILE | M2_CONCEAL | M2_CARNIVORE },
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,
X M1_BIG | M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
X/* trappers, lurkers, etc... */
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,
X M1_BIG | M1_ANIMAL | M1_NOEYES | M1_NOHANDS | M1_STALK | M1_FLY,
X M2_HOSTILE | M2_STRONG | M2_NOLIMBS | M2_CARNIVORE },
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,
X M1_BIG | M1_ANIMAL | M1_NOEYES | M1_NOHANDS | M1_STALK,
X M2_HOSTILE | M2_STRONG | M2_NOLIMBS | M2_CARNIVORE },
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, M1_BIG | M1_NOHANDS | M1_POIS_RES | M1_JEWELS,
X M2_WANDER | M2_STRONG | M2_HERBIVORE },
X { "grey 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, M1_BIG | M1_NOHANDS | M1_POIS_RES | M1_JEWELS,
X M2_WANDER | M2_STRONG | M2_HERBIVORE },
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, M1_BIG | M1_NOHANDS | M1_POIS_RES | M1_JEWELS,
X M2_WANDER | M2_STRONG | M2_HERBIVORE },
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 0, 0, 0, MS_SILENT,
X M1_FLY | M1_NOEYES | M1_NOHANDS | M1_POIS_RES, M2_HOSTILE |
X M2_NOLIMBS },
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 0, 0, 0, MS_SILENT,
X M1_FLY | M1_NOEYES | M1_NOHANDS | M1_POIS_RES, M2_HOSTILE |
X M2_NOLIMBS },
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 NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_SILENT,
X M1_FLY | M1_NOEYES | M1_NOHANDS | M1_POIS_RES | M1_ELEC_RES,
X M2_HOSTILE | M2_NOLIMBS },
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 0, 0, 0, MS_SILENT,
X M1_FLY | M1_NOEYES | M1_NOHANDS | M1_POIS_RES | M1_COLD_RES,
X M2_HOSTILE | M2_NOLIMBS },
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 0, 0, 0, MS_SILENT,
X M1_FLY | M1_NOEYES | M1_NOHANDS | M1_POIS_RES | M1_FIRE_RES,
X M2_HOSTILE | M2_NOLIMBS },
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 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 0, 0, 0, MS_SILENT,
X M1_FLY | M1_NOEYES | M1_NOHANDS | M1_POIS_RES | M1_FIRE_RES,
X M2_HOSTILE | M2_NOLIMBS },
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 10, 100, 0, MS_SILENT, M1_ANIMAL | M1_NOHANDS, M2_HOSTILE |
X M2_NOLIMBS | M2_CARNIVORE },
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 10, 100, 0, MS_SILENT, M1_ANIMAL | M1_NOHANDS, M2_HOSTILE |
X M2_NOLIMBS | M2_CARNIVORE },
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,
X M1_BIG | M1_ANIMAL | M1_NOHANDS | M1_NOPOLY | M1_EGGS,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_NOLIMBS | M2_CARNIVORE },
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,
X M1_BIG | M1_ANIMAL | M1_NOHANDS | M1_EGGS,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_NOLIMBS | M2_CARNIVORE },
X/* xan */
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, M1_VSMALL | M1_FLY | M1_ANIMAL | M1_NOHANDS |
X M1_POIS | M1_POIS_RES, M2_HOSTILE },
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, M1_FLY | M1_NOHANDS, M2_HOSTILE | M2_NOLIMBS },
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, M1_BIG | M1_ANIMAL | M1_HUMANOID,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_HUMANOID,
X M2_STRONG | M2_CARNIVORE },
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, M1_BIG | M1_ANIMAL | M1_HUMANOID,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
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, M1_VSMALL | M1_FLY | M1_ANIMAL | M1_NOHANDS,
X M2_WANDER | M2_CARNIVORE },
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, M1_FLY | M1_ANIMAL | M1_NOHANDS,
X M2_WANDER | M2_HOSTILE | M2_CARNIVORE },
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, M1_VSMALL | M1_FLY | M1_ANIMAL | M1_UNDEAD |
X M1_NOHANDS | M1_POIS | M1_REGEN, M2_HOSTILE },
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, M1_BIG | M1_COLLECT | M1_GREEDY, M2_STRONG },
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, M1_BIG | M1_COLLECT | M1_GREEDY, M2_STRONG },
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, M1_BIG | M1_COLLECT | M1_GREEDY, M2_STRONG },
X/* Dragons */
X { "baby grey 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,
X M1_BIG | M1_FLY | M1_NOHANDS | M1_GREEDY | M1_JEWELS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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,
X M1_BIG | M1_FLY | M1_NOHANDS | M1_GREEDY | M1_JEWELS | M1_FIRE_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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,
X M1_BIG | M1_FLY | M1_NOHANDS | M1_GREEDY | M1_JEWELS | M1_COLD_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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,
X M1_BIG | M1_FLY | M1_NOHANDS | M1_GREEDY | M1_JEWELS | M1_ELEC_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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,
X M1_BIG | M1_FLY | M1_NOHANDS | M1_GREEDY | M1_JEWELS | M1_POIS |
X M1_POIS_RES, M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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,
X M1_BIG | M1_FLY | M1_NOHANDS | M1_GREEDY | M1_JEWELS | M1_SLEE_RES,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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,
X M1_BIG | M1_FLY | M1_NOHANDS | M1_GREEDY | M1_JEWELS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
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,
X M1_BIG | M1_FLY | M1_NOHANDS | M1_GREEDY | M1_JEWELS,
X M2_HOSTILE | M2_STRONG | M2_CARNIVORE | M2_THICK_HIDE },
X { "grey 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, M1_BIG | M1_FLY | M1_NOHANDS | M1_EGGS |
X M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_FLY | M1_NOHANDS | M1_EGGS |
X M1_FIRE_RES | M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_FLY | M1_NOHANDS | M1_EGGS |
X M1_SLEE_RES | M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_FLY | M1_NOHANDS | M1_EGGS |
X M1_COLD_RES | M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_FLY | M1_NOHANDS | M1_EGGS |
X M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_FLY | M1_NOHANDS | M1_EGGS |
X M1_ELEC_RES | M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_FLY | M1_NOHANDS | M1_EGGS |
X M1_POIS | M1_POIS_RES | M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_THICK_HIDE },
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, M1_BIG | M1_FLY | M1_NOHANDS | M1_EGGS |
X M1_POIS | M1_STON_RES | M1_GREEDY | M1_JEWELS | M1_MAGIC,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE | M2_THICK_HIDE },
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 0, 0, 0, MS_SILENT,
X M1_BIG | M1_NOEYES | M1_NOHANDS | M1_POIS_RES | M1_FLY,
X M2_STRONG | M2_NOLIMBS },
X { "fire elemental", S_ELEMENTAL, 8, 12, 2, 30, 0, (G_NOCORPSE | 1),
X { { AT_CLAW, AD_FIRE, 3, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 0, 0, 0, MS_SILENT,
X M1_BIG | M1_NOEYES | M1_NOHANDS | M1_POIS_RES | M1_FLY | M1_FIRE_RES,
X M2_STRONG | M2_NOLIMBS },
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 0, 0, 0, MS_SILENT,
X M1_BIG | M1_WALLWALK | M1_NOEYES | M1_NOHANDS | M1_POIS_RES |
X M1_STON_RES, M2_STRONG | M2_NOLIMBS | M2_THICK_HIDE },
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 0, 0, 0, MS_SILENT,
X M1_BIG | M1_NOEYES | M1_NOHANDS | M1_POIS_RES | M1_SWIM,
X M2_STRONG | M2_NOLIMBS },
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, M1_VSMALL |
X M1_NOEYES | M1_NOHANDS | M1_POIS_RES,
X M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE },
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, M1_VSMALL | M1_NOEYES | M1_NOHANDS |
X M1_POIS_RES | M1_COLD_RES, M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE },
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, M1_VSMALL | M1_NOEYES | M1_NOHANDS |
X M1_POIS | M1_POIS_RES, M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE },
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, M1_VSMALL | M1_NOEYES | M1_NOHANDS |
X M1_POIS | M1_STON_RES, M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE },
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, M1_VSMALL | M1_NOEYES | M1_NOHANDS |
X M1_POIS_RES | M1_FIRE_RES, M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE },
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, M1_HUMANOID | M1_COLLECT, 0 },
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, M1_HUMANOID | M1_COLLECT | M1_LORD, 0 },
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, M1_HUMANOID | M1_COLLECT | M1_PRINCE, 0 },
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, M1_HUMANOID | M1_MAGIC, 0 },
X/* giant Humanoids */
X { "ettin", S_GIANT, 10, 12, 3, 0, 0, (G_GENO | 1),
X { { AT_WEAP, AD_PHYS, 2, 8 }, { AT_WEAP, AD_PHYS, 3, 6 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 30, 300, 0, MS_GRUNT, M1_BIG | M1_ANIMAL | M1_HUMANOID | M1_COLLECT,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE },
X { "giant", S_GIANT, 6, 6, 0, 0, 2, (G_GENO | G_NOGEN | 1),
X { { AT_WEAP, AD_PHYS, 2, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 75, 750, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_COLLECT | M1_JEWELS,
X M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY },
X { "stone giant", S_GIANT, 6, 6, 0, 0, 2, (G_GENO | G_SGROUP | 1),
X { { AT_WEAP, AD_PHYS, 2, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 75, 750, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_COLLECT | M1_JEWELS,
X M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY },
X { "hill giant", S_GIANT, 8, 10, 6, 0, -2, (G_GENO | G_SGROUP | 1),
X { { AT_WEAP, AD_PHYS, 2, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 70, 700, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_COLLECT | M1_JEWELS,
X M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY },
X { "fire giant", S_GIANT, 9, 12, 4, 5, 2, (G_GENO | G_SGROUP | 1),
X { { AT_WEAP, AD_PHYS, 2, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 75, 750, 0, MS_SILENT,
X M1_BIG | M1_HUMANOID | M1_FIRE_RES | M1_COLLECT | M1_JEWELS,
X M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY },
X { "frost giant", S_GIANT, 10, 12, 3, 10, -3, (G_GENO | G_SGROUP | 1),
X { { AT_WEAP, AD_PHYS, 2, 12 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 75, 750, 0, MS_SILENT,
X M1_BIG | M1_HUMANOID | M1_COLD_RES | M1_COLLECT | M1_JEWELS,
X M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY },
X { "titan", S_GIANT, 16, 18, -3, 70, 9, 1,
X { { AT_WEAP, AD_PHYS, 2, 8 }, { AT_MAGC, AD_SPEL, 0, 0 },
X NO_ATTK, NO_ATTK, NO_ATTK },
X 90, 900, 0, MS_SILENT, M1_BIG | M1_FLY | M1_HUMANOID | M1_MAGIC |
X M1_COLLECT, M2_STRONG | M2_ROCKTHROW | M2_NASTY },
X { "minotaur", S_GIANT, 15, 15, 6, 0, 0, (G_GENO | G_NOGEN),
X { { AT_CLAW, AD_PHYS, 3, 10 }, { AT_CLAW, AD_PHYS, 3, 10 },
X AT_BUTT, AD_PHYS, 2, 8, NO_ATTK, NO_ATTK },
X 70, 700, 0, MS_SILENT, M1_BIG | M1_ANIMAL | M1_HUMANOID,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE },
X { "owlbear", S_GIANT, 5, 12, 5, 0, 0, (G_GENO | 3),
X { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 },
X { AT_HUGS, AD_PHYS, 2, 8 }, NO_ATTK, NO_ATTK },
X 70, 700, 0, MS_SILENT, M1_BIG | M1_ANIMAL | M1_HUMANOID,
X M2_HOSTILE | M2_STRONG | M2_NASTY | M2_CARNIVORE },
X/* Invisible stalker */
X { "stalker", S_STALKER, 8, 12, 3, 0, 0, (G_GENO | 3),
X { { AT_CLAW, AD_PHYS, 4, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 40, 400, 0, MS_SILENT,
X M1_BIG | M1_ANIMAL | M1_FLY | M1_SEE_INVIS | M1_STALK,
X M2_WANDER | M2_HOSTILE | M2_STRONG },
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, M1_BIG | M1_NOEYES | M1_NOHANDS |
X M1_POIS_RES | M1_COLD_RES,
X M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE | M2_AMORPHOUS },
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,
X M1_BIG | M1_NOEYES | M1_NOHANDS | M1_POIS | M1_STON_RES,
X M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE | M2_AMORPHOUS },
X { "ochre jelly", S_JELLY, 6, 3, 8, 20, 0, (G_GENO | 2),
X { { AT_ENGL, AD_ACID, 3, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 2, 20, 0, MS_SILENT, M1_BIG | M1_NOEYES | M1_NOHANDS | M1_POIS |
X M1_STON_RES, M2_HOSTILE | M2_OMNIVORE | M2_NOLIMBS | M2_AMORPHOUS },
X/* Kops */
X#ifdef KOPS
X { "Keystone Kop", S_KOP, 1, 6, 7, 10, 9, (G_GENO | G_LGROUP | G_NOGEN),
X { { AT_WEAP, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_ARREST, M1_HUMANOID | M1_COLLECT,
X M2_HUMAN | M2_WANDER | M2_HOSTILE },
X { "Kop Sergeant", S_KOP, 2, 8, 6, 10, 10, (G_GENO | G_SGROUP | G_NOGEN),
X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_ARREST, M1_HUMANOID | M1_COLLECT,
X M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG },
X { "Kop Lieutenant", S_KOP, 3, 10, 5, 20, 11, (G_GENO | G_NOGEN),
X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_ARREST, M1_HUMANOID | M1_COLLECT,
X M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG },
X { "Kop Kaptain", S_KOP, 4, 12, 4, 20, 12, (G_GENO | G_NOGEN),
X { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
X 20, 200, 0, MS_ARREST, M1_HUMANOID | M1_COLLECT,
X M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG },
X#endif
END_OF_FILE
if test 41770 -ne `wc -c <'src/monst.c1'`; then
echo shar: \"'src/monst.c1'\" unpacked with wrong size!
fi
# end of 'src/monst.c1'
fi
if test -f 'src/music.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/music.c'\"
else
echo shar: Extracting \"'src/music.c'\" \(10776 characters\)
sed "s/^X//" >'src/music.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)music.c 3.0 88/10/22
X/* Copyright (c) 1989 by Jean-Christophe Collet */
X/* NetHack may be freely redistributed. See license for details. */
X
X/*
X * This file contains the different functions designed to manipulate the
X * musical instruments and their various effects.
X *
X * Actually the list of instruments / effects is :
X *
X * Flute may calm snakes if player has enough dexterity
X * Magic flute may put monsters to sleep: area of effect depends
X * on player level.
X * Horn Will awaken monsters: area of effect depends on player
X * level. May also scare monsters.
X * Fire horn Acts like a wand of fire.
X * Frost horn Acts like a wand of cold.
X * Bugle Will awaken soldiers (if any): area of effect depends
X * on player level.
X * Harp May calm nymph if player has enough dexterity.
X * Magic harp Charm monsters: area of effect depends on player
X * level.
X * Drum Will awaken monsters like the horn.
X * Drum of earthquake Will initiate an earthquake whose intensity depends
X * on player level. That is, it creates ramdom pits
X * called here chasms.
X */
X
X
X#include "hack.h"
X
X#ifdef MUSIC
X
X/*
X * Wake every monster in range...
X */
X
Xstatic void
Xawaken_monsters(distance)
Xint distance;
X{
X register struct monst *mtmp = fmon;
X
X while(mtmp) {
X if (dist(mtmp->mx, mtmp->my) < distance/3) {
X /* May scare some monsters */
X if (!resist(mtmp, SCROLL_SYM, 0, NOTELL))
X mtmp->mflee = 1;
X } else if (dist(mtmp->mx, mtmp->my) < distance) {
X mtmp->msleep = 0;
X mtmp->mfroz = 0;
X }
X mtmp = mtmp->nmon;
X }
X}
X
X/*
X * Make monsters fall asleep. Note that they may resist the spell.
X */
X
Xstatic void
Xput_monsters_to_sleep(distance)
Xint distance;
X{
X register struct monst *mtmp = fmon;
X
X while(mtmp) {
X if (dist(mtmp->mx, mtmp->my) < distance)
X if(!mtmp->mfroz && !resist(mtmp, WAND_SYM, 0, NOTELL))
X mtmp->mfroz = 1;
X mtmp = mtmp->nmon;
X }
X}
X
X/*
X * Charm snakes in range. Note that the snakes are NOT tamed.
X */
X
Xstatic void
Xcharm_snakes(distance)
Xint distance;
X{
X register struct monst *mtmp = fmon;
X
X while (mtmp) {
X if (mtmp->data->mlet == S_SNAKE && dist(mtmp->mx, mtmp->my) < distance) {
X mtmp->mpeaceful = 1;
X if (cansee(mtmp->mx, mtmp->my))
X pline("%s freezes and sways with the music, then seems quieter.",defmonnam(mtmp));
X }
X mtmp = mtmp->nmon;
X }
X}
X
X/*
X * Calm nymphs in range.
X */
X
Xstatic void
Xcalm_nymphs(distance)
Xint distance;
X{
X register struct monst *mtmp = fmon;
X
X while (mtmp) {
X if (mtmp->data->mlet == S_NYMPH && dist(mtmp->mx, mtmp->my) < distance) {
X mtmp->mpeaceful = 1;
X if (cansee(mtmp->mx, mtmp->my))
X pline("%s listens cheerfully to the music, then seems quieter.",defmonnam(mtmp));
X }
X mtmp = mtmp->nmon;
X }
X}
X
X/* Awake only soldiers of the level. */
X
Xstatic void
Xawaken_soldiers() {
X#ifdef ARMY
X#define IS_SOLDIER(dat) ((int)((dat) - mons) >= PM_UNARMORED_SOLDIER && \
X (int) ((dat) - mons) <= PM_CAPTAIN)
X register struct monst *mtmp = fmon;
X
X while(mtmp) {
X if (IS_SOLDIER(mtmp->data))
X mtmp->mpeaceful = mtmp->msleep = mtmp->mfroz = 0;
X mtmp = mtmp->nmon;
X }
X#endif /* ARMY /**/
X}
X
X/* Charm monsters in range. Note that they may resist the spell. */
X
Xstatic void
Xcharm_monsters(distance)
Xint distance;
X{
X register struct monst *mtmp = fmon;
X
X while(mtmp) {
X if(dist(mtmp->mx, mtmp->my) <= distance)
X if(!resist(mtmp, SCROLL_SYM, 0, NOTELL))
X (void) tamedog(mtmp, (struct obj *) 0);
X mtmp = mtmp->nmon;
X }
X
X}
X
X/* Generate earthquake :-) of desired force.
X * That is: create random chasms (pits).
X */
X
Xstatic void
Xdo_earthquake(force)
Xint force;
X{
X register int x,y;
X struct monst *mtmp;
X struct trap *chasm;
X int start_x, start_y, end_x, end_y;
X
X start_x = u.ux - (force * 2);
X start_y = u.uy - (force * 2);
X end_x = u.ux + (force * 2);
X end_y = u.uy + (force * 2);
X if (start_x < 1) start_x = 1;
X if (start_y < 1) start_y = 1;
X if (end_x >= COLNO) end_x = COLNO - 1;
X if (end_y >= ROWNO) end_y = ROWNO - 1;
X for (x=start_x; x<=end_x; x++)
X for (y=start_y; y<=end_y; y++)
X if (!rn2(14 - force)) {
X switch (levl[x][y].typ) {
X#ifdef FOUNTAINS
X case FOUNTAIN : /* Make the fountain disappear */
X if (cansee(x,y))
X pline("The fountain falls into a chasm.");
X goto do_pit;
X#endif
X#ifdef SINKS
X case SINK :
X if (cansee(x,y))
X pline("The kitchen sink falls into a chasm.");
X goto do_pit;
X#endif
X#ifdef ALTARS
X case ALTAR :
X if (cansee(x,y))
X pline("The altar falls into a chasm.");
X goto do_pit;
X#endif
X#ifdef THRONES
X case THRONE :
X if (cansee(x,y))
X pline("The throne falls into a chasm.");
X /* Falls into next case */
X#endif
X case ROOM :
X case CORR : /* Make a pit */
Xdo_pit: chasm = maketrap(x,y,PIT);
X chasm->tseen = 1;
X
X levl[x][y].doormask = 0;
X
X /* We have to check whether monsters or player
X fall in a chasm... */
X
X if (levl[x][y].mmask) {
X mtmp = m_at(x,y);
X if(!is_flyer(mtmp->data)) {
X mtmp->mtrapped = 1;
X if(cansee(x,y))
X pline("%s falls into a chasm!",
X Monnam(mtmp));
X else if (flags.soundok && humanoid(mtmp->data))
X You("hear a scream!");
X if ((mtmp->mhp -= rnd(6)) <= 0) {
X int saved_conf = u.umconf;
X
X if(!cansee(x,y))
X pline("It has died!");
X else {
X You("destroy %s!",
X mtmp->mtame ?
X a_monnam(mtmp, "poor") :
X mon_nam(mtmp));
X }
X xkilled(mtmp,0);
X u.umconf = saved_conf;
X }
X }
X } else if (x == u.ux && y == u.uy) {
X if (Levitation
X#ifdef POLYSELF
X || is_flyer(uasmon)
X#endif
X ) {
X pline("A chasm opens up under you!");
X You("don't fall in!");
X } else {
X You("fall into a chasm!");
X u.utrap = rn1(6,2);
X u.utraptype = TT_PIT;
X losehp(rnd(6),"fall into a chasm");
X selftouch("Falling, you");
X }
X } else
X newsym(x,y);
X break;
X case DOOR : /* Make the door collapse */
X if (levl[x][y].doormask == D_NODOOR) break;
X if (cansee(x,y))
X pline("The door collapses.");
X levl[x][y].doormask = D_NODOOR;
X if (!levl[x][y].mmask && !(x == u.ux && y == u.uy))
X newsym(x,y);
X break;
X }
X }
X}
X
X/*
X * The player is trying to extract something from his/her instrument.
X */
X
Xstatic int
Xdo_improvisation(instr)
Xstruct obj *instr;
X{
X int damage;
X
X if (Confusion)
X pline("What you produce is quite far from music...");
X else
X You("start playing the %s.", xname(instr));
X switch (instr->otyp) {
X case FLUTE: /* May charm snakes */
X if (rn2(ACURR(A_DEX)) + u.ulevel > 25)
X charm_snakes((int)u.ulevel*3);
X break;
X case MAGIC_FLUTE: /* Make monster fall asleep */
X You("produce soft music.");
X put_monsters_to_sleep((int)u.ulevel*5);
X break;
X case HORN: /* Awaken monsters or scare monsters */
X You("produce a frightful, grave sound.");
X awaken_monsters((int)u.ulevel*30);
X break;
X case FROST_HORN: /* Idem wand of cold */
X case FIRE_HORN: /* Idem wand of fire */
X if (instr->spe > 0) {
X instr->spe--;
X if (!getdir(1)) {
X if (!Blind)
X pline("The %s glows then fades.", xname(instr));
X } else {
X if (!u.dx && !u.dy && !u.dz) {
X if((damage = zapyourself(instr)))
X losehp(damage,"self-inflicted injury");
X makeknown(instr->otyp);
X return(2);
X }
X buzz((instr->otyp == FROST_HORN) ? 3 : 1, rn1(6,6), u.ux, u.uy, u.dx, u.dy);
X makeknown(instr->otyp);
X return(2);
X }
X }
X break;
X case BUGLE: /* Awaken & attract soldiers */
X You("extract a loud noise from the %s.",xname(instr));
X awaken_soldiers();
X break;
X case HARP: /* May calm Nymph */
X if (rn2(ACURR(A_DEX)) + u.ulevel > 25)
X calm_nymphs((int)u.ulevel*3);
X break;
X case MAGIC_HARP: /* Charm monsters */
X if (instr->spe > 0) {
X pline("The %s produces very attractive music.",xname(instr));
X instr->spe--;
X charm_monsters(((int)u.ulevel - 1) / 3 + 1);
X }
X break;
X case DRUM: /* Awaken monsters */
X You("beat a deafening row!");
X awaken_monsters((int)u.ulevel * 40);
X break;
X case DRUM_OF_EARTHQUAKE: /* create several pits */
X if (instr->spe > 0) {
X You("produce a heavy, thunderous rolling!");
X pline("The entire dungeon is shaking around you!");
X do_earthquake(((int)u.ulevel - 1) / 3 + 1);
X instr->spe--;
X makeknown(DRUM_OF_EARTHQUAKE);
X }
X break;
X default:
X impossible("What a weird instrument (%d)!",instr->otyp);
X break;
X }
X return (2); /* That takes time */
X}
X
X/*
X * So you want music...
X */
X
Xint
Xdo_play_instrument(instr)
Xstruct obj *instr;
X{
X#ifdef STRONGHOLD
X char buf[BUFSZ], *s, c = 'y';
X int x,y;
X boolean ok;
X
X if (instr->otyp != DRUM && instr->otyp != DRUM_OF_EARTHQUAKE) {
X pline("Improvise? ");
X c = yn();
X }
X if (c == 'n') {
X pline("What tune are you playing? [what 5 notes] ");
X getlin(buf);
X for(s=buf;*s;s++)
X *s = (*s >='a' && *s<='z') ? 'A' + *s - 'a' : *s;
X You("extract a strange sound from the %s!",xname(instr));
X /* Check if there was the Stronghold drawbridge near
X * and if the tune conforms to what we're waiting for.
X */
X if (dlevel == stronghold_level)
X if (!strcmp(buf,tune)) {
X /* Search for the drawbridge */
X for(y=u.uy-1; y<=u.uy+1; y++)
X for(x=u.ux-1;x<=u.ux+1;x++)
X if (find_drawbridge(&x,&y)) {
X if (levl[x][y].typ == DRAWBRIDGE_DOWN)
X close_drawbridge(x,y);
X else
X open_drawbridge(x,y);
X return 0;
X }
X } else if (flags.soundok) {
X /* Okay, it wasn't the right tune, but perhaps
X * we can give the player some hints like in the
X * Mastermind game */
X ok = FALSE;
X for(y = u.uy-1; y <= u.uy+1 && !ok; y++)
X for(x = u.ux-1; x <= u.ux+1 && !ok; x++)
X if(IS_DRAWBRIDGE(levl[x][y].typ) ||
X is_drawbridge_wall(x,y) >= 0)
X ok = TRUE;
X if (ok) { /* There is a drawbridge near */
X int tumblers, gears;
X boolean matched[5];
X
X tumblers = gears = 0;
X for(x=0; x < 5; x++)
X matched[x] = FALSE;
X
X for(x=0; x < strlen(buf); x++)
X if(x < 5) {
X if(buf[x] == tune[x]) {
X gears++;
X matched[x] = TRUE;
X } else
X for(y=0; y < 5; y++)
X if(!matched[y] &&
X buf[x] == tune[y] &&
X buf[y] != tune[y]) {
X tumblers++;
X matched[y] = TRUE;
X break;
X }
X }
X if(tumblers)
X if(gears)
X You("hear %d tumbler%s click and %d gear%s turn.",
X tumblers, (tumblers > 1 ? "s" : ""),
X gears, (gears > 1 ? "s" : ""));
X else
X You("hear %d tumbler%s click.",
X tumblers, (tumblers > 1 ? "s" : ""));
X else if(gears)
X You("hear %d gear%s turn.",
X gears, (gears > 1 ? "s" : ""));
X }
X }
X return 1;
X } else
X#endif /* STRONGHOLD /**/
X return do_improvisation(instr);
X}
X
X#endif /* MUSIC /**/
END_OF_FILE
if test 10776 -ne `wc -c <'src/music.c'`; then
echo shar: \"'src/music.c'\" unpacked with wrong size!
fi
# end of 'src/music.c'
fi
echo shar: End of archive 5 \(of 38\).
cp /dev/null ark5isdone
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 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 38 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