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.
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 /* ... */.
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.]
> 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.
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.
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.
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).
(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().
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().
The many sys/* and win/* changes are untested....
[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.
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.
For text data processed by makedefs at install time, change all
printf and scanf calls that use %lx format to deal with unsigned long
variables, replacing the makedefs hack of a few days ago. It's not as
clean as I would have liked (quite a few casts), because the values
involved are derived from ftell and/or passed to fseek, which deal in
signed longs. But it clears up a few format check warnings by gcc in
rumors.c and pager.c in addition to the previous one in makedefs.c and
uses the right data type even in the places where no warning was issued.
This is the code I built trying to figure out the large window size issue.
It completely compiles out if not needed (see -DWINCHAIN in hints/macos10.7)
and except for one call during setup has zero overhead if compiled in and
not used. See window.doc for more info.
Defs for UNUSED parms. I know this has been controversial, so use is isolated
to the chain code and windows.c (where it shouldn't be intrusive and saves about
50 warnings).
Hints file for 10.7, but the build process still needs to be migrated from
the branch.
Pat noted that I neglected to drop the SCCS lines on the files I've been
committing, so clean up those and any others I could find where the SCCS
line date is out of date.
From a bug report, if you used the apply command while
not carrying anything applicable except for unknown potion, you would get
"you don't have anything to apply" if that potion wasn't oil but an
inventory selection prompt (with '*' as the default since you wouldn't
have anything considered to be a likely candidate) if that potion was oil,
giving away information.
This fix makes carrying any unknown potion yield the inventory
selection result, unless oil is already discovered and hero can see that
the unknown potion isn't oil.
Provide a mechanism for cleanly moving between tentative window system
selections during startup. Now, before a second (or later) system is selected,
the first will be notified that it is losing control. See window.doc.
From the newsgroup: casting spell of drain life at Stormbringer
(or Excalibur or Staff of Aesculapius) would reduce its enchantment just
like any other weapon. Drain resistance should protect against that even
when not actively wielded.
There was a second instance of curs()+flush_screen() that had the
calls swapped 5.5 years ago and is being restored to 3.4.3 state here.
It turns out that swapping the other instance of those two calls
didn't help with the original problem (^R during getpos() redrew the
screen but left the cursor at the end of the 2nd status line) at all.
Only adding the pline() call after docrt() fixed it. pline() calls
flush_screen(1) which ultimately puts the cursor back on the hero. I
still don't understand why curs(WIN_MAP,x,y)+flush_screen(0) leaves it
on the status line instead of at the specified map coordinates. That
must be a bug in the tty code somewhere.
This ought to fix the problem excountered by Ken, where the cursor
wasn't at the spot '/y' was reporting on. This reverses part of a change
from May, 2005. I still don't understand the original behavior, which
was that docrt() for ^R followed by positioning the cursor at a specific
map coordinate and calling flush_screen() was leaving the cursor at the
end of the second status line. Reversing flush_screen and curs(WIN_MAP)
made it work for tty but screwed up X11. It turns out that including
pline("Move cursor to %s:") *also* makes things work as intended, so that
the flush/position hack wasn't necessary once that other change went in
(same 2005 patch, but the cursor hack was implemented first at that time;
once this reversal is in place, commenting out the pline() does bring the
odd behavior for tty back).