Introduce a new set of functions to manage delayed killers in the trunk, used
in addressing the various reports of delayed killer confusion. Since existing
delayed killers are related to player properties, the delayed killers are
keyed by uprop indexes. I did this to avoid adding yet another set of
similar identifiers.
- the new delayed_killer() is used for stoning, sliming, sickness, and
delayed self-genocide while polymorphed. Some other timed events don't
use it (and didn't use the old delayed_killer variable) because they
use a fixed message when the timeout occurs.
- A new data structure, struct kinfo, is used to track both delayed and
immediate killers. This encapsulates all the info involved with
identifying a killer. The structure contains a buffer, which subsumes the
old killer_buf and several other buffers that didn't/couldn't use killer_buf.
- the killer list is saved and restored as part of the game state.
- the special case of usick_cause was removed and a delayed killer list
entry is now used in its place
- common code dealing with (un)sliming is moved to a new make_slimed function
- attempted to update all make dependencies for new end.c -> lev.h
dependency, sorry if I messed any up
It makes sense that if you cannot normally move to a location containing a
boulder, dismounting there should be avoided if possible. It seems
that it should be possible to land there if there's no other choice.
Perhaps doing so should result in damage, but that's not in this patch.
<Someone> pointed out the inappropriate appearance of the 3.4.2 message when
fog clouds have you engulfed if you happen to be polymorphed into an aquatic
creature. It does seem that a fog cloud should not cause added damage to
amphibious creatures, which includes breathless (but non-flaming) monsters.
I also thought another message was more appropriate for flaming creatures
(see on_fire()), and added a special case for that.
gulpum was missing symmetric code and I added it there too.
This change adds a new flaming() macro and uses it in several places
where the list of flaming monsters was tested. on_fire() didn't list
salamanders as already being on fire, but should have. A couple other
cases were not updated to include flaming sphere.
While wearing the Eyes of the Overworld, one could use a hook or pole thru
walls. The bug report thought they should work past a boulder, but I
disagree, given a pole or hook's rigid nature, and did not special case that.
couldsee() is not affected by the Eyes, so use that after checking cansee().
Incorporate various killer message grammar fixes suggested by <Someone>.
Mostly these deal with using the proper killer_format and prefix ("the" or
no "the") for unique and type_is_pname monsters, or death to to eating
their corpses.
One case is handled by a general fix to name_to_mon to allow it to deal
with "Croesus' corpse".
The pre-3.4.1 topten behavior for "starved to death" messages is also restored.
Some changes for standard C platforms, to avoid declaring errno explictly.
Such platforms should declare errno in errno.h, which is already included
in the files in question.
Nethack's manes are based on AD&D manes which are in turn based on the
manes of Roman legend. They are supposed to be spirits of the dead.
To that end, added them to the nonliving() macro. The biggest behavioral
change is that death spells no longer effect them, which does technically
make them a bit tougher but also makes sense. Also, they're so wimpy, it's
hard to believe anyone would use a death/disintegration on them anyway.
The choice was to avoid one of the two sellobj() calls in in_container.
Since I liked the message ordering "put gold into... credit" better than
"credit... put gold into", the code now avoids the 1st sellobj call for coins.
This is an initial round of SAFERHANGUP hangup changes. It introduces
SAFERHANGUP, provides the core framework, and enables it for UNIX.
Window-port changes are provided for win/tty, win/X11 and win/gnome. Qt
changes should be forthcoming after having Warwick look at them.
window.doc is updated so windowport maintainers have an clue what needs to
be done to support SAFERHANGUP.
As suggested in a message from <Someone>, add a rumor and an oracle
regarding priestly donations. Keni's suggested wording was incorporated.
A spelling error in another oracle is also fixed.
This patch introduces a change to yname() and Yname2() that avoids the
possessive "your" for the hero's normal, fully identified artifacts.
Quest artifacts still get the possessive, as do all other objects and all
objects not in the hero's possession. shk_your()/Shk_Your() are used in
many places with a specific, generalized name for the object, so I didn't
introduce the artifact behavior there, although I did change them to append
a space, which simplified some other code. Through added use of yname(),
there may be some places that used to just say "corpse" that will now be more
descriptive via yname()'s use of cxname(). I'm sure <Someone> will point
out any such places that are too onerous, although nothing obviously is.
I took the opportunity to inspect many uses of "your" and even Your(). Two
new functions are also introduced, yobjnam() and Yobjnam2(), which work
like aobjnam() and yname() combined, because I found that many uses of
aobjnam() were preceeded by "your" and I couldn't generally provide the
desired behavior for artifacts (or future artifacts) without a combined
function. In some cases, this change allowed better sharing of code.
rust_dmg() still takes a string as input which is sometimes initialized
from xname() and often prepends "your" to it. Currently, this isn't a
problem since there currently are no normal, armor artifacts. If/when any
are introduced, rust_dmg() will need to be addressed.
The patch is for the trunk only. A lot of research was required and I
didn't feel the upside was there for repeating it in the 3.4.3 branch.
A while back, I delayed applying this patch after a discussion about
quivering coins, because I didn't want to change the behavior of GOLDOBJ
vs non-GOLDOBJ games. I'm tired of seeing this diff in my tree, and I
recall there was some sentiment that I should have checked it in, so I'm
adding the feature in the trunk.
Quoting the buglist: "If shk.c does get modified, I'd
like to see a call to rouse_shk() added at the start of rob_shop().
If the shk wakes up for buying and selling, he ought to wake up for
robbery--even when it's covered by the customer's credit--too."
A recent report noted that if you are invisible, teleport into a shop,
steal something, teleport out, and then return, the shopkeeper will become
pacified. This is because the pacification code occurred even if the
shopkeeper already knew your name, as long as the "Welcome" message had not
yet occurred. Implement <Someone>'s proposed fix: Before pacifying, either
the visitct must be zero (as per old code) or the customer name must
already be known. And, of course, the customer name must differ from the
current setting. This skips the pacification code in those situations
where the shopkeeper learned your name but was not happy about it (which is
what visitct > 0 implies, at least initially).
This also deals with an older bug report where you attack a shopkeeper
while outside the shop and then later enter the shop while the shopkeeper
is in it. hot_pursuit() sets the customer name, and the new check avoids
pacifying the shopkeeper for the same reason as noted above.
rewrote the message so it doesn't talk about his body dissolving into gas,
since there's a possibility that he'll leave a corpse. It now doesn't
mention a body at all, so it's not so bad when he doesn't leave a corpse
either. The contents are completely changed, and I think it's more in line
with the sort of thing you'd expect from Master Kaen.
remove_rooms() was trying to be clever and truncate the maximum room bounds
in partially overlapping rooms. In the process, it would truncate the
bounds of L shaped rooms incorrectly, leaving some locations outside the
bounds with the roomno field set. Since the maximum bounds really do not
have to actually match the largest extent of the room in the case of
irregular rooms, it was easiest to just remove the code that was performing
the incorrect truncation. Due to the way remove_room() is coded, this
could result in shopkeeper messages (or, less likely, priest messages,
although that has not been reported yet) occuring for locations to the
right (or the upper/lower right corner) of the MAP on the Bustling Town level.
correct the region where the down stairs can be placed so they don't show up
in a cut off cave. If/when the level generator is improved to avoid generating
such caves, the down stairs region could potentially be changed back.
<Someone> forwarded from rgrn that a monster using Stormbringer would
lose hp when hitting the player. The sign of the "gain" was reversed due
to subtracting the difference in the wrong order.
Build and install the NetHack.ad file, and change the nethack.sh to append
the HACKDIR to the XUSERFILESEARCHPATH. This means users do not have to
do anything special to use the NetHack X11 resources, nor does it require
teaching nethack where the X11 app-defaults directory is. The change also
updates the X11 and linux doc files in a corresponding way.
I think this was From a bug report, but I cannot find the report
anymore. Perhaps I noticed it while doing something else. In any case,
every turn you're engulfed in, say, a dust vortex wearing the Eyes of the
Overworld, you get the "can't see"/"vision clears" message pair. This
patch modifies the behavior to only display this the first turn. Other code,
partially related to B01003, already deals with the puton-remove cases.
Since B01003 is only in the trunk, this fix is also only in the trunk.
Correct the unreachable "snores" message From a bug report.
Applied to trunk only in hopes that beta8 might be the last for 3.4.2.
The fixes entry is generic since I'm sure other similar messages will be fixed.
Digging a pit in the location where you're stuck should always free you.
This would not occur if you used a wand of digging to do the digging,
especially if you did so while levitating.
Back in April, <Someone> reported to the list that when you are
polymorphed into a mimic and #monster, and return to human form while still
mimicing, your appearance does not change. This was due to a change
between 3.4.0 and 3.4.1 that caused all mimicing to go thru one case and
the code to change appearance was actually never executed.
Several bug reports have been filed regarding the use of attached iron balls to
move in ways that are otherwise disallowed: moving diagonally from a
doorway, moving through boulders, squeezing through small openings, passing
over traps and diagonally between boulders on sokoban levels. Modified
bhit to deal with this. All these cases now cause the iron ball to stop if
appropriate for your form, level of burden, and so on. Since both boulders
and iron balls are big, boulders now always stop thrown iron balls,
even if not attached. Since iron balls don't cause any damage as they pull
you along, I didn't add any damage for the new "jerks to a halt" cases.
Undo the change to test_move and instead, don't even test moving in diagonals.
This opens the possibility for approximating the diagonal while polymorphed
into a grid bug in the future.
the cmdassist message shows all the valid directions even if you are
polymorphed into a grid bug. I noticed this when I typed a diagonal
direction as a grid bug and got the dialog, telling me the key I just typed
was valid, but it wasn't. Limit the keys to those valid for grid bugs.
Since only developers know that "13" is EACCES, try to include the text
message. I'm not 100% sure the ifdefs are complete, but it can be tweaked
as needed. This was the only common message in files.c that included errno
so it's the only one I changed. Of course, "13" is only one of several
possible errno values that might reasonably show up here.
- If you have Gnome installed on solaris, the GETRES support wouldn't build.
I don't have access to a solaris system with Gnome installed, but hacked
unixconf.h to force the GETRES code itself to be compiled. So, I believe the
unixres.c change will work for folks really using Gnome on Solaris.
Whether the rest of the gnome code will build there is beyond me.
- I accidentally left TIMED_DELAY defined and the Solaris build failed.
While solaris has usleep(), this is not part of SVR4 as far as I can tell.
But, SysV does have poll, so I implemented msleep() for SysV systems in
terms of poll. So, you can now define TIMED_DELAY on any SYSV build.
<Someone> thought the incorrect grammar in the messages was due to scatter()
changing the quan of treefruit, but in fact, it was due to treefruit
referring to the wrong object (there is also a theoretical possibility that
treefruit can refer to a merged object with the wrong count). Create a temp
object for use in the message to avoid these possibilities.
If you dug in a pit next to a sleeping, angry monster, you'd stop every
turn due to a complex check at the end of dochugw. It turned out this
was due to a long-standing bug in the special case vision code that failed
to set the COULD_SEE bit for the locations where it set the IN_SIGHT bit.
It looks like the underwater code had the same problem (it didn't set the
bit, obviously there are no pits underwater). However, the same could
occur if you see the angry, sleeping monster with Xray vision. In this
case, setting COULD_SEE is not appropriate, so added a mcanmove check to
the complex check in dochugw.
Avoid ever putting an "I" on the hero's location by checking it in
map_invisible(). It appeared there were a few other special cases that
could call map_invisible() for actions involving the steed, so checking there
catches them all.
Finally got around to installing OpenBSD (rev 3.3) in a vmware partition.
Found that several #if BSD's were inappropriate for modern BSD's. Haven't
installed FreeBSD or NetBSD, but based on reading their man pages,
these changes are needed there too. Mostly due to POSIX time() signature.
Since cansee() is false for all locations while swallowed, need to test if
the monster being hit is the one that swallowed you to ensure that various
artifact hit messages, including the DRLI message, are printed.
Digging a pit while a xorn set the trap time, but falling into a pit did
not. While lookin at this, it occurred to me that the same inconsistency
might occur while polymorhing from/to a xorn, and there was.
Switch the default Linux build behavior to use random instead of lrand48,
since lrand48 exhibits some obviously non-random behavior. random() has
been in glibc for a long time. Even if no other changes are made to
nethack's random number generator, this will improve the Linux behavior.
This is derived from the proposed patch and feedback to it. This applies
the last-position cache behavior without an option, making the behavior
more like it is for interfaces with a mouse, where holding the mouse still
acts the same way as the travel cache. The code is not #ifdef'd either.
I found that the setting of GUIDECMD sys/unix/Makefile.doc didn't cut
it with groff-1.18. Also, the command was duplicated in the rule to
generate Guidebook.txt.
A while back, I noticed that there was a custom use of the obj->recharged
flag in mkobj.c for tracking corpses on ice. It's much more obvious for
those of us that don't have the entire source base memorized to follow the
usual convention of adding a #define to obj.h. That's what this change does.
Due to limitations in some interface's display capabilities, don't let
polymorphed players web over stairs or ladders. As a side effect, this
side-steps missing checks for webs when going up or down stairs and ladders.
Because hmon_hitmon caches the monster data type, it needs to update this
whenever the monster might polymorph. It already did this for potions, but
not for jousting. There are other more complex ways this could be addressed.
Unix code does not always go thru hangup() when EOF is encountered.
There is a similar end_of_input() that is sometimes called instead, which
was missing a test of program_state.something_worth_saving.
When dismounting by choice and not impaired, the player could end up in a
known trap even if better positions were available. This change allows
the landing spot to prefer non-traps in these cases.
A core fixup if the the port startup code sets an invalid flags.female when
starting a new game. The old comment regarding being unable to change
flags.female was not completely correct. The flags.pantheon can be used to
differenciate new games from a restored game.
this particular fix has been sitting around my inbox for a while although
we've had reports of FreeBSD build problems for a long time. While it's
untested, it certainly looks like the unfixed system.h had a case that
could not be reached. bsdi seems like it needs to be handled the same way.
When attempting to disarm a trapped chest, wisdom should only be exercised
when not confused. It stands to reason that even if you manage to find a
trap in a confused/hallucinating state, wisdom shouldn't be exercised.
Since monster cancellation sticks, it doesn't makes sense for Magicbane to
cancel a monster more than once. Tweaked the messages to deal with this fact.
I decided to not make Magicbane's random effect "intelligent", which is what
changing it to use some other attack against a canceled monster would be.
Several cases in the trap block of code in dosit() were caused by utraptype
being set to values not corresponding to an actual trap. <Someone>
reported back in 12/02 that the "sitting in lava" killer message could not
occur, but the special-case sit messages for TT_INFLOOR and TT_BURIEDBALL
couldn't occur either.
Incorporate a mod submitted by <Someone> to implement the TODO in the
class genocide code by walking thru the species to find a class to genocide
if the user input does not match the class description.
Several cases in the trap block of code in dosit() were caused by utraptype
being set to values not corresponding to an actual trap. <Someone>
reported back in 12/02 that the "sitting in lava" killer message could not
occur, but the special-case sit messages for TT_INFLOOR and TT_BURIEDBALL
couldn't occur either.
<Someone> pointed out a disagreement between the comment and code in
throwing_weapon(): comment says daggers & knife can be thrown, but
code also allowed short swords. Assuming the comment was correct, changed
the code to match.
<Someone> (also later forwarded by <Someone>) reported that choking
while eating non-food always resulted in calling it a "quick snack".
lesshungry() depends on an occupation to tell if you are actually eatig or
not, but since non-food is eaten in one turn, no occupation was set. Took
his suggestion of setting the occupation temporarily to cause lesshungry()
call choke() appropriately in this case.
The bug report referred to greased hands, but that doesn't affect the
behavior. If you drop an object while swallowed or engulfed in a shop, and
that object had previously been picked up from the shop floor, the object
was treated as costly. In some cases, this could result in impossible
errors later on. Perhaps object ox & oy should be modified when in
player/monster inventory, but this fix addresses the specific problem by
not doing the costly check while swallowed.
This solution is mostly a band-aid. Make sure information set by join_map
that is overlaid by the MAP is cleared out. This ensures that place_branch
will never consider invalid data. A new function, remove_rooms(), with a
helper, remove_room(), takes care of this, but only for rooms created by
join_map, which addresses the only known case that causes this problem.
There's a possibility that some other strange behavior, especially in
minetn-6, will be fixed by this as well. The problem of disconnected caves
on minetn-6 is not yet addressed.
Also, add a check to lev_comp.y to make sure the required fg semantics of
joined levels (fg must be ROOM or CORR) are actually met. Doesn't affect
any levels currently included in the distro, but might address levels
others are trying to make.
add another bit to the flags passed to launch_obj so it can print
the initial "rumbling" message at the appropriate time rather than
having the caller print the message, possibly out of order.
Write "died of starvation" on the tombstone, not just "starvation".
Suggested by <Someone> a couple weeks ago, although his suggested
prefix was different and didn't work as well for the "exhaustion" case.
> While looking at the tiles.bmp file, I've found some more mistakes like
> this : the Wizard of Yendor's shadow is touching Croesus' tile, and one
> of Orcus' wing is touching Yeenoghu's tile.
Reported to the list a while back by <Someone>. The Knight's quest
messages are inconsistent in the use of royal pronouns. Capitalize them all.
Another option would have been to remove all royal capitalization (since such
Capitalization didn't come into use until relatively recently).
<Someone> suggested a scroll to counteract an unknown scroll of charging
that had negative effects. Scroll of punishment already costs the same,
so that unknown behavior is already covered. Plus, a cursed scroll of
charging already has negative effects, except in the case where the player
was confused where no negative effect from reading a cursed scroll of
charging occured. Added such an effect (since the curse should still cause
something bad, even though the reader is confused), to drain the player's
energy.
Make the instructions a bit more blow-by-blow. Re-order them so they
correspond to the Install.unx step numbers. Explicitly refer to
Install.unx and Install.X11 where appropriate.
When polymorphed, only attacks involving hands/feet/weapons should result
in damage to object. Theoretically, hug and butt attacks should affect
objects too, but no forms with such attacks currently allow wearing armor.