Commit Graph
19186 Commits
Author SHA1 Message Date
nhmall d7d0e9061a follow-up: trailing whitespace 2026-05-27 16:44:51 -04:00
nhmall ce31feb231 add some foundational work for uplifts
Be able to carry out uplifts during minor release
lifetimes.

Document a way to be able to uplift struct content
without incrementing EDITLEVEL and breaking existing savefiles.
Use the mechanics outlined to uplift the contents instead, where
it is feasible to do so. The uplift is currently one-way only. An
uplifted savefile cannot be used with an earlier build of NetHack
, one built with a lower SAVEFILE_REVISION_LEVEL, than the one which
wrote the savefile.

The final byte (byte 79) of the 80 critical bytes in the savefile,
of which 10 are reserved for future expansion and not currently
used, will now be used for holding the savefile revision level
(SAVEFILE_REVISION_LEVEL in include/patchlevel.h) at the time
the savefile was written.

That leaves 9 of the bytes available for future use.
2026-05-27 16:14:20 -04:00
nhmall e352048612 include MAXTCHARS in --dumpenums 2026-05-26 22:00:12 -04:00
Ingo Paschke 598253eac8 glyphs: rotate-5 in glyph_hash eliminates true collisions
The previous rotate-1-xor put consecutive characters' bits in
adjacent positions, so short similar names like fox/bat or
jaguar/lichen collided -- 164 colliding buckets across the 9577
named glyphs.  Rotate-5 spreads each character across a 5-bit
window: zero true collisions, one m68k ROL.L, no multiplication.

The 16 remaining same-hash buckets are name duplicates from a
separate compose_glyph_name bug, addressed by its own fix.
2026-05-25 15:45:25 -04:00
nhw_cron b4f417f2ca This is cron-daily v1-May-7-2026. 005guidebook updated: doc/Guidebook.txt 2026-05-25 15:41:24 -04:00
nhmall bd67f3d0d6 merge bit 2026-05-25 15:33:54 -04:00
nhmall fee9516d9b Merge branch 'fix-piletop-generic-obj-prefix' of https://github.com/ingpaschke/NetHack into pr1549 2026-05-25 15:30:40 -04:00
Ingo Paschke 95d70ef5d8 glyphs: add piletop_ prefix to piletop-generic-obj canonical names
parse_id's glyph_is_object branch only emitted the "piletop_" prefix
when glyph_is_normal_piletop_obj(glyph) was true.  Piletop-generic
objects (the GLYPH_OBJ_PILETOP_OFF + 1 .. + LAST_GENERIC range) hit
glyph_is_piletop_generic_obj() instead and got no prefix, so they
produced the same canonical name as their non-piletop generic
counterparts.

For example glyph 3449 (GLYPH_OBJ_OFF + GENERIC_STRANGE) and glyph
7993 (GLYPH_OBJ_PILETOP_OFF + GENERIC_STRANGE) both yielded
"G_generic_strange".  14 such pairs exist; the piletop variant is
unreachable by name from nethackrc, and the runtime hashtable's
"assume no id occurs twice" populate loop silently dropped them.

Emit "piletop_" for both piletop predicates so each glyph gets a
distinct canonical name.  --dumpglyphnames now shows the 14
"G_piletop_generic_*" entries (and the count goes from 9577 to 9591;
the existing off-by-one in glyph_is_normal_piletop_obj still hides
slot GLYPH_OBJ_PILETOP_OFF + FIRST_OBJECT - 1, which is addressed by
its own fix).
2026-05-25 21:19:51 +02:00
nhmall 503355bb11 yet another function and date name update
Related to the overhaul of glyphname hash indices
2026-05-25 14:44:32 -04:00
nhmall 8b3eb77305 cherry-pick pr #1548 52e0404 glyphname indexes 2026-05-25 14:30:02 -04:00
Ingo Paschke be9e430ebb glyphs: replace open-addressed glyphname hashtable with sorted index
The open-addressed glyphname_hashtable stored each canonical
"G_xxx" name as a dupstr'd string in its bucket: ~9577 small heap
allocations and ~290 KB of resident name strings, on top of ~256 KB
of 32768-bucket scaffolding kept at <50% load for probe performance.
On classic Mac OS the populate cost (quadratic small-allocation in a
fragmented Memory Manager heap) dominated startup time -- many
seconds on an SE/30 -- and ~800 KB resident is meaningful on the
small machines the port targets.

