Commit Graph

10713 Commits

Author SHA1 Message Date
Alex Smith
e428046ffa Restructure u_init to allow for inventory rerolling
This doesn't implement inventory rerolling, just adds the
infrastructure: it's now possible to call u_init_inventory_attrs
multiple times and the starting inventory/attributes replace those
from the previous call rather than compounding.
2025-11-30 04:52:13 +00:00
Alex Smith
d41cea8286 Make the inventory-initialisation arrays constants
This is helpful for if we ever allow playing multiple games in the
same session: because the arrays are not modified, they can now be
used more than once.
2025-11-30 02:59:23 +00:00
PatR
94e5f7b861 part of issue #1463: // vs lootabc
Issue reported by ashleyharvey in a comment to issue #1463:  with the
'lootabc' option set, using the '/' command wouldn't accept a second
slash to look at things on the map (nor a question mark to type in
text to look up).

Not a bug since '//' is not documented as the way to look at the map
and '/a' works for lootabc, but '//' is useful so add support for it.

The '/' menu already uses 'y' and 'n' as unshown synonyms for looking
at the map and for looking up words.  Those now only work for the
'!lootabc' setting since lootabc can't assign multiple group
accelerators to the relevant choices.  Many of the other !lootabc
choice letters now work as unshown synonyms for lootabc choices, but
not all.  Feeding 'i' and 'e' to the menu as group accelerators would
interfere with using them as ordinary abc choices (at least for tty).
2025-11-28 15:13:01 -08:00
Alex Smith
b08fbef739 Followup to erinyes changes / offering while impaired
The important part of the "don't offer while impaired" change was to
prevent offering while confused.  However, it was also extended to
other status conditions: stunning seems fine, but hallucination was
problematic (both because it makes a large number of messages
inaccessible, and because hallucination is more of a long-term status
effect than the other two and players may sometimes choose to play
with it for a large portion of the game).  So make the change trigger
only on stunning and confusion, not hallucination.

