diff --git a/doc/fixes36.2 b/doc/fixes36.2 index d891d6e63..dbe5691c9 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -156,9 +156,6 @@ a wand of polymorph lost its magical ability for the turn just because the much sense floating eye is classified as a flyer but flying is blocked while levitating, so don't set intrinsic flying if hero is polymorphed into one -being trapped (bear trap, web, molten or solidified lava, chained to buried - iron ball) blocks both levitation and flight (note: being stuck in a - pit ends when either of those starts so doesn't apply) change default value for the 'autodescribe' option to 'on' Elbereth hypocrisy penalty doesn't apply if attacking a monster which isn't frightened by Elbereth; normal scuffing of engravings still applies @@ -300,6 +297,12 @@ identifying or forgetting gem types now adjusts prices for gems already on when fire converts an ice location into a water location, dunk any monster on that spot immediately instead of waiting until its next move training riding skill had an off-by-one bug when counting turns riding +message sequencing when vampire shifts to fog cloud to pass under closed door: + when in sight, give form change message before moving to door spot +limit carrying heavy loads from water to land +failing to carry a wished-for item behaved differenctly from dropping one +life-saving while weak/starving/fainting boosted nutrition without restoring + lost point of strength, making temporary loss be permanent Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository @@ -333,6 +336,7 @@ a config file line with OPTIONS=symset:default, roguesymset:RogueEpyx meant to have color; that was due to an errant init_symbols() call during the processing of symset:default done after RogueEpyx had already been processed +avoid potential segfault when doing 'more information' lookup tty: turn off an optimization that is the suspected cause of Windows reported partial status lines following level changes tty: ensure that current status fields are always copied to prior status @@ -447,6 +451,11 @@ for ^X and enlightenment, display the information in a menu rather than a needed for interfaces (tty) without text popup scrollbar support; end of game disclosure of attributes remains single-forward-pass for ^X, include current state of 'autopickup' +being trapped (bear trap, web, molten or solidified lava, chained to buried + iron ball) blocks both levitation and flight (note: being stuck in a + pit ends when either of those starts so doesn't apply) +early level traps are sometimes covered by the remains of fake players +fake player characters resist Conflict NetHack Community Patches (or Variation) Included diff --git a/include/extern.h b/include/extern.h index 1f801d6df..1bcbcef38 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 extern.h $NHDT-Date: 1545439142 2018/12/22 00:39:02 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.676 $ */ +/* NetHack 3.6 extern.h $NHDT-Date: 1545597403 2018/12/23 20:36:43 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.676 $ */ /* Copyright (c) Steve Creps, 1988. */ /* NetHack may be freely redistributed. See license for details. */ @@ -536,7 +536,7 @@ E void FDECL(impact_drop, (struct obj *, XCHAR_P, XCHAR_P, XCHAR_P)); E int NDECL(dothrow); E int NDECL(dofire); E void FDECL(endmultishot, (BOOLEAN_P)); -E void FDECL(hitfloor, (struct obj *)); +E void FDECL(hitfloor, (struct obj *, BOOLEAN_P)); E void FDECL(hurtle, (int, int, int, BOOLEAN_P)); E void FDECL(mhurtle, (struct monst *, int, int, int)); E boolean FDECL(throwing_weapon, (struct obj *)); diff --git a/src/artifact.c b/src/artifact.c index c31de3041..bdd8590ba 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 artifact.c $NHDT-Date: 1543745353 2018/12/02 10:09:13 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.127 $ */ +/* NetHack 3.6 artifact.c $NHDT-Date: 1545597414 2018/12/23 20:36:54 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.128 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1469,6 +1469,7 @@ struct obj *obj; } case ENERGY_BOOST: { int epboost = (u.uenmax + 1 - u.uen) / 2; + if (epboost > 120) epboost = 120; /* arbitrary */ else if (epboost < 12) @@ -1587,6 +1588,7 @@ struct obj *obj; otmp->owt = weight(otmp); otmp = hold_another_object(otmp, "Suddenly %s out.", aobjnam(otmp, "fall"), (char *) 0); + nhUse(otmp); break; } } @@ -1610,7 +1612,7 @@ struct obj *obj; } if ((eprop & ~W_ARTI) || iprop) { - nothing_special: + nothing_special: /* you had the property from some other source too */ if (carried(obj)) You_feel("a surge of power, but nothing seems to happen."); @@ -1964,7 +1966,7 @@ boolean loseit; /* whether to drop it if hero can longer touch it */ if (loseit && obj) { if (Levitation) { freeinv(obj); - hitfloor(obj); + hitfloor(obj, TRUE); } else { /* dropx gives a message iff item lands on an altar */ if (!IS_ALTAR(levl[u.ux][u.uy].typ)) diff --git a/src/do.c b/src/do.c index 7469e05f2..a9e65a2d6 100644 --- a/src/do.c +++ b/src/do.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 do.c $NHDT-Date: 1545043771 2018/12/17 10:49:31 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.181 $ */ +/* NetHack 3.6 do.c $NHDT-Date: 1545597418 2018/12/23 20:36:58 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.182 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -610,7 +610,7 @@ register struct obj *obj; if (obj->oclass == COIN_CLASS) context.botl = 1; freeinv(obj); - hitfloor(obj); + hitfloor(obj, TRUE); if (levhack) float_down(I_SPECIAL | TIMEOUT, W_ARTI | W_ART); return 1; diff --git a/src/dothrow.c b/src/dothrow.c index 24ce9317f..853f625f2 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 dothrow.c $NHDT-Date: 1545044705 2018/12/17 11:05:05 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.154 $ */ +/* NetHack 3.6 dothrow.c $NHDT-Date: 1545597420 2018/12/23 20:37:00 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.155 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -413,21 +413,21 @@ boolean verbose; } } -/* - * Object hits floor at hero's feet. Called from drop() and throwit(). - */ +/* Object hits floor at hero's feet. + Called from drop(), throwit(), hold_another_object(). */ void -hitfloor(obj) -register struct obj *obj; +hitfloor(obj, verbosely) +struct obj *obj; +boolean verbosely; /* usually True; False if caller has given drop message */ { - if (IS_SOFT(levl[u.ux][u.uy].typ) || u.uinwater) { + if (IS_SOFT(levl[u.ux][u.uy].typ) || u.uinwater || u.uswallow) { dropy(obj); return; } if (IS_ALTAR(levl[u.ux][u.uy].typ)) doaltarobj(obj); - else - pline("%s hit%s the %s.", Doname2(obj), (obj->quan == 1L) ? "s" : "", + else if (verbosely) + pline("%s %s the %s.", Doname2(obj), otense(obj, "hit"), surface(u.ux, u.uy)); if (hero_breaks(obj, u.ux, u.uy, TRUE)) @@ -1045,7 +1045,7 @@ boolean hitsroof; done(STONING); return obj ? TRUE : FALSE; } - hitfloor(obj); + hitfloor(obj, TRUE); thrownobj = 0; losehp(Maybe_Half_Phys(dmg), "falling object", KILLED_BY_AN); } @@ -1166,7 +1166,7 @@ boolean twoweap; /* used to restore twoweapon mode if wielded weapon returns */ for dealing with cursed saddle: throw holy water > */ potionhit(u.usteed, obj, POTHIT_HERO_THROW); } else { - hitfloor(obj); + hitfloor(obj, TRUE); } thrownobj = (struct obj *) 0; return; diff --git a/src/end.c b/src/end.c index c2ddf0821..ce94ce6a6 100644 --- a/src/end.c +++ b/src/end.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 end.c $NHDT-Date: 1545172226 2018/12/18 22:30:26 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.159 $ */ +/* NetHack 3.6 end.c $NHDT-Date: 1545646111 2018/12/24 10:08:31 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.160 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -836,16 +836,13 @@ int how; u.uhp = u.uhpmax; if (Upolyd) /* Unchanging, or death which bypasses losing hit points */ u.mh = u.mhmax; - if (u.uhunger < 500) { - u.uhunger = 500; - newuhs(FALSE); + if (u.uhunger < 500 || how == CHOKING) { + init_uhunger(); } /* cure impending doom of sickness hero won't have time to fix */ if ((Sick & TIMEOUT) == 1L) { make_sick(0L, (char *) 0, FALSE, SICK_ALL); } - if (how == CHOKING) - init_uhunger(); g.nomovemsg = "You survived that attempt on your life."; context.move = 0; if (g.multi > 0) @@ -1037,9 +1034,12 @@ int how; if (iflags.debug_fuzzer) { if (!(program_state.panicking || how == PANICKED)) { savelife(how); - /* periodically restore characteristics and lost exp levels */ + /* periodically restore characteristics and lost exp levels + or cure lycanthropy */ if (!rn2(10)) { - struct obj *potion = mksobj(POT_RESTORE_ABILITY, TRUE, FALSE); + struct obj *potion = mksobj((u.ulycn > LOW_PM && !rn2(3)) + ? POT_WATER : POT_RESTORE_ABILITY, + TRUE, FALSE); bless(potion); (void) peffects(potion); /* always -1 for restore ability */ diff --git a/src/hack.c b/src/hack.c index b5c6998ab..a28a14ef8 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 hack.c $NHDT-Date: 1544401269 2018/12/10 00:21:09 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.201 $ */ +/* NetHack 3.6 hack.c $NHDT-Date: 1545530973 2018/12/23 02:09:33 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.202 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1427,6 +1427,19 @@ domove() } x = u.ux + u.dx; y = u.uy + u.dy; + + /* are we trying to move out of water while carrying too much? */ + if (isok(x, y) && !is_pool(x, y) && !Is_waterlevel(&u.uz) + && wtcap > (Swimming ? MOD_ENCUMBER : SLT_ENCUMBER)) { + /* when escaping from drowning you need to be unencumbered + in order to crawl out of water, but when not drowning, + doing so while encumbered is feasible; if in an aquatic + form, stressed or less is allowed; otherwise (magical + breathing), only burdened is allowed */ + You("are carrying too much to climb out of the water."); + nomul(0); + return; + } } if (!isok(x, y)) { nomul(0); @@ -1439,6 +1452,7 @@ domove() if (iflags.mention_walls) { if (trap && trap->tseen) { int tt = what_trap(trap->ttyp); + You("stop in front of %s.", an(defsyms[trap_to_defsym(tt)].explanation)); } else if (is_pool_or_lava(x,y) && levl[x][y].seenv) { diff --git a/src/invent.c b/src/invent.c index 3785beb59..6cef966a0 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 invent.c $NHDT-Date: 1545043772 2018/12/17 10:49:32 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.244 $ */ +/* NetHack 3.6 invent.c $NHDT-Date: 1545597422 2018/12/23 20:37:02 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.245 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -970,9 +970,9 @@ const char *drop_fmt, *drop_arg, *hold_msg; } } if (Fumbling) { - if (drop_fmt) - pline(drop_fmt, drop_arg); - dropy(obj); + obj->nomerge = 1; + obj = addinv(obj); /* dropping expects obj to be in invent */ + goto drop_it; } else { long oquan = obj->quan; int prev_encumbr = near_capacity(); /* before addinv() */ @@ -989,12 +989,10 @@ const char *drop_fmt, *drop_arg, *hold_msg; obj = addinv(obj); if (inv_cnt(FALSE) > 52 || ((obj->otyp != LOADSTONE || !obj->cursed) && near_capacity() > prev_encumbr)) { - if (drop_fmt) - pline(drop_fmt, drop_arg); /* undo any merge which took place */ if (obj->quan > oquan) obj = splitobj(obj, oquan); - dropx(obj); + goto drop_it; } else { if (flags.autoquiver && !uquiver && !obj->owornmask && (is_missile(obj) || ammo_and_launcher(obj, uwep) @@ -1005,6 +1003,18 @@ const char *drop_fmt, *drop_arg, *hold_msg; } } return obj; + + drop_it: + if (drop_fmt) + pline(drop_fmt, drop_arg); + obj->nomerge = 0; + if (can_reach_floor(TRUE)) { + dropx(obj); + } else { + freeinv(obj); + hitfloor(obj, FALSE); + } + return (struct obj *) 0; /* might be gone */ } /* useup() all of an item regardless of its quantity */ diff --git a/src/mail.c b/src/mail.c index b2a119750..d1ceb7aa1 100644 --- a/src/mail.c +++ b/src/mail.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mail.c $NHDT-Date: 1542765359 2018/11/21 01:55:59 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.37 $ */ +/* NetHack 3.6 mail.c $NHDT-Date: 1545597424 2018/12/23 20:37:04 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.39 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Pasi Kallinen, 2018. */ /* NetHack may be freely redistributed. See license for details. */ @@ -186,7 +186,7 @@ coord *startp; */ lax = 0; /* be picky */ max_distance = -1; -retry: + retry: for (row = 0; row < ROWNO; row++) { if (viz_rmin[row] < viz_rmax[row]) { /* There are valid positions on this row. */ @@ -418,15 +418,17 @@ struct mail_info *info; display_nhwindow(WIN_MESSAGE, FALSE); obj = hold_another_object(obj, "Oops!", (const char *) 0, (const char *) 0); + nhUse(obj); } -/* zip back to starting location */ -go_back: + go_back: + /* zip back to starting location */ if (!md_rush(md, start.x, start.y)) md->mx = md->my = 0; /* for mongone, md is not on map */ mongone(md); -/* deliver some classes of messages even if no daemon ever shows up */ -give_up: + + give_up: + /* deliver some classes of messages even if no daemon ever shows up */ if (!message_seen && info->message_typ == MSG_OTHER) pline("Hark! \"%s.\"", info->display_txt); } @@ -609,7 +611,7 @@ boolean adminmsg; else unlink(mailbox); return; -bail: + bail: /* bail out _professionally_ */ if (!adminmsg) pline("It appears to be all gibberish."); diff --git a/src/mkobj.c b/src/mkobj.c index fa3d857c1..dbbaad4f8 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mkobj.c $NHDT-Date: 1542798624 2018/11/21 11:10:24 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.136 $ */ +/* NetHack 3.6 mkobj.c $NHDT-Date: 1545597425 2018/12/23 20:37:05 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.137 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2168,18 +2168,21 @@ boolean tipping; /* caller emptying entire contents; affects shop handling */ being included in its formatted name during next message */ iflags.suppress_price++; if (!tipping) { - obj = hold_another_object( - obj, u.uswallow ? "Oops! %s out of your reach!" - : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) - || levl[u.ux][u.uy].typ < IRONBARS - || levl[u.ux][u.uy].typ >= ICE) - ? "Oops! %s away from you!" - : "Oops! %s to the floor!", - The(aobjnam(obj, "slip")), (const char *) 0); + obj = hold_another_object(obj, + u.uswallow + ? "Oops! %s out of your reach!" + : (Is_airlevel(&u.uz) + || Is_waterlevel(&u.uz) + || levl[u.ux][u.uy].typ < IRONBARS + || levl[u.ux][u.uy].typ >= ICE) + ? "Oops! %s away from you!" + : "Oops! %s to the floor!", + The(aobjnam(obj, "slip")), (char *) 0); + nhUse(obj); } else { /* assumes this is taking place at hero's location */ if (!can_reach_floor(TRUE)) { - hitfloor(obj); /* does altar check, message, drop */ + hitfloor(obj, TRUE); /* does altar check, message, drop */ } else { if (IS_ALTAR(levl[u.ux][u.uy].typ)) doaltarobj(obj); /* does its own drop message */ diff --git a/src/monmove.c b/src/monmove.c index d7ead926c..fb6341c8a 100644 --- a/src/monmove.c +++ b/src/monmove.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 monmove.c $NHDT-Date: 1545439153 2018/12/22 00:39:13 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.110 $ */ +/* 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 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -944,7 +944,7 @@ register int after; mmoved = 1; goto postmov; } -not_special: + not_special: if (u.uswallow && !mtmp->mflee && u.ustuck != mtmp) return 1; omx = mtmp->mx; @@ -1205,7 +1205,7 @@ not_special: chi = i; mmoved = 1; } - nxti: + nxti: ; } } @@ -1249,6 +1249,7 @@ not_special: if ((info[chi] & ALLOW_M) || (nix == mtmp->mux && niy == mtmp->muy)) { struct monst *mtmp2; int mstatus; + mtmp2 = m_at(nix, niy); g.notonhead = mtmp2 && (nix != mtmp2->mx || niy != mtmp2->my); @@ -1272,6 +1273,7 @@ not_special: if ((info[chi] & ALLOW_MDISP)) { struct monst *mtmp2; int mstatus; + mtmp2 = m_at(nix, niy); mstatus = mdisplacem(mtmp, mtmp2, FALSE); if ((mstatus & MM_AGR_DIED) || (mstatus & MM_DEF_DIED)) @@ -1283,6 +1285,7 @@ not_special: if (!m_in_out_region(mtmp, nix, niy)) return 3; + remove_monster(omx, omy); place_monster(mtmp, nix, niy); for (j = MTSZ - 1; j > 0; j--) @@ -1300,18 +1303,51 @@ not_special: if (mtmp->wormno) worm_nomove(mtmp); } -postmov: + postmov: if (mmoved == 1 || mmoved == 3) { boolean canseeit = cansee(mtmp->mx, mtmp->my); if (mmoved == 1) { + /* normal monster move will already have , + but pet dog_move() with 'goto postmov' won't */ + nix = mtmp->mx, niy = mtmp->my; + /* sequencing issue: when monster movement decides that a + monster can move to a door location, it moves the monster + there before dealing with the door rather than after; + so a vampire/bat that is going to shift to fog cloud and + pass under the door is already there but transformation + into fog form--and its message, when in sight--has not + happened yet; we have to move monster back to previous + location before performing the vamp_shift() to make the + message happen at right time, then back to the door again + [if we did the shift above, before moving the monster, + we would need to duplicate it in dog_move()...] */ + if (is_vampshifter(mtmp) && !amorphous(mtmp->data) + && IS_DOOR(levl[nix][niy].typ) + && ((levl[nix][niy].doormask & (D_LOCKED | D_CLOSED)) != 0) + && can_fog(mtmp)) { + if (sawmon) { + remove_monster(nix, niy); + place_monster(mtmp, omx, omy); + newsym(nix, niy), newsym(omx, omy); + } + if (vamp_shift(mtmp, &mons[PM_FOG_CLOUD], sawmon)) { + ptr = mtmp->data; /* update cached value */ + } + if (sawmon) { + remove_monster(omx, omy); + place_monster(mtmp, nix, niy); + newsym(omx, omy), newsym(nix, niy); + } + } + newsym(omx, omy); /* update the old position */ if (mintrap(mtmp) >= 2) { if (mtmp->mx) newsym(mtmp->mx, mtmp->my); return 2; /* it died */ } - ptr = mtmp->data; + ptr = mtmp->data; /* in case mintrap() caused polymorph */ /* open a door, or crash through it, if 'mtmp' can */ if (IS_DOOR(levl[mtmp->mx][mtmp->my].typ) @@ -1332,18 +1368,11 @@ postmov: btrapped = FALSE; } if ((here->doormask & (D_LOCKED | D_CLOSED)) != 0 - && (amorphous(ptr) - || (can_fog(mtmp) - && vamp_shift(mtmp, &mons[PM_FOG_CLOUD], - sawmon)))) { - /* update cached value for vamp_shift() case */ - ptr = mtmp->data; + && amorphous(ptr)) { if (flags.verbose && canseemon(mtmp)) pline("%s %s under the door.", Monnam(mtmp), (ptr == &mons[PM_FOG_CLOUD] - || ptr->mlet == S_LIGHT) - ? "flows" - : "oozes"); + || ptr->mlet == S_LIGHT) ? "flows" : "oozes"); } else if (here->doormask & D_LOCKED && can_unlock) { if (btrapped) { here->doormask = D_NODOOR; @@ -1732,6 +1761,9 @@ boolean domsg; pline("You %s %s where %s was.", !canseemon(mon) ? "now detect" : "observe", noname_monnam(mon, ARTICLE_A), oldmtype); + /* this message is given when it turns into a fog cloud + in order to move under a closed door */ + display_nhwindow(WIN_MESSAGE, FALSE); } return reslt; diff --git a/src/pager.c b/src/pager.c index 5887aa001..67cde4bd5 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pager.c $NHDT-Date: 1545361111 2018/12/21 02:58:31 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.143 $ */ +/* NetHack 3.6 pager.c $NHDT-Date: 1545595360 2018/12/23 20:02:40 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.144 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2018. */ /* NetHack may be freely redistributed. See license for details. */ @@ -646,9 +646,9 @@ char *supplemental_name; The Eyes of the Overworld" simplified above to "lenses named The Eyes of the Overworld", now reduced to "The Eyes of the Overworld", skip "The" as with base name processing) */ - if (!strncmpi(alt, "a ", 2) - || !strncmpi(alt, "an ", 3) - || !strncmpi(alt, "the ", 4)) + if (alt && (!strncmpi(alt, "a ", 2) + || !strncmpi(alt, "an ", 3) + || !strncmpi(alt, "the ", 4))) alt = index(alt, ' ') + 1; /* remove charges or "(lit)" or wizmode "(N aum)" */ if ((ep = strstri(dbase_str, " (")) != 0 && ep > dbase_str) diff --git a/src/pickup.c b/src/pickup.c index ac5485c56..f650e8460 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pickup.c $NHDT-Date: 1543188989 2018/11/25 23:36:29 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.220 $ */ +/* NetHack 3.6 pickup.c $NHDT-Date: 1545597427 2018/12/23 20:37:07 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.221 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2010,6 +2010,7 @@ boolean *prev_loot; } otmp = hold_another_object(otmp, "You drop %s!", doname(otmp), (const char *) 0); + nhUse(otmp); timepassed = rnd(3); if (prev_loot) *prev_loot = TRUE; @@ -3175,7 +3176,7 @@ struct obj *box; /* or bag */ if (highdrop) { /* might break or fall down stairs; handles altars itself */ - hitfloor(otmp); + hitfloor(otmp, TRUE); } else { if (altarizing) { doaltarobj(otmp); diff --git a/src/potion.c b/src/potion.c index 2ebdf8073..53a3fe01d 100644 --- a/src/potion.c +++ b/src/potion.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 potion.c $NHDT-Date: 1545182147 2018/12/19 01:15:47 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.156 $ */ +/* NetHack 3.6 potion.c $NHDT-Date: 1545597429 2018/12/23 20:37:09 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.157 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2234,6 +2234,7 @@ more_dips: singlepotion = hold_another_object(singlepotion, "You juggle and drop %s!", doname(singlepotion), (const char *) 0); + nhUse(singlepotion); update_inventory(); return 1; } diff --git a/src/uhitm.c b/src/uhitm.c index 520ee9271..4eeb4bee4 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 uhitm.c $NHDT-Date: 1544840256 2018/12/15 02:17:36 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.196 $ */ +/* NetHack 3.6 uhitm.c $NHDT-Date: 1545597432 2018/12/23 20:37:12 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.197 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1541,7 +1541,8 @@ struct attack *mattk; /* give the object to the character */ otmp = hold_another_object(otmp, "You snatched but dropped %s.", doname(otmp), "You steal: "); - if (otmp->where != OBJ_INVENT) + /* might have dropped otmp, and it might have broken or left level */ + if (!otmp || otmp->where != OBJ_INVENT) continue; if (theft_petrifies(otmp)) break; /* stop thieving even though hero survived */ diff --git a/src/zap.c b/src/zap.c index 134a0abc6..364349d37 100644 --- a/src/zap.c +++ b/src/zap.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 zap.c $NHDT-Date: 1545431660 2018/12/21 22:34:20 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.303 $ */ +/* NetHack 3.6 zap.c $NHDT-Date: 1545614662 2018/12/24 01:24:22 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.304 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -5082,6 +5082,11 @@ int damage, tell; int resisted; int alev, dlev; + /* fake players always pass resistance test against Conflict + (this doesn't guarantee that they're never affected by it) */ + if (oclass == RING_CLASS && !damage && !tell && is_mplayer(mtmp->data)) + return 1; + /* attack level */ switch (oclass) { case WAND_CLASS: