Commit Graph
100 Commits
Author SHA1 Message Date
PatR 3ce02fedc8 glyph macro formatting
Change some more
  (first_line <op> \
   second_line)
to
  (first_line \
   <op> second_line)
for various values of <op> besides '&&' and '||'.  Also clean up some
indentation and backslash+newline alignment.

For object_is_piletop() don't bother to validate that an object which
is classified as being on the floor is actually on the floor at its
specified map coordinates.  That check was propagating to expansions
of multiple macros and if it ever failed it would just be hiding a
very serious bug without helping to fix that.
2022-07-16 15:36:25 -07:00
PatR fcbeed21cc montraits vs monst->mstate
The new test in m_detach(mon) to check whether mon was already detached
is being tripped for trolls who died, revived, and died again.  Clear
out the MON_DETACH bit when saving montraits.
2022-07-16 06:36:45 -07:00
PatR 231bd75b7f github issue #819 - magic harp vs shopkeeper
Issue reported by youkan700:  for shopkeepers, taming via magic harp
behaved differently than taming via scroll or spell.

Make magic harp's taming be the same as [non-cursed] scroll of taming
and spell of charm monster:  angry shopkeepers will be pacified (even
though they can't be tamed).

Also, add something I've been sitting on for ages:  when taming magic
hits an already tame monster, give that monster a chance to become
tamer.  Not significant for monsters that eat (unless being starved
for some reason) but matters for ones who don't eat.  For tameness N
(which has a maximum of 20), if N is less than 10, have any taming
yield a 10-N out of 10 chance to increase the tameness by 1.  So the
closer a pet is to becoming feral, the more likely for it to improve
tameness a little.

Closes #819
2022-07-16 05:08:26 -07:00
PatR 1b3d2c6781 \#wizmakemap fix fix
Check for the possibility of dead monsters on fmon when removing
everything from fmon.  Mustn't pass a pending dead monster to
mongone() and get rid of it twice.
2022-07-15 23:57:10 -07:00
PatR f4e38b8b3e fix github issue #820 - clinger vs pit
Issue from youkan700:  a previously undiscovered pit was being made
known before hero poly'd into clinging monster checked whether it was
already known.  So it always gave "you see a pit below you" instead
of "a pit opens up under you!" combined with "you don't fall in!".

(I think those exclamations are excessive but haven't touched them.)
2022-07-15 15:51:01 -07:00
PatR e5977a3a2d \#wizmakemap vs migrating monsters
The bookkeeping for number of dead or removed monsters got out of sync
if a shopkeeper, temple priest, or vault guard on the migrating_mons
list who was scheduled to return to the current level got passed to
mongone() when #wizmakemap destroyed the current level in order to
replace it.

When getting rid of such monsters, first put them on fmon.  Once 'gone'
they'll still be on that list and dmonsfree() will include them in the
tally of dead or removed monsters and hopefully the count will match
the number it thinks were pending.

This works for a vault guard; I didn't try for shopkeeper or priest.
Ditch pet(s) so that they won't kill stuff and open up map spots while
you're waiting for guard activity; enter vault away from the wall
nearest to 'civilization'; fill the level with lichens or other junk;
wait for guard to arrive; don't drop gold.  After a short while the
guard will try to teleport next to you but with the level full will
end up in limbo instead (migrating, scheduled to come back to current
level).  Then perform #wizmakemap.  Prior to this patch, there will be
an impossible about N removed not matching N+1 pending; after it, no
such impossible.
2022-07-15 14:36:03 -07:00
PatR b37f922cf7 viz_array[][] type
viz_array[][] is indexed by coordinates but the data it contains has
nothing to do with them so it shouldn't have been changed to coordxy.
'char' was sufficient; 'uchar' would have been better; this invents
'seenV' instead.  This led to a cascade of required changes.  The
result is warning free and seems to be working but my fingers are
crosssed....
2022-07-15 13:48:29 -07:00
PatR 5aca2fc590 redundant "guard appears" messages
When a vault guard was created it was producing a "guard appears"
message, then the vault code immediately produced a "vault's guard
enters" message.  Suppress the creation message.

While testing that, I noticed that if the hero was blind and lacked
telepathy, "someone enters" started the guard interrogation sequence
but if hero answered and dropped gold, the way out wasn't discernable.
Put a "remembered, unseen monster" glyph at the guard's spot in the
breeched vault wall.  The player will need to do <search><move> over
and over to actually follow the guard but at least will know where to
start doing that.
2022-07-14 23:58:34 -07:00
PatR 32636099ce wizmgender fix
The 'wizmgender' option is flagged as 'wizonly' in optlist.h but that
doesn't prevent it from being set in NETHACKOPTIONS or .nethackrc.
Apply the fix from entrez to only honor it when running in wizard
mode.
2022-07-14 16:29:08 -07:00
PatR 66dc16b61f gulpmm "placing <mon> over itself"
Reported direclty to devteam by a hardfought player:
|placing tame fire vortex <56,18> over itself at <56,18>, [...]

An old map fixup when an engulfer and its victim temporarily share
the same map location got impacted by changes made a month or two
back for removing dead or migrated monsters from the map.  The old
fixup (for putting the engulfer back after removing the victim also
removed it) was no longer needed and using it resulted in a warning
from place_monster() about putting a monster on top of itself.
2022-07-14 16:13:47 -07:00
PatR 5ddf8c9815 out of bounds memory access during zap bounce
Apply the diff from entrez to deal with out of array bounds access by
wand or spell zap when deciding whether to bounce if that zap reached
the extreme edge of the map (not just the edge of the portion of the
map in use by current level).
2022-07-14 15:17:30 -07:00
PatR b14b830b49 simplify glyph_is_cmap()
I captured preprocessor output while debugging vault guard changes
and noticed that glyhp_is_cmap() was expanding to an excessive amount
of code.  Simplify it.

Also, a bunch of the cmap macro definitions were using old
 (foo && \
  bar)
instead of current
 (foo \
  && bar)
so this changes those.
2022-07-14 14:46:32 -07:00
PatR 62a9510109 \#wizfliplevel fixes
Fix wizard mode issues pointed out by the #wizmakemap fix.  If a
shopkeeper or temple priest is on a different level and its home
level gets flipped, monst eshk or epri data became invalid and would
cause trouble if the shk or priest ever made it back to home level.

If a vault guard is maintaining a temporary corridor and the level
gets flipped, the data became invalid.  If you used #wizfliplevel
while the guard was leading you out, the corridor spots would be
flipped along with the rest of the map but the guards's temporary
corridor data didn't match.  Breaches in the vault walls would be
sealed, then the guard would just mill around, never finishing
leading the hero out.
2022-07-14 13:38:09 -07:00
PatR 67ec92165e another comment typo/thinko 2022-07-14 00:54:43 -07:00
PatR 6efb8c528e comment typo/thinko 2022-07-14 00:48:10 -07:00
PatR aba500b482 fix #K3633 - vault guard parked at <0,0> brought \
back into play with bad data

I don't have a test case to verify the fix, and I'm not absolutely
certain that the cause has been correctly diagnosed, but I think the
problem was caused by a guard being sent into limbo because the map
was too full to place it, then while it was on the migrating monsters
list waiting for a chance to come back the fuzzer executed #wizmakemap.
If the hero left the level and subsequently returned, the guard would
arrive back but monst->mextra->egd contained data for the previous
incarnation of the level that's invalid for wizmakemap's replacement.

Treat any shopkeeper, temple priest, or vault guard who is not on his
'home' level like the Wizard has been treated since 3.6.0.  When
leaving the level they're on, put them on the migrating monsters list
scheduled to return to present position instead of stashing them in
the level's data file.  That way they can be accessed from any dungeon
level, so wizmakemap can pull ones for the level it's replacing off
the migrating monsters list when removing the old level's monsters,
handling both migration-pending and already-arrived-on-another-level.

Bonus fix:  put monsters who are on the migrating_mons list solely in
order to be accessible from other levels back first when returning to
the level they're on so that pets and the hero can't hijack their spot
when those arrive.  The Wizard has been vulnerable to that.

Not fixed:  #wizfliplevel command needs to flip parts of shk->mextra->
eshk and priest->mextra->epri for shk or priest on migrating_mons.
Vault guards don't contain anything flippable when migrating, but do
have coordinates that need fixing up while they're maintaining a
temporary corridor to/from the vault.
2022-07-13 15:19:51 -07:00
PatR 0059ced578 bump EDITLEVEL
The most recent "simulated mouse" commit included changes to 'struct u'
that should have been accompanied by an increment in EDITLEVEL.  Do the
missing increment now.
2022-07-10 15:43:49 -07:00
PatR fed367ccbd simulated mouse again
Change u.{dx,dy,dz} from schar to int and get rid of unused u.di.

Remove just added getdir_ok2click; it was declared as int but being
assigned booleans.  Rename getloc_click to getdir_click and have
getdir() use it for both input and output.

A simulated mouse is becoming quite a nuisance for something which
will probably never be used by anyone in actual play.
2022-07-10 11:14:10 -07:00
PatR 6ac5525239 restore getdir simulated mouse click
When getdir is given '_' as a direction, it calls getpos to get a
map location rather than just a direction.  Have getdir()'s caller
explicitly enable that so using '_' for other than #therecmdmenu
doesn't produce a delta that's farther than one step away.
2022-07-10 06:55:16 -07:00
PatR 6249fa7e54 rephrase some livelog messages
From entrez:  rephrase the terse livelog messages so that they form
complete sentences.
2022-07-08 18:24:36 -07:00
PatR c536c6920d maybe fix #K3634 - failed migrating mov arrival
place_monster() sanity check complained that a long worm was being
put at the same location as another monster.  The long worm wasn't
on the map prior to that place attempt.  This probably fixes it but
I don't a test case so am not sure.
2022-07-08 11:07:36 -07:00
PatR ab32ec4ad6 config_error_add()'s terminating period
Have the config error reporting routine check whether the message
it's delivering already has end-of-sentence punctuation instead of
adding that unconditionally.
2022-07-05 23:20:58 -07:00
PatR c3832a6afa refine PR #814 - included weapon in first hit mesg
When naming the weapon in the livelog message for breaking "never
hit with wielded weapon" conduct, avoid xname() because it includes
"<item> named <something or other>".  That's partly censorship and
partly keeping the message from being longer than necessary.  Long
messages on tty cause '#chronicle' output to become ugly.
2022-07-05 13:10:45 -07:00
PatR 3238e62ce7 pull request #814 - log mesg for 1st weapon hit \
now includes what the weapon was

Pull request from vultur-cadens:  show the weapon used when logging
the breaking of "never hit with a wielded weapon" conduct.

Also, if that first hit was a successful joust attack it was being
shown twice.

Closes #814
2022-07-05 11:50:20 -07:00
PatR bb53addd14 more #802 - lava travel rather than running
Too many negations for my brain to cope with.  I've tested travel
properly this time, but not re-tested running (which shouldn't be
affected by this code).
2022-07-04 12:28:12 -07:00
PatR 2d0ee19df5 a few miscellaneous comments 2022-07-03 17:51:47 -07:00
PatR f8dde7fb6b pull request #811 - getpos help during ";"
Pull request from entrez:  context-sensitive help.  During the
quick farlook command (aka #glance), if the player types "?" to
ask for help don't show "prompt for 'more info'" among the actions
performed for response ".".  (":" still mentions that because it
does show 'more info', if some is available, when using ";".)

Closes #811
2022-07-03 17:40:10 -07:00
PatR 99558c580c fixes entry for #810 - underwater food
Pull request from entrez:  non-swimming pets wouldn't target
underwater food but if a flying pet happened to move over such food
it would eat that.

Fixes #810
2022-07-03 17:09:56 -07:00
PatR 9bab9d4fce pull request #809 - just-picked pseudo class and $
Pull request from entrez:  gold wasn't handled consistently when
performing object class filtering with the just-picked-up pseudo
class.

Closes #809
2022-07-03 16:55:22 -07:00
PatR 59b9a684ac pull request #807 - 'wizmgender'
Pull request from entrez:  changes in symbol handling rendered the
'wizmgender' debugging option non-functional.  Get it working again,
and when it's enabled have doname() list the corpse or statue gender
formatting those types of items for inventory or other display.

Closes #807
2022-07-03 16:35:30 -07:00
PatR d1d4614b26 more #802 - lava running
From entrez, then modified possibly beyond recognition:  don't run
or travel onto lava even with known safe lava-walking because that
isn't 100% safe.  But if already on/over lava, allow moving onto
adjacent lava in that situation.
2022-07-03 16:27:19 -07:00
PatR 67e80cc329 pull request #804 - "Continue eating?" prompt \
should be skipped when current bite finishes meal

Pull request from entrez.  Treat resuming an interrupted meal with one
bite left similarly to starting a meal that only takes one bite.

Closes #804
2022-07-02 15:34:53 -07:00
PatR cf52d034cc pull request #802 - water running
Pull request from entrez:  allow rush/run to move over water if
wearing discovered water walking boots.  (Having walked over water
while wearing them but without them being discovered isn't sufficient.
Hypothetically there could some other method of acquiring water
walking ability.)  #802 supersedes #454.

Closes #802
2022-07-02 15:12:12 -07:00
PatR 00c0baf3d1 pull request #801 - triggering landmines \
by monsters is based on their weight

Pull request from entrez:  instead of straight 2/3 chance for a monster
to trigger a landmine, base the chance on monster's weight.

Closes #801
2022-07-02 15:03:52 -07:00
PatR 896686e860 boulder sanity check
From entrez, pushing a boulder into the water on Plane of Water
resulted in a sanity check warning about a boulder at water location
(every turn until bubble movement eventually pushed it back out of
the water).  Make boulders in that situation always fail to plug the
water and vanish rather not attempt to plug and remain intact.

This also changes the chance to plugging water from 90% to 50% when
dealing with a wall of water somewhere other than Plane of Water.
2022-07-02 11:54:31 -07:00
PatR 0bd5b3d39e teleport feedback for STRAT_APPEARMSG mon
Reported by entrez:  if a monster with the STRAT_APPEARMSG flag is
seen to teleport away from its current position, an arrival message
would always be given too.  If you couldn't see that arrival, you'd
get nonsensical "It suddenly appears!".

Minor fix:  when a monster is seen to vanish at one spot and appear
at another, if it was not close you'd get either "appears closer to
you" or "appears farther from you" even if the new spot was the same
distance as the old spot.
2022-07-01 15:53:53 -07:00
PatR dda4cd0530 regex handling
Change the regex_error_desc() interface.  Have the caller pass in
a pointer to a buffer of at least BUFSZ characters and have
regex_error_desc() populate that.  No need for static buffers or
extra dynamic alloction.

Also, change it to never return Null.  None of its callers were
checking for that and could have passed Null to config_error_add()
or raw_print().  printf("%s", NULL) produces "null" on OSX but other
systems would probably crash if a Null result ever actually occurred.

The error explanation returned by cppregex included a trailing period.
config_error_add() adds one, so the message ended up with two.  Have
regex_error_desc() check for final period and strip it off if found.
(My test case used a menucolor pattern of "[" which triggers an error
about mismatched brackets.)

Reformat cppregex.cpp; treat 'extern "C" {' as if it isn't introducing
a nested block.  Fix the '#include <hack.h>' that 'make depend' was
ignoring.
2022-07-01 13:08:43 -07:00
PatR eaa3b35fcf pull request #797 - running past quest leader \
and not stopping if tossed out of the quest

Pull request from entrez:  a running or travelling hero who passes
next to the quest leader and gets tossed back through the portal for
some reason would keep on running on the far side.

Closes #797
2022-06-29 18:28:01 -07:00
PatR b25961fb13 pull request #792 - pet w/ engulf+digest \
can gain intrinsics by swallowing monsters whole

Pull request #792 from entrez:  monsters can gain instrinsics now but
the case for an engulfer digesting a live monster was overlooked.

Add the same for non-pet monsters digesting other monsters, likely
under the influence of conflict but possibly counter-attacking a pet.

Closes #792
2022-06-29 18:08:50 -07:00
PatR 46652d3cef fix 'D' vs obj->bypass
Reported by entrez:  dropping items with the 'D' command sets
obj->bypass which prevents an otherwise compatible item from merging
with non-bypass floor stack.

'D' sets the bypass bit to avoid trouble if a dropped item triggers
an explosion that destroys some of inventory (making straightforward
invent traversal be unreliable).  Having bypass set prevented merging
with a floor stack that had that flag bit clear.  That was very
noticeable if a subset of a stack was picked up and then 'D' used to
drop it again, resulting in two stacks instead of recombining into
the original.

Change the test for mergability to ignore bypass so items will merge
when one has it set and other doesn't.  And when successfully merging
set bypass on the combined stack if either part had that set.
2022-06-29 11:46:31 -07:00
PatR 4fb55653b2 pull request #806 - remove unnecessary variable
Pull request from argrath: in destroy_one_item(), 'physical_damage'
is set to False with no provision for changing that it True, so the
'if (physical_damage) xxx' is never executed.  Remove it.

Closes #806
2022-06-28 12:53:16 -07:00
PatR 1ff9ad5faf pull request #800 - displaying detected traps
Pull request from argrath:  move display of detected traps into
separate routine to eliminate some 'goto's.

Closes #800
2022-06-28 12:41:51 -07:00
PatR bb238b5ef3 avoid becoming stunned due to level teleporting
Reported by entrez:  the code to have a hero become stunned for 1..3
turns when going though a level teleporter trap effectively negated
teleport control (except in wizard mode which is probably why this
slipped through).  Make the effect happen after level_tele instead of
before, change it from being stunned to being confused, and only
happen if hero lacks teleport control.

The association between confusion and level teleportation already
exists and this might be just enough of a hint for someone who isn't
aware of that yet to figure it out.  (Probably just wishing thinking.)

Magic portal traversal hasn't changed; it still causes brief stun.
2022-06-28 12:37:06 -07:00
PatR 4f781e7850 fix #K3627 - impossible placing long worm at <0,0>
When migrating, a long worm is removed from the map to take off the
tail, then its head is put back to be treated like other monsters.
If that occurred when being forced to re-migrate during failure to
arrive from a prior migration, it wouldn't have valid coordinates
and the place_monster attempt produced an impossible warning.
(Other types of monsters don't get removed and put back so didn't
trigger the problem.)

The routine to format a monster when the data is suspect mistakenly
thought it was dealing with a long worm tail because the monster
didn't match level.monsters[0][0], so the warning inaccurately
reported the problem as "placing long worm tail".
2022-06-26 12:22:09 -07:00
PatR 174cac42a6 partial vampire fix
From a followup comment to a reddit post:  a vampire who has gained
levels loses them when reverting to base form.  This fixes the case
where it grows into a vampire lord; change the base form from plain
vampire to lord when that happens.

It does not fix the case where shapechanging to fog or bat or wolf
and then back to base form yields a new vampire or vampire lord
instead of the one that built itself up.  Mainly affects pet vampires
since wild oees don't tend to grow very much.
2022-06-25 11:26:05 -07:00
PatR cde9b7e481 streamline the tty perm_invent bounder box set up
For the tty perm_invent boundary box initialiation, instead of doing
one of many assignments that do glyph lookup, do one of many symbol
assignments and one glyph lookup.  No change in observable behavior.

Also, use the main dungeon's walls for box rendering instead of
selecting ones for whatever branch the hero happens to be in at the
time perm_invent gets enabled.
2022-06-24 23:35:26 -07:00
PatR 38433b4075 tty perm_invent bits
Mostly comments.
2022-06-23 16:10:17 -07:00
PatR d8377fe091 skip update_inventory during character init
With a debugging pline() in place, I could see that tty perm_invent
was being redrawn for each item added to hero's initial inventory.
Avoid that.  There is an update_inventory() call just prior to
entering moveloop() which handles all of starting invent as a unit.
2022-06-23 13:14:28 -07:00
PatR 64c1f83dd8 tty perm_invent: fix right-hand panel
Introducing 'maxslot' at the last second invalidated a ton of prior
testing.  This should fix all the modes of tty perm_invent, including
the missing bottom boundary for TTYINV=4 (show in-use items only, an
approximation of Qt's "paper doll" and of the '*' command).

The boundary box characters are set using cmap_to_glyph(S_<wall_type>)
which in theory makes them change depending on which branch of the
dungeon the hero is in.  That isn't noticeable since they aren't drawn
as tiles, but it doesn't seem right.
2022-06-23 13:03:32 -07:00
PatR da3c5dfe87 experimental change for tty perm_invent
This checks for 'TTYINV' in the environment and if found, it uses that
as a number describing a bit mask for how to show the perm_invent.
 0 = current behavior, a-zA-Z in two columns (I've started referring
     to those as panels because "column" is already used a lot);
 1 = "show gold" => $a-zA-Z# in two columns; requires 1 more line;
 2 = "sparse" => list all letters a-z in the left panel and A-Z in
     the right whether there is an item in the slot or not, so that
     open slots will be obvious;
 3 = 1|2, "sparse" with $a-zA-Z$ instead of just letters;
 4 = "in use" => full lines instead of side-by-side panels, listing
     only items with non-zero obj->owornmask; currently requires 17
     lines instead of 28 (or 29 for show-gold):  room for top border,
     15 lines of worn/wielded items, and bottom border; normal usage
     would be capped at 3 weapon slots, 7 armor slots, and 4 accessory
     slots, but it is possible to have more items in use (simplest
     case is to pick up the iron ball while punished).
The #4 case isn't displaying its bottom border correctly and I haven't
figured out why.

If this turns out to be useful, perm_invent can become a compound or
some new option for perminv mode could be added.
2022-06-23 02:05:52 -07:00
PatR 295a8523f5 tty perm_invent fixes
Modify the error message delivery when too-small so that it works for
both NETHACKOPTIONS or .nethackrc and for 'O'.  "Early failure" isn't
very early; using pline() instead of raw_print() ends up writing to
the base window but also works normally when used for failed attempt
to set perm_invent with 'O'.

Fix the off by one error in height which required an extra line that
ended up going unused.

Fix an off by one error in the middle divider.  Forcing the same item
from the left column to the right column, I was seeing
 "f - an uncursed +0 pair of leather glove" ["s (being worn)" truncated]
 "F - an uncursed +0 pair of leather gl"
After the fix I get
 "f - an uncursed +0 pair of leather glov"
 "F - an uncursed +0 pair of leather glo"
(When terminal width is even, the left side is one character wider
than the right.)

Split the invent window creation code out of tty_create_nhwwindow() to
new routine tty_create_invent().  I came across
  if (r == 0 || (newwin->maxrow - 1)
in the process (note lack of 'r ==' in the second part).  I'm not sure
what the initialization code is intended to accomplish but missing
that init for the bottom (boundary box) row didn't seem to be causing
any problem.

This forces the required size to be big enough to handle statuslines:3
regardless of what the setting for that is at the time the perm_invent
window is created.  When the value is 2, there will be a blank line
between status and the boundary box of perm_invent.  When it is 3, the
third line will use that line and the only separator will be the top
boundary box line.  Toggling back and forth with 'O' works as expected.
2022-06-22 14:21:57 -07:00
PatR 6b5c3fa979 more '&m'
For what a key does, when operating on 'm' which produces two lines
of output, append a command to the first line so that the combination
forms a complete sentence.  Also, expand on the explanattion of what
is going on in dowhatdoes().
2022-06-21 16:22:44 -07:00
PatR c6c1e381b0 fix recent Guidebook typo/thinko 2022-06-21 15:49:30 -07:00
PatR 27c287997b tentative fix for #K3626 - segfault when swallowed
release_hold() checked for (Upolyd && sticks(g.youmonst.data)) before
checking for (u.uswallow) and it could set u.ustuck to Null while
u.uswallow remained set to 1.  dmove_core() was accessing u.ustuck->mx
and u.ustuck->my after that, resulting in a crash.

This fixes that particular case but there might be others that also
assume sticky poly'd hero should be handled before swallowed hero.
Being swallowed/engulfed needs to be handled first.
2022-06-21 12:52:29 -07:00
PatR 3a0c1541dd tty perm_invent options again
I'm not sure what happened but something that worked when I tested
yesterday wouldn't work today.  Have 'O' was pass TRUE rather than
FALSE to tty_perm_invent_toggled() when perm_invent is set to 'on'.
And skip that code for .nethackrc or NETHACKOPTIONS because it was
segfaulting.
2022-06-21 09:56:59 -07:00
PatR d886b43107 fix [again] exploiting artifact name rejection
Reported by entrez:  attempting to name certain undiscovered items
after an artifact could be used to tell whether the item being named
was the same type as the artifact, so trying to name a gray stone
the Heart of Ahriman would let you tell whether it was a luckstone.
That was fixed years ago to reject for any undiscovered gray stone
rather than only for luckstone; you'll get "your hand slips" and the
name would be smudged.  But that fix allowed a loophole and could
still be exploited if the player used lowercase for the name:  it
would get changed to mixed capitalization if the object was the
artifact's type or stay lowercase if it only matched by description.

This changes to the capitalized name even when the type isn't an
exact match, so attempting to name either a luckstone or a touchstone
"the heart of ahriman" will name it "The Aeart of Xhriman" with at
least one smudged letter to avoid the actual artifact name.

Unrelated change:  when attempting to apply a new name to an existing
artifact, it now says "<Artifact> resists" rather than "The artifact
seems to resist" because there's no "seeming" about it.
2022-06-21 08:57:58 -07:00
PatR 6c686c82cb boolean options parsing bit
Boolean switches: add an omitted 'break', plus a few 'default' cases
that would matter if someone turned on the warning about a switch
statement with 'enum' index that doesn't have cases for all possible
values of that enum.  I haven't made any attempt to be exhaustive
about those; these few were just right in the same place.
2022-06-21 01:08:07 -07:00
PatR 305967add4 tty perm_invent option handling
The code for toggling perm_invent when windowtype=="tty" was inserted
into the middle of several switch cases that share 'need_redraw' so
was getting executed for various other options such as 'use_inverse'
that precede it in the list of cases.  It was also continuing on to
general feedback for boolean options, reporting "'perm_invent option
toggled on" even if it failed and the option stayed off.
2022-06-20 16:18:50 -07:00
PatR 916cd4a57d fix #2779 - Windows GUI pulldown help menu \
specifies duplicate accelerator keystrokes

Reported and diagnosed nine and half years ago but never fixed.

In the WinGUI-specific help menu (under the titlebar, not nethack's
'?' command), both "&Long description of the game" and "&Longer list
of game options" use &L as accelerator.  Typing 'L' or 'l' highlights
one of the entries, then <enter> is needed to execute it or typing
another 'L' or 'l' unhighlights it and highlights the other.  Other
accelerators in that menu execute their entries immediately, without
the need for <enter>.

Change the first one to "Long description of the &game" so that 'G'
or 'g' becomes its accelerator.

That menu is missing several things that have been added to the menu
for '?'.  I put in placeholder comments for them but won't pursue
them further.

Untested.
2022-06-19 16:55:39 -07:00
PatR d80752ad4b \#wizkill feedback
If is mon not sensed or seen and you use #wizkill to kill it, report
"You kill an unseen mon." rather than just "You kill the mon."  Also,
override hallucination when identifying the victim.
2022-06-19 13:50:15 -07:00
PatR efcd07f814 another x_monnam() tweak
The former special case for a/an prefix wasn't partlicularly special.
2022-06-19 11:36:40 -07:00
PatR f598acd1c9 code paths through x_monnam()
Reduce the number of early returns in x_monnam().  There shouldn't be
any change in observable behavior.
2022-06-19 02:44:18 -07:00
PatR 5e09a86766 yet more magic whistle
'optr' was accidentally left around from an intermediate revision.
There's no reason to keep it as a comment.
2022-06-19 02:39:43 -07:00
PatR 88c8e92e76 debugpline() fix
Something which occurred to me when looking at the magic whistle code.
It's behavior can vary depending upon whether pline()/You()/&c has
been called and that is detected by checking whether pline() has reset
iflags.last_msg.  Change the debugpline() mechanism to prevent it from
interfering with that.
2022-06-19 02:30:45 -07:00
PatR e6a5ef8e59 magic whistle followup 2022-06-19 01:40:07 -07:00
PatR 304888c99f feedback for bad command prefix usage
The old code to supply a list of directions if a prefix was followed
by a non-direction didn't work as intended anymore.  Add some more
precise feedback for gGF mis-use and comment out some code that never
gets executed.

A number_pad user can get a complaint about 'G' when using '5' followed
by a non-directional command.  Too bad for them.

Supersedes pull request #803
2022-06-17 17:59:05 -07:00
PatR e5180d1587 magic whistle bandage
Reported by entrez:  if magic whistle summoned a pet onto a trap, the
messages produced could be in the wrong sequence or contradictory.
The code was collecting counts and name-of-first for shift (was seen
before whistling, seen at different spot after), for appear (wasn't
seen before, now is), and for disappear (was seen before, now isn't)
before dealing with a trap at arrival location.  The trap could issue
a message (including pet killed, pet sent away--teleport trap, hole,
&c--or pet changed shape--which occurred after its name/old shape was
saved for use when it was the only one in its category), and finally
the summary message was issued.

Change the code to handle arriving in a trap before the collection
into the three categories that provide feedback, and skip the latter
if any message was given during mintrap().  That handles the most
glaring anomalies like killed followed by shifted location or takes
on new shape followed by old shape shifted or appeared.  But it no
longer gives specific shift/appear/disappear feedback for those cases.
Pets that don't land on traps or who land on ones that don't issue
any feedback aren't affected.

The accessibility aspect of this--message feedback in order to avoid
tedious screen reading of the map--will need to be satisfied by the
trap feedback unless/until someone comes up with a better solution.
One possibility is an option to allow player to have rloc() always
issue its vanish and appear messages.  Right now it does so when magic
whistle hasn't been discovered yet, then avoids that hyper-verbosity
(if hero has multiple pets) once it has.  Or the whistle code could
count the number of pets first, then behave as if such an option is in
effect when the count is small and only resort to the current summary
method if the count is larger than some threshold.
2022-06-17 14:58:02 -07:00
PatR 6c91f52908 documentation update
Incorporate the diff from entrez describing the travel_debug wizard
mode option and removing obsolete M prefix from the Guidebook.  That
missed a reference to it in the description of '_'.

I put M back in case someone who has used it with earlier versions
tries to use it and gets a no-such-command complaint so goes looking
for it.

Also, make the mention of ^X at the end of the discussion of status
stand out a bit.  The indentation of its paragraph made it line up
with the preceding text instead of making it be distinct from that.

The TeX changes are untested and given the amount of punctuation
characters used, it will be surprising if they all have been quoted
properly.
2022-06-17 03:18:52 -07:00
PatR 3806dae153 ignoring features when checking version compat
The nomakedefs stuff for cross-compiling support broke the code to
treat enabling or disabling some optional features as not breaking
save and bones file compatibility.  It was relying on a macro whose
definition was local to mdlib.c rather than propagated among files.
makedefs still constructs date.h with a value indicating the ignored
features but the actual compatability check doesn't use that anymore.
Toggling SCORE_ON_BOTL shouldn't have caused existing files to be
rejected but they were.
2022-06-16 11:00:53 -07:00
PatR 479945257b minor perm_invent fix 2022-06-16 09:42:52 -07:00
PatR 3c75e6b01a itemized billing vs persistent inventory, round II
Reported by entrez:  buying an unpaid item using itemized billing used
to result in the price information for unpaid items disappearing when
they get shown by perm_invent.  (Their status as unpaid didn't change;
persistent inventory just got redrawn without cost information.)  The
fix for that didn't handle buying a used-up item.  There's no invent
update for the gone-item item but there is one for moving gold out of
hero's inventory to add to shopkeeper's inventory.  The vanishing
price phenomenon applied to that situation too.

I can't think of any situation where persistent inventory would want
to hide unpaid status and/or cost, so always prevent those from being
excluded during perm_invent update.
2022-06-14 15:48:45 -07:00
PatR 00fd2b79de simulated mouse click for #therecmdmenu
The #therecmdmenu command calls getdir() which issues an "in what
direction?" prompt.  This allows you to answer with "_" instead of a
regular direction, then it will call getpos() to allow you to move
the cursor and type "," (or ";") to behave as if a left-click had
been done or type "." (or ":") to behave as right-click.

Ordinarily I would think of the 'normal' getpos() response of "."
as suitable for left-click, then one of the other getpos finishers
for right-click, but comma is left of period on a standard keyboard
and that seems useful for remembering which is used for which click.

Left clicking on a spot farther than one step away offers travel,
throw iff lined up, and also click-look as choices.  If you right
click farther than one step away, it will only offer click-look.
The look choice for either left or right click isn't inhibited by
having the clicklook option set to False.  After all, player is
explicitly choosing the menu entry to look at something.

New getdir.mouse can be bound to some other key than "_" and the
getpos.pick* responses could already be re-bound, but there's no
separate getdir.left/right that could be used to bind different keys
from those used for the four getpos responses.
2022-06-13 16:06:06 -07:00
PatR 145232a16f fix 'simplify streamlined act_on_act()'
Still more PR #777.  Commit c4c6c3d73a broke #therecmdmenu travel,
throw, and far-look.  It was restricting dx and dy unnecessarily
and that resulted in not specifying the correct location when the
destination was farther than one step away.

Testing those properly requires a mouse.  I've implemented a way
to simulate a left or right click at getdir()'s prompt (only useful
for #therecmdmenu).  That will be committed separately.
2022-06-13 14:44:20 -07:00
PatR c4c6c3d73a simplify streamlined act_on_act()
More PR #777:  there's no need for there_cmd_menu() to pass absolute
<x,y> instead of <dx,dy> for a couple of actions.  Those actions can
reconstruct <x,y> by adding <dx,dy> to <u.ux,u.uy>.
2022-06-13 11:30:59 -07:00
PatR 778eb2603d better feedback for '& m' and '? f m'
For the description of what a keystroke does, augment 'm' (or whatever
key has been bound to #reqmenu) to replace the default description
|m      prefix: request menu or modify command (#reqmenu).
with
|m      movement prefix: move without autopickup and without attacking
|m      non-movement prefix: request menu or modify command (#reqmenu).

The text is delivered by pline so tty will issue --More-- between the
two lines.
2022-06-13 04:41:31 -07:00
PatR 20c43287eb hack.c reformatting
Mostly adjusting some wide lines.  Should be no change in generated
code.
2022-06-13 03:35:46 -07:00
PatR b49e8bdfb6 streamline act_on_act()
Refine the code from pull request #777 by changing act_on_act() to
take 3 arguments instead of 6.  x,y and dx,dy are mutually exclusive
so it doesn't need both pairs provided that the caller is adjusted
to pass the ones appropriate for the action, and dir is easily
derived from dx,dy for the couple of cases that use it.
2022-06-13 03:13:11 -07:00
PatR fe34d4e3e3 noxious quest nemeses
Refine the code added by pull request #763 to check the quest nemesis
death message for reference to noxious fumes rather than having the
three relevant roles be hardcoded.
2022-06-12 13:19:13 -07:00
PatR 14fec29c13 fixes entry for pull request #770 - wizard splbook
Pull request from matteverett:  for generating starting equipment,
mark a wizard as having received a level 1 spellbook when getting
guaranteed force bolt so that the random second spellbook can be
level 1, 2, or 3 as intended rather than unintentionally be forced
to be level 1.

Closes #770
2022-06-11 15:32:37 -07:00
PatR fbd7d5cd37 pull request #798 - fix typo in disclosure \
of vanquired monsters.

Pull request from janne-hmp:  the test for how many spaces to insert
in front of "the <unique monster>" couldn't match prefix "the "
because it was specifying a length of 3 instead of the 4 required to
include the trailing space.

Despite that clear error, the code worked as intended because the
default value of 0 is the same as an explicit value of 0 it would
have gotten if it had matched "the ".  So there is no change in the
resulting vanquished monsters display.

Closes #798
2022-06-11 15:13:30 -07:00
PatR ad3aa545dc monsters less likely to dig in Sokoban
Make monsters being created in Sokoban that are given a random
defensive item be less likely to receive a wand of digging.  Should
result in fewer extra holes needing to be plugged.

Resurrected from an old stash entry.  I have no recollection of why
I didn't consider it to be ready for prime time way back then.
2022-06-11 11:38:52 -07:00
PatR 7c732e64a0 simplify unpunish()
unpunish() duplicated much of delobj() in order to use dealloc_obj().
Switch to delobj().  That required a fix to feel_location() when it
was called by savebones() after vision is turned disabled.
2022-06-11 00:11:48 -07:00
PatR 01fb6a703f Some cleanup for saving bones 2022-06-11 00:09:14 -07:00
PatR 542ab25da1 saving/freeing ball and chain
Reported by entrez:  fix memory being accessed after having been
freed by trying to keep ball&chain data up to date when they're
processed by the save code.  This fix is a little more elaborate
than this suggested one.  I'm crossing my fingers on this one....
2022-06-11 00:08:17 -07:00
PatR cdf82a8a7a \#wizkill while engulfed
Targetting any of the eight surrounding spots while swallowed will
kill the engulfer.  Picking a spot farther away reports "no monster
there" even if there does happen to be one at the chosen spot.
2022-06-10 15:19:01 -07:00
PatR 188f9f86af left out of commit e2d694ed32 2022-06-10 14:36:55 -07:00
PatR e2d694ed32 fix github issue #769 - revive panic
Issue #769, reported by k2 and diagnosed by entrez:  eating a troll
corpse that revives on the last turn of the meal was using up the
corpse while the revival was in progress (unless the hero couldn't
observe the resulting monster), leading to a panic when trying to
use it up at the end of revival.  Brought on by a recent change to
interrupt an occupied hero who can observe a hostile monster being
created nearby.

The fix isn't perfect.  If revival fails because there's no place
to put the revived troll, the meal will be interrupted with one bite
left instead of finishing.  If that happens, the interruption will
include a "you stop eating" message, just with no explanation why.
The partly eaten--almost completely eaten--corpse will remain.

Closes #769
2022-06-10 11:35:07 -07:00
PatR 95dece1a2b object splitting bit
Something else noticed while hunting for the revive() panic.  Like
the zap.c change (56b791f7cc), doesn't fix that or impact its
eventual fix.
2022-06-10 10:14:06 -07:00
PatR 56b791f7cc couple of revive() bits
Noticed while hunting for the panic.  They don't fix it but also
won't interfere with the eventual fix.
2022-06-10 10:11:10 -07:00
PatR c8ceb2b860 add reset_justpicked() comment 2022-06-09 00:37:14 -07:00
PatR 3d35e54414 utf8 warning fix
Avoid gcc/clang warning about mixing || with && without parentheses.
The code already worked as intended despite the warning.
2022-06-09 00:28:44 -07:00
PatR faf3d6f08a death from touching silver ring or wand
From a reddit thread:  NAO's list of causes of death shows
|killed by handling a(n) ring of shock resistance
|killed by handling a(n) wand of fire
along with various other rings and wands and the poster wondered how
that could have killed characters.  Someone quickly figured out that
the heroes involved had lycanthropy and the items listed happened
to be silver in those games.

Avoid that sort of confusion in future by specifying "handling a
silver ring" or "handling a silver wand" instead of the specific
type of item when inflicting silver damage.  It still uses specific
item for other classes of objects where silver isn't shuffled among
potential items at start of game.
2022-06-08 12:50:49 -07:00
PatR f710a3175f magic portal traversal feedback
Replace the old message "you feel dizzy for a moment, but the sensation
passes" when going through a magic portal.  The sensation doesn't just
pass anymore; you arrived stunned these days.  Suggested by entrez.
2022-06-08 10:46:51 -07:00
PatR d1d0f1103c artifact name formatting bit
All the quest artifacts are named "The <something> of <someone>".
Change xname() to force "the" instead of "The" when that occurs in
the middle of "a skeleton key named The Master Key of Thievery" or
"a pair of lenses named The Eyes of the Overworld".

This change isn't applied to user-assigned names; they're used as-is.
2022-06-06 16:15:07 -07:00
PatR 59c73cf0ae monpolycontrol bit
I tried to polymorph a shopkeeper into a long worm (which isn't
allowed) and EDIT_GETLIN preserved "long worm" for default input
on the first retry.  I just pressed <return> without modifying the
preloaded input, so a cycle of repitition occurred until eventually
it returned Null.  But then the outer caller also retried, starting
it all over (at least without preserving the old failed input this
time).

Change it so that if the same unacceptible input is given twice in
a row, or empty input even once, preload the buffer for the next
retry with "random".  Player can still edit that but if <return> is
used then an acceptable random choice gets made.

Only applies to the "what type of monster?" for polymorph target
when monpolycontrol is On since that's where two levels of retrying
happens.
2022-06-05 14:39:48 -07:00
PatR 1791dda512 atttempting to close a blocked door
Simplify the message handling for trying to close a door when there's
a monster in the doorway.
2022-06-05 14:37:00 -07:00
PatR b4a415848d curses locale.h fix 2022-06-03 13:12:27 -07:00
PatR 4c47b7f622 'make depend' update 2022-06-03 13:02:40 -07:00
PatR f5642d8bc4 fixes entry for PR #784 - reset just-picked-up
Pull request from entrez:  the just-picked-up flag on recently
picked up items was being reset when you stepped on other items
without picking anything else up.

Closes #784
2022-06-03 12:48:38 -07:00
PatR 4a7481dab6 github PR #787 - segfault for wizterrain wish
Pull request from entrez:  the change to show the result of a wish in
its gamelog/livelog event resulted in a segfault if that result was
&zeroobj.  It occurs for wizard mode wishes producing terrain changes
instead of objects.

Closes #787
2022-06-03 12:10:55 -07:00