monster order rules

<Someone> wrote:
> From the mkclass() comments:
>
> /*      Assumption #2:  monsters of a given class are presented in ascending
> *                      order of strength.
> */
>
> And monst.c:
>
>  *      Rule #2:        monsters of a given class are presented in ascending
>  *                      order of strength.
>
>  *      Rule #4:        monster subclasses (e.g. giants) should be kept
>  *                      together, unless it violates Rule 2.  NOGEN monsters
>  *                      won't violate Rule 2.
>
> Inspecting my monster-difficulty spoiler, I see the following places
> that these precepts are violated: do they cause potential problems?
> (Insofar as occasionally incorrectly miscalculating the probabilities
> for monster generation is a "problem", that is...)
>
> SPECIES                DIF
> ~~~~~~~~~~~~~~~~~~~~~~ ~~~
> d                  dog   5
> d            large dog   7
> d                dingo   5
>
> d                 warg   8
> d      winter wolf cub   7
> d          winter wolf   9
>
> u        white unicorn   6
> u         gray unicorn   6
> u        black unicorn   6
> u                 pony   4
>
> H          frost giant  13
> H          storm giant  19
> H                ettin  13
>
> P        black pudding  12
> P          green slime   8
>
> S            pit viper   9
> S               python   8
> S                cobra  10
>
> Z         giant zombie   9
> Z                ghoul   5
>
> @                nurse  13
> @              soldier   8
> @             sergeant  10
>
> &         horned devil   9
> &             succubus   8
>
> &               balrog  20
> &            sandestin  15
>
> (I've just realised that these may have already been fixed, and
> waiting on a file-compatibility-breaking release; if so, ignore me :-)
This commit is contained in:
nethack.allison
2004-12-17 01:32:59 +00:00
parent 0843550e37
commit 1c326a95e1
3 changed files with 80 additions and 79 deletions

View File

@@ -136,4 +136,5 @@ move all flags that are system or port specific from flag struct to sysflags
struct which is used only if SYSFLAGS is defined
all fields in flags struct are unconditionally present
monst cham field now a short and uses mons[] index
rearrange some monster ordering to follow rule #2 listed at top of monst.c

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)patchlevel.h 3.4 2004/12/15 */
/* SCCS Id: @(#)patchlevel.h 3.4 2004/12/16 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -13,7 +13,7 @@
* Incrementing EDITLEVEL can be used to force invalidation of old bones
* and save files.
*/
#define EDITLEVEL 15
#define EDITLEVEL 16
#define COPYRIGHT_BANNER_A \
"NetHack, Copyright 1985-2004"

View File

