]> granicus.if.org Git - nethack/commitdiff
Fix wizmakemap to consider monster birth counts and uniques
authorPasi Kallinen <paxed@alt.org>
Sat, 7 Mar 2020 19:33:31 +0000 (21:33 +0200)
committerPasi Kallinen <paxed@alt.org>
Sat, 7 Mar 2020 19:35:26 +0000 (21:35 +0200)
Also add a new wizmode command #wizborn to show those.

dat/wizhelp
doc/Guidebook.mn
doc/Guidebook.tex
doc/fixes37.0
include/extern.h
src/cmd.c
src/insight.c

index 519ca1687bbe27acde39a7fec232659fa8c8fd51..bc8a4715c97ea23677c180a4138c9cbb074313f9 100644 (file)
@@ -19,6 +19,7 @@ Debug-Mode Quick Reference:
 #timeout        == look at timeout queue and hero's timed intrinsics
 #vanquished     == disclose counts of dead monsters sorted in various ways
 #vision         == show vision array
+#wizborn        == show monster birth/death/geno/extinct stats
 #wizintrinsic   == set selected intrinsic timeouts
 #wizmakemap     == recreate the current dungeon level
 #wizrumorcheck  == validate first and last rumor for true and false set
index 4cd2b1476e7bb0bd798180567943f5b4f926ac00..36ccd7e13d45348751950c04124ed6a76a76a57e 100644 (file)
@@ -1512,6 +1512,9 @@ Default key is \(oqw\(cq.
 Wipe off your face.
 Autocompletes.
 Default key is \(oqM-w\(cq.
+.lp "#wizborn "
+Show monster birth, death, genocide, and extinct statistics.
+Debug mode only.
 .lp "#wizbury "
 Bury objects under and around you.
 Autocompletes.
index b734529618122836df082ac8864341b954cc43c9..13db12a251f6e1e5a2a03baf93b4c803a769bfbd 100644 (file)
@@ -1600,6 +1600,10 @@ Wield a weapon. Default key is `{\tt w}'.
 \item[\tb{\#wipe}]
 Wipe off your face. Autocompletes. Default key is `{\tt M-w}'.
 %.lp
+\item[\tb{\#wizborn}]
+Show monster birth, death, genocide, and extinct statistics.
+Debug mode only.
+%.lp
 \item[\tb{\#wizbury}]
 Bury objects under and around you.
 Autocompletes.
index de408d60795283a5ab0f7381b33e3b67c6fecee8..65d8cb4113c8b16fbb81940284aed2d7dea7cacf 100644 (file)
@@ -64,6 +64,8 @@ if eel bite attack caused hero to move (killed + rehumanized + crawled out
        of water), its grab attack could succeed even if no longer adjacent
 specifying a count when picking [part of] a stack of scrolls of scare monster
        ignored that count and the whole stack was affected
+wizmakemap didn't account for unique monsters and didn't correct monster
+       birth counts
 
 
 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
@@ -175,6 +177,7 @@ demon lords and princes suppress teleporting in Gehennom
 for !fixinv option where inventory letters normally don't stick, try to put
        a throw-and-return weapon back into the same inventory slot it gets
        thrown from; only works if it does return and is successfully caught
+wizard mode #wizborn command
 
 
 Platform- and/or Interface-Specific New Features
index 425197c13da5357f9a5a2e520728eca043c1654a..c859bbb3466de216a01583c51d5153187ecc84a3 100644 (file)
@@ -1002,6 +1002,7 @@ E void FDECL(record_achievement, (XCHAR_P));
 E boolean FDECL(remove_achievement, (XCHAR_P));
 E int NDECL(count_achievements);
 E int NDECL(dovanquished);
+E int NDECL(doborn);
 E void FDECL(list_vanquished, (CHAR_P, BOOLEAN_P));
 E int NDECL(num_genocides);
 E void FDECL(list_genocided, (CHAR_P, BOOLEAN_P));
index 6a0bf64e3ea92557729bff83c619756c78157512..bf8076d7d073770c56c9e809278227effcfbfea2 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -780,10 +780,15 @@ boolean pre, wiztower;
     if (pre) {
         rm_mapseen(ledger_no(&u.uz));
         for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
+            int ndx = monsndx(mtmp->data);
             if (mtmp->isgd) { /* vault is going away; get rid of guard */
                 mtmp->isgd = 0;
                 mongone(mtmp);
             }
+            if (mtmp->data->geno & G_UNIQ)
+                g.mvitals[ndx].mvflags &= ~(G_EXTINCT);
+            if (g.mvitals[ndx].born)
+                g.mvitals[ndx].born--;
             if (DEADMONSTER(mtmp))
                 continue;
             if (mtmp->isshk)
@@ -802,11 +807,6 @@ boolean pre, wiztower;
                     g.context.achieveo.soko_prize_oid = 0;
                 }
             }
-            /* TODO?
-             *  Reduce 'born' tally for each monster about to be discarded
-             *  by savelev(), otherwise replacing heavily populated levels
-             *  tends to make their inhabitants become extinct.
-             */
         }
         if (Punished) {
             ballrelease(FALSE);
@@ -1890,6 +1890,8 @@ struct ext_func_tab extcmdlist[] = {
             dowhatis, IFBURIED | GENERALCMD },
     { 'w', "wield", "wield (put in use) a weapon", dowield },
     { M('w'), "wipe", "wipe off your face", dowipe, AUTOCOMPLETE },
+    { '\0', "wizborn", "show stats of monsters created",
+            doborn, IFBURIED | WIZMODECMD },
 #ifdef DEBUG
     { '\0', "wizbury", "bury objs under and around you",
             wiz_debug_cmd_bury, IFBURIED | AUTOCOMPLETE | WIZMODECMD },
index a6fa1ad4bd4aaefb2fbb3d395b45cf42847137fd..8321696041d45efa7b84b0e3866a7cfbac909f98 100644 (file)
@@ -2062,6 +2062,39 @@ dovanquished()
     return 0;
 }
 
+/* #wizborn extended command */
+int
+doborn()
+{
+    static const char fmt[] = "%4i %4i %c %-30s";
+    int i;
+    winid datawin = create_nhwindow(NHW_TEXT);
+    char buf[BUFSZ];
+    int nborn = 0, ndied = 0;
+
+    putstr(datawin, 0, "died born");
+    for (i = LOW_PM; i < NUMMONS; i++)
+        if (g.mvitals[i].born || g.mvitals[i].died
+            || (g.mvitals[i].mvflags & G_GONE)) {
+            Sprintf(buf, fmt,
+                    g.mvitals[i].died, g.mvitals[i].born,
+                    ((g.mvitals[i].mvflags & G_GONE) == G_EXTINCT) ? 'E' :
+                    ((g.mvitals[i].mvflags & G_GONE) == G_GENOD) ? 'G' : ' ',
+                    mons[i].mname);
+            putstr(datawin, 0, buf);
+            nborn += g.mvitals[i].born;
+            ndied += g.mvitals[i].died;
+        }
+
+    putstr(datawin, 0, "");
+    Sprintf(buf, fmt, ndied, nborn, ' ', "");
+
+    display_nhwindow(datawin, FALSE);
+    destroy_nhwindow(datawin);
+
+    return 0;
+}
+
 /* high priests aren't unique but are flagged as such to simplify something */
 #define UniqCritterIndx(mndx) ((mons[mndx].geno & G_UNIQ) \
                                && mndx != PM_HIGH_PRIEST)