Switch to a sorted (hash, glyph) index sized exactly to the number
of named glyphs:

  struct glyphname_hashtable_entry_t {
      uint32 hash;
      int glyphnum;
  };

populate_glyphname_hashtable() allocates one block of MAX_GLYPH
entries (no per-name strings), fills it via compose_glyph_name() +
glyph_hash(), and qsort()s ascending by hash.  Lookup binary-searches
the hash column, then walks any equal-hash neighbours verifying each
candidate by reconstructing its canonical name and strcmpi'ing it
back -- collisions are rare with 9577 uniformly-distributed 32-bit
hashes.

Other changes that fall out:

 * Extract compose_glyph_name() from parse_id's bulk-iteration switch
   so it is the single source of truth for "glyph number -> canonical
   name".  Called by find_glyph_in_hashtable for collision
   verification, by populate_glyphname_hashtable, by the
   --dumpglyphnames path, and by wizcustom_glyphnames.
 * empty_glyphname_hashtable() reduces to free(ptr); no per-entry
   strings to release.
 * Drop find_glyphname_in_hashtable_by_glyphnum (no longer used --
   wizcustom_glyphnames iterates compose_glyph_name directly).
 * Drop the res_fill_hashtable parse_id mode; populate iterates
   directly.

Memory drops from ~800 KB to ~75 KB.  One allocation instead of
~9578.  Lookup goes from O(1) to O(log N) but N ~ 9577 means ~14
comparisons per probe -- well under what the upstream cache ever
cost in practice.

Function names (populate_glyphname_hashtable, etc.) are kept for
extern.h compatibility; the data structure is now a sorted index,
"hashtable" in the names is historical.

--dumpglyphnames output is byte-identical.
2026-05-25 14:22:19 -04:00
nhmall b7c7f051b4 update Guidebook to refer to glyphname 2026-05-25 13:49:44 -04:00
nhmall 752af5b435 add fixes5-0-1.txt entry for pr #1547
fix off-by-one in glyph_is_normal_piletop_obj
2026-05-25 12:19:47 -04:00
Ingo Paschke 87a0bdf26c display: fix off-by-one in glyph_is_normal_piletop_obj
glyph_is_normal_object includes its boundary slot
GLYPH_OBJ_OFF + FIRST_OBJECT - 1 via >=, but its piletop sibling
glyph_is_normal_piletop_obj used > and excluded the matching
GLYPH_OBJ_PILETOP_OFF + FIRST_OBJECT - 1 slot.  That leaves
exactly one glyph (the would-be G_piletop_generic_venom) matching
neither the piletop-generic nor the piletop-normal predicate, so
parse_id never builds a name for it and --dumpglyphnames emits a
blank line for the slot.

Change > to >= so the two ranges are inclusive on the same side.
--dumpglyphnames now produces (8009) G_piletop_generic_venom.
2026-05-25 17:06:24 +02:00
nhmall 0e39c11be9 update --dumpenums
Include the glyph_offsets from display.h
2026-05-24 22:24:50 -04:00
nhmall 7a38d29363 nomenclature: glyphids
glyphids shall be known as glyphnames henceforth
glyphid_cache shall be known as glyphname_hashtable
2026-05-24 18:30:46 -04:00
nhmall 7996090a19 Merge branch 'no-bees-in-these-trees' of https://github.com/copperwater/NetHack into NetHack-5.0 2026-05-24 15:57:03 -04:00
copperwater c1697c0042 Don't print "low buzzing" for bee-less trees when kicked
Noticed this when testing a level with some barren trees which were set
in the special level to not contain bees; the barren trees are still
able to produce a low buzzing. This may convince players that they can
get bees from the tree if only they kick it enough times, which will not
happen.