@@ -231,6 +231,13 @@ NEARDATA struct permonst mons[] = {
SIZ(150, 150, 0, MS_BARK, MZ_SMALL), 0, 0,
M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE,
HI_DOMESTIC),
MON("dingo", S_DOG,
LVL(4, 16, 5, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_PHYS, 1 ,6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(400, 200, 0, MS_BARK, MZ_MEDIUM), 0, 0,
M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
CLR_YELLOW),
MON("dog", S_DOG,
LVL(4, 16, 5, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_PHYS, 1 ,6),
@@ -245,13 +252,6 @@ NEARDATA struct permonst mons[] = {
SIZ(800, 250, 0, MS_BARK, MZ_MEDIUM), 0, 0,
M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,
M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC),
MON("dingo", S_DOG,
LVL(4, 16, 5, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_PHYS, 1 ,6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(400, 200, 0, MS_BARK, MZ_MEDIUM), 0, 0,
M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
CLR_YELLOW),
MON("wolf", S_DOG,
LVL(5, 12, 4, 0, 0), (G_GENO|G_SGROUP|2),
A(ATTK(AT_BITE, AD_PHYS, 2, 4),
@@ -266,6 +266,12 @@ NEARDATA struct permonst mons[] = {
SIZ(500, 250, 0, MS_BARK, MZ_MEDIUM), MR_POISON, 0,
M1_NOHANDS|M1_POIS|M1_REGEN|M1_CARNIVORE,
M2_NOPOLY|M2_WERE|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN),
MON("winter wolf cub", S_DOG,
LVL(5, 12, 4, 0, -5), (G_NOHELL|G_GENO|G_SGROUP|2),
A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(250, 200, 0, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD,
M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_CYAN),
MON("warg", S_DOG,
LVL(7, 12, 4, 0, -5), (G_GENO|G_SGROUP|2),
A(ATTK(AT_BITE, AD_PHYS, 2, 6),
@@ -273,12 +279,6 @@ NEARDATA struct permonst mons[] = {
SIZ(850, 350, 0, MS_BARK, MZ_MEDIUM), 0, 0,
M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
CLR_BROWN),
MON("winter wolf cub", S_DOG,
LVL(5, 12, 4, 0, -5), (G_NOHELL|G_GENO|G_SGROUP|2),
A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(250, 200, 0, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD,
M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_CYAN),
MON("winter wolf", S_DOG,
LVL(7, 12, 4, 20, 0), (G_NOHELL|G_GENO|1),
A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_COLD, 2, 6),
@@ -890,6 +890,13 @@ NEARDATA struct permonst mons[] = {
/*
* unicorns and horses
*/
MON("pony", S_UNICORN,
LVL(3, 16, 6, 0, 0), (G_GENO|2),
A(ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 2),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1300, 250, 0, MS_NEIGH, MZ_MEDIUM), 0, 0,
M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC,
M3_INFRAVISIBLE, CLR_BROWN),
MON("white unicorn", S_UNICORN,
LVL(4, 24, 2, 70, 7), (G_GENO|2),
A(ATTK(AT_BUTT, AD_PHYS, 1,12), ATTK(AT_KICK, AD_PHYS, 1, 6),
@@ -911,13 +918,6 @@ NEARDATA struct permonst mons[] = {
SIZ(1300, 300, 0, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON,
M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_JEWELS,
M3_INFRAVISIBLE, CLR_BLACK),
MON("pony", S_UNICORN,
LVL(3, 16, 6, 0, 0), (G_GENO|2),
A(ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 2),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1300, 250, 0, MS_NEIGH, MZ_MEDIUM), 0, 0,
M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC,
M3_INFRAVISIBLE, CLR_BROWN),
MON("horse", S_UNICORN,
LVL(5, 20, 5, 0, 0), (G_GENO|2),
A(ATTK(AT_KICK, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 3),
@@ -1538,14 +1538,6 @@ struct permonst _mons2[] = {
M1_HUMANOID|M1_CARNIVORE,
M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS,
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_WHITE),
MON("storm giant", S_GIANT,
LVL(16, 12, 3, 10, -3), (G_GENO|G_SGROUP|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 12),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(2250, 750, 0, MS_BOAST, MZ_HUGE), MR_ELEC, MR_ELEC,
M1_HUMANOID|M1_CARNIVORE,
M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS,
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE),
MON("ettin", S_GIANT,
LVL(10, 12, 3, 0, 0), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6),
@@ -1554,6 +1546,14 @@ struct permonst _mons2[] = {
M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE,
M2_HOSTILE|M2_STRONG|M2_NASTY|M2_COLLECT,
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BROWN),
MON("storm giant", S_GIANT,
LVL(16, 12, 3, 10, -3), (G_GENO|G_SGROUP|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 12),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(2250, 750, 0, MS_BOAST, MZ_HUGE), MR_ELEC, MR_ELEC,
M1_HUMANOID|M1_CARNIVORE,
M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS,
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE),
MON("titan", S_GIANT,
LVL(16, 18, -3, 70, 9), (1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0),
@@ -1836,15 +1836,6 @@ struct permonst _mons2[] = {
M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|
M1_MINDLESS|M1_OMNIVORE|M1_ACID,
M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN),
MON("black pudding", S_PUDDING,
LVL(10, 6, 6, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(900, 250, 0, MS_SILENT, MZ_LARGE),
MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_COLD|MR_ELEC|MR_POISON,
M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|
M1_MINDLESS|M1_OMNIVORE|M1_ACID,
M2_HOSTILE|M2_NEUTER, 0, CLR_BLACK),
MON("green slime", S_PUDDING,
LVL(6, 6, 6, 0, 0), (G_HELL|G_GENO|1),
A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0),
@@ -1854,6 +1845,15 @@ struct permonst _mons2[] = {
M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|
M1_MINDLESS|M1_OMNIVORE|M1_ACID|M1_POIS,
M2_HOSTILE|M2_NEUTER, 0, CLR_GREEN),
MON("black pudding", S_PUDDING,
LVL(10, 6, 6, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(900, 250, 0, MS_SILENT, MZ_LARGE),
MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_COLD|MR_ELEC|MR_POISON,
M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|
M1_MINDLESS|M1_OMNIVORE|M1_ACID,
M2_HOSTILE|M2_NEUTER, 0, CLR_BLACK),
/*
* Quantum mechanics
*/
@@ -1908,15 +1908,6 @@ struct permonst _mons2[] = {
M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS|
M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE,
M2_HOSTILE, 0, CLR_RED),
MON("pit viper", S_SNAKE,
LVL(6, 15, 2, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_DRST, 1, 4), ATTK(AT_BITE, AD_DRST, 1, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(100, 60, 0, MS_HISS, MZ_MEDIUM),
MR_POISON, MR_POISON,
M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS|
M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE,
M2_HOSTILE, M3_INFRAVISION, CLR_BLUE),
MON("python", S_SNAKE,
LVL(6, 3, 5, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_PHYS, 0, 0),
@@ -1926,6 +1917,15 @@ struct permonst _mons2[] = {
M1_SWIM|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|
M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE,
M2_HOSTILE|M2_STRONG, M3_INFRAVISION, CLR_MAGENTA),
MON("pit viper", S_SNAKE,
LVL(6, 15, 2, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_DRST, 1, 4), ATTK(AT_BITE, AD_DRST, 1, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(100, 60, 0, MS_HISS, MZ_MEDIUM),
MR_POISON, MR_POISON,
M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS|
M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE,
M2_HOSTILE, M3_INFRAVISION, CLR_BLUE),
MON("cobra", S_SNAKE,
LVL(6, 18, 2, 0, 0), (G_GENO|1),
A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_SPIT, AD_BLND, 0, 0),
@@ -2163,6 +2163,14 @@ struct permonst _mons2[] = {
MR_COLD|MR_SLEEP|MR_POISON, 0,
M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID,
M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_STRONG, M3_INFRAVISION, CLR_BLUE),
MON("ghoul", S_ZOMBIE,
LVL(3, 6, 10, 0, -2), (G_GENO|G_NOCORPSE|1),
A(ATTK(AT_CLAW, AD_PLYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 3),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(400, 50, 0, MS_SILENT, MZ_SMALL),
MR_COLD|MR_SLEEP|MR_POISON, 0,
M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS,
M2_UNDEAD|M2_WANDER|M2_HOSTILE, M3_INFRAVISION, CLR_BLACK),
MON("giant zombie", S_ZOMBIE,
LVL(8, 8, 6, 0, -4), (G_GENO|G_NOCORPSE|1),
A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8),
@@ -2172,14 +2180,6 @@ struct permonst _mons2[] = {
M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID,
M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_GIANT|M2_STRONG, M3_INFRAVISION,
CLR_CYAN),
MON("ghoul", S_ZOMBIE,
LVL(3, 6, 10, 0, -2), (G_GENO|G_NOCORPSE|1),
A(ATTK(AT_CLAW, AD_PLYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 3),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(400, 50, 0, MS_SILENT, MZ_SMALL),
MR_COLD|MR_SLEEP|MR_POISON, 0,
M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS,
M2_UNDEAD|M2_WANDER|M2_HOSTILE, M3_INFRAVISION, CLR_BLACK),
MON("skeleton", S_ZOMBIE,
LVL(12, 8, 4, 0, 0), (G_NOCORPSE|G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6),
@@ -2360,13 +2360,6 @@ struct permonst _mons2[] = {
M1_HUMANOID|M1_OMNIVORE,
M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_COLLECT|M2_SHAPESHIFTER,
M3_INFRAVISIBLE, HI_DOMESTIC),
MON("nurse", S_HUMAN,
LVL(11, 6, 0, 0, 0), (G_GENO|3),
A(ATTK(AT_CLAW, AD_HEAL, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_NURSE, MZ_HUMAN), MR_POISON, MR_POISON,
M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_HOSTILE,
M3_INFRAVISIBLE, HI_DOMESTIC),
MON("shopkeeper", S_HUMAN,
LVL(12, 18, 0, 50, 0), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
@@ -2432,6 +2425,13 @@ struct permonst _mons2[] = {
M1_HUMANOID|M1_OMNIVORE,
M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_HOSTILE|M2_STRONG|M2_COLLECT,
M3_INFRAVISIBLE, CLR_RED),
MON("nurse", S_HUMAN,
LVL(11, 6, 0, 0, 0), (G_GENO|3),
A(ATTK(AT_CLAW, AD_HEAL, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_NURSE, MZ_HUMAN), MR_POISON, MR_POISON,
M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_HOSTILE,
M3_INFRAVISIBLE, HI_DOMESTIC),
MON("lieutenant", S_HUMAN,
LVL(10, 10, 10, 15, -4), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4),
@@ -2543,15 +2543,6 @@ struct permonst _mons2[] = {
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE),
/* standard demons & devils
*/
MON("horned devil", S_DEMON,
LVL(6, 9, -5, 50, 11), (G_HELL|G_NOCORPSE|2),
A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
ATTK(AT_BITE, AD_PHYS, 2, 3), ATTK(AT_STNG, AD_PHYS, 1, 3),
NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
M1_POIS|M1_THICK_HIDE,
M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION,
CLR_BROWN),
#ifdef SEDUCE
# define SEDUCTION_ATTACKS \
A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
@@ -2568,6 +2559,15 @@ struct permonst _mons2[] = {
M1_HUMANOID|M1_FLY|M1_POIS,
M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_FEMALE,
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GRAY),
MON("horned devil", S_DEMON,
LVL(6, 9, -5, 50, 11), (G_HELL|G_NOCORPSE|2),
A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
ATTK(AT_BITE, AD_PHYS, 2, 3), ATTK(AT_STNG, AD_PHYS, 1, 3),
NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
M1_POIS|M1_THICK_HIDE,
M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION,
CLR_BROWN),
MON("incubus", S_DEMON,
LVL(6, 12, 0, 70, -9), (G_NOCORPSE|1),
SEDUCTION_ATTACKS,
@@ -2650,6 +2650,13 @@ struct permonst _mons2[] = {
M1_SEE_INVIS|M1_POIS,
M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_COLLECT,
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED),
MON("sandestin", S_DEMON,
LVL(13, 12, 4, 60, -5), (G_HELL|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1500, 400, 0, MS_CUSS, MZ_HUMAN), MR_STONE, 0,
M1_HUMANOID, M2_NOPOLY|M2_STALK|M2_STRONG|M2_COLLECT|M2_SHAPESHIFTER,
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GRAY),
MON("balrog", S_DEMON,
LVL(16, 5, -2, 75, -14), (G_HELL|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6),
@@ -2787,13 +2794,6 @@ struct permonst _mons2[] = {
SIZ(1500, 400, 0, MS_DJINNI, MZ_HUMAN), MR_POISON|MR_STONE, 0,
M1_HUMANOID|M1_FLY|M1_POIS,
M2_NOPOLY|M2_STALK|M2_COLLECT, M3_INFRAVISIBLE, CLR_YELLOW),
MON("sandestin", S_DEMON,
LVL(13, 12, 4, 60, -5), (G_HELL|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1500, 400, 0, MS_CUSS, MZ_HUMAN), MR_STONE, 0,
M1_HUMANOID, M2_NOPOLY|M2_STALK|M2_STRONG|M2_COLLECT|M2_SHAPESHIFTER,
M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GRAY),
/*
* sea monsters
*/