]> granicus.if.org Git - nethack/commitdiff
monster order rules
authornethack.allison <nethack.allison>
Fri, 17 Dec 2004 01:32:59 +0000 (01:32 +0000)
committernethack.allison <nethack.allison>
Fri, 17 Dec 2004 01:32:59 +0000 (01:32 +0000)
<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 :-)

doc/fixes35.0
include/patchlevel.h
src/monst.c

index ca413c19de0caf8273f3cdf3d8df347529b6ab70..f315ef025799d80cbaba8fa578ae74f7f9994562 100644 (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
 
index 3ab6a90d5ba5e574f4428bc2405e05fbd22ac484..9b888efca66ebd4d039964b419a8136c2a4007af 100644 (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"
index 03356569c782ad022474e1c2b811f5dca9e4592d..904e3d6205fc0a2e3e6b024f7b5744e0fa531b80 100644 (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
  */