OSDN Git Service

update year to 2022
[jnethack/source.git] / src / read.c
index d17e67b..07ebe43 100644 (file)
@@ -1,11 +1,11 @@
-/* NetHack 3.6 read.c  $NHDT-Date: 1515802375 2018/01/13 00:12:55 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.150 $ */
+/* NetHack 3.6 read.c  $NHDT-Date: 1561485713 2019/06/25 18:01:53 $  $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.172 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Robert Patrick Rankin, 2012. */
 /* NetHack may be freely redistributed.  See license for details. */
 
 /* JNetHack Copyright */
 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000  */
-/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2018            */
+/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2022            */
 /* JNetHack may be freely redistributed.  See license for details. */
 
 #include "hack.h"
@@ -24,19 +24,23 @@ static NEARDATA const char readable[] = { ALL_CLASSES, SCROLL_CLASS,
 static const char all_count[] = { ALLOW_COUNT, ALL_CLASSES, 0 };
 
 STATIC_DCL boolean FDECL(learnscrolltyp, (SHORT_P));
-STATIC_DCL char * FDECL(erode_obj_text, (struct obj *, char *));
-STATIC_DCL void NDECL(do_class_genocide);
+STATIC_DCL char *FDECL(erode_obj_text, (struct obj *, char *));
+STATIC_DCL char *FDECL(apron_text, (struct obj *, char *buf));
 STATIC_DCL void FDECL(stripspe, (struct obj *));
 STATIC_DCL void FDECL(p_glow1, (struct obj *));
 STATIC_DCL void FDECL(p_glow2, (struct obj *, const char *));
-STATIC_DCL void FDECL(randomize, (int *, int));
 STATIC_DCL void FDECL(forget_single_object, (int));
+#if 0 /* not used */
+STATIC_DCL void FDECL(forget_objclass, (int));
+#endif
+STATIC_DCL void FDECL(randomize, (int *, int));
 STATIC_DCL void FDECL(forget, (int));
 STATIC_DCL int FDECL(maybe_tame, (struct monst *, struct obj *));
-STATIC_DCL boolean FDECL(is_valid_stinking_cloud_pos, (int, int, BOOLEAN_P));
-STATIC_DCL void FDECL(display_stinking_cloud_positions, (int));
 STATIC_DCL boolean FDECL(get_valid_stinking_cloud_pos, (int, int));
+STATIC_DCL boolean FDECL(is_valid_stinking_cloud_pos, (int, int, BOOLEAN_P));
+STATIC_PTR void FDECL(display_stinking_cloud_positions, (int));
 STATIC_PTR void FDECL(set_lit, (int, int, genericptr));
+STATIC_DCL void NDECL(do_class_genocide);
 
 STATIC_OVL boolean
 learnscrolltyp(scrolltyp)
@@ -61,7 +65,7 @@ struct obj *sobj;
         (void) learnscrolltyp(sobj->otyp);
 }
 
-char *
+STATIC_OVL char *
 erode_obj_text(otmp, buf)
 struct obj *otmp;
 char *buf;
@@ -81,7 +85,7 @@ char *buf;
 {
     static const char *shirt_msgs[] = {
         /* Scott Bigham */
-#if 0 /*JP*/
+#if 0 /*JP:T*/
       "I explored the Dungeons of Doom and all I got was this lousy T-shirt!",
         "Is that Mjollnir in your pocket or are you just happy to see me?",
       "It's not the size of your sword, it's how #enhance'd you are with it.",
@@ -117,7 +121,7 @@ char *buf;
         "\82g\82\85\82\8c\81|\82k\82n\82n\82n\81C\82m\82\95\82\92\82\93\82\85\81I",                     /* Animaniacs */
 #endif
         "=^.^=",
-#if 0 /*JP*/
+#if 0 /*JP:T*/
         "100% goblin hair - do not wash",
         "Aberzombie and Fitch",
         "cK -- Cockatrice touches the Kop",
@@ -154,7 +158,7 @@ char *buf;
         "\8e\84\82Í\83S\83\80\82Ì\96Ø\82É\92µ\82Ë\95Ô\82Á\82½",         /* Monkey Island */
         "\97ª\92D\93\87\97°\89©\8aC\8aÝ\83N\83\89\83u", /* Monkey Island */
 #endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
         "If you can read this, I can hit you with my polearm",
         "I'm confused!",
         "I scored with the princess",
@@ -187,7 +191,7 @@ char *buf;
         "The Hellhound Gang",
         "The Werewolves",
 #endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
         "They Might Be Storm Giants",
         "Weapons don't kill people, I kill people",
         "White Zombie",
@@ -207,14 +211,6 @@ char *buf;
         "Hello, I'm War!",
         "It is better to light a candle than to curse the darkness",
         "It is easier to curse the darkness than to light a candle",
-        /* expanded "rock--paper--scissors" featured in TV show "Big Bang
-           Theory" although they didn't create it (and an actual T-shirt
-           with pentagonal diagram showing which choices defeat which) */
-        "rock--paper--scissors--lizard--Spock!",
-        /* "All men must die -- all men must serve" challange and response
-           from book series _A_Song_of_Ice_and_Fire_ by George R.R. Martin,
-           TV show "Game of Thrones" (probably an actual T-shirt too...) */
-        "/Valar morghulis/ -- /Valar dohaeris/",
 #else
         "\83[\83C\81E\83}\83C\83g\81E\83r\81[\81E\83X\83g\81[\83\80\81E\83W\83\83\83C\83A\83\93\83c",
         "\95\90\8aí\82ª\90l\82ð\8eE\82·\82Ì\82Å\82Í\82È\82¢\81C\8e\84\82ª\90l\82ð\8eE\82·\82Ì\82¾",
@@ -229,42 +225,72 @@ char *buf;
         "\82±\82Ì\82s\83V\83\83\83c\82ð\94\83\82¤\82¨\8bà\82ª\82È\82©\82Á\82½\82Ì\82Å\82±\82ê\82Í\93\90\82ñ\82¾\81I",
         "\83}\83C\83\93\83h\83t\83\8c\83\84\8e\81\82Ë",
         "\8e\84\82Í\83p\83\93\83c\82ð\90ú\82¢\82Ä\82¢\82Ü\82¹\82ñ",
-        "Down with the living!",
+        "\90\8a\88\82ð\82Ô\82Á\89ó\82¹\81I",
         "\83v\83\8a\83\93\94_\89Æ",
         "\83x\83W\83^\83\8a\83A\83\93",
         "\82â\82 \81C\8e\84\82ª\81w\90í\91\88\81x\82¾\81I",
-        "It is better to light a candle than to curse the darkness",
-        "It is easier to curse the darkness than to light a candle",
+        "\88Ã\82¢\82Æ\95s\95½\82ð\8c¾\82¤\82æ\82è\82à\81C\82·\82·\82ñ\82Å\82 \82©\82è\82ð\82Â\82¯\82Ü\82µ\82å\82¤",
+        "\82·\82·\82ñ\82Å\82 \82©\82è\82ð\82Â\82¯\82é\82æ\82è\81C\88Ã\82¢\82Æ\95s\95½\82ð\8c¾\82¤\95û\82ª\8aÈ\92P",
+#endif
         /* expanded "rock--paper--scissors" featured in TV show "Big Bang
            Theory" although they didn't create it (and an actual T-shirt
            with pentagonal diagram showing which choices defeat which) */
+/*JP
         "rock--paper--scissors--lizard--Spock!",
+*/
+        "\8aâ--\8e\86--\83n\83T\83~--\83g\83J\83Q--\83X\83|\83b\83N\81I",
         /* "All men must die -- all men must serve" challange and response
            from book series _A_Song_of_Ice_and_Fire_ by George R.R. Martin,
            TV show "Game of Thrones" (probably an actual T-shirt too...) */
         "/Valar morghulis/ -- /Valar dohaeris/",
-#endif
     };
 
     Strcpy(buf, shirt_msgs[tshirt->o_id % SIZE(shirt_msgs)]);
     return erode_obj_text(tshirt, buf);
 }
 
-char *
+STATIC_OVL char *
 apron_text(apron, buf)
 struct obj *apron;
 char *buf;
 {
     static const char *apron_msgs[] = {
+/*JP
         "Kiss the cook",
+*/
+        "\83R\83b\83N\82É\83L\83X\82¹\82æ",
+/*JP
         "I'm making SCIENCE!",
+*/
+        "\8e\84\82Í*\89È\8aw*\82ð\8ds\82Á\82Ä\82¢\82é\81I",
+/*JP
         "Don't mess with the chef",
+*/
+        "\83V\83F\83t\82É\82Í\8eè\82ð\8fo\82·\82È",
+/*JP
         "Don't make me poison you",
+*/
+        "\82 \82È\82½\82É\93Å\82ð\90·\82ç\82³\82¹\82È\82¢\82Å",
+/*JP
         "Gehennom's Kitchen",
+*/
+        "\83Q\83w\83i\83L\83b\83`\83\93",
+/*JP
         "Rat: The other white meat",
+*/
+        "\83l\83Y\83~: \82à\82¤\88ê\82Â\82Ì\94\92\90g\93÷",
+/*JP
         "If you can't stand the heat, get out of Gehennom!",
+*/
+        "\94M\82É\91Ï\82¦\82ç\82ê\82È\82¢\82È\82ç\81A\83Q\83w\83i\82©\82ç\8fo\82Ä\8ds\82¯\81I",
+/*JP
         "If we weren't meant to eat animals, why are they made out of meat?",
+*/
+        "\82à\82µ\89ä\81X\82ª\93÷\82ð\90H\82×\82é\89^\96½\82Å\82Í\82È\82¢\82Ì\82È\82ç\81C\82È\82º\93®\95¨\82É\82Í\93÷\82ª\82 \82é\82Ì\81H",
+/*JP
         "If you don't like the food, I'll stab you",
+*/
+        "\90H\82×\95¨\82ª\8bC\82É\93ü\82ç\82È\82¢\82È\82ç\81C\8eh\82·\82æ",
     };
 
     Strcpy(buf, apron_msgs[apron->o_id % SIZE(apron_msgs)]);
@@ -349,7 +375,7 @@ doread()
         return 1;
     } else if (scroll->otyp == CREDIT_CARD) {
         static const char *card_msgs[] = {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             "Leprechaun Gold Tru$t - Shamrock Card",
             "Magic Memory Vault Charge Card",
             "Larn National Bank",                /* Larn */
@@ -503,6 +529,7 @@ doread()
         return 0;
     } else if (Blind && (scroll->otyp != SPE_BOOK_OF_THE_DEAD)) {
         const char *what = 0;
+
         if (scroll->oclass == SPBOOK_CLASS)
 /*JP
             what = "mystic runes";
@@ -534,7 +561,7 @@ doread()
            maintained illiterate conduct so far, and this mail
            scroll didn't come from bones, ask for confirmation */
         if (!u.uconduct.literate) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             if (!scroll->spe && yn(
              "Reading mail will violate \"illiterate\" conduct.  Read anyway?"
                                    ) != 'y')
@@ -568,7 +595,7 @@ doread()
                        || (scroll->otyp == SCR_REMOVE_CURSE
                            && scroll->cursed));
         if (Blind)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline(nodisappear
                       ? "You %s the formula on the scroll."
                       : "As you %s the formula on it, the scroll disappears.",
@@ -580,7 +607,7 @@ doread()
                   silently ? "\94O\82¶" : "\8f¥\82¦");
 #endif
         else
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline(nodisappear ? "You read the scroll."
                               : "As you read the scroll, it disappears.");
 #else
@@ -594,7 +621,7 @@ doread()
 */
                 pline("\82Æ\82Ä\82à\82Ö\82ë\82Ö\82ë\82È\82Ì\82Å\81C\82­\82µ\82á\82­\82µ\82á\82É\82µ\82Ä\82µ\82Ü\82Á\82½\81D\81D\81D");
             else
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 pline("Being confused, you %s the magic words...",
                       silently ? "misunderstand" : "mispronounce");
 #else
@@ -650,12 +677,12 @@ p_glow2(otmp, color)
 register struct obj *otmp;
 register const char *color;
 {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
     pline("%s%s%s for a moment.", Yobjnam2(otmp, Blind ? "vibrate" : "glow"),
           Blind ? "" : " ", Blind ? "" : hcolor(color));
 #else
     Your("%s\82Í\88ê\8fu%s%s\81D", xname(otmp),
-         Blind ? "" : jconj_adj(hcolor(color)),
+         Blind ? "" : hcolor_adv(color),
          Blind ? "\90U\93®\82µ\82½" : "\8bP\82¢\82½");
 #endif
 }
@@ -760,7 +787,7 @@ int curse_bless;
 
         /* destruction depends on current state, not adjustment */
         if (obj->spe > rn2(7) || obj->spe <= -5) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline("%s momentarily, then %s!", Yobjnam2(obj, "pulsate"),
                   otense(obj, "explode"));
 #else
@@ -777,7 +804,7 @@ int curse_bless;
         } else {
             long mask = is_on ? (obj == uleft ? LEFT_RING : RIGHT_RING) : 0L;
 
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline("%s spins %sclockwise for a moment.", Yname2(obj),
                   s < 0 ? "counter" : "");
 #else
@@ -868,7 +895,7 @@ int curse_bless;
                 stripspe(obj);
                 if (obj->lamplit) {
                     if (!Blind)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                         pline("%s out!", Tobjnam(obj, "go"));
 #else
                         pline("%s\82Í\8fÁ\82¦\82½\81I", xname(obj));
@@ -1200,7 +1227,7 @@ int x,y;
               || distu(x, y) >= 32));
 }
 
