nethack.rankin [Thu, 7 Nov 2013 01:03:16 +0000 (01:03 +0000)]
retouch_equipment() bypass handling
Simplify retouch_equipment (post-3.4.3.code, called when hero
changes alignment or turns into a silver-hating critter; inventory
traversal must cope with the possibility of losing object->nobj when
processing object) by switching to recently added object->bypass code.
nethack.rankin [Tue, 5 Nov 2013 00:57:56 +0000 (00:57 +0000)]
fix #H3039 - panic() when trying to drop destroyed items
From a bug report, dropping a lit
(burning) potion of oil while levitating can produce an explosion which can
destroy inventory. If in the process of dropping multiple items, the ones
after the oil might be gone, resulting in use of stale pointers and possibly
triggering an "extract_nobj: object lost" panic or even a crash. While
testing my fix, I discovered that being killed by an exploding potion of oil
could produce an "object_is_local" panic if bones are saved (and reproduced
with unmodified 3.4.3).
nethack.rankin [Sat, 26 Oct 2013 21:33:47 +0000 (21:33 +0000)]
fix #H3033 - Crash upon teleport onto a sink while equipping levitation boots
From a bug report, being teleported onto
a sink while busy putting on levitation boots triggered a crash when
Boots_on() was called (as '(*aftermv)()' on the next turn) because
'uarmf' would be null by then. Not mentioned, but the same problem was
encountered by Boots_off() if the teleport happened while you were busy
taking boots off. It could be fixed by having having dosinkfall() call
cancel_don() if donning(uarmf) yields true, but this patch does a little
more than that: cancel donning/doffing of any multi-turn armor if you
fall onto a sink. It also prevents you from falling if you end up
flying (which will have been blocked while levitating).
The situation when putting on levitation boots has a sequencing
issue: setworn() causes you to be flagged as levitating immediately,
but the float_up() feedback doesn't occur until Boots_on() gets called
a turn later. Teleporting to the sink will tell you that you crash
onto the sink and and that you stop putting on boots, without having
been told that you've floated up into the air. It's suboptimal but it
doesn't seem to actually be incorrect.
nethack.rankin [Sun, 17 Mar 2013 00:17:18 +0000 (00:17 +0000)]
Magicbane grammar
After newsgroup discussion of C343-162, I noticed that it had fixed
the verb usage in the message for confused and/or stunned, but not in the
one for resisting. (If a monster name ends in 's', or it has been named
"you", 3.4.3 used the wrong verb because vtense() was fooled about plural
or second person.) No new fixes entry needed....
nethack.rankin [Thu, 14 Mar 2013 01:58:21 +0000 (01:58 +0000)]
flying into pits
In the newsgroup recently, someone mentioned that when polymorphed into
a flying monster, he couldn't retrieve items out of pits, even with the '>'
command. I thought that we had fixed that, but the fix apparently only
covered walk-through-wall creatures (xorns and earth elementals), not flyers
and ceiling clingers. Now those can also deliberately enter pits via '>'.
The fixes entry is in the new features section in order to be next to
the xorn one. '>' at pit locations is new, but it handles something which
was missing so feels more like a bug fix than a new feature to me....
[Keni, the bug page entry C343-12 about '>' (for xorns?) is general enough
to cover this fix, so we don't need to add a new one for flyers.]
I noticed an unrelated fixes35.0 entry mentioning '>' which was duplicated;
this removes one of the copies.
nethack.rankin [Sat, 9 Feb 2013 01:33:37 +0000 (01:33 +0000)]
impossible fix - potentially invalid feedback
From a bug report, the message displayed to the screen by
impossible() might be different from the one written into paniclog, if it
had argument subsitution/formatting. I couldn't reproduce that myself,
but stdarg.h/varargs.h is tricky stuff and I think that passing the va_list
to a routine which steps through it requires that va_start be called again
if you're going to use the va_list a second time. This changes impossible()
to handle its arguments only once, like panic().
nethack.rankin [Wed, 19 Dec 2012 01:26:54 +0000 (01:26 +0000)]
fix #H2785 - engraving punctuation
Message tidbit when engraving with a weapon which becomes too dull to
finish the whole text: add missing final period to
You are only able to write "<partial text>".
I think that proper usage puts the period in front of the quote rather than
after, but that could make it look as if the period ended up inside the
partial engraving.
fix #H2671 - feedback when entering untended shop while blind
From a bug report, you get the message "this shop
appears to be deserted" when entering a shop whose shopkeeper is not there,
even if you can't see at the time. Change it to be
'this shop is deserted'
when you can see that the shop is empty,
'this shop is untended'
when there's no shopkeeper but you can see some other monster(s) inside,
'this shop seems to be deserted'
when you can see but there is a monster that you can't see (probably a
hidden mimic, but possibly an invisible monster or one standing behind
a boulder that's ended up in the shop), or
'this shop seems to be untended'
when you can't see (and don't have active telepathy or persistent
monster detection).
nethack.rankin [Fri, 25 May 2012 23:54:59 +0000 (23:54 +0000)]
wand of polymorph vs monster inventory
From the newsgroup: inventory dropped by a monster killed by system
shock when zapped by a wand of polymorph is protected against being poly'd
by that same zap, but worn/wielded equipment that's forced to be dropped
due to being unusable in a transformed monster's new form was not. Not
mentioned in the newsgroup, but also fixed: boulders dropped when a giant
turns into a non-giant were also subject to the zap instead of protected.
nethack.rankin [Wed, 16 May 2012 02:15:10 +0000 (02:15 +0000)]
addtional monster movement tweak
Introduce some variation in monster movement by adding and substracting
small random amounts to the fixed increment from the main monster table. The
amount added is potentially bigger (average is +2) than the amount substracted
(average is +1), so monsters will tend to be slightly faster. Probably not
noticeable except for super-slow monsters not being so glacially slow, since
net +1 is a bigger relative increase for such critters' low movement rates.
In practice, the noticeable effect will be that ordinary speed monsters will
occasionally get an extra move even if/when player keeps the hero unburdened.
Possible extension (although I'm not planning to do it): sort the
monster list by pending movement points, so that faster monsters move before
slower ones. The random variation would become noticeable because groups of
same-speed monsters would alter their movement order depending upon who got
a bigger increment or smaller decrement on that turn.
nethack.rankin [Wed, 16 May 2012 01:47:18 +0000 (01:47 +0000)]
fix #H2588 - turn order alternation bug
From a bug report, when the hero has
precisely 24 movement points, fast monsters will move twice and then the
hero will move twice, instead of being interleaved. The hero will get 24
additonal movement points approximately one turn out of three when wearing
speed boots (or when using spell of haste self or potion of speed) and can
also get 18 additional points twice in succession, with a net of 24 after
12 of them are used on the first turn. But hero might not be starting at
zero at the time, so I'm not sure how often this is actually noticeable.
He apparently got a report about this for <some variant> and had some
user-contributed instrumentation in place that made it easier to replicate.
This fix is the one he suggested.
nethack.rankin [Fri, 11 May 2012 22:36:33 +0000 (22:36 +0000)]
oracle tidbit
From the newsgroup, while rehashing our bug page entries someone
mentioned that buying a minor consultation from the oracle exercizes
wisdom twice. First when getrumor() chooses one, then again when
outrumor(BY_ORACLE) delivers it.
This also simplifies some #if GOLDOBJ conditional code.
nethack.rankin [Mon, 7 May 2012 01:44:38 +0000 (01:44 +0000)]
fix #H2645 - invulnerability during prayer is vulernable to stinking cloud
From a bug report, stinking cloud
harms hero even when u.uninvulnerable is set during successful prayer.
This makes the cloud harmless during prayer as he suggested.
It also makes being inside a stinking cloud become a major trouble
that prayer can fix. (With magical breathing such a cloud is harmless and
with poison resistance it is just a nuisance; it won't be considered to be
trouble in such cases.) The fix is to clear away the cloud, or to teleport
the hero if he's inside multiple overlapping clouds or in one that is
marked as permanent (which I think isn't currently possible).
nethack.rankin [Sun, 6 May 2012 02:29:33 +0000 (02:29 +0000)]
fix hider bug
From a bug report, this turned out to be caused by a fix
I implemented for #H1749 three and a half years ago. Kicking a hidden
monster's location would bring the monster out of hiding but lacked a
newsym(), so if there was 'I' displayed there it stayed displayed as 'I'
even while subsequent messages referred to the unhidden monster.
nethack.rankin [Sat, 5 May 2012 23:26:26 +0000 (23:26 +0000)]
container_impact_dmg
A post-3.4.3 change made the contents of thrown (or dropped while
levitating) containers subject to breakage, but it had sequence issues.
When something was thrown from outside a shop (or from its doorway or
entry spot) and arrived inside, the shopkeeper was taking possession too
soon, charging the hero for any broken contents, and then going ballistic
(summoning kops and attacking) because the hero was outside the shop while
owing money. We need to break contents before shk claims ownership, which
turned out to be trickier than it sounds since it has to occur after any
item-hits-floor message if such feedback is given.
Also, clear the container's contents-known flag when contents break.
Conceivably it should stay set when there is only one item, since hearing
something break could only be that item, but this resets container->cknown
unconditionally if anything inside breaks.
nethack.rankin [Wed, 2 May 2012 23:01:40 +0000 (23:01 +0000)]
fix [rest of] #H2554 - noise when declining to kick peaceful monst
Reported last December by <email deleted>, attempting to kick
a peaceful monster then declining to attack at the confirmation prompt
uses no time, as expected, but does wake up nearby monsters and scuff an
engraving at the hero's location.
nethack.rankin [Tue, 1 May 2012 02:22:33 +0000 (02:22 +0000)]
fix [part of] #H2554 - hunger when declining to attack peaceful monst
Reported last December by <email deleted>, attempting to move
into a peaceful monster's position and then declining to attack at the
confirmation prompt uses no time, as expected, but does burn nutrition
the same as if you carried out the attack. A player could abuse that to
make room to eat an intrinisic-conferring corpse before it rots away.
This fixes that, and also makes attacking a monster via applying a polearm
and via kicking burn the same extra nutrition as ordinary attack. I didn't
add it for attacking via throwing.
He/she also reported that kicking at a peaceful monster and declining
to attack at the prompt wakes up nearby monsters even though no actual kick
ultimately takes place. I can confirm that, but this does not fix it.
From a bug report, using a magic whistle when
you're mounted and standing on a trap location would cause your steed to
trigger the trap even though it didn't move. Since it is already at the
same place as you, make steed be unaffected by magic whistle so that trap
complications can be avoided.
fix #H2642 - escaping from drowning by moving diagonally
From a bug report, you could crawl
out of water to avoid drowning by moving diagonally into an intact doorway
even though regular movement won't allow that. (Second version of Medusa's
level has a door adjacent to water.) You could also escape diagonally when
polymorphed into a grid bug.
People in the newsgroup are rehashing the entries on our bugs page
trying to figure out whether the bugs are still present in "NetHack 4",
and one is about messages for mirror actions which use hardcoded "mirror"
even when "looking glass" hasn't been discovered yet. They mentioned
something for C343-118 (#M178, Sep 2005) which was overlooked: wielded
mirror breaking when used to hit something.
Fix PL macro indentation when the entry spans a page break. (Note to anyone
who thinks these should be upgraded to keep an entry on a single page: look
at the footnote code in the original nroff docs, the tmac.n display code,
and then use ev 2 anyway - as long as there are no footnotes on a page with
PL, you might get away with it.)
^F on Plane of Water didn't show the magic portal to Astral. I spent
a lot of time looking at differences between current code and 3.4.3 to figure
out what had changed, then finally tried it on 3.4.3 and discovered that it
didn't work back then either. ^F marks all floor and ceiling traps as seen
and explicitly maps them, but Water has level.flags.hero_memory clear, making
the mapped trap disappear when it isn't in line of sight.
When fixing this, I changed magic mapping so that it shows furniture
(stairs, altars, fountains, &c) in preference to traps or objects, and known
traps in preference to objects, so hidden things can be spotted. (Once
they're in line of sight, the precedence reverses to normal, showing objects
on top of traps on top of floor.)
From a bug report, 2012:
> This one's easy: the "Your limbs {are stiffening|have turned to stone}" still
> appears as such even when you're polymorphed into a form that has no limbs
> (worms, etc.).
>
> Perhaps it should be "Your extremities[...]" or similar?
Change extcmd_via_menu() so that the code which guards against overflow
when gathering menu entries is always present. Now only the explanatory
message when overflow is discovered remains conditional upon DEBUG || BETA.
And make MAX_EXT_CMD actually be the maximum number of extended commands
supported by the menu, instead of MAX_EXT_CMD-2 (which was an off-by-one
bug; capacity for MAX_EXT_CMD-1 was available, but the last slot was always
left unused except if/when unchecked overflow occured).
When the 'extmenu' boolean was set, typing '#' in wizard mode triggered
a crash. The total number of extended commands exceeded the capacity of
extcmd_via_menu() and the code it had to check for that was only in effect
if DEBUG was defined. This boosts the limit from 40 (actally 38) to 50 (48)
and enables the checking code for BETA as well as for DEBUG.
Change how overview data is handled if/when you get expelled from
the quest: mark quest levels as unreachable rather than discarding their
overview data, so that it can be included in end of game disclosure (and
can be revived if you manage to return to your quest branch by invoking
the W quest artifact).
Order of endgame levels was odd: earth followed by astral, water,
fire, and air, because the code didn't know how to insert in front of the
first one visited. Now it does. Placement of endgame levels was sub-
optimal: since that has the highest internal dungeon branch number, it
came out last. Now it is forced to come out first, so that it appears
above the dungeon. And use "Plane of Earth" for level name rather than
"Plane 1", and so on for the others, when in the endgame.
Since I'm bumping EDITLEVEL due to adding mapseen.flags.unreachable,
I am also inserting u.uevent.uvibrated now so that it won't trigger another
EDITLEVEL increment. At the moment it doesn't do anything except get set
when you receive the "you feel strange vibrations <under you>" message.
The level where that occurs will eventually have an automatic annotation
of some sort.
On 12/04/2012 12:44 PM, <Someone> wrote:
> The message displayed was: "The floating eye's gaze is reflected by your
> armor". Although I realize that my silver dragon scale mail is embedded in
> my skin (as per my inventory), I still think that it's now my skin that
> reflects the gaze, not my (temporarily non-existent) armor.
This was done using the CVS log listings to preserve
the chronological order that patches were distributed,
rather than just cut and paste from one to the other.
This marks the abandonment of updates for fixes34.4.
Add 'o' to "i a v g c" disclosure set, to display final dungeon
overview at end of game. It lists all levels visited rather than just
those that #overview considers to be interesting, but it doesn't reveal
any undiscovered aspects of those levels except for the presence of bones.
(I think revealing shops and altars and such would be worthwhile, but the
data for that isn't handy at the time.) If the game ends due to death,
the bones section of the current level will have "you, <reason you died>"
(before any real bones entries for that level). That occurs before bones
file creation so it doesn't give away whether bones are being saved.
end.c includes some unrelated lint cleanup.
Guidebook.{mn,tex} updates the section for autopickup_exceptions as
well as for disclose. It had some odd looking indentation due to various
explicit paragraph breaks. I took "experimental" out of its description
since it was moved out of the experimental section of config.h long ago.
The revised Guidebook.tex is untested.
fix more of #2629 - striking/force bolt feedback (trunk only)
From a bug report, the message "Boing!" is given if wand of striking
or spell of force bolt is aimed at magic resistant hero by self or by
monster, or at magic resistant monster by another monster, but it was
omitted when aimed at magic resistant monster by the hero. The shield
effect animation for resistance is given in all the cases.
fix another part of #2629 - destory_mitem of partial stack (trunk only)
From a bug report, if part of a stack in a monster's inventory gets
destroyed (examples given were from Fire Brand burning scrolls or Frost
Brand freezing potions, but other code calls destroy_mitem() too), the
message handled singular vs plural for the desruction part ("catches
fire and burns" vs "catch fire and burn") but always used plural when
formatting the object stack being affected. Now say "One of <the mon's
foo>" or "Some of <the mon's foo>" as appropriate when part of a stack
is being destroyed. (destroy_item() for the hero paid more attention
and handled this issue correctly.)
fix part of #2629 - feedback for reverse genocide (trunk only)
From a bug report, if reading a cursed scroll of genocide created only
one monster it would give the plural message "Sent in some <monsters>."
Now it will say "Sent in a(n) <monster>." in such case. (The grammar is
accurate even if you can't see what happened; that situation is unusual
enough that I'm not going to worry about giving information away.)
nethack.rankin [Tue, 21 Feb 2012 04:05:45 +0000 (04:05 +0000)]
files.c cleanup and/or trashing (trunk only)
I started out changing some bar=strcpy(alloc(strlen(foo)+1),foo)
sequences to bar=dupstr(foo), then decided to try to clean up the lint
From a bug report. I'm not sure
whether the final result is worth it, and the MICRO configurations need
to test configuration file processing for LEVELS and RAMDISK. There were
three different sets of conditionals being used for that.
Declaration Parsing Assignment
#if MICRO || WIN32 #if MICRO && !NOCWD_ASSUMPTIONS #if MICRO && !NOCWD_
char tmp_levels[] read LEVELS into tmp_levels # if MFLOPPY
# if MFLOPPY && !AMIGA # if MFLOPPY && !AMIGA handle tmp_levels
char tmp_ramdisk[] read RAMDISK into tmp_ramdisk # if !AMIGA
# endif # endif handle tmp_ramdisk
#endif #endif # endif x 3
The revised code uses the middle set; the other two are gone. This means
that MICRO+!MFLOPPY will use LEVELS instead of silently ignoring it, which
might need to be changed.
nethack.rankin [Sun, 19 Feb 2012 02:06:43 +0000 (02:06 +0000)]
nerf potion alchemy (trunk only)
Something I've had in mind for a long time: make it harder to acquire
dozens of potions of full healing and thereby (8 * dozens) of extra hit
points. When dipping a stack of more than 2 potions into another potion
other than water, first split the stack so that 2 to 9 potions are dipped
rather than all of them. Alchemy still works but it will take more dips
(hence need more resources) to convert large amounts. Dipping into water
isn't affected, nor is dipping non-potions.
Also fix a bug where dipping a stack--now perhaps a subset stack after
splitting--which triggered an explosion was only using up one of the dipped
potions (plus the one being dipped into) instead of the whole stack.
nethack.rankin [Thu, 16 Feb 2012 02:40:24 +0000 (02:40 +0000)]
#overview enhancements (trunk only)
1) add graves to the dungeon features being tracked;
2) report on known bones (determined by seeing map spot(s) where previous
hero(es) died since there's no guarantee of graves or ghosts);
3) add automatic annotations for oracle, sokoban, bigroom, rogue level,
Ft.Ludios, castle, valley, and Moloch's sanctum. For bigroom and rogue
level you just need to visit that level, for the others you need to get
far enough along to learn something specific (oracle: her room, sokoban:
annotation is either "solved" or "unsolved" depending upon whether all
the holes and pits have been filled, fort and castle: see the drawbridge,
valley and sanctum: see inside the tended temple). Discovering the
relevant locations via magic mapping counts as "far enough along".
There should probably also be automatic annotations for Medusa and the
vibrating square but I'm not sure what criteria should be used for the
former or what phrasing to use for the latter. Demon lord/prince lairs fall
into similar category as Medusa.
TODO: add final #overview as an end of game disclosure option. (I was
planning this even before I saw that nitrohack has implemented it....)
nethack.rankin [Wed, 15 Feb 2012 01:55:34 +0000 (01:55 +0000)]
oracle bones (trunk only)
Noticed while working on #overview/#annotate revisions, one of which
will key off the oracle's welcome message. On a bones level, the oracle
could be outside her room, or the room's one time welcome message could be
used up, or both. During bones creation, discard her if she's on the wrong
level (probably not possible, aside from wizard mode ^G), try to put her
back into her room if she's outside it on the right level, and restore the
room's type (if she's still in it, or has been successfully moved back into
it) so that next hero who loads the bones will get her welcome message the
first time that room is entered.
Other special rooms could be fixed up too, provided that they're
sufficiently intact (stealthy hero might enter and get the one-time message
then run away and die elsewhere on the level; at present, next hero won't
get the room's entry message) but this doesn't attempt to deal with that.
nethack.rankin [Fri, 10 Feb 2012 09:29:28 +0000 (09:29 +0000)]
mimicking by pets (trunk only)
I killed a mimic in a shop, then left. My dog or cat entered that shop
where I could no longer see it, and I got
You see a tripe ration appear where it was!
when it evidently ate the corpse, without me being able to see any such thing.
This fix is only approximate but I didn't want to figure out all the
permutations of esp or prolonged monster detection or infravision. (There
probably aren't as many permutations as I first thought since only "ordinary"
pets will take on alternate monster form, so won't ever switch from detectable
via esp to not detectable or vice versa. Maybe this is good enough.)
No fixes entry; this is post-3.4.3 code. There was an early return with
a comment stating that idx==0 was impossible. I took that out since 0 is not
only possible, it's a valid index into the array of transformations.
nethack.rankin [Mon, 6 Feb 2012 04:17:25 +0000 (04:17 +0000)]
fix #H2591 - sitting while swallowed (trunk only)
From a bug report, sitting while
swallowed gave "you are sitting on air," and the intended message "there are
no seats in here" was never reached. Move the latter so that it works, and
add a new one when you try to sit while a grabber is holding on to you.
Also add theft vs donning fixes entry which was left out two days ago.
nethack.rankin [Sun, 5 Feb 2012 04:26:48 +0000 (04:26 +0000)]
theft vs donning, round 2 (trunk only)
The message "you stop taking off <that armor>" when interrupted by a
nymph's or monkey's theft attack would only be given if you were using 'A'
to take off the armor. If you used 'T', you'd get "you stop putting on
<that armor>" instead. The fix for that also makes it easy to vary the
nymph message "<the nymph persuades> you to start taking off" to be "<the
nymph persuades you to continue taking off" when taking that same piece
of armor off was interrupted by the theft.
nethack.rankin [Sat, 4 Feb 2012 08:13:26 +0000 (08:13 +0000)]
fix #H2589 - theft vs donning/doffing (trunk only)
From a bug report, having some
armor stolen while in the midst of putting on armor--when both items have
a multiple turn completion delay--could result in side-effects for the
latter item being reversed even though they hadn't been applied yet. So
you'd lose points of Int and Wis when attempting to put on a positively
enchanted helm of brilliance, or gain such with a negatively enchanted one.
steal() was assigning to afternmv before it had been used to finish the
action of putting on or taking off armor. Fix by interrupting the attempt
to put on or take off armor when being victimized by theft (or being hit by
succubus or incubus seduction). The existing stop_occupation() call wasn't
sufficient because afternmv is different from occupation.
nethack.rankin [Sat, 4 Feb 2012 07:20:23 +0000 (07:20 +0000)]
unconsciousness (trunk only)
When testing armor theft by nymph I got a message "you dream that you
hear <something or other>" even though I was awake. steal() was leaving
nomovemsg null in order to get the default of "you can move again", but
unconscious() was treating null value as 'yes, hero is unconscious'. I'm
pretty sure its intent was just to guard against passing null to strncmpi()
and didn't really mean that null indicates unconsciousness.
nethack.rankin [Thu, 2 Feb 2012 10:15:04 +0000 (10:15 +0000)]
#overview overhaul, part I (trunk only)
Reformat the DUNGEON_OVERVIEW code in dungeon.c. It's clear from the
way lines were wrapping that the original author used an editor that let
him set tab expansion to columns of four, and when they're treated as the
conventional eight then some longish lines won't fit. Switch to using a
mix of tabs and four spaces instead of all tab characters.
I've separated out my more interesting changes (which will come later).
However, there are a bunch of minor ones included:
1) the lastseentyp array is reused for each level visited, but it wasn't
being reinitialized when creating a new level, so remembered fountains,
altars, and so forth could be erroneously propogated across levels
(the original contributed patch may not have suffered from this because
it handled last-seen data differently than the code which is in place);
2) add 3.5.0 health food store to the list of recognized shop types;
3) make an #annotate value of a single space delete any old annotation
without adding a new one, the way monster and object naming works;
4) the code to discard overview data for a branch of the dungeon which
can no longer be reached (quest expulsion) wasn't capable of doing so
for the very first level (a hypothetical problem since level 1 isn't in
the quest...) and didn't free memory used for user-supplied annotations;
5) reorganize dooverview() where Michael's compiler reported that a
variable might be used before being initialized (it wasn't, but it also
wasn't even needed to achieve the intended result);
6) redo the #overview formatting macros so that they'll work with pre-ANSI
compilers that don't support concatenation of adjacent string literals;
7) function-like macro ADDNTOBUF() was used without terminating semi-colon,
which confused emacs when indenting, so this rewrites it such that it
expects ordinary termination and will work correctly if ever used in the
form 'if (some_condition) ADDNTOBUF(args); else ...';
8) comment out water/ice/lava with #if 0 ... #endif rather than /* ... */.
nethack.rankin [Thu, 2 Feb 2012 09:18:14 +0000 (09:18 +0000)]
quest pager fix (trunk only)
A priest quest message that was supposed to say "brotherhood" or
"sisterhood" said "itood" instead. Text "%shood" used the post-3.4.3 'h'
modifier to substitute a pronoun in place of the %s value. That's only
a valid modifier when it follows %d (deity), %l (leader), %n (nemesis),
or %o (artifact). Change the substitution routine to leave it as an 'h'
when it follows anything else. [No fixes entry needed.]
nethack.allison [Wed, 1 Feb 2012 00:49:16 +0000 (00:49 +0000)]
rolling boulder trap's boulder can be generated in lava
> On 01/30/2012 08:20 PM, <Someone> wrote:
> The boulder from a rolling boulder trap can be generated on a
> lava pool. mkroll_launch() in trap.c, line 1584 checks only for pools
> of water.
nethack.allison [Sun, 29 Jan 2012 16:50:56 +0000 (16:50 +0000)]
x64 command line build cleanup
64-bit linker had a number of warnings that the 32-bit linker did not.
It turned out to be because the 64-bit compiler is more picky about
declaring DLL exports 2-different ways, even if they are essentially
the same. The 32-bit linkder didn't complain. It is described here:
http://support.microsoft.com/kb/835326
The warnings that this suppresses are:
nhdefkey.c
Linking hdefkey.dll
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
nhdefkey.o : warning LNK4197: export 'ProcessKeystroke' specified multiple times; using first specification
nhdefkey.o : warning LNK4197: export 'NHkbhit' specified multiple times; using first specification
nhdefkey.o : warning LNK4197: export 'CheckInput' specified multiple times; using first specification
nhdefkey.o : warning LNK4197: export 'SourceWhere' specified multiple times; using first specification
nhdefkey.o : warning LNK4197: export 'SourceAuthor' specified multiple times; using first specification
nhdefkey.o : warning LNK4197: export 'KeyHandlerName' specified multiple times; using first specification
Creating library o\nhdefkey.lib and object o\nhdefkey.exp
nh340key.c
Linking h340key.dll
nh340key.o : warning LNK4197: export 'ProcessKeystroke' specified multiple times; using first specification
nh340key.o : warning LNK4197: export 'NHkbhit' specified multiple times; using first specification
nh340key.o : warning LNK4197: export 'CheckInput' specified multiple times; using first specification
nh340key.o : warning LNK4197: export 'SourceWhere' specified multiple times; using first specification
nh340key.o : warning LNK4197: export 'SourceAuthor' specified multiple times; using first specification
nh340key.o : warning LNK4197: export 'KeyHandlerName' specified multiple times; using first specification
Creating library o\nh340key.lib and object o\nh340key.exp
nhraykey.c
Linking hraykey.dll
nhraykey.o : warning LNK4197: export 'ProcessKeystroke' specified multiple times; using first specification
nhraykey.o : warning LNK4197: export 'CheckInput' specified multiple times; using first specification
nhraykey.o : warning LNK4197: export 'NHkbhit' specified multiple times; using first specification
nhraykey.o : warning LNK4197: export 'SourceWhere' specified multiple times; using first specification
nhraykey.o : warning LNK4197: export 'SourceAuthor' specified multiple times; using first specification
nhraykey.o : warning LNK4197: export 'KeyHandlerName' specified multiple times; using first specification
Creating library o\nhraykey.lib and object o\nhraykey.exp
nethack.rankin [Sun, 29 Jan 2012 03:00:17 +0000 (03:00 +0000)]
strdup/dupstr (trunk only)
Add dupstr() as a substitute for strdup() so that out-of-memory
handling will be consistent with the rest of nethack, and make it aware
of nethack's heap logging. It's treated like alloc() so that its caller
can be logged for NH_HEAPLOG.
I put it into use in a few places, but there are lots more candidates
besides the existing calls to strdup() that should be replaced.
nethack.rankin [Sun, 29 Jan 2012 00:34:33 +0000 (00:34 +0000)]
bit logic fix (trunk only)
Fix some expressions that were supposed to use bitwise '&' but were
accidentally using logical '&&', pointed out by Keni's lint tool. All 3
instances are in post-3.4.3 code, so don't affect the branch and don't
need a fixes entry.
nethack.rankin [Sat, 28 Jan 2012 02:52:14 +0000 (02:52 +0000)]
wizard bones bug (trunk only)
The wizard mode sequence
load bones? y, unlink bones? y, die, save bones? y
works, but
load bones? y, unlink bones? n, die, save bones? y, replace old bones? y
fails if/when external compression is in use. The file gets uncompressed
before being opened to check its existence, then immediately closed, and
re-compressed, changing the file's name, before the deletion attempt takes
place. Then delete_bonesfile() can't find it via the uncompressed name
and the bones saving code reports "cannot unlink old bones".
The code involved doesn't seem to have changed since the current cvs
repository was set up, so this bug has gone unnoticed for a long time.
There's no reason this fix shouldn't go into the branch too, other than the
fact that I don't have that checked out on this machine. If someone wants
to apply it there, be my guest (and move the fixes entry to fixes34.4).
keni [Fri, 27 Jan 2012 20:15:31 +0000 (20:15 +0000)]
SYSCF bits
(This covers some thing that Pat found and some things I found while working
on those.)
Unscramble duplicate use of GREPPATH and GDBPATH symbols.
Add some more info to config.h.
Make missing SYSCF_FILE a fatal error.
Make a parse error in SYSCF_FILE a fatal error.
Rename PANICTRACE_GLIBC (et al) to PANICTRACE_LIBC (et al) since FreeBSD
and Mac OS X (at least) also implement the needed API.
Allow SYSCF_FILE to be unreadable by the user (for setgid installs).
If SYSCF, do NOT fall back to the compiled in WIZARD account.
Put WIZARD into sysopt and remove special cases in authorize_wizard_mode().
nethack.rankin [Tue, 24 Jan 2012 04:26:33 +0000 (04:26 +0000)]
outrip() updating (trunk only)
Part II of the bones tracking patch. Change umpteen different outrip()
routines to handle its new time_t argument, and use formatkiller() instead
of directly accessing killer.{format,name} and killed_by_prefix[]. The
latter is now static within formatkiller().
nethack.rankin [Mon, 23 Jan 2012 10:45:31 +0000 (10:45 +0000)]
bones tracking (trunk only)
[See cvs log for include/rm.h or doc/window.doc for more complete description.]
Attach hero info, death reason, and date+time to a level that's being saved
as bones. Read such data back when loading a bones file, then treat it as
part of that level for the rest of the game. Dying on a loaded bones file
will chain the new hero+death+date to previous one(s) if new bones get saved.
outrip() now takes an extra argument of type time_t, and interface-specific
implementations of this routine need to be updated to handle that.
nethack.rankin [Mon, 23 Jan 2012 10:41:57 +0000 (10:41 +0000)]
bones tracking (trunk only)
Quite a long time ago, the developer/administrator of the 'hearse'
bones respository asked to have bones files augmented so that they could
be correlated with logfile entries. He was forced to approximate it by
comparing file date+time with logfile date, which won't work well if there
are multiple deaths at roughly the same time, or perhaps even on the same
day. This adds character name plus role, race, gender, alignment, the
cause of death, and date plus time of death to the bones file when it is
saved, and reads that data in when a bones file is loaded, then retains
it as part of that level for the remainder of the game. Dying on a level
that was loaded from bones will chain the new dead hero info to whatever
was there from the previous one(s). It's written as fixed length strings
padded with spaces before writing the map and its messy details, making
it easy to spot with a simple file browsing tool rather than requiring
something which can interpret nethack level files. This may need to be
tweaked if players start shelling out of nethack to see whether the
checkpoint file for a newly entered level contains bones info, but at the
moment I'm not going to worry about that.
TODO: I wanted the bones and topten date to match, so am obtaining
the current date+time in done() and passing it to both of those and also
to outrip(). Hence the latter now has an additional argument. So far only
genl_outrip() and hup_outrip() in src and the three outrips in win/chain
have been taught about that; interfaces that supply their own outrip()
need to be updated and probably won't compile right now. Also, code for
formatting the cause of death has been moved from topten() into a separate
routine so that the new bones code can share it. genl_outrip() now calls
it too; the various other outrip() routines should be changed to call it
instead of continuing to duplicate that core code. (I probably should
have made topten.c's killed_by_prefix[] be static in order to force that,
but haven't done so.)
TODO too: there ought to be some way of viewing the data for a loaded
bones file from within nethack. I'll probably add something to the dungeon
overview code to treat it as an implicit annotation, as least in wizard mode.
Showing it in normal play once a level is sufficiently discovered would be
useful, but I'm not sure what criteria should control that. Neither ghost
nor grave is guaranteed to be present, particularly for levels that were
saved as bones, loaded into a subsequent game, then became new bones when
the second hero died there, which can occur an arbitrary number of times.
nethack.rankin [Mon, 23 Jan 2012 07:11:09 +0000 (07:11 +0000)]
unixtty lint (trunk only)
gcc reports "comparison between signed and unsigned". One header file
uses unsigned long for tty flags, another uses [signed] short. 'unsigned'
seems like the best compromise, but this might accidentally introduce lint
for some other configuration.
nethack.rankin [Fri, 20 Jan 2012 03:41:33 +0000 (03:41 +0000)]
date.h/patchlevel.h dependencies (trunk only)
Remove date.h and patchlevel.h from win/tty/wintty.c, win/X11/winX.c,
and sys/share/pcmain.c (caveat: the latter two are untested) so that they
don't get recompiled every time any other source file changes and triggers
creation of a new date.h. Only version.c needs to be recompiled in that
situation. Also, Makefile.src was missing a reference to botl.h.
keni [Wed, 18 Jan 2012 22:32:24 +0000 (22:32 +0000)]
gcc invocation cleanup (mac)
Move the compiler flags out of CC and into CFLAGS. Split off
-Wunreachable-code, comment it out, and explain why. Fix typo.
nethack.rankin [Wed, 18 Jan 2012 02:36:50 +0000 (02:36 +0000)]
save and restore lint cleanup (trunk only)
Fix a couple of signed vs unsigned and unused paramater warnings
that pointed to actual bugs. uid values were being handled as int, even
though "modern" systems use type uid_t which could be bigger and is almost
certainly unsigned. There haven't been any reports of nethack falsely
claiming that the wrong user is trying to restore, so in practice this
hasn't mattered, but switch from int to unsigned long to make the chance
of problems be even smaller.
The code to save message history was ignoring the 'mode' argument so
would have attepted to write even when asked to free memory instead. It
isn't currently called by freedynamicdata() so the problem was theoretical
rather than real.
The 'UNUSED' macro is inadequate to handle parameters which are used
by some conditional configurations and unused by others, so there are
still several warnings about unused parameters from save.c and restore.c.
nethack.rankin [Mon, 16 Jan 2012 03:56:08 +0000 (03:56 +0000)]
dlb capacity (trunk only)
From the newsgroup: if someone adds too many new special levels, dlb
creation during install will give a warning but still exit with success,
and the subsequent installation won't know that the excess files need to be
placed in the playground separately. The result is that some files will
be missing when nethack tries to access them. The newsgroup thread states
that slash'em increased dlb's default limit of 200 files to 300, and the
unnethack variant increased it to 250 and also changed the overflow message
into an error that causes 'make' to quit. (The thread was initiated by
someone working on his own, not affiliated with either variant, who asked
for help figuring out why nethack couldn't find files at the end of the
alphabet. My answer didn't help much; I thought he was working with
separate files rather than with a DLB container.)
I started to go with the too-many-files-is-an-error fix, but instead
went the GNU route ("no arbitrary limits") and made the number of allowed
files become dynamic. It starts at 200 and expands by increments of 40
when necessary.