Merge branch 'NetHack-3.6'

This commit is contained in:
nhmall
2019-06-20 22:33:33 -04:00
6 changed files with 76 additions and 31 deletions

View File

@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.59 $ $NHDT-Date: 1561022792 2019/06/20 09:26:32 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.62 $ $NHDT-Date: 1561081353 2019/06/21 01:42:33 $
This fixes36.3 file is here to capture information about updates in the 3.6.x This fixes36.3 file is here to capture information about updates in the 3.6.x
lineage following the release of 3.6.2 in May 2019. Please note, however, lineage following the release of 3.6.2 in May 2019. Please note, however,
@@ -77,6 +77,8 @@ for wizard mode 'monpolycontrol', allow usually disallowed type 'chameleon',
'doppelganger', or 'sandestin' as answer to "change <monster> @ <x,y> 'doppelganger', or 'sandestin' as answer to "change <monster> @ <x,y>
into what?" prompt when <monster> is really that type of creature into what?" prompt when <monster> is really that type of creature
add Space, Return, and Escape to '? k' (help for menu control keys) add Space, Return, and Escape to '? k' (help for menu control keys)
hero can no longer negotiate a bribe with a demon lord when deaf
wishing for "foo amulet" now yields an "amulet of foo" rather than random one
Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository
@@ -89,6 +91,8 @@ using ^G to create "hidden mimic" shouldn't have marked it as undetected since
also for eels and other fish if/when created at water location also for eels and other fish if/when created at water location
for wizard mode 'wizweight' option, glob weight wasn't shown unless glob had for wizard mode 'wizweight' option, glob weight wasn't shown unless glob had
shop price information attached shop price information attached
fix for feedback when a monster plays a fire horn at self to cure green slime
ended up being used for zapping a wand of fire at self too
curses: sometimes the message window would show a blank line after a prompt curses: sometimes the message window would show a blank line after a prompt
tty: revert the attempt to fix "message line anomaly: if autodecribe feedback tty: revert the attempt to fix "message line anomaly: if autodecribe feedback
wrapped to second line, the wrapped portion wasn't erased when a wrapped to second line, the wrapped portion wasn't erased when a

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 monst.h $NHDT-Date: 1559994623 2019/06/08 11:50:23 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.32 $ */ /* NetHack 3.6 monst.h $NHDT-Date: 1561053561 2019/06/20 17:59:21 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.33 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2016. */ /*-Copyright (c) Robert Patrick Rankin, 2016. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 minion.c $NHDT-Date: 1544998886 2018/12/16 22:21:26 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.40 $ */ /* NetHack 3.6 minion.c $NHDT-Date: 1561061319 2019/06/20 20:08:39 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.42 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2008. */ /*-Copyright (c) Robert Patrick Rankin, 2008. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -204,9 +204,13 @@ boolean talk;
} }
if (mon) { if (mon) {
if (talk) { if (talk) {
pline_The("voice of %s booms:", align_gname(alignment)); if (!Deaf)
pline_The("voice of %s booms:", align_gname(alignment));
else
You_feel("%s booming voice:",
s_suffix(align_gname(alignment)));
verbalize("Thou shalt pay for thine indiscretion!"); verbalize("Thou shalt pay for thine indiscretion!");
if (!Blind) if (canspotmon(mon))
pline("%s appears before you.", Amonnam(mon)); pline("%s appears before you.", Amonnam(mon));
mon->mstrategy &= ~STRAT_APPEARMSG; mon->mstrategy &= ~STRAT_APPEARMSG;
} }
@@ -254,16 +258,18 @@ register struct monst *mtmp;
newsym(mtmp->mx, mtmp->my); newsym(mtmp->mx, mtmp->my);
} }
if (g.youmonst.data->mlet == S_DEMON) { /* Won't blackmail their own. */ if (g.youmonst.data->mlet == S_DEMON) { /* Won't blackmail their own. */
pline("%s says, \"Good hunting, %s.\"", Amonnam(mtmp), if (!Deaf)
flags.female ? "Sister" : "Brother"); pline("%s says, \"Good hunting, %s.\"", Amonnam(mtmp),
flags.female ? "Sister" : "Brother");
else if (canseemon(mtmp))
pline("%s says something.", Amonnam(mtmp));
if (!tele_restrict(mtmp)) if (!tele_restrict(mtmp))
(void) rloc(mtmp, TRUE); (void) rloc(mtmp, TRUE);
return 1; return 1;
} }
cash = money_cnt(g.invent); cash = money_cnt(g.invent);
demand = demand = (cash * (rnd(80) + 20 * Athome))
(cash * (rnd(80) + 20 * Athome)) / (100 * (1 + (sgn(u.ualign.type) == sgn(mtmp->data->maligntyp))));
/ (100 * (1 + (sgn(u.ualign.type) == sgn(mtmp->data->maligntyp))));
if (!demand || g.multi < 0) { /* you have no gold or can't move */ if (!demand || g.multi < 0) { /* you have no gold or can't move */
mtmp->mpeaceful = 0; mtmp->mpeaceful = 0;
@@ -273,13 +279,22 @@ register struct monst *mtmp;
/* make sure that the demand is unmeetable if the monster /* make sure that the demand is unmeetable if the monster
has the Amulet, preventing monster from being satisfied has the Amulet, preventing monster from being satisfied
and removed from the game (along with said Amulet...) */ and removed from the game (along with said Amulet...) */
if (mon_has_amulet(mtmp)) /* [actually the Amulet is safe; it would be dropped when
demand = cash + (long) rn1(1000, 40); mongone() gets rid of the monster; force combat anyway;
also make it unmeetable if the player is Deaf, to simplify
handling that case as player-won't-pay] */
if (mon_has_amulet(mtmp) || Deaf)
/* 125: 5*25 in case hero has maximum possible charisma */
demand = cash + (long) rn1(1000, 125);
pline("%s demands %ld %s for safe passage.", Amonnam(mtmp), demand, if (!Deaf)
currency(demand)); pline("%s demands %ld %s for safe passage.",
Amonnam(mtmp), demand, currency(demand));
else if (canseemon(mtmp))
pline("%s seems to be demanding something.", Amonnam(mtmp));
if ((offer = bribe(mtmp)) >= demand) { offer = 0L;
if (!Deaf && ((offer = bribe(mtmp)) >= demand)) {
pline("%s vanishes, laughing about cowardly mortals.", pline("%s vanishes, laughing about cowardly mortals.",
Amonnam(mtmp)); Amonnam(mtmp));
} else if (offer > 0L } else if (offer > 0L
@@ -447,12 +462,18 @@ gain_guardian_angel()
Hear_again(); /* attempt to cure any deafness now (divine Hear_again(); /* attempt to cure any deafness now (divine
message will be heard even if that fails) */ message will be heard even if that fails) */
if (Conflict) { if (Conflict) {
pline("A voice booms:"); if (!Deaf)
pline("A voice booms:");
else
You_feel("a booming voice:");
verbalize("Thy desire for conflict shall be fulfilled!"); verbalize("Thy desire for conflict shall be fulfilled!");
/* send in some hostile angels instead */ /* send in some hostile angels instead */
lose_guardian_angel((struct monst *) 0); lose_guardian_angel((struct monst *) 0);
} else if (u.ualign.record > 8) { /* fervent */ } else if (u.ualign.record > 8) { /* fervent */
pline("A voice whispers:"); if (!Deaf)
pline("A voice whispers:");
else
You_feel("a soft voice:");
verbalize("Thou hast been worthy of me!"); verbalize("Thou hast been worthy of me!");
mm.x = u.ux; mm.x = u.ux;
mm.y = u.uy; mm.y = u.uy;

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 muse.c $NHDT-Date: 1560161807 2019/06/10 10:16:47 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.96 $ */ /* NetHack 3.6 muse.c $NHDT-Date: 1561053256 2019/06/20 17:54:16 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.97 $ */
/* Copyright (C) 1990 by Ken Arromdee */ /* Copyright (C) 1990 by Ken Arromdee */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -2487,7 +2487,10 @@ boolean by_you; /* true: if mon kills itself, hero gets credit/blame */
dmg = 0; /* damage has been applied by explode() */ dmg = 0; /* damage has been applied by explode() */
} }
} else { /* wand/horn of fire w/ positive charge count */ } else { /* wand/horn of fire w/ positive charge count */
mplayhorn(mon, obj, TRUE); if (obj->otyp == FIRE_HORN)
mplayhorn(mon, obj, TRUE);
else
mzapwand(mon, obj, TRUE);
/* -1 => monster's wand of fire; 2 => # of damage dice */ /* -1 => monster's wand of fire; 2 => # of damage dice */
dmg = zhitm(mon, by_you ? 1 : -1, 2, &odummyp); dmg = zhitm(mon, by_you ? 1 : -1, 2, &odummyp);
} }

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 objnam.c $NHDT-Date: 1560185545 2019/06/10 16:52:25 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.243 $ */ /* NetHack 3.6 objnam.c $NHDT-Date: 1561081353 2019/06/21 01:42:33 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.244 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2011. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -2812,7 +2812,7 @@ int xtra_prob; /* to force 0% random generation items to also be considered */
* probabilities are not very useful because they don't take * probabilities are not very useful because they don't take
* the class generation probability into account. [If 10% * the class generation probability into account. [If 10%
* of spellbooks were blank and 1% of scrolls were blank, * of spellbooks were blank and 1% of scrolls were blank,
* "blank" would have 10/11 chance to yield a blook even though * "blank" would have 10/11 chance to yield a book even though
* scrolls are supposed to be much more common than books.] * scrolls are supposed to be much more common than books.]
*/ */
for (i = oclass ? g.bases[(int) oclass] : STRANGE_OBJECT + 1; for (i = oclass ? g.bases[(int) oclass] : STRANGE_OBJECT + 1;
@@ -3347,6 +3347,7 @@ struct obj *no_wish;
for (i = 0; i < (int) (sizeof wrpsym); i++) { for (i = 0; i < (int) (sizeof wrpsym); i++) {
register int j = strlen(wrp[i]); register int j = strlen(wrp[i]);
/* check for "<class> [ of ] something" */
if (!strncmpi(bp, wrp[i], j)) { if (!strncmpi(bp, wrp[i], j)) {
oclass = wrpsym[i]; oclass = wrpsym[i];
if (oclass != AMULET_CLASS) { if (oclass != AMULET_CLASS) {
@@ -3358,12 +3359,27 @@ struct obj *no_wish;
actualn = bp; actualn = bp;
goto srch; goto srch;
} }
/* check for "something <class>" */
if (!BSTRCMPI(bp, p - j, wrp[i])) { if (!BSTRCMPI(bp, p - j, wrp[i])) {
oclass = wrpsym[i]; oclass = wrpsym[i];
p -= j; /* for "foo amulet", leave the class name so that
*p = 0; wishymatch() can do "of inversion" to try matching
if (p > bp && p[-1] == ' ') "amulet of foo"; other classes don't include their
p[-1] = 0; class name in their full object names (where
"potion of healing" is just "healing", for instance) */
if (oclass != AMULET_CLASS) {
p -= j;
*p = '\0';
if (p > bp && p[-1] == ' ')
p[-1] = '\0';
} else {
/* amulet without "of"; convoluted wording but better a
special case that's handled than one that's missing */
if (!strncmpi(bp, "versus poison ", 14)) {
typ = AMULET_VERSUS_POISON;
goto typfnd;
}
}
actualn = dn = bp; actualn = dn = bp;
goto srch; goto srch;
} }

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 pray.c $NHDT-Date: 1559853037 2019/06/06 20:30:37 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.114 $ */ /* NetHack 3.6 pray.c $NHDT-Date: 1561061321 2019/06/20 20:08:41 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.115 $ */
/* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */ /* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -484,7 +484,7 @@ int trouble;
what = rightglow; what = rightglow;
else if (otmp == uleft) else if (otmp == uleft)
what = leftglow; what = leftglow;
decurse: decurse:
if (!otmp) { if (!otmp) {
impossible("fix_worst_trouble: nothing to uncurse."); impossible("fix_worst_trouble: nothing to uncurse.");
return; return;
@@ -716,8 +716,9 @@ aligntyp resp_god;
(on_altar() && (a_align(u.ux, u.uy) != resp_god)) (on_altar() && (a_align(u.ux, u.uy) != resp_god))
? "scorn" ? "scorn"
: "call upon"); : "call upon");
/* [why isn't this using verbalize()?] */
pline("\"Then die, %s!\"", pline("\"Then die, %s!\"",
g.youmonst.data->mlet == S_HUMAN ? "mortal" : "creature"); (g.youmonst.data->mlet == S_HUMAN) ? "mortal" : "creature");
summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE);
break; break;
@@ -797,7 +798,7 @@ gcrownu()
&& uwep->oartifact != ART_STORMBRINGER)) && uwep->oartifact != ART_STORMBRINGER))
&& !carrying(SPE_FINGER_OF_DEATH)) { && !carrying(SPE_FINGER_OF_DEATH)) {
class_gift = SPE_FINGER_OF_DEATH; class_gift = SPE_FINGER_OF_DEATH;
make_splbk: make_splbk:
obj = mksobj(class_gift, TRUE, FALSE); obj = mksobj(class_gift, TRUE, FALSE);
bless(obj); bless(obj);
obj->bknown = 1; /* ok to skip set_bknown() */ obj->bknown = 1; /* ok to skip set_bknown() */
@@ -1483,7 +1484,7 @@ dosacrifice()
if (otmp->otyp == AMULET_OF_YENDOR) { if (otmp->otyp == AMULET_OF_YENDOR) {
if (!highaltar) { if (!highaltar) {
too_soon: too_soon:
if (altaralign == A_NONE && Inhell) if (altaralign == A_NONE && Inhell)
/* hero has left Moloch's Sanctum so is in the process /* hero has left Moloch's Sanctum so is in the process
of getting away with the Amulet (outside of Gehennom, of getting away with the Amulet (outside of Gehennom,
@@ -1579,7 +1580,7 @@ dosacrifice()
} }
if (altaralign != u.ualign.type && highaltar) { if (altaralign != u.ualign.type && highaltar) {
desecrate_high_altar: desecrate_high_altar:
/* /*
* REAL BAD NEWS!!! High altars cannot be converted. Even an attempt * REAL BAD NEWS!!! High altars cannot be converted. Even an attempt
* gets the god who owns it truly pissed off. * gets the god who owns it truly pissed off.