This also updates the changelog for the change, because while
connected to the erinys changes, it's technically separate and is
relevant even in games where erinyes are never summoned.
2025-11-27 23:14:17 +00:00
Alex Smith
4d55e1de79 Make saving grace also work against repeated damage sources
For example, being hit by the bounce of a wand of fire means that
the main character could take damage twice in a turn, which would
kill even through saving grace; and scrolls and potions could burn
up after that and finish off the last HP, even if the wand only hit
once. This commit changes it to track all damage done during the
turn, and prevent HP dropping below 1 from damage until the next
player action or the next turn boundary, whichever comes first.
2025-11-26 05:45:45 +00:00
Alex Smith
6eb2eb7df7 Accurate dknown when writing scrolls while blind
If you write the scroll by description, you obviously know what the
label is because you specified the label (even if you didn't know
what the scroll was). When writing an unidentified scroll by type,
though, and getting lucky, you don't necessarily know the label of
the resulting scroll.
2025-11-25 23:01:46 +00:00
Alex Smith
8c29b20010 Accurately track which items have been discovered, even if not #named
This fixes a couple of bugs: a long-standing bug in which writing a
scroll by label could fail even if you've already seen a scroll with
that label (due to the game not tracking whether or not you've seen a
scroll if it doesn't have a name); and a somewhat newer bug in which
spellbooks auto-identified by Wizard knowledge were marked as having
been encountered (rather than as known but not encountered).

Breaks save file compatibility, but not bones files.
2025-11-25 22:42:38 +00:00
Alex Smith
10a5e67478 Some types of shopkeeper start with a scroll of charging
This is partially for the pun, and partially because the "wish for
scrolls of charging to identify them" strategy has been nerfed in
previous commits and this offers an opportunity to discover what
scrolls of charging are without randomly encountering one.
2025-11-25 22:19:24 +00:00
PatR
7b5d7d7ae6 fix issue #1462 - objects embedded in trees
Issue reported by chappg:  on arboreal levels, when an object was
located at a stone location treated as a tree location, examining
the object would report it as embedded in stone.

The Ranger quest has arboreal levels where STONE becomes TREE, and
items that would become embedded in stone will be in trees instead.
(Sometimes kicking a tree would drop fruit onto an adjacent tree,
effectively embedding it.  For testing, it's easier just to poly
into a xorn, walk onto the tree spot, and drop something.)  The item
description code for farlook and quicklook wasn't checking for that.

The fix also corrects another bug:  an item located at a normal tree
location would just be described as itself with no mention of the
tree at all.  Attempting to walk onto it would report the terrain
and not let you move there (assuming not in xorn form), like trying
to walk into a wall.

Fixes #1462
2025-11-24 12:37:08 -08:00
Alex Smith
fce66245ca Don't attempt to cache encumber_msg result
There was only one point in the code at which this caching was
being done, and it was incorrect: it's possible for the result of
near_capacity to change during a monster turn because monster
actions can change either inventory weight or carry capacity.

The bug was particularly relevant in cases where a character
polymorphed into a slow weak monster gets attacked by a monster
that moves at normal speed: due to the polyform being slow, the
normal-speed monster gets in a lot of attacks and causes a
rehumanization, but due to the polyform being weak, it was
burdened at the start of the monster turn, and so when that
penalty is (due to the bug) applied to the next turn it can
mean that the character misses the next turn too, and may end up
dying as a result.
2025-11-24 02:07:23 +00:00
PatR
93f8e5b3b3 fix #S14702 - travel to covered vibrating square
Targeting '~' when vibrating square has been discovered would report
"Can't find dungeon feature '~'" if it was covered by an object or a
monster.

That's normal behavior for a trap but the vibrating square is only
one of those for display purposes.
2025-11-20 15:02:54 -08:00
PatR
6466b47fc1 miscellaneous formatting of zap.c
Just to clear zap.c modifications out of my working directory.
2025-11-20 14:54:57 -08:00
PatR
9b1bb1150e fix issue #1458 - inappropriate verbal messages
Issue reported by chappg:  succubi could produce "it's on the house"
(quoted verbal message) when hero is deaf.  The mail daemon could
produce a variety of verbal message when hero is deaf.

The succubus/incubus one is easy to fix.  The mail daemon ones are
untested and a couple haven't been given non-verbal alternatives.

Fixes #1458
2025-11-09 12:58:19 -08:00
PatR
0524ff482b fix #S14678 - livelog of bribery when hallucinat
If hallucinating hero bribes a demon lord, report its true identity for
livelog/#chronicle.  Unlike with the similar change for genocide, this
does give away information if the player checks #chronicle.

Again, the report via the web contact form was misclassified as spam.
2025-11-09 06:33:19 -08:00
PatR
f7e12d2801 do-again vs yn_function()
This fixes the impossible from yn_function() for ^A after Z.  One
call to yn_function stored the spell letter for do-again and then
another call was unintentionally using that when getting a y/n
response for askchain() while using menustyle:Traditional [when
spell was identify and eligible objects needed confirmation about
whether to be ID'd].

Fixing that seemed to break #pray so the paranoid_confirm routine
has been changed to not rely on canned input, even for queries where
the player hasn't specified that confirmation be required.

Behavior of ^A might be different in unexpected ways, but it wasn't
working correctly before.
2025-11-08 18:38:55 -08:00
PatR
33401b0d08 spell selection tweak
For Z command, prevent an arbitrary number of reprompts when choosing
which spell to cast under menustyle:Traditional.
2025-11-08 18:13:31 -08:00
nhmall
d5658018ac alternative to display_inventory for window-port
Several window ports that support perm_invent were
using a call back to the core display_inventory()
function.

While calling from the window port back to core functions
is arguably not ideal in the first place, it was recently
brought to light that code NetHack-3.7 code changes to
display_inventory() actually caused it to stop repopulating
the perm_invent window as intended under certain circumstances.

For now, provide an alternative function, repopulate_perminvent(),
that hopefullshould still work the way it did previously.

There will likely be some additional changes after this to
further improve things, at some point.

For now though, this
Resolves #1454
2025-11-08 14:26:07 -05:00
PatR
6fa324d52a more hallucinatory genocide
Reorganize the recent livelog/#chronicle fix.
2025-11-08 01:06:13 -08:00
PatR
3113387371 fix #S14667 - livelog of genocide when hallucinating
Uncursed genocide while hallucinating deliberately reports hero's
role to the player as the affected target, but it was also showing
that for livelog and #chronicle.

Making the true target be visible for #chronicle gives away a little
information but that should be inconsequential in this siutation
since the player specifies the target.

Not sure why this report got misclassified as spam.
2025-11-07 13:03:46 -08:00
Alex Smith
82edcca402 Improve messages for oilskin sack protection versus water
The existing messages made sense for brief dips into water, but
didn't make sense when using an oilskin sack for an extended
period underwater (and also assumed that the player was able to
see the sack). This commit changes the message to make sense
(and to be less spamy) if the hero enters water and remains there,
and prevents oilskin sacks self-IDing if the hero is blind and
thus can't see the water.
2025-11-07 18:21:21 +00:00
nhmall
0f01260605 Revert "blank perm_invent after repeating spell cast"
This reverts commit 7763f4c5b0.
2025-11-06 18:44:12 -05:00
nhmall
4574738c48 Revert "follow-up: program_state field isn't boolean"
This reverts commit 6af5a906bc.
2025-11-06 18:43:48 -05:00
nhmall
6af5a906bc follow-up: program_state field isn't boolean 2025-11-06 01:38:06 -05:00
nhmall
7763f4c5b0 blank perm_invent after repeating spell cast
add mechanics to ensure display_inventory() refreshes perm_invent as
expected when update_inventory() is called from a repeat command.

Resolves #1454
2025-11-06 01:34:52 -05:00
Alex Smith
317282c469 Paper objects (except books) also do no damage
These are even flimsier than vegetables are.
2025-11-01 16:09:25 +00:00
Alex Smith
177a5bcaf7 Wielded vegetables do no damage
It makes sense that a vegetable would do less damage than a hard
object would, as they're generally fairly soft, so it seems like a
likely thing for players to try if they're *intentionally* trying
to hit for zero damage (which could be useful in certain niche
cases, e.g. to wake up a sleeping monster without damaging it).
2025-11-01 10:09:30 +00:00
nhmall
8b69a5aabb a few constants that don't need to be octal at all 2025-10-23 11:18:42 -04:00
PatR
7e3586acad ring item action bit for 'P'
If the hero is in a form without fingers but is wearing two rings (put
on before shape change), examining inventory and selecting a third
ring shows an item action menu entry of "P - [both ring fingers in use]"
(as of a couple of days ago).  Change that to plug in appropriate body
part for finger.
2025-10-21 14:06:16 -07:00
PatR
966145a61d item action 'T' against covered armor
Using 'i'+menu choice for suit+'T' to try to take off a suit that is
covered by a cloak (or shirt covered by suit and/or cloak) wouldn't
do anything.  It should report that you need to take off the outer
garment first and then not take the chosen item off.

There is probably a simpler fix.  It took me a long time to figure
where things were going wrong and them cobble this together.

A big chunk of the diff for invent.c is just identation, surrounding
a one-line change there.
2025-10-20 13:29:42 -07:00
PatR
a9f84bfe9a item action for towel
Change the menu entry for putting on a towel to "Put this on to blindfold
yourself" since "Use this ..." seems ambiguous.

Also, for the 'P' and 'R' item actions, list amulets before rings like
most other routines that can deal with both.
2025-10-18 10:20:13 -07:00
PatR
da20b839b5 item actions for accessories
Update item actions for rings, amulets, and eyewear.  Make 'P' for an
accessory that isn't worn behave similarly to recently modified 'W',
and make 'R' for an accessory that is worn be more specific.
2025-10-15 23:49:52 -07:00
PatR
6f8c1127ed item action 'W' for armor
In the context-sensitive menu when picking an item of armor from an
inventory listing, distinguish between wear-this-armor from could-
wear-this-armor-if-something-else-wasn't-already-worn-in-its-slot.
2025-10-13 23:13:15 -07:00
PatR
34d0e956ed fix issue #1453 - throwing crackable object upward
Issue reported by NullCGT:  throwing a crackable item against the
ceiling would cause it to vanish if it became [more] cracked but not
yet fully shattered.

Fixes #1453
2025-10-13 23:02:56 -07:00
nhmall
d75ffe4b34 distinguish magical and auditory scares
Github issue #1326 states:
"dc9fe0d8bc
 aims to nerf scrolls of scare monster a bit, making humans and uniques immune.
 But in actuality this change also affects all elves, and also makes them immune
 to musical instruments, including the objectively scary drums of earthquake.
 This is possibly unintentional (I don't see why elves would be immune to bugles
 but dwarves wouldn't), and in my experience (playing EvilHack which ports this
 commit) it makes elves really annoying, and seems to contradict the commit's
 message about getting "most of the effect in the early game when you're usually
 dealing with normal monsters" (elves are fairly common starting from around Sokoban).
 [...]
 Also the commit has a comment saying "humans aren't monsters" presumably referring
 to the scroll of scare monster, but read scrolls can still scare most @, or uniques
 for that matter."

Resolves #1326
2025-10-09 09:52:30 -04:00
nhmall
38161f3e4a relocate customization application
Resolves #1450
2025-10-06 11:49:31 -04:00
nhmall
60e2598d81 SYMBOLS=S_ghost:
Resolves #1448
2025-10-05 22:10:34 -04:00
nhmall
41f8cee117 Merge branch 'mklev' of https://github.com/argrath/NetHack into pr1412 2025-10-03 16:00:18 -04:00
nhmall
c0686d1795 clear pair of warnings re: not initialized 2025-09-30 12:41:55 -04:00
nhmall
bbc8578375 get rid of a visual studio build warning
lnt-arithmetic-overflow	A sub-expression may overflow before being assigned to a wider type
2025-09-30 12:35:18 -04:00
PatR
b857899afc issue #1449 - fake explorer corpses on land mines
Issue reported by AndrioCelos:  the corpse of an early-level fake
explorer supposedly killed by a trap would leave land mines intact.

Change land mines with a fake explorer's corpse into discovered pits.

Fixes #1449
2025-09-25 11:39:08 -07:00
PatR
edd11009e9 issue #1447 - physical damage when polymorphed
Isssue reported by Tomsod:  hero-as-target section of mhitm_ad_phys()
was not handling hero's Half_physical_damage attribute.

The issue was about cloning a pet from hero who is poly'd into a
pudding but it was more general than that.  Half_physical_damage was
ignored for any hit by a monster-wielded weapon against poly'd hero.

It took a while to convince myself that Half_physical_damage wasn't
aleady being applied elsewhere but it doesn't seem to be.

Fixes #1447
2025-09-25 09:59:15 -07:00
PatR
d0b79912ed support 'nethack --nethackrc=~/File'
Substitute $HOME/File if command line specifies --nethackrc=~/File
to avoid "Access to ~/File denied (2)".

Only implemented for opening run-time config file on Unix.  Works for
NETHACKOPTIONS=@~/File too; the normally optional at-sign is required
since the tilde won't match a slash to distinguish file versus options.

Only supports "~/" file path prefix, not "~user/".
2025-09-22 14:47:54 -07:00
nhmall
349fbe93b1 less verbose compiler command lines during build
If using hints file sys/unix/hints/linux.370 or sys/unix/hints/macOS.370
allow the majority of the boilerplate compile switches to reside in a
compiler response file, instead of on the command line.

Include one of the following on your make command line:

make response=1
  or
make resp=1

It can be combined with other make command line options. See
sys/unix/README-hints for further information about those.

The response files that it uses are:
    CC   (clang or gcc)    src/nethack_cc.rsp
    CXx  (clang++ or g++)  src/nethack_cxx.rsp

Note: I think the reduced clutter should actually become the default,
and the override should be noresponse=1 to NOT use it, but I'm
not sure how others feel, so for now, it requires
    make resp=1
Feedback on whether that should become the default or not
is welcome.

Tested on Linux with gcc-15 and on Linux with clang-20.

I haven't had a chance to test it on macOS yet.
2025-09-07 12:50:54 -04:00
nhmall
e8e1868b70 part3 of 3 for GitHub issue #1441
> Perhaps related: when a wand of sleep hits a disguised already-sleeping
> mimic (about which it is a separate question if they should go into
> disguise when sleeping, is it supposed to be automagic or conscious
> effort for them? but I digress), the mimic is not revealed (should it?)
> but the message says "hits a mimic".

Adjust restrap() so that a revealed mimic won't disguise itself while
sleeping. This seems to be in keeping with mimic lore.

Also, normal shop sounds (chime of register etc.) will wake a
mimic up from indeterminate sleep.

Closes #1441
2025-09-05 12:37:40 -04:00
nhmall
602678aa5a follow-up: function name 2025-09-05 09:26:00 -04:00
nhmall
d3db5ce4f1 yet_another: !mimic_disguised_as_mon(mtmp)
would be true for a non-mimic

(mimic_disguised_as_non_mon(mtmp) would also have
worked okay)
2025-09-04 23:01:29 -04:00
nhmall
774129df11 another #1441 follow-up bit 2025-09-04 22:52:36 -04:00
nhmall
88eb33f198 more #1441
Address the second part of the GitHub issue:
"Finally, when a wand of striking (or a shift+F melee attack for that
matter, but the latter gives no tactical advantage compared to just
bumping them) misses a disguised mimic, it is revealed. I don't know
what to make of it"
2025-09-04 22:38:49 -04:00
nhmall
fe357a6f04 avoid telling hero they missed a monster they aren't aware of
Resolves #1441
2025-09-04 22:13:07 -04:00
PatR
e4f0d1a3e2 fix #4341 - jousting while trapped 2025-09-01 13:35:05 -07:00