-boolean
+STATIC_OVL boolean
 is_valid_stinking_cloud_pos(x, y, showmsg)
 int x, y;
 boolean showmsg;
@@ -1216,7 +1243,7 @@ boolean showmsg;
     return TRUE;
 }
 
-void
+STATIC_PTR void
 display_stinking_cloud_positions(state)
 int state;
 {
@@ -1286,7 +1313,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
 
         otmp = some_armor(&youmonst);
         if (!otmp) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             strange_feeling(sobj, !Blind
                                       ? "Your skin glows then fades."
                                       : "Your skin feels warm for a moment.");
@@ -1312,7 +1339,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                 Your("%s\82Í\88ê\8fu\92g\82©\82­\82È\82Á\82½\81D", xname(otmp));
             } else {
                 otmp->rknown = TRUE;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 pline("%s covered by a %s %s %s!", Yobjnam2(otmp, "are"),
                       scursed ? "mottled" : "shimmering",
                       hcolor(scursed ? NH_BLACK : NH_GOLDEN),
@@ -1320,7 +1347,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                               : (is_shield(otmp) ? "layer" : "shield"));
 #else
                 Your("%s\82Í%s%s%s\82Å\95¢\82í\82ê\82½\81I", xname(otmp),
-                     jconj_adj(hcolor(scursed ? NH_BLACK : NH_GOLDEN)),
+                     hcolor_adv(scursed ? NH_BLACK : NH_GOLDEN),
                      scursed ? "\8cõ\82é\82Ü\82¾\82ç\82Ì" : "\82ä\82ç\82ß\82­",
                      scursed ? "\8bP\82«"
                              : "\83o\83\8a\83A");
@@ -1328,7 +1355,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
             }
             if (new_erodeproof && (otmp->oeroded || otmp->oeroded2)) {
                 otmp->oeroded = otmp->oeroded2 = 0;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 pline("%s as good as new!",
                       Yobjnam2(otmp, Blind ? "feel" : "look"));
 #else
@@ -1361,7 +1388,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
         s = scursed ? -otmp->spe : otmp->spe;
         if (s > (special_armor ? 5 : 3) && rn2(s)) {
             otmp->in_use = TRUE;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline("%s violently %s%s%s for a while, then %s.", Yname2(otmp),
                   otense(otmp, Blind ? "vibrate" : "glow"),
                   (!Blind && !same_color) ? " " : "",
@@ -1370,7 +1397,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                   otense(otmp, "evaporate"));
 #else
             Your("%s\82Í\82µ\82Î\82ç\82­\82Ì\8aÔ\8c\83\82µ\82­%s%s\81C\8fö\94­\82µ\82½\81D", xname(otmp),
-                 (Blind || same_color) ? "" : jconj_adj(hcolor(scursed ? NH_BLACK : NH_SILVER)),
+                 (Blind || same_color) ? "" : hcolor_adv(scursed ? NH_BLACK : NH_SILVER),
                  Blind ? "\90U\93®\82µ" : "\8bP\82«");
 #endif
             remove_worn_item(otmp, FALSE);
@@ -1404,7 +1431,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                 alter_cost(otmp, 0L); /* shop bill */
             break;
         }
-#if 0 /*JP*/
+#if 0 /*JP:T*/
         pline("%s %s%s%s%s for a %s.", Yname2(otmp),
               s == 0 ? "violently " : "",
               otense(otmp, Blind ? "vibrate" : "glow"),
@@ -1417,7 +1444,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
              (s * s > 1) ? "\82µ\82Î\82ç\82­\82Ì\8aÔ" : "\88ê\8fu",
              s == 0 ? "\8c\83\82µ\82­" : "",
              (Blind || same_color) ? ""
-                                   : jconj_adj(hcolor(sobj->cursed ? NH_BLACK : NH_SILVER)),
+                                   : hcolor_adv(sobj->cursed ? NH_BLACK : NH_SILVER),
              Blind ? "\90U\93®\82µ\82½" : "\8bP\82¢\82½");
 #endif
         /* [this cost handling will need updating if shop pricing is
@@ -1441,7 +1468,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
 
         if ((otmp->spe > (special_armor ? 5 : 3))
             && (special_armor || !rn2(7)))
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline("%s %s.", Yobjnam2(otmp, "suddenly vibrate"),
                   Blind ? "again" : "unexpectedly");
 #else
@@ -1510,24 +1537,24 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
             make_confused(HConfusion + rnd(100), FALSE);
         } else if (confused) {
             if (!sblessed) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 Your("%s begin to %s%s.", makeplural(body_part(HAND)),
                      Blind ? "tingle" : "glow ",
                      Blind ? "" : hcolor(NH_PURPLE));
 #else
                 Your("%s\82Í%s%s\82Í\82\82ß\82½\81D", makeplural(body_part(HAND)),
-                     Blind ? "" : jconj_adj(hcolor(NH_PURPLE)),
+                     Blind ? "" : hcolor_adv(NH_PURPLE),
                      Blind ? "\83q\83\8a\83q\83\8a\82µ" : "\8bP\82«");
 #endif
                 make_confused(HConfusion + rnd(100), FALSE);
             } else {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 pline("A %s%s surrounds your %s.",
                       Blind ? "" : hcolor(NH_RED),
                       Blind ? "faint buzz" : " glow", body_part(HEAD));
 #else
                 pline("%s%s\82ª\82 \82È\82½\82Ì%s\82ð\8eæ\82è\8aª\82¢\82½\81D",
-                      Blind ? "" : jconj_adj(hcolor(NH_RED)),
+                      Blind ? "" : hcolor_adv(NH_RED),
                       Blind ? "\82©\82·\82©\82É\83u\81[\83\93\82Æ\96Â\82é\82à\82Ì" : "\8bP\82­\82à\82Ì",
                       body_part(HEAD));
 #endif
@@ -1535,7 +1562,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
             }
         } else {
             if (!sblessed) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 Your("%s%s %s%s.", makeplural(body_part(HAND)),
                      Blind ? "" : " begin to glow",
                      Blind ? (const char *) "tingle" : hcolor(NH_RED),
@@ -1543,13 +1570,13 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
 #else
                 Your("%s\82Í%s%s%s\81D", makeplural(body_part(HAND)),
                      u.umconf ? "\8f­\82µ" : "",
-                     Blind ? (const char *) "\83q\83\8a\83q\83\8a\82µ\82½" : jconj_adj(hcolor(NH_RED)),
+                     Blind ? (const char *) "\83q\83\8a\83q\83\8a\82µ\82½" : hcolor_adv(NH_RED),
                      Blind ? "" : "\8bP\82«\82Í\82\82ß\82½");
 #endif
                 u.umconf++;
             } else {
                 if (Blind)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                     Your("%s tingle %s sharply.", makeplural(body_part(HAND)),
                          u.umconf ? "even more" : "very");
 #else
@@ -1557,14 +1584,14 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                          u.umconf ? "\8f­\82µ" : "\82Æ\82Ä\82à");
 #endif
                 else
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                     Your("%s glow a%s brilliant %s.",
                          makeplural(body_part(HAND)),
                          u.umconf ? "n even more" : "", hcolor(NH_RED));
 #else
                     Your("%s\82Í%s%s\96¾\82é\82­\8bP\82¢\82½\81D",
                          makeplural(body_part(HAND)),
-                         u.umconf ? "\8f­\82µ" : "", jconj_adj(hcolor(NH_RED)));
+                         u.umconf ? "\8f­\82µ" : "", hcolor_adv(NH_RED));
 #endif
                 /* after a while, repeated uses become less effective */
                 if (u.umconf >= 40)
@@ -1593,12 +1620,13 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
             }
         }
         if (otyp == SCR_SCARE_MONSTER || !ct)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             You_hear("%s %s.", (confused || scursed) ? "sad wailing"
                                                      : "maniacal laughter",
                      !ct ? "in the distance" : "close by");
 #else
-            You_hear("\89\93\82­\82Å%s\82ð\95·\82¢\82½\81D",
+            You_hear("%s\82­\82Å%s\82ð\95·\82¢\82½\81D",
+                     !ct ? "\89\93" : "\8bß",
                      (confused || sobj->cursed) ? "\94ß\82µ\82­\8b\83\82«\8b©\82Ô\90º"
                                                 : "\8b\82Á\82½\82æ\82¤\82É\8fÎ\82¤\90º");
 #endif
@@ -1621,7 +1649,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
     case SPE_REMOVE_CURSE: {
         register struct obj *obj;
 
-#if 0 /*JP*/
+#if 0 /*JP:T*/
         You_feel(!Hallucination
                      ? (!confused ? "like someone is helping you."
                                   : "like you need some help.")
@@ -1647,6 +1675,10 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                 /* gold isn't subject to cursing and blessing */
                 if (obj->oclass == COIN_CLASS)
                     continue;
+                /* hide current scroll from itself so that perm_invent won't
+                   show known blessed scroll losing bknown when confused */
+                if (obj == sobj && obj->quan == 1L)
+                    continue;
                 wornmask = (obj->owornmask & ~(W_BALL | W_ART | W_ARTI));
                 if (wornmask && !sblessed) {
                     /* handle a couple of special cases; we don't
@@ -1737,21 +1769,21 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                 pline("\95\90\8aí\82ª\88ê\8fu\92g\82©\82­\82È\82Á\82½\82æ\82¤\82È\8bC\82ª\82µ\82½\81D");
             } else {
                 uwep->rknown = TRUE;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 pline("%s covered by a %s %s %s!", Yobjnam2(uwep, "are"),
                       scursed ? "mottled" : "shimmering",
                       hcolor(scursed ? NH_PURPLE : NH_GOLDEN),
                       scursed ? "glow" : "shield");
 #else
                 Your("%s\82Í%s%s%s\82Å\95¢\82í\82ê\82½\81I", xname(uwep),
-                     jconj_adj(hcolor(scursed ? NH_PURPLE : NH_GOLDEN)),
+                     hcolor_adv(scursed ? NH_PURPLE : NH_GOLDEN),
                      scursed ? "\8cõ\82é\82Ü\82¾\82ç\82Ì" : "\82ä\82ç\82ß\82­",
                      scursed ? "\8bP\82«" : "\83o\83\8a\83A");
 #endif
             }
             if (new_erodeproof && (uwep->oeroded || uwep->oeroded2)) {
                 uwep->oeroded = uwep->oeroded2 = 0;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 pline("%s as good as new!",
                       Yobjnam2(uwep, Blind ? "feel" : "look"));
 #else
@@ -1802,7 +1834,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                 }
         }
         if (!results) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline("Nothing interesting %s.",
                   !candidates ? "happens" : "seems to happen");
 #else
@@ -1810,7 +1842,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                   !candidates ? "" : "\82æ\82¤\82¾");
 #endif
         } else {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline_The("neighborhood %s %sfriendlier.",
                       vis_results ? "is" : "seems",
                       (results < 0) ? "un" : "");
@@ -1980,7 +2012,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
         /*FALLTHRU*/
     case SPE_MAGIC_MAPPING:
         if (level.flags.nommap) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             Your("%s spins as %s blocks the spell!", body_part(HEAD),
                  something);
 #else
@@ -2089,7 +2121,8 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
                 pline("Where do you want to center the explosion?");
 */
                 pline("\82Ç\82±\82ð\94\9a\94­\82Ì\92\86\90S\82É\82µ\82Ü\82·\82©\81H");
-                getpos_sethilite(display_stinking_cloud_positions, get_valid_stinking_cloud_pos);
+                getpos_sethilite(display_stinking_cloud_positions,
+                                 get_valid_stinking_cloud_pos);
 /*JP
                 (void) getpos(&cc, TRUE, "the desired position");
 */
@@ -2102,9 +2135,9 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
             }
             if (cc.x == u.ux && cc.y == u.uy) {
 /*JP
-            pline_The("scroll erupts in a tower of flame!");
+                pline_The("scroll erupts in a tower of flame!");
 */
-            pline("\8aª\95¨\82©\82ç\89Î\92\8c\82ª\97§\82¿\8f¸\82Á\82½\81I");
+                pline("\8aª\95¨\82©\82ç\89Î\92\8c\82ª\97§\82¿\8f¸\82Á\82½\81I");
                 iflags.last_msg = PLNMSG_TOWER_OF_FLAME; /* for explode() */
                 burn_away_slime();
             }
@@ -2126,7 +2159,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
 */
                 You_hear("\83S\83\8d\83S\83\8d\82Æ\82¢\82¤\89¹\82ð\95·\82¢\82½\81D");
             else
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 pline_The("%s rumbles %s you!", ceiling(u.ux, u.uy),
                           sblessed ? "around" : "above");
 #else
@@ -2180,15 +2213,17 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
 */
             You("\88«\8fL\89_\82Ì\8aª\95¨\82ð\94­\8c©\82µ\82½\81I");
         known = TRUE;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
         pline("Where do you want to center the %scloud?",
               already_known ? "stinking " : "");
 #else
-        pline("\89_\82Ì\92\86\90S\82ð\82Ç\82±\82É\82µ\82Ü\82·\82©\81H");
+        pline("%s\89_\82Ì\92\86\90S\82ð\82Ç\82±\82É\82µ\82Ü\82·\82©\81H",
+              already_known ? "\88«\8fL" : "");
 #endif
         cc.x = u.ux;
         cc.y = u.uy;
-        getpos_sethilite(display_stinking_cloud_positions, get_valid_stinking_cloud_pos);
+        getpos_sethilite(display_stinking_cloud_positions,
+                         get_valid_stinking_cloud_pos);
 /*JP
         if (getpos(&cc, TRUE, "the desired position") < 0) {
 */
@@ -2205,6 +2240,11 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
     default:
         impossible("What weird effect is this? (%u)", otyp);
     }
+    /* if sobj is gone, we've already called useup() above and the
+       update_inventory() that it performs might have come too soon
+       (before charging an item, for instance) */
+    if (!sobj)
+        update_inventory();
     return sobj ? 0 : 1;
 }
 
@@ -2297,7 +2337,7 @@ boolean confused, byu;
             if (mtmp->minvis && !canspotmon(mtmp))
                 map_invisible(mtmp->mx, mtmp->my);
         } else if (u.uswallow && mtmp == u.ustuck)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             You_hear("something hit %s %s over your %s!",
                      s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH),
                      body_part(HEAD));
@@ -2325,7 +2365,7 @@ boolean confused, byu;
                     mdmg = 2;
             } else {
                 if (canspotmon(mtmp))
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                     pline("%s's %s does not protect %s.", Monnam(mtmp),
                           xname(helmet), mhim(mtmp));
 #else
@@ -2335,7 +2375,7 @@ boolean confused, byu;
             }
         }
         mtmp->mhp -= mdmg;
-        if (mtmp->mhp <= 0) {
+        if (DEADMONSTER(mtmp)) {
             if (byu) {
                 killed(mtmp);
             } else {
@@ -2412,7 +2452,7 @@ int chg; /* recharging */
     /* inflict damage and destroy the wand */
     dmg = d(n, k);
     obj->in_use = TRUE; /* in case losehp() is fatal (or --More--^C) */
-#if 0 /*JP*/
+#if 0 /*JP:T*/
     pline("%s %s explodes!", Yname2(obj), expl);
 #else
     pline("%s\82Í%s\94\9a\94­\82µ\82½\81I", xname(obj), expl);
@@ -2501,7 +2541,7 @@ struct obj *obj;
             if (Blind)
                 ; /* no feedback */
             else if (is_animal(u.ustuck->data))
-#if 0 /*JP*/
+#if 0 /*JP:T*/
                 pline("%s %s is lit.", s_suffix(Monnam(u.ustuck)),
                       mbodypart(u.ustuck, STOMACH));
 #else
@@ -2607,7 +2647,7 @@ do_class_genocide()
             (void) mungspaces(buf);
         } while (!*buf);
         /* choosing "none" preserves genocideless conduct */
-#if 0 /*JP*/
+#if 0 /*JP:T*/
         if (*buf == '\033' || !strcmpi(buf, "none")
             || !strcmpi(buf, "nothing"))
 #else
@@ -2903,7 +2943,7 @@ int how;
     if (how & REALLY) {
         /* setting no-corpse affects wishing and random tin generation */
         mvitals[mndx].mvflags |= (G_GENOD | G_NOCORPSE);
-#if 0 /*JP*/
+#if 0 /*JP:T*/
         pline("Wiped out %s%s.", which,
               (*which != 'a') ? buf : makeplural(buf));
 #else
@@ -2976,7 +3016,7 @@ int how;
             /* accumulated 'cnt' doesn't take groups into account;
                assume bringing in new mon(s) didn't remove any old ones */
             cnt = monster_census(FALSE) - census;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
             pline("Sent in %s%s.", (cnt > 1) ? "some " : "",
                   (cnt > 1) ? makeplural(buf) : an(buf));
 #else
@@ -3029,8 +3069,8 @@ struct obj *sobj;
     uball->spe = 1; /* special ball (see save) */
 
     /*
-     *  Place ball & chain if not swallowed.  If swallowed, the ball &
-     *  chain variables will be set at the next call to placebc().
+     *  Place ball & chain if not swallowed.  If swallowed, the ball & chain
+     *  variables will be set at the next call to placebc().
      */
     if (!u.uswallow) {
         placebc();
@@ -3046,12 +3086,14 @@ unpunish()
 {
     struct obj *savechain = uchain;
 
+    /* chain goes away */
     obj_extract_self(uchain);
     newsym(uchain->ox, uchain->oy);
-    setworn((struct obj *) 0, W_CHAIN);
+    setworn((struct obj *) 0, W_CHAIN); /* sets 'uchain' to Null */
     dealloc_obj(savechain);
+    /* ball persists */
     uball->spe = 0;
-    setworn((struct obj *) 0, W_BALL);
+    setworn((struct obj *) 0, W_BALL); /* sets 'uball' to Null */
 }
 
 /* some creatures have special data structures that only make sense in their
@@ -3083,6 +3125,208 @@ struct obj *from_obj;
     return FALSE;
 }
 
+struct _create_particular_data {
+    int which;
+    int fem;
+    char monclass;
+    boolean randmonst;
+    boolean maketame, makepeaceful, makehostile;
+    boolean sleeping, saddled, invisible, hidden;
+};
+
+boolean
+create_particular_parse(str, d)
+char *str;
+struct _create_particular_data *d;
+{
+    char *bufp = str;
+    char *tmpp;
+
+    d->monclass = MAXMCLASSES;
+    d->which = urole.malenum; /* an arbitrary index into mons[] */
+    d->fem = -1; /* gender not specified */
+    d->randmonst = FALSE;
+    d->maketame = d->makepeaceful = d->makehostile = FALSE;
+    d->sleeping = d->saddled = d->invisible = d->hidden = FALSE;
+
+    if ((tmpp = strstri(bufp, "saddled ")) != 0) {
+        d->saddled = TRUE;
+        (void) memset(tmpp, ' ', sizeof "saddled " - 1);
+    }
+    if ((tmpp = strstri(bufp, "sleeping ")) != 0) {
+        d->sleeping = TRUE;
+        (void) memset(tmpp, ' ', sizeof "sleeping " - 1);
+    }
+    if ((tmpp = strstri(bufp, "invisible ")) != 0) {
+        d->invisible = TRUE;
+        (void) memset(tmpp, ' ', sizeof "invisible " - 1);
+    }
+    if ((tmpp = strstri(bufp, "hidden ")) != 0) {
+        d->hidden = TRUE;
+        (void) memset(tmpp, ' ', sizeof "hidden " - 1);
+    }
+    /* check "female" before "male" to avoid false hit mid-word */
+    if ((tmpp = strstri(bufp, "female ")) != 0) {
+        d->fem = 1;
+        (void) memset(tmpp, ' ', sizeof "female " - 1);
+    }
+    if ((tmpp = strstri(bufp, "male ")) != 0) {
+        d->fem = 0;
+        (void) memset(tmpp, ' ', sizeof "male " - 1);
+    }
+    bufp = mungspaces(bufp); /* after potential memset(' ') */
+    /* allow the initial disposition to be specified */
+#if 0 /*JP:T*/
+    if (!strncmpi(bufp, "tame ", 5)) {
+        bufp += 5;
+#else
+    if (!STRNCMP2(bufp, "\8eè\82È\82¸\82¯\82ç\82ê\82½")) {
+        bufp += 14;
+#endif
+        d->maketame = TRUE;
+#if 0 /*JP:T*/
+    } else if (!strncmpi(bufp, "peaceful ", 9)) {
+        bufp += 9;
+#else
+    } else if (!STRNCMP2(bufp, "\97F\8dD\93I\82È")) {
+        bufp += 8;
+#endif
+        d->makepeaceful = TRUE;
+#if 0 /*JP:T*/
+    } else if (!strncmpi(bufp, "hostile ", 8)) {
+        bufp += 8;
+#else
+    } else if (!STRNCMP2(bufp, "\93G\91Î\93I\82È")) {
+        bufp += 8;
+#endif
+        d->makehostile = TRUE;
+    }
+    /* decide whether a valid monster was chosen */
+/*JP
+    if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "random"))) {
+*/
+    if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "\83\89\83\93\83_\83\80"))) {
+        d->randmonst = TRUE;
+        return TRUE;
+    }
+    d->which = name_to_mon(bufp);
+    if (d->which >= LOW_PM)
+        return TRUE; /* got one */
+    d->monclass = name_to_monclass(bufp, &d->which);
+
+    if (d->which >= LOW_PM) {
+        d->monclass = MAXMCLASSES; /* matters below */
+        return TRUE;
+    } else if (d->monclass == S_invisible) { /* not an actual monster class */
+        d->which = PM_STALKER;
+        d->monclass = MAXMCLASSES;
+        return TRUE;
+    } else if (d->monclass == S_WORM_TAIL) { /* empty monster class */
+        d->which = PM_LONG_WORM;
+        d->monclass = MAXMCLASSES;
+        return TRUE;
+    } else if (d->monclass > 0) {
+        d->which = urole.malenum; /* reset from NON_PM */
+        return TRUE;
+    }
+    return FALSE;
+}
+
+boolean
+create_particular_creation(d)
+struct _create_particular_data *d;
+{
+    struct permonst *whichpm = NULL;
+    int i, mx, my, firstchoice = NON_PM;
+    struct monst *mtmp;
+    boolean madeany = FALSE;
+
+    if (!d->randmonst) {
+        firstchoice = d->which;
+        if (cant_revive(&d->which, FALSE, (struct obj *) 0)
+            && firstchoice != PM_LONG_WORM_TAIL) {
+            /* wizard mode can override handling of special monsters */
+            char buf[BUFSZ];
+
+#if 0 /*JP:T*/
+            Sprintf(buf, "Creating %s instead; force %s?",
+                    mons[d->which].mname, mons[firstchoice].mname);
+#else
+            Sprintf(buf, "\91ã\82í\82è\82É%s\82ª\8dì\82ç\82ê\82Ü\82·\81G%s\82É\82·\82é\81H",
+                    mons[d->which].mname, mons[firstchoice].mname);
+#endif
+            if (yn(buf) == 'y')
+                d->which = firstchoice;
+        }
+        whichpm = &mons[d->which];
+    }
+    for (i = 0; i <= multi; i++) {
+        if (d->monclass != MAXMCLASSES)
+            whichpm = mkclass(d->monclass, 0);
+        else if (d->randmonst)
+            whichpm = rndmonst();
+        mtmp = makemon(whichpm, u.ux, u.uy, NO_MM_FLAGS);
+        if (!mtmp) {
+            /* quit trying if creation failed and is going to repeat */
+            if (d->monclass == MAXMCLASSES && !d->randmonst)
+                break;
+            /* otherwise try again */
+            continue;
+        }
+        mx = mtmp->mx, my = mtmp->my;
+        /* 'is_FOO()' ought to be called 'always_FOO()' */
+        if (d->fem != -1 && !is_male(mtmp->data) && !is_female(mtmp->data))
+            mtmp->female = d->fem; /* ignored for is_neuter() */
+        if (d->maketame) {
+            (void) tamedog(mtmp, (struct obj *) 0);
+        } else if (d->makepeaceful || d->makehostile) {
+            mtmp->mtame = 0; /* sanity precaution */
+            mtmp->mpeaceful = d->makepeaceful ? 1 : 0;
+            set_malign(mtmp);
+        }
+        if (d->saddled && can_saddle(mtmp) && !which_armor(mtmp, W_SADDLE)) {
+            struct obj *otmp = mksobj(SADDLE, TRUE, FALSE);
+
+            put_saddle_on_mon(otmp, mtmp);
+        }
+        if (d->invisible) {
+            mon_set_minvis(mtmp);
+            if (does_block(mx, my, &levl[mx][my]))
+                block_point(mx, my);
+            else
+                unblock_point(mx, my);
+        }
+       if (d->hidden
+           && ((is_hider(mtmp->data) && mtmp->data->mlet != S_MIMIC)
+               || (hides_under(mtmp->data) && OBJ_AT(mx, my))
+               || (mtmp->data->mlet == S_EEL && is_pool(mx, my))))
+            mtmp->mundetected = 1;
+        if (d->sleeping)
+            mtmp->msleeping = 1;
+        /* iff asking for 'hidden', show locaton of every created monster
+           that can't be seen--whether that's due to successfully hiding
+           or vision issues (line-of-sight, invisibility, blindness) */
+        if (d->hidden && !canspotmon(mtmp)) {
+            int count = couldsee(mx, my) ? 8 : 4;
+            char saveviz = viz_array[my][mx];
+
+            if (!flags.sparkle)
+                count /= 2;
+            viz_array[my][mx] |= (IN_SIGHT | COULD_SEE);
+            flash_glyph_at(mx, my, mon_to_glyph(mtmp, newsym_rn2), count);
+            viz_array[my][mx] = saveviz;
+            newsym(mx, my);
+        }
+        madeany = TRUE;
+        /* in case we got a doppelganger instead of what was asked
+           for, make it start out looking like what was asked for */
+        if (mtmp->cham != NON_PM && firstchoice != NON_PM
+            && mtmp->cham != firstchoice)
+            (void) newcham(mtmp, &mons[firstchoice], FALSE, FALSE);
+    }
+    return madeany;
+}
+
 /*
  * Make a new monster with the type controlled by the user.
  *
@@ -3098,23 +3342,11 @@ struct obj *from_obj;
 boolean
 create_particular()
 {
-    char buf[BUFSZ] = DUMMY, *bufp, monclass;
-    char *tmpp;
-    int which, tryct, i, firstchoice = NON_PM;
-    struct permonst *whichpm = NULL;
-    struct monst *mtmp;
-    boolean madeany = FALSE, randmonst = FALSE,
-        maketame, makepeaceful, makehostile, saddled, invisible,
-        sleeping;
-    int fem;
+    char buf[BUFSZ] = DUMMY, *bufp;
+    int  tryct = 5;
+    struct _create_particular_data d;
 
-    tryct = 5;
     do {
-        monclass = MAXMCLASSES;
-        which = urole.malenum; /* an arbitrary index into mons[] */
-        maketame = makepeaceful = makehostile = FALSE;
-        sleeping = saddled = invisible = FALSE;
-        fem = -1; /* gender not specified */
 /*JP
         getlin("Create what kind of monster? [type the name or symbol]", buf);
 */
@@ -3122,73 +3354,10 @@ create_particular()
         bufp = mungspaces(buf);
         if (*bufp == '\033')
             return FALSE;
-        if ((tmpp = strstri(bufp, "saddled ")) != 0) {
-            saddled = TRUE;
-            (void) memset(tmpp, ' ', sizeof "saddled " - 1);
-        }
-        if ((tmpp = strstri(bufp, "sleeping ")) != 0) {
-            sleeping = TRUE;
-            (void) memset(tmpp, ' ', sizeof "sleeping " - 1);
-        }
-        if ((tmpp = strstri(bufp, "invisible ")) != 0) {
-            invisible = TRUE;
-            (void) memset(tmpp, ' ', sizeof "invisible " - 1);
-        }
-        /* check "female" before "male" to avoid false hit mid-word */
-        if ((tmpp = strstri(bufp, "female ")) != 0) {
-            fem = 1;
-            (void) memset(tmpp, ' ', sizeof "female " - 1);
-        }
-        if ((tmpp = strstri(bufp, "male ")) != 0) {
-            fem = 0;
-            (void) memset(tmpp, ' ', sizeof "male " - 1);
-        }
-        bufp = mungspaces(bufp); /* after potential memset(' ') */
-        /* allow the initial disposition to be specified */
-#if 0 /*JP*/
-        if (!strncmpi(bufp, "tame ", 5)) {
-            bufp += 5;
-#else
-        if (!strncmpi(bufp, "\8eè\82È\82¸\82¯\82ç\82ê\82½", 14)) {
-            bufp += 14;
-#endif
-            maketame = TRUE;
-#if 0 /*JP*/
-        } else if (!strncmpi(bufp, "peaceful ", 9)) {
-            bufp += 9;
-#else
-        } else if (!strncmpi(bufp, "\97F\8dD\93I\82È", 8)) {
-            bufp += 8;
-#endif
-            makepeaceful = TRUE;
-#if 0 /*JP*/
-        } else if (!strncmpi(bufp, "hostile ", 8)) {
-            bufp += 8;
-#else
-        } else if (!strncmpi(bufp, "\93G\91Î\93I\82È", 8)) {
-            bufp += 8;
-#endif
-            makehostile = TRUE;
-        }
-        /* decide whether a valid monster was chosen */
-/*JP
-        if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "random"))) {
-*/
-        if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "\83\89\83\93\83_\83\80"))) {
-            randmonst = TRUE;
-            break;
-        }
-        which = name_to_mon(bufp);
-        if (which >= LOW_PM)
-            break; /* got one */
-        monclass = name_to_monclass(bufp, &which);
-        if (which >= LOW_PM) {
-            monclass = MAXMCLASSES; /* matters below */
-            break;
-        } else if (monclass > 0) {
-            which = urole.malenum; /* reset from NON_PM */
+
+        if (create_particular_parse(bufp, &d))
             break;
-        }
+
         /* no good; try again... */
 /*JP
         pline("I've never heard of such monsters.");
@@ -3196,66 +3365,12 @@ create_particular()
         pline("\82»\82Ì\82æ\82¤\82È\89ö\95¨\82Í\95·\82¢\82½\82±\82Æ\82ª\82È\82¢\81D");
     } while (--tryct > 0);
 
-    if (!tryct) {
+    if (!tryct)
         pline1(thats_enough_tries);
-    } else {
-        if (!randmonst) {
-            firstchoice = which;
-            if (cant_revive(&which, FALSE, (struct obj *) 0)) {
-                /* wizard mode can override handling of special monsters */
-#if 0 /*JP*/
-                Sprintf(buf, "Creating %s instead; force %s?",
-                        mons[which].mname, mons[firstchoice].mname);
-#else
-                Sprintf(buf, "\91ã\82í\82è\82É%s\82ª\8dì\82ç\82ê\82Ü\82·\81G%s\82É\82·\82é\81H",
-                        mons[which].mname, mons[firstchoice].mname);
-#endif
-                if (yn(buf) == 'y')
-                    which = firstchoice;
-            }
-            whichpm = &mons[which];
-        }
-        for (i = 0; i <= multi; i++) {
-            if (monclass != MAXMCLASSES)
-                whichpm = mkclass(monclass, 0);
-            else if (randmonst)
-                whichpm = rndmonst();
-            mtmp = makemon(whichpm, u.ux, u.uy, NO_MM_FLAGS);
-            if (!mtmp) {
-                /* quit trying if creation failed and is going to repeat */
-                if (monclass == MAXMCLASSES && !randmonst)
-                    break;
-                /* otherwise try again */
-                continue;
-            }
-            /* 'is_FOO()' ought to be called 'always_FOO()' */
-            if (fem != -1 && !is_male(mtmp->data) && !is_female(mtmp->data))
-                mtmp->female = fem; /* ignored for is_neuter() */
-            if (maketame) {
-                (void) tamedog(mtmp, (struct obj *) 0);
-            } else if (makepeaceful || makehostile) {
-                mtmp->mtame = 0; /* sanity precaution */
-                mtmp->mpeaceful = makepeaceful ? 1 : 0;
-                set_malign(mtmp);
-            }
-            if (saddled && can_saddle(mtmp) && !which_armor(mtmp, W_SADDLE)) {
-                struct obj *otmp = mksobj(SADDLE, TRUE, FALSE);
+    else
+        return create_particular_creation(&d);
 
-                put_saddle_on_mon(otmp, mtmp);
-            }
-            if (invisible)
-                mon_set_minvis(mtmp);
-            if (sleeping)
-                mtmp->msleeping = 1;
-            madeany = TRUE;
-            /* in case we got a doppelganger instead of what was asked
-               for, make it start out looking like what was asked for */
-            if (mtmp->cham != NON_PM && firstchoice != NON_PM
-                && mtmp->cham != firstchoice)
-                (void) newcham(mtmp, &mons[firstchoice], FALSE, FALSE);
-        }
-    }
-    return madeany;
+    return FALSE;
 }
 
 /*read.c*/