Merge branch 'NetHack-3.6.2'

This commit is contained in:
nhmall
2019-05-05 23:30:50 -04:00
18 changed files with 218 additions and 87 deletions
+3 -3
View File
@@ -227,9 +227,9 @@ and in days past, devnull.net (gone for now, but not forgotten).
- - - - - - - - - - - - - - - - - - - -
From time to time, some depraved individual out there in netland sends a From time to time, some depraved individual out there in netland sends a
particularly intriguing modification to help out with the game. The gods particularly intriguing modification to help out with the game. The
of the dungeon sometimes make note of the names of the worst of these NetHack Development Team sometimes makes note of the names of the worst
miscreants in this, the list of Dungeoneers: of these miscreants in this, the list of Dungeoneers:
Adam Aronow Janet Walz Nathan Eady Adam Aronow Janet Walz Nathan Eady
Alex Kompel Janne Salmijarvi Norm Meluch Alex Kompel Janne Salmijarvi Norm Meluch
+6 -1
View File
@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.312 $ $NHDT-Date: 1556649298 2019/04/30 18:34:58 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.315 $ $NHDT-Date: 1557091781 2019/05/05 21:29:41 $
This fixes36.2 file is here to capture information about updates in the 3.6.x This fixes36.2 file is here to capture information about updates in the 3.6.x
lineage following the release of 3.6.1 in April 2018. Please note, however, lineage following the release of 3.6.1 in April 2018. Please note, however,
@@ -421,6 +421,11 @@ message given when shape-shifted vampire cheats death by reverting to its
Vlad wasn't set up as a vampshifter properly Vlad wasn't set up as a vampshifter properly
poly'd hero capable of spitting venom would leave intact venom object if it poly'd hero capable of spitting venom would leave intact venom object if it
reached end of range at a 'soft' location such as water reached end of range at a 'soft' location such as water
avoid impossible if monster cannot be relocated from teleport region
fix cloned monster trapped and hiding states
split monster could be placed on trap without triggering it
turning into green slime would make wielded or carried crysknives revert to
worm teeth in bones data even though they remained carried
Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
+2 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 extern.h $NHDT-Date: 1555201698 2019/04/14 00:28:18 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.702 $ */ /* NetHack 3.6 extern.h $NHDT-Date: 1557088399 2019/05/05 20:33:19 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.703 $ */
/* Copyright (c) Steve Creps, 1988. */ /* Copyright (c) Steve Creps, 1988. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -136,6 +136,7 @@ E boolean FDECL(drag_ball, (XCHAR_P, XCHAR_P, int *, xchar *, xchar *,
xchar *, xchar *, boolean *, BOOLEAN_P)); xchar *, xchar *, boolean *, BOOLEAN_P));
E void FDECL(drop_ball, (XCHAR_P, XCHAR_P)); E void FDECL(drop_ball, (XCHAR_P, XCHAR_P));
E void NDECL(drag_down); E void NDECL(drag_down);
E void NDECL(bc_sanity_check);
/* ### bones.c ### */ /* ### bones.c ### */
+78 -10
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 ball.c $NHDT-Date: 1450402033 2015/12/18 01:27:13 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.29 $ */ /* NetHack 3.6 ball.c $NHDT-Date: 1557088406 2019/05/05 20:33:26 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.36 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) David Cohrs, 2006. */ /*-Copyright (c) David Cohrs, 2006. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -24,12 +24,14 @@ boolean showmsg;
setuswapwep((struct obj *) 0); setuswapwep((struct obj *) 0);
if (uquiver == uball) if (uquiver == uball)
setuqwep((struct obj *) 0); setuqwep((struct obj *) 0);
; /* [this used to test 'if (uwep != uball)' but that always passes
if (uwep != uball) after the setuwep() above] */
freeinv(uball); freeinv(uball); /* remove from inventory but don't place on floor */
encumber_msg();
} }
} }
/* ball&chain might hit hero when falling through a trap door */
void void
ballfall() ballfall()
{ {
@@ -40,6 +42,7 @@ ballfall()
ballrelease(TRUE); ballrelease(TRUE);
if (gets_hit) { if (gets_hit) {
int dmg = rn1(7, 25); int dmg = rn1(7, 25);
pline_The("iron ball falls on your %s.", body_part(HEAD)); pline_The("iron ball falls on your %s.", body_part(HEAD));
if (uarmh) { if (uarmh) {
if (is_metallic(uarmh)) { if (is_metallic(uarmh)) {
@@ -113,9 +116,9 @@ placebc()
(void) flooreffects(uchain, u.ux, u.uy, ""); /* chain might rust */ (void) flooreffects(uchain, u.ux, u.uy, ""); /* chain might rust */
if (carried(uball)) /* the ball is carried */ if (carried(uball)) { /* the ball is carried */
u.bc_order = BCPOS_DIFFER; u.bc_order = BCPOS_DIFFER;
else { } else {
/* ball might rust -- already checked when carried */ /* ball might rust -- already checked when carried */
(void) flooreffects(uball, u.ux, u.uy, ""); (void) flooreffects(uball, u.ux, u.uy, "");
place_object(uball, u.ux, u.uy); place_object(uball, u.ux, u.uy);
@@ -411,6 +414,7 @@ boolean allow_drag;
/* only need to move the chain? */ /* only need to move the chain? */
if (carried(uball) || distmin(x, y, uball->ox, uball->oy) <= 2) { if (carried(uball) || distmin(x, y, uball->ox, uball->oy) <= 2) {
xchar oldchainx = uchain->ox, oldchainy = uchain->oy; xchar oldchainx = uchain->ox, oldchainy = uchain->oy;
*bc_control = BC_CHAIN; *bc_control = BC_CHAIN;
move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy); move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy);
if (carried(uball)) { if (carried(uball)) {
@@ -774,21 +778,24 @@ xchar x, y;
} }
} }
/* ball&chain cause hero to randomly lose stuff from inventory */
STATIC_OVL void STATIC_OVL void
litter() litter()
{ {
struct obj *otmp = g.invent, *nextobj; struct obj *otmp, *nextobj = 0;
int capacity = weight_cap(); int capacity = weight_cap();
while (otmp) { for (otmp = g.invent; otmp; otmp = nextobj) {
nextobj = otmp->nobj; nextobj = otmp->nobj;
if ((otmp != uball) && (rnd(capacity) <= (int) otmp->owt)) { if ((otmp != uball) && (rnd(capacity) <= (int) otmp->owt)) {
if (canletgo(otmp, "")) { if (canletgo(otmp, "")) {
pline("%s you down the stairs.", Yobjnam2(otmp, "follow")); You("drop %s and %s %s down the stairs with you.",
yname(otmp), (otmp->quan == 1L) ? "it" : "they",
otense(otmp, "fall"));
dropx(otmp); dropx(otmp);
encumber_msg(); /* drop[xyz]() probably ought to to this... */
} }
} }
otmp = nextobj;
} }
} }
@@ -839,4 +846,65 @@ drag_down()
} }
} }
void
bc_sanity_check()
{
int otyp;
unsigned save_nameknown;
const char *onam;
if (Punished && (!uball || !uchain)) {
impossible("Punished without %s%s%s?",
!uball ? "iron ball" : "",
(!uball && !uchain) ? " and " : "",
!uchain ? "attached chain" : "");
} else if (!Punished && (uball || uchain)) {
impossible("Attached %s%s%s without being Punished?",
uchain ? "chain" : "",
(uchain && uball) ? " and " : "",
uball ? "iron ball" : "");
}
/* ball is free when swallowed, changing levels, other times? */
if (uball && (uball->otyp != HEAVY_IRON_BALL
|| (uball->where != OBJ_FLOOR
&& uball->where != OBJ_INVENT
&& uball->where != OBJ_FREE)
|| (uball->owornmask & W_BALL) == 0L
|| (uball->owornmask & ~(W_BALL | W_WEAPON)) != 0L)) {
otyp = uball->otyp;
if (otyp < STRANGE_OBJECT || otyp >= NUM_OBJECTS
|| !OBJ_NAME(objects[otyp])) {
onam = "glorkum";
} else {
save_nameknown = objects[otyp].oc_name_known;
objects[otyp].oc_name_known = 1;
onam = simple_typename(otyp);
objects[otyp].oc_name_known = save_nameknown;
}
impossible("uball: type %d (%s), where %d, wornmask=0x%08lx",
otyp, onam, uball->where, uball->owornmask);
}
/* similar check to ball except can't be in inventory */
if (uchain && (uchain->otyp != IRON_CHAIN
|| (uchain->where != OBJ_FLOOR
&& uchain->where != OBJ_FREE)
/* [could simplify this to owornmask != W_CHAIN] */
|| (uchain->owornmask & W_CHAIN) == 0L
|| (uchain->owornmask & ~W_CHAIN) != 0L)) {
otyp = uchain->otyp;
if (otyp < STRANGE_OBJECT || otyp >= NUM_OBJECTS
|| !OBJ_NAME(objects[otyp])) {
onam = "glorkum";
} else {
save_nameknown = objects[otyp].oc_name_known;
objects[otyp].oc_name_known = 1;
onam = simple_typename(otyp);
objects[otyp].oc_name_known = save_nameknown;
}
impossible("uchain: type %d (%s), where %d, wornmask=0x%08lx",
otyp, onam, uchain->where, uchain->owornmask);
}
/* [check bc_order too?] */
}
/*ball.c*/ /*ball.c*/
+14 -10
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 bones.c $NHDT-Date: 1539653203 2018/10/16 01:26:43 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.73 $ */ /* NetHack 3.6 bones.c $NHDT-Date: 1557092711 2019/05/05 21:45:11 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.75 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985,1993. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985,1993. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -212,8 +212,8 @@ char *namebuf;
/* called by savebones(); also by finish_paybill(shk.c) */ /* called by savebones(); also by finish_paybill(shk.c) */
void void
drop_upon_death(mtmp, cont, x, y) drop_upon_death(mtmp, cont, x, y)
struct monst *mtmp; struct monst *mtmp; /* monster if hero turned into one (other than ghost) */
struct obj *cont; struct obj *cont; /* container if hero is turned into a statue */
int x, y; int x, y;
{ {
struct obj *otmp; struct obj *otmp;
@@ -221,9 +221,13 @@ int x, y;
u.twoweap = 0; /* ensure curse() won't cause swapwep to drop twice */ u.twoweap = 0; /* ensure curse() won't cause swapwep to drop twice */
while ((otmp = g.invent) != 0) { while ((otmp = g.invent) != 0) {
obj_extract_self(otmp); obj_extract_self(otmp);
/* when turning into green slime, all gear remains held;
other types "arise from the dead" do aren't holding
equipment during their brief interval as a corpse */
if (!mtmp || is_undead(mtmp->data))
obj_no_longer_held(otmp); obj_no_longer_held(otmp);
otmp->owornmask = 0; otmp->owornmask = 0L;
/* lamps don't go out when dropped */ /* lamps don't go out when dropped */
if ((cont || artifact_light(otmp)) && obj_is_burning(otmp)) if ((cont || artifact_light(otmp)) && obj_is_burning(otmp))
end_burn(otmp, TRUE); /* smother in statue */ end_burn(otmp, TRUE); /* smother in statue */
@@ -388,7 +392,7 @@ make_bones:
/* check iron balls separately--maybe they're not carrying it */ /* check iron balls separately--maybe they're not carrying it */
if (uball) if (uball)
uball->owornmask = uchain->owornmask = 0; uball->owornmask = uchain->owornmask = 0L;
/* dispose of your possessions, usually cursed */ /* dispose of your possessions, usually cursed */
if (u.ugrave_arise == (NON_PM - 1)) { if (u.ugrave_arise == (NON_PM - 1)) {
@@ -420,21 +424,21 @@ make_bones:
g.in_mklev = TRUE; /* use <u.ux,u.uy> as-is */ g.in_mklev = TRUE; /* use <u.ux,u.uy> as-is */
mtmp = makemon(&mons[u.ugrave_arise], u.ux, u.uy, NO_MINVENT); mtmp = makemon(&mons[u.ugrave_arise], u.ux, u.uy, NO_MINVENT);
g.in_mklev = FALSE; g.in_mklev = FALSE;
if (!mtmp) { if (!mtmp) { /* arise-type might have been genocided */
drop_upon_death((struct monst *) 0, (struct obj *) 0, u.ux, u.uy); drop_upon_death((struct monst *) 0, (struct obj *) 0, u.ux, u.uy);
u.ugrave_arise = NON_PM; /* in case caller cares */ u.ugrave_arise = NON_PM; /* in case caller cares */
return; return;
} }
/* give mummy-from-hero a wrapping unless hero already
carries one; don't bother forcing it to become worn */
if (mtmp->data->mlet == S_MUMMY && !carrying(MUMMY_WRAPPING))
(void) mongets(mtmp, MUMMY_WRAPPING);
mtmp = christen_monst(mtmp, g.plname); mtmp = christen_monst(mtmp, g.plname);
newsym(u.ux, u.uy); newsym(u.ux, u.uy);
/* ["Your body rises from the dead as an <mname>..." used /* ["Your body rises from the dead as an <mname>..." used
to be given here, but it has been moved to done() so that to be given here, but it has been moved to done() so that
it gets delivered even when savebones() isn't called] */ it gets delivered even when savebones() isn't called] */
drop_upon_death(mtmp, (struct obj *) 0, u.ux, u.uy); drop_upon_death(mtmp, (struct obj *) 0, u.ux, u.uy);
/* 'mtmp' now has hero's inventory; if 'mtmp' is a mummy, give it
a wrapping unless already carrying one */
if (mtmp->data->mlet == S_MUMMY && !m_carrying(mtmp, MUMMY_WRAPPING))
(void) mongets(mtmp, MUMMY_WRAPPING);
m_dowear(mtmp, TRUE); m_dowear(mtmp, TRUE);
} }
if (mtmp) { if (mtmp) {
+15 -6
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 botl.c $NHDT-Date: 1554857126 2019/04/10 00:45:26 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.144 $ */ /* NetHack 3.6 botl.c $NHDT-Date: 1557094795 2019/05/05 22:19:55 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.145 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2006. */ /*-Copyright (c) Michael Allison, 2006. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -772,7 +772,15 @@ boolean *valsetlist;
} }
#endif #endif
if (g.update_all || chg || reset) { /*
* TODO?
* It's possible for HPmax (or ENEmax) to change while current
* HP (or energy) stays the same. [Perhaps current and maximum
* both go up, then before the next status update takes place
* current goes down again.] If that happens with HPmax, we
* ought to force the windowport to treat current HP as changed
* if hitpointbar is On, in order for that to be re-rendered.
*/
idxmax = curr->idxmax; idxmax = curr->idxmax;
pc = (idxmax >= 0) ? percentage(curr, &g.blstats[idx][idxmax]) : 0; pc = (idxmax >= 0) ? percentage(curr, &g.blstats[idx][idxmax]) : 0;
@@ -853,8 +861,8 @@ boolean *valsetlist;
if (g.context.botlx && (windowprocs.wincap2 & WC2_RESET_STATUS) != 0L) if (g.context.botlx && (windowprocs.wincap2 & WC2_RESET_STATUS) != 0L)
status_update(BL_RESET, (genericptr_t) 0, 0, 0, status_update(BL_RESET, (genericptr_t) 0, 0, 0,
NO_COLOR, (unsigned long *) 0); NO_COLOR, (unsigned long *) 0);
else if ((updated || g.context.botlx) && else if ((updated || g.context.botlx)
(windowprocs.wincap2 & WC2_FLUSH_STATUS) != 0L) && (windowprocs.wincap2 & WC2_FLUSH_STATUS) != 0L)
status_update(BL_FLUSH, (genericptr_t) 0, 0, 0, status_update(BL_FLUSH, (genericptr_t) 0, 0, 0,
NO_COLOR, (unsigned long *) 0); NO_COLOR, (unsigned long *) 0);
@@ -1335,7 +1343,8 @@ const char *name;
STATIC_OVL boolean STATIC_OVL boolean
hilite_reset_needed(bl_p, augmented_time) hilite_reset_needed(bl_p, augmented_time)
struct istat_s *bl_p; struct istat_s *bl_p;
long augmented_time; long augmented_time; /* no longer augmented; it once encoded fractional
* amounts for multiple moves within same turn */
{ {
/* /*
* This 'multi' handling may need some tuning... * This 'multi' handling may need some tuning...
@@ -1393,7 +1402,7 @@ status_eval_next_unhilite()
} }
} }
/* called by options handling when 'statushilites' boolean is toggled */ /* called by options handling when 'statushilites' value is changed */
void void
reset_status_hilites() reset_status_hilites()
{ {
+2 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 cmd.c $NHDT-Date: 1549327488 2019/02/05 00:44:48 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.331 $ */ /* NetHack 3.6 cmd.c $NHDT-Date: 1557088405 2019/05/05 20:33:25 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.333 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2013. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -4087,6 +4087,7 @@ sanity_check()
timer_sanity_check(); timer_sanity_check();
mon_sanity_check(); mon_sanity_check();
light_sources_sanity_check(); light_sources_sanity_check();
bc_sanity_check();
} }
#ifdef DEBUG_MIGRATING_MONS #ifdef DEBUG_MIGRATING_MONS
+5 -8
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 dogmove.c $NHDT-Date: 1551493951 2019/03/02 02:32:31 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.72 $ */ /* NetHack 3.6 dogmove.c $NHDT-Date: 1557094801 2019/05/05 22:20:01 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.74 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -618,7 +618,6 @@ int after, udist, whappr;
return appr; return appr;
} }
STATIC_OVL struct monst * STATIC_OVL struct monst *
find_targ(mtmp, dx, dy, maxdist) find_targ(mtmp, dx, dy, maxdist)
register struct monst *mtmp; register struct monst *mtmp;
@@ -647,14 +646,13 @@ int maxdist;
if (!m_cansee(mtmp, curx, cury)) if (!m_cansee(mtmp, curx, cury))
break; break;
targ = m_at(curx, cury);
if (curx == mtmp->mux && cury == mtmp->muy) if (curx == mtmp->mux && cury == mtmp->muy)
return &g.youmonst; return &g.youmonst;
if (targ) { if ((targ = m_at(curx, cury)) != 0) {
/* Is the monster visible to the pet? */ /* Is the monster visible to the pet? */
if ((!targ->minvis || perceives(mtmp->data)) && !targ->mundetected) if ((!targ->minvis || perceives(mtmp->data))
&& !targ->mundetected)
break; break;
/* If the pet can't see it, it assumes it aint there */ /* If the pet can't see it, it assumes it aint there */
targ = 0; targ = 0;
@@ -810,7 +808,6 @@ struct monst *mtmp, *mtarg;
return score; return score;
} }
STATIC_OVL struct monst * STATIC_OVL struct monst *
best_target(mtmp) best_target(mtmp)
struct monst *mtmp; /* Pet */ struct monst *mtmp; /* Pet */
@@ -862,7 +859,6 @@ struct monst *mtmp; /* Pet */
return best_targ; return best_targ;
} }
/* return 0 (no move), 1 (move) or 2 (dead) */ /* return 0 (no move), 1 (move) or 2 (dead) */
int int
dog_move(mtmp, after) dog_move(mtmp, after)
@@ -1142,6 +1138,7 @@ int after; /* this is extra fast monster movement */
/* How hungry is the pet? */ /* How hungry is the pet? */
if (!mtmp->isminion) { if (!mtmp->isminion) {
struct edog *dog = EDOG(mtmp); struct edog *dog = EDOG(mtmp);
hungry = (g.monstermoves > (dog->hungrytime + 300)); hungry = (g.monstermoves > (dog->hungrytime + 300));
} }
+10 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 end.c $NHDT-Date: 1554591224 2019/04/06 22:53:44 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.168 $ */ /* NetHack 3.6 end.c $NHDT-Date: 1557094801 2019/05/05 22:20:01 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.170 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -479,6 +479,15 @@ int how;
} }
Strcpy(g.killer.name, buf); Strcpy(g.killer.name, buf);
/*
* Chicken and egg issue:
* Ordinarily Unchanging ought to override something like this,
* but the transformation occurs at death. With the current code,
* the effectiveness of Unchanging stops first, but a case could
* be made that it should last long enough to prevent undead
* transformation. (Turning to slime isn't an issue here because
* Unchanging prevents that from happening.)
*/
if (mptr->mlet == S_WRAITH) if (mptr->mlet == S_WRAITH)
u.ugrave_arise = PM_WRAITH; u.ugrave_arise = PM_WRAITH;
else if (mptr->mlet == S_MUMMY && g.urace.mummynum != NON_PM) else if (mptr->mlet == S_MUMMY && g.urace.mummynum != NON_PM)
+2
View File
@@ -842,6 +842,8 @@ xchar x, y; /* clone's preferred location or 0 (near mon) */
m2->mx = mm.x; m2->mx = mm.x;
m2->my = mm.y; m2->my = mm.y;
m2->mundetected = 0;
m2->mtrapped = 0;
m2->mcloned = 1; m2->mcloned = 1;
m2->minvent = (struct obj *) 0; /* objects don't clone */ m2->minvent = (struct obj *) 0; /* objects don't clone */
m2->mleashed = FALSE; m2->mleashed = FALSE;
+3 -1
View File
@@ -408,7 +408,8 @@ register struct monst *magr, *mdef;
|| objects[g.otmp->otyp].oc_material == METAL)) || objects[g.otmp->otyp].oc_material == METAL))
&& mdef->mhp > 1 && mdef->mhp > 1
&& !mdef->mcan) { && !mdef->mcan) {
if (clone_mon(mdef, 0, 0)) { struct monst *mclone;
if ((mclone = clone_mon(mdef, 0, 0)) != 0) {
if (g.vis && canspotmon(mdef)) { if (g.vis && canspotmon(mdef)) {
char buf[BUFSZ]; char buf[BUFSZ];
@@ -416,6 +417,7 @@ register struct monst *magr, *mdef;
pline("%s divides as %s hits it!", buf, pline("%s divides as %s hits it!", buf,
mon_nam(magr)); mon_nam(magr));
} }
mintrap(mclone);
} }
} }
} else } else
+7 -4
View File
@@ -320,6 +320,8 @@ xchar rtype;
boolean oneshot; boolean oneshot;
d_level *lev; d_level *lev;
{ {
struct monst *mtmp;
if (bad_location(x, y, nlx, nly, nhx, nhy)) { if (bad_location(x, y, nlx, nly, nhx, nhy)) {
if (!oneshot) { if (!oneshot) {
return FALSE; /* caller should try again */ return FALSE; /* caller should try again */
@@ -340,11 +342,12 @@ d_level *lev;
case LR_UPTELE: case LR_UPTELE:
case LR_DOWNTELE: case LR_DOWNTELE:
/* "something" means the player in this case */ /* "something" means the player in this case */
if (MON_AT(x, y)) { if ((mtmp = m_at(x, y)) != 0) {
/* move the monster if no choice, or just try again */ /* move the monster if no choice, or just try again */
if (oneshot) if (oneshot) {
(void) rloc(m_at(x, y), FALSE); if (!rloc(mtmp, TRUE))
else m_into_limbo(mtmp);
} else
return FALSE; return FALSE;
} }
u_on_newpos(x, y); u_on_newpos(x, y);
+1
View File
@@ -1685,6 +1685,7 @@ struct monst **monst_list; /* &g.migrating_mons or &g.mydogs or null */
} }
if (on_map) { if (on_map) {
mon->mtrapped = 0;
if (mon->wormno) if (mon->wormno)
remove_worm(mon); remove_worm(mon);
else else
+2 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 monmove.c $NHDT-Date: 1545596010 2018/12/23 20:13:30 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.111 $ */ /* NetHack 3.6 monmove.c $NHDT-Date: 1557094802 2019/05/05 22:20:02 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.113 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2006. */ /*-Copyright (c) Michael Allison, 2006. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1620,6 +1620,7 @@ register struct monst *mtmp;
if (!gotu) { if (!gotu) {
register int try_cnt = 0; register int try_cnt = 0;
do { do {
if (++try_cnt > 200) if (++try_cnt > 200)
goto found_you; /* punt */ goto found_you; /* punt */
+3 -1
View File
@@ -1222,7 +1222,8 @@ int dieroll;
/* but not bashing with darts, arrows or ya */ /* but not bashing with darts, arrows or ya */
&& !(is_ammo(obj) || is_missile(obj))) && !(is_ammo(obj) || is_missile(obj)))
&& hand_to_hand) { && hand_to_hand) {
if (clone_mon(mon, 0, 0)) { struct monst *mclone;
if ((mclone = clone_mon(mon, 0, 0)) != 0) {
char withwhat[BUFSZ]; char withwhat[BUFSZ];
withwhat[0] = '\0'; withwhat[0] = '\0';
@@ -1230,6 +1231,7 @@ int dieroll;
Sprintf(withwhat, " with %s", yname(obj)); Sprintf(withwhat, " with %s", yname(obj));
pline("%s divides as you hit it%s!", Monnam(mon), withwhat); pline("%s divides as you hit it%s!", Monnam(mon), withwhat);
hittxt = TRUE; hittxt = TRUE;
mintrap(mclone);
} }
} }
+50 -24
View File
@@ -71,18 +71,27 @@
The distributed copy of config.h will work successfully on VMS; The distributed copy of config.h will work successfully on VMS;
vmsconf.h has conditional code to deal with the UNIX-specific items. vmsconf.h has conditional code to deal with the UNIX-specific items.
4. If you have the programming utilities lex or flex and yacc or bison, 4. vmsbuild.com checks for several source files in [.util] and if it doesn't
you may edit the procedure [.sys.vms]spec_lev.com and execute it to find them, it uses [.sys.vms]spec_lev.com to generate them. If you have
process several source files for NetHack's special level and dungeon the programming utilities lex or flex and yacc or bison, they be will
compilers. If you use the version of these utilities from the OpenVMS used if symbols are set up to run them. Or if you have them but do not
freeware CD you will have to remove the include <stdlib.h> that yacc have symbols set up, you may edit spec_lev.com to have it run them.
places at the top of each file. The provided spec_lev.com will default If neither of those situations applies, spec_lev.com will default to
to copy pre-processed versions of the appropriate files (dgn_lex.c, lev_lex.c, copying pre-genearated versions of the appropriate files (dgn_lex.c,
dgn_yacc.c, lev_yacc.c, dgn_comp.h, and lev_comp.h) from [.sys.share] lev_lex.c, dgn_yacc.c, lev_yacc.c, dgn_comp.h, and lev_comp.h) from
into [.util]*.c and [.include]*.h. [.sys.share] into [.util]*.c and [.include]*.h.
If you choose to modify spec_lev.com, you want to run and test your
changes prior to executing vmsbuild.com; otherwise, vmsbuild.com will Once the file lev_yacc.c is in place, vmsbuild.com won't execute
do so for you and the results might not be what you expect. spec_lev.com to make any of them, so if you decide to modify *_comp.l
and/or *_comp.y then you'll either need to execute spec_lev.com before
vmsbuild.com or remove [.util]lev_yacc.c so vmsbuild.com will do so.
If you use the versions of the lex and yacc utilities from the OpenVMS
freeware CD, you will need to pass "/Define=_DECC_V4_SOURCE" as the
third argument to vmsbuild.com in step #5. The version of yacc
or bison in that distribution places '#include <stdlib.h>' in the
generated code, before nethack's '#include "config.h"', leading to
conflicts that prevent compilation from completing.
5. To build NETHACK.EXE and its auxiliary programs, execute the 5. To build NETHACK.EXE and its auxiliary programs, execute the
following DCL command: following DCL command:
@@ -212,6 +221,9 @@ Notes:
is the preferred way to compile because it's guaranteed to compile is the preferred way to compile because it's guaranteed to compile
and link everything. and link everything.
[Note: Makefile.* have been updated occasionally but not exercised
for a long time, so might not be in working order.]
4. termcap is an ASCII data file containing descriptions of terminal 4. termcap is an ASCII data file containing descriptions of terminal
capabilities and the escape sequences that software must use to take capabilities and the escape sequences that software must use to take
advantage of them. If you do not already have a termcap file in use advantage of them. If you do not already have a termcap file in use
@@ -240,7 +252,11 @@ Notes:
termcap file, otherwise a message about "Unknown terminal type" will termcap file, otherwise a message about "Unknown terminal type" will
be printed and NetHack will exit. be printed and NetHack will exit.
5. NetHack contains code which attempts to make it secure in case it's 5. Both vmsbuild.com and Makefile.src have provisions to build nethack's
'curses' interface, but the source code for it won't compile using
the implementation of curses which is supplied with VMS.
6. NetHack contains code which attempts to make it secure in case it's
installed with privileges (to allow the playground to be protected installed with privileges (to allow the playground to be protected
against world write access). This has only undergone limited testing, against world write access). This has only undergone limited testing,
so install NetHack with privileges at your own risk. If you discover so install NetHack with privileges at your own risk. If you discover
@@ -293,7 +309,7 @@ Notes:
built NetHack, you can relink with tracebacks disabled by doing built NetHack, you can relink with tracebacks disabled by doing
$ @[.SYS.VMS]VMSBUILD "LINK" "" "" "/noTrace/noDebug" $ @[.SYS.VMS]VMSBUILD "LINK" "" "" "/noTrace/noDebug"
6. If you can't or won't install nethack.exe with privileges and if you 7. If you can't or won't install nethack.exe with privileges and if you
don't have access to a privileged account yourself, then if you intend don't have access to a privileged account yourself, then if you intend
to allow other users to access your copy of NetHack you should probably to allow other users to access your copy of NetHack you should probably
place an ACL on the playground directory and its save subdirectory. place an ACL on the playground directory and its save subdirectory.
@@ -326,7 +342,7 @@ Notes:
you to run recover.exe on behalf of other users, because you won't be you to run recover.exe on behalf of other users, because you won't be
able to create files owned by them unless you have elevated privileges. able to create files owned by them unless you have elevated privileges.
7. Many NetHack commands can be aborted by sending it the <escape> 8. Many NetHack commands can be aborted by sending it the <escape>
character when it wants input. This is displayed as ESC inside the character when it wants input. This is displayed as ESC inside the
game. Digital VK201 keyboards (used by VT2xx and VT3xx and older game. Digital VK201 keyboards (used by VT2xx and VT3xx and older
VAXstations) and VK401 keyboards (used by VT4xx, newer VAXstations, VAXstations) and VK401 keyboards (used by VT4xx, newer VAXstations,
@@ -366,16 +382,18 @@ Notes:
be sure to remember to eventually reattach to the NetHack subprocess; be sure to remember to eventually reattach to the NetHack subprocess;
otherwise the game in progress won't get saved when you logout. otherwise the game in progress won't get saved when you logout.
8. NetHack optionally maintains a logfile which receives one line appended 9. NetHack optionally maintains a logfile which receives one line appended
to it whenever a game ends. This can be disabled entirely by adding to it whenever a game ends. This can be disabled entirely by adding
an "#undef LOGFILE" directive to vmsconf.h prior to building the an "#undef LOGFILE" directive to vmsconf.h prior to building the
program, or it can be disabled later by removing the file(s) LOGFILE.;* program, or it can be disabled later by removing the file(s) LOGFILE.;*
from the playground directory. If not disabled prior to compilation, from the playground directory. If not disabled prior to compilation,
the logfile can be reinitialized by simply creating an empty file the logfile can be reinitialized by simply creating an empty file
named LOGFILE in the playground, but make sure that users are able named LOGFILE in the playground, but make sure that users are able
to write into it, or new entries will not be appended. to write into it, or new entries will not be appended. A somewhat
more elaborate log file named XLOGFILE containing more information is
handled similarly.
9. Some attempt at support for VMS versions earlier than V4.6 has been 10. Some attempt at support for VMS versions earlier than V4.6 has been
included, but no such obsolete system was available for testing it. included, but no such obsolete system was available for testing it.
vmsbuild.com detects the need for the extra support routines and vmsbuild.com detects the need for the extra support routines and
arranges automatically for them to be compiled. The reason that arranges automatically for them to be compiled. The reason that
@@ -383,7 +401,10 @@ Notes:
underwent a major revision for VMS V4.6 and several routines which underwent a major revision for VMS V4.6 and several routines which
NetHack utilizes were not available prior to that upgrade. NetHack utilizes were not available prior to that upgrade.
10. vmsbuild.com collects almost all of the object files (xxx.OBJ) into [That was written many years ago and the chance of it still working
is very small.]
11. vmsbuild.com collects almost all of the object files (xxx.OBJ) into
an object library (NETHACK.OLB) as it compiles the source files. an object library (NETHACK.OLB) as it compiles the source files.
This should prevent the quota-exceeded problems from the linker This should prevent the quota-exceeded problems from the linker
that some sites have reported for prior versions. Note that if you that some sites have reported for prior versions. Note that if you
@@ -395,7 +416,7 @@ Notes:
If you forget to replace the library entry, your newly compiled code If you forget to replace the library entry, your newly compiled code
will not be included in the new executable image. will not be included in the new executable image.
11. To access "wizard mode"--intended for debugging purposes, not to 12. To access "wizard mode"--intended for debugging purposes, not to
spoil the game with unlimited wishes--you must be running from the spoil the game with unlimited wishes--you must be running from the
username compiled into the game via Local_WIZARD in vmsconf.h, and username compiled into the game via Local_WIZARD in vmsconf.h, and
you must specify "-D" on the command line when invoking NetHack. you must specify "-D" on the command line when invoking NetHack.
@@ -405,7 +426,11 @@ Notes:
$ @hackdir:nethack "-D" $ @hackdir:nethack "-D"
Any character name you specify will be ignored in favor of "wizard". Any character name you specify will be ignored in favor of "wizard".
12. At program startup time, NetHack uses the empty file PERM to prevent [More out of date information. Rather than compile-time Local_WIZARD,
uses(s) allowed to entre wizard mode are now controlled by the entry
WIZARDS in the file SYSCONF.]
13. At program startup time, NetHack uses the empty file PERM to prevent
two different processes from using the same character name (under the two different processes from using the same character name (under the
same UIC ownership) at the same time. It does this by temporarily same UIC ownership) at the same time. It does this by temporarily
giving that file a second directory entry named PERM.LOCK, then giving that file a second directory entry named PERM.LOCK, then
@@ -447,7 +472,7 @@ Notes:
is accomplished using temporary entry RECORD.LOCK and LOGFILE using is accomplished using temporary entry RECORD.LOCK and LOGFILE using
entry LOGFILE.LOCK. entry LOGFILE.LOCK.
13. Unless you have both Motif and the Athena Widget set from MIT, you 14. Unless you have both Motif and the Athena Widget set from MIT, you
will not be able to use the X11 interface on VMS. Even if you do will not be able to use the X11 interface on VMS. Even if you do
have both those things, such a configuration has not been tested and have both those things, such a configuration has not been tested and
there are no provisions for it in vmsbuild.com. Makefile.src does there are no provisions for it in vmsbuild.com. Makefile.src does
@@ -473,14 +498,15 @@ Notes:
window manager in order for any changes to take effect; it's easiest window manager in order for any changes to take effect; it's easiest
to just make the session manager quit and then log in again. to just make the session manager quit and then log in again.
14. If necessary, send problem reports via e-mail to 15. If necessary, send problem reports via e-mail to
<devteam@nethack.org> <devteam@nethack.org>
Always include version information for NetHack, the operating system, Always include version information for NetHack, the operating system,
and the C compiler used. and the C compiler used.
20-OCT-2003 20-OCT-2003
minimally updated 9-NOV-2015... minimally updated 9-NOV-2015...
and again 5-MAY-2019...
# NetHack 3.6 Install.vms $NHDT-Date: 1524689427 2018/04/25 20:50:27 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.12 $ # NetHack 3.6 Install.vms $NHDT-Date: 1557100606 2019/05/05 23:56:46 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.14 $
# Copyright (c) 2003 by Robert Patrick Rankin # Copyright (c) 2003 by Robert Patrick Rankin
# NetHack may be freely redistributed. See license for details. # NetHack may be freely redistributed. See license for details.
+1 -1
View File
@@ -432,7 +432,7 @@ boolean border;
w += (int) strlen(text); w += (int) strlen(text);
/* if preceding field has any trailing spaces, don't add extra; /* if preceding field has any trailing spaces, don't add extra;
(should only apply to prev==title; status_update() handles (should only apply to prev==title; status_update() handles
others that used to have trailing spaces by stripping such */ others that used to have trailing spaces by stripping such) */
if (spacing[fld] > 0 && prev_fld != BL_FLUSH if (spacing[fld] > 0 && prev_fld != BL_FLUSH
&& *(p = status_vals[prev_fld]) && *(eos(p) - 1) == ' ' && *(p = status_vals[prev_fld]) && *(eos(p) - 1) == ' '
&& (prev_fld != BL_TITLE || !iflags.wc2_hitpointbar)) && (prev_fld != BL_TITLE || !iflags.wc2_hitpointbar))
+4 -4
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 wintty.c $NHDT-Date: 1555702074 2019/04/19 19:27:54 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.202 $ */ /* NetHack 3.6 wintty.c $NHDT-Date: 1557088734 2019/05/05 20:38:54 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.203 $ */
/* Copyright (c) David Cohrs, 1991 */ /* Copyright (c) David Cohrs, 1991 */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -3929,7 +3929,7 @@ unsigned long *colormasks;
tty_status[NOW][fldidx].lth = 30 + 2; /* '[' and ']' */ tty_status[NOW][fldidx].lth = 30 + 2; /* '[' and ']' */
break; break;
case BL_GOLD: case BL_GOLD:
/* \GXXXXNNNN counts as 1 */ /* \GXXXXNNNN counts as 1 [moot since we use decode_mixed() above] */
if ((p = index(status_vals[fldidx], '\\')) != 0 && p[1] == 'G') if ((p = index(status_vals[fldidx], '\\')) != 0 && p[1] == 'G')
tty_status[NOW][fldidx].lth -= (10 - 1); tty_status[NOW][fldidx].lth -= (10 - 1);
break; break;
@@ -4036,7 +4036,7 @@ int sz[3];
/* On a change to the field location, everything further /* On a change to the field location, everything further
to the right must be updated as well. (Not necessarily to the right must be updated as well. (Not necessarily
everything; it's possible for complementary changes to everything; it's possible for complementary changes across
multiple fields to put stuff further right back in sync.) */ multiple fields to put stuff further right back in sync.) */
if (tty_status[NOW][idx].x + tty_status[NOW][idx].lth if (tty_status[NOW][idx].x + tty_status[NOW][idx].lth
!= tty_status[BEFORE][idx].x + tty_status[BEFORE][idx].lth) != tty_status[BEFORE][idx].x + tty_status[BEFORE][idx].lth)
@@ -4501,7 +4501,7 @@ render_status(VOID_ARGS)
x += tlth; x += tlth;
} }
finalx[row][NOW] = x - 1; finalx[row][NOW] = x - 1;
/* reset .redraw, .dirty, .padright now that they're rendered */ /* reset .redraw and .dirty now that they're rendered */
tty_status[NOW][idx].dirty = FALSE; tty_status[NOW][idx].dirty = FALSE;
tty_status[NOW][idx].redraw = FALSE; tty_status[NOW][idx].redraw = FALSE;
/* /*