To avoid that, only print this message when the tree can release bees,
augmenting the existing check for killer bees being non-extinct.
2026-05-24 15:37:35 -04:00
nhmall 0a332657f1 methods of disabling glyphid cache prefill
Two methods are now provided for slow ports/platforms that
need to do this for performance reasons.

Hopefully, this will avoid proliferation of more platform-specific
conditional code within initoptions_init().

Method (1): #define DISABLE_GLYPHID_CACHE_PREFILL in platform/OS's
            include/*conf.h.

or

Method (2): set gd.disable_glyphid_cache_prefill = TRUE in startup code
            after decl_global_init(), and prior to initoptions_init().
	    It has to be done after decl_global_init() because
	    decl_global_init() sets the value to its initialization
	    default.
2026-05-24 12:40:24 -04:00
nhmall c22b21e3bd follow-up: spelling fix in comment 2026-05-24 11:49:12 -04:00
nhmall c506c73fbe X11 bit 2026-05-24 00:21:40 -04:00
nhmall 05371dd481 some tipping fixes
- adjust the surface name in prompts (resolves a TODO in the code).
- be more player-friendly with the prompting, and don't prompt a
second time if the floor/surface is the only tip-destination, as
that can be annoyng and viewed as unnecessary. Instead, include
that information in the first decision prompt.

Resolves #1537
2026-05-24 00:01:50 -04:00
nhmall 7025945d2a Get CROSSCOMPILE defined earlier in the Makefiles 2026-05-23 22:50:12 -04:00
nhmall 2680476825 fixes entry for the big-endian fix 2026-05-23 21:37:56 -04:00
nhmall 58f2ef3a9e Merge branch 'lua-coordxy-bigendian' of https://github.com/ingpaschke/NetHack into NetHack-5.0 2026-05-23 21:31:44 -04:00
Ingo Paschke 4470ce348e lua: read coordxy fields with the right width (big-endian fix)
Add ANY_INT16 to any_types and use it for u.ux/uy/tx/ty and uz
dlevel/dnum.  These are coordxy (int16_t) but the Lua bindings were
treating them as 1-byte fields, so on big-endian m68k Lua read the
high byte (0) instead of the actual value.  Symptom: place_object
off map <0,0> in the tutorial.
2026-05-24 02:55:57 +02:00
nhmall ff4abc9b8c 3rd time is the charm3rd time is the charm3rd time is the charm 2026-05-23 20:05:54 -04:00
nhmall d7726e6069 follow-up grammar bit 2026-05-23 20:03:30 -04:00
nhmall 94e7d0bcf3 fixes5-0-1.txt catch-up 2026-05-23 20:01:06 -04:00
nhw_cron 0536318099 This is cron-daily v1-May-7-2026. 000files updated: Files 2026-05-23 19:16:10 -04:00
nhmall fd4fd6ef86 README-hints -> README.hints 2026-05-23 13:43:06 -04:00
nhmall 6aed21933d add paragraph about README.hints to NewInstall.unx 2026-05-23 13:33:35 -04:00
nhw_cron 2808f45c70 This is cron-daily v1-May-7-2026. 005guidebook updated: doc/Guidebook.txt 2026-05-22 16:37:10 -04:00
nhmall 3ea7fd3d67 stamp Guidebook with date of most recent commit to it 2026-05-22 15:41:18 -04:00
Ingo Paschke 1e34b52648 share: extend pcmain.c nhuuid to CROSS_TO_MSDOS, drop stub
The MSDOS branch carried a zero-filled placeholder with a FIXME; it
can use the same RFC 4122 v4 path as Atari and Amiga.
2026-05-22 15:21:00 -04:00
Ingo Paschke ced5744fe6 share+amiga: gate pcmain.c nhuuid for CROSS_TO_AMIGA, drop amidos.c copy
amidos.c had a byte-identical copy of the RFC 4122 v4 generator
already living under CROSS_TO_ATARI in sys/share/pcmain.c.
2026-05-22 15:20:50 -04:00
nhmall 189a0b8c3f update tested versions of Visual Studio 2026-05-22 2026-05-22 14:46:17 -04:00
nhmall be4d613bff follow-up curses idlecheckpoint 2026-05-22 14:20:13 -04:00
nhmall e394dc341b prevent a checkpoint from executing too early 2026-05-22 12:25:13 -04:00
nhmall a1fad59f2d idlecheckpoint support in curses 2026-05-22 12:24:32 -04:00
nhmall 4c7f2dfaac some Windows curses adjustments dialog on startup 2026-05-22 12:21:42 -04:00
Alex Smith 3f837939ba Change the MAX_REROLLS option to be MAX_REROLL_RATE
Having a hard cap on the number of rerolls doesn't help save CPU
usage from excessive rerolling, because if the cap is set low
enough to keep the CPU usage reasonable it isn't high enough for
players to actually use the feature.

Instead, allow capping the number of rerolls per second. (Sensible
values seem to be in the 5-10 range.) If the player attempts more
rerolls than this, show a paranoid confirmation prompt: the need to
type the answer to the prompt will slow a human user down (and if
the prompt is filled in too quickly, it will simply just be shown
again, preventing attempts to use automation to skip the prompt).
2026-05-22 06:02:00 +01:00
Ingo Paschke 7d512fd8ce shk: show item glyphs in the pay-bill menu
menu_pick_pay_items() passed &nul_glyphinfo to add_menu so
port windowports never had a tile/glyph to render alongside
each entry on the bill.  Compute the proper glyph_info from
the bill's obj, matching the pattern src/invent.c already
uses for inventory menus.
2026-05-21 16:05:47 -04:00
nhmall 3beaf04c45 fixes update for menu glyphs: shop bills, tip/loot 2026-05-21 15:54:27 -04:00
Ingo Paschke e14cb40a6e pickup: show container glyphs in tip/loot menus
doloot_core(), choose_tip_container_menu(), and
tipcontainer_gettarget() each iterate carried or floor containers
and offer them as menu rows, but passed &nul_glyphinfo so port
windowports had nothing to render alongside.  Compute proper
glyph_info from each container the same way src/invent.c
already does for inventory menus.
2026-05-21 15:47:55 -04:00
nhmall b9d87fea6d fix a buffer overlow introduced in recent commit 2026-05-21 12:04:01 -04:00
nhmall 18845b6f67 match magic object tiles with mundane counterparts
Fixes #1533
2026-05-21 10:44:29 -04:00
nhmall 65646e2a8c fix recently appearing warnings in clang-22 and visual studio
clang-22:

invent.c:2621:16: warning: variable 'option' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
 2621 |     } else if (!hit_reroll_limit(u.uroleplay.numrerolls)) {
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
invent.c:2629:9: note: uninitialized use occurs here
 2629 |     if (option == 'y') {
      |         ^~~~~~
invent.c:2621:12: note: remove the 'if' if its condition is always true
 2621 |     } else if (!hit_reroll_limit(u.uroleplay.numrerolls)) {
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
invent.c:2570:16: note: initialize the variable 'option' to silence this warning
 2570 |     char option;
      |                ^
      |                 = '\0'
1 warning generated.

visual studio:

src/invent.c(2629,1): warning C4701: potentially uninitialized local variable 'option' used
2026-05-21 10:36:22 -04:00
Pasi Kallinen 51f486589c Add sysconf MAX_REROLLS option
Public servers probably want to set this.
2026-05-21 09:11:24 +03:00
nhmall 0f8f8f4892 Windows console dev debug line 2026-05-21 01:26:29 -04:00