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