From: Pasi Kallinen Date: Sat, 7 Mar 2020 19:33:31 +0000 (+0200) Subject: Fix wizmakemap to consider monster birth counts and uniques X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f5d9324f28c4744111b0a94999c8dd75a419eb90;p=nethack Fix wizmakemap to consider monster birth counts and uniques Also add a new wizmode command #wizborn to show those. --- diff --git a/dat/wizhelp b/dat/wizhelp index 519ca1687..bc8a4715c 100644 --- a/dat/wizhelp +++ b/dat/wizhelp @@ -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 diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index 4cd2b1476..36ccd7e13 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -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. diff --git a/doc/Guidebook.tex b/doc/Guidebook.tex index b73452961..13db12a25 100644 --- a/doc/Guidebook.tex +++ b/doc/Guidebook.tex @@ -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. diff --git a/doc/fixes37.0 b/doc/fixes37.0 index de408d607..65d8cb411 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -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 diff --git a/include/extern.h b/include/extern.h index 425197c13..c859bbb34 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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)); diff --git a/src/cmd.c b/src/cmd.c index 6a0bf64e3..bf8076d7d 100644 --- 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 }, diff --git a/src/insight.c b/src/insight.c index a6fa1ad4b..832169604 100644 --- a/src/insight.c +++ b/src/insight.c @@ -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)