]> granicus.if.org Git - nethack/log
nethack
5 years agotest and adjust for curses with msdos
nhmall [Tue, 2 Jul 2019 18:01:44 +0000 (14:01 -0400)]
test and adjust for curses with msdos

5 years agotty status highlighting via attributes
PatR [Tue, 2 Jul 2019 08:37:04 +0000 (01:37 -0700)]
tty status highlighting via attributes

Highlighting via attributes got broken three months ago.  May or
may not have been noticeable depending upon which attributes are
supported.  Too many variations of attribute designations...

5 years agofix up Windows gcc Makefile
nhmall [Mon, 1 Jul 2019 02:19:37 +0000 (22:19 -0400)]
fix up Windows gcc Makefile

5 years agoWhen restoring game we should not need to invoke rnd to test for hiding.
Bart House [Sun, 30 Jun 2019 23:41:24 +0000 (16:41 -0700)]
When restoring game we should not need to invoke rnd to test for hiding.

5 years agoNeed to check ball and chain after we have procesed floor objects.
Bart House [Sun, 30 Jun 2019 23:34:41 +0000 (16:34 -0700)]
Need to check ball and chain after we have procesed floor objects.

5 years agolast NetHack-3.6 travis build passed so re-enable notifications to devteam
nhmall [Sun, 30 Jun 2019 20:54:34 +0000 (16:54 -0400)]
last NetHack-3.6 travis build passed so re-enable notifications to devteam

5 years agowishing vs EDIT_GETLIN
PatR [Sun, 30 Jun 2019 20:45:14 +0000 (13:45 -0700)]
wishing vs EDIT_GETLIN

If you ask for help when wishing, don't leave "help" in the buffer
for EDIT_GETLIN to use as default answer on next retry.  It does still
leave anything rejected as unknown so that the player has a change to
review the spelling and conceivably add and/or remove from the end
witout having to retype everything.

5 years agocurses message history vs dumplog message history
PatR [Sun, 30 Jun 2019 18:50:08 +0000 (11:50 -0700)]
curses message history vs dumplog message history

When I implemented getmsghistory()/putmsghistory() for curses I was
assuming that DUMPLOG would only be used with tty, but it is interface
neutral and can be used with curses (or others).  So curses message
history needs to behave like tty message history and be sure to pass
along messages that bypass pline() and the normal message window.
(Mainly one-line summaries of long quest messages, but also old
messages fetched from a save file and available to be re-saved without
having been shown if new session doesn't generate enough new messages
to flush them.)

5 years agoMerge branch 'NetHack-3.6' of https://rodney.nethack.org:20040/git/NHsource into...
nhmall [Sun, 30 Jun 2019 18:12:48 +0000 (14:12 -0400)]
Merge branch 'NetHack-3.6' of https://rodney.nethack.org:20040/git/NHsource into NetHack-3.6

5 years agoadd --depth 1 to git clone for travis windows test
nhmall [Sun, 30 Jun 2019 18:12:16 +0000 (14:12 -0400)]
add --depth 1 to git clone for travis windows test

5 years agoattributes disclosure: experience points
PatR [Sun, 30 Jun 2019 17:51:00 +0000 (10:51 -0700)]
attributes disclosure: experience points

Wizard mode shows the number of points needed to reach the next level
(unless already maxxed out at 30) for ^X and end of game disclosure.
Do it in normal play for the latter too.  (I think it would ok to do
that for ^X too but haven't gone that far.)

Even when it was wizard mode only, the phrasing for past tense had a
minor grammar bug, and it could make the line a little too long for
tty and curses (not sure about others) when level was high, resulting
in wrapped text.  That looked bad for tty, which first tries removing
indentation (just 1 space in this case), making that line outdented
as well as wrapped.  So change the phrasing slightly when experience
level is 'too high'.  I had a version which formatted, measured, and
re-formatted if necessary but that was overkill; simple hardcoded
rephrasing suffices particularly when measuring was against assumed
display width (80) rather than actual width.

5 years agoadd pdcurses support to travis ci windows test builds
nhmall [Sun, 30 Jun 2019 17:22:25 +0000 (13:22 -0400)]
add pdcurses support to travis ci windows test builds

pdcurses is obtained on-the-fly from the github source

5 years agoremove "bogus" bit :)
nhmall [Sun, 30 Jun 2019 16:12:42 +0000 (12:12 -0400)]
remove "bogus" bit :)

5 years agolower case windows in .travis.yml
nhmall [Sun, 30 Jun 2019 14:33:53 +0000 (10:33 -0400)]
lower case windows in .travis.yml

5 years agoTRAVIS CI updated to include Windows and osx testing
nhmall [Sun, 30 Jun 2019 14:19:16 +0000 (10:19 -0400)]
TRAVIS CI updated to include Windows and osx testing

TRAVIS CI added Windows to their platform list in late 2018.

Update the .travis.yml file to include a pair of Windows in
machines in the testing suite, one built with visual studio
command line tools and the other with mingw gcc tools.

The visual studio build is currently using nmake with the
sys/winnt/Makefile.msc Makefile from our distribution,
That's the same process we've been using for building
our binaries, pretty much.

BRH may be able to modernize it over the next couple of
weeks to use the msbuild process instead.

I went with the HINTS environment variable on windows
for consistent self-documenting purposes, even though
the environment variable isn't used on windows.

included:
   os: linux
   Compiler: gcc C
   HINTS=linux

   os: linux
   Compiler: clang C
   HINTS=linux

   os: linux
   Compiler: gcc C
   HINTS=linux-x11

   os: linux
   Compiler: gcc C
   HINTS=linux-qt5

   os: linux
   Compiler: gcc C
   HINTS=linux-minimal

   os: windows
   language: shell
   HINTS=Windows-visual-studio

   os: windows
   HINTS=Windows-mingw

excluded:
   os: osx
   Compiler: clang
   Xcode: xcode10.2 C
   HINTS=macosx10.14

5 years agoNo PDCurses right out-of-the-box; requires an edit
nhmall [Sun, 30 Jun 2019 05:10:32 +0000 (01:10 -0400)]
No PDCurses right out-of-the-box; requires an edit

5 years agoupdate Windows Makefiles to support TRAVIS CI builds
nhmall [Sun, 30 Jun 2019 05:09:41 +0000 (01:09 -0400)]
update Windows Makefiles to support TRAVIS CI builds

5 years agocurses+EDIT_GETLIN again
PatR [Sat, 29 Jun 2019 00:00:20 +0000 (17:00 -0700)]
curses+EDIT_GETLIN again

Turns the "fix" in commit 319dcf4746a81ef0ca413491bdf30b4c08f931c2
handled removing the default answer for single-line-prompt plus
multi-line-answer but not for multi-line-prompt plus long-enough-
answer-to-reach-another-line.  The logic wasn't quite right and I
misunderstood what is stored in linestarts[] so even correct logic
wouldn't have solved things.

5 years agobuild fix for Windows if pdcurses is included after recent changes
nhmall [Fri, 28 Jun 2019 22:59:06 +0000 (18:59 -0400)]
build fix for Windows if pdcurses is included after recent changes

cursmain.o : error LNK2001: unresolved external symbol _erase_char
cursmesg.o : error LNK2001: unresolved external symbol _erase_char
cursmain.o : error LNK2001: unresolved external symbol _kill_char
cursmesg.o : error LNK2001: unresolved external symbol _kill_char

5 years ago^I vs perm_invent again
PatR [Fri, 28 Jun 2019 19:50:08 +0000 (12:50 -0700)]
^I vs perm_invent again

A recent fix for #wizidentify showing "Not carrying anything" after
listing inventory items still showed "Not carrying anything" after
"(all items are already identified)".  Fix is easy.

Trickier bug was that ^I performs object ID on selected items while
the inventory routine is still in progress (but after it has processed
every item) and the ID routine will call update_inventory() which
will call the inventory routine to reformat invent.  So the inventory
display routine was called recursively without having returned to
wizidentify where iflags.override_ID gets cleared to revert to normal
inventory.  The nested call was unintentionally narrowing the contents
of persistent inventory window to whatever items were still unIDed.
(Any inventory update, including ^R, restored it to full inventory.)

5 years agocurses popup single char input
PatR [Fri, 28 Jun 2019 19:28:40 +0000 (12:28 -0700)]
curses popup single char input

With 'popup_dialog' On, a one line popup with question and likely
responses and default answer was shown, but without having the
cursor displayed at the end of emphasize that it was waiting for an
answer.  Make the popup be one character wider so that there is room
to show the cursor.  No effect when 'popup_dialog' is Off and prompts
are shown at the bottom of the message window; those already have the
cursor sitting at the end.

5 years agocurses menu and text window size
PatR [Fri, 28 Jun 2019 18:59:14 +0000 (11:59 -0700)]
curses menu and text window size

Make final inventory disclosure use a full width menu instead of
the default 38-column width with lots of wrapping.  Also, increase
that default from 38 to 40 for the rest of the time.  Commit
9f6588af49766c00998291ff79735922199c8563 made the 38 vs 40 portion
matter much less but I decided to keep it in anyway.

When a menu or 'things that are here' popup has only a couple of
lines and they happen to be narrow, a sized-to-fit window isn't
always easy to spot when it is shown over the ends of old messages
rather than over the map, even with a border box around it.  Give
such windows a minimum size of 5x25 so that they always stand out
enough to be immediately seen.  This will cause more message text to
be rewritten occasionally (after dismissing the menu or text window)
but the curses interface seems to discount that as something to be
concerned about.

5 years agocurses mouse_support bit for fixes36.3
PatR [Fri, 28 Jun 2019 10:17:25 +0000 (03:17 -0700)]
curses mouse_support bit for fixes36.3

5 years agoMerge 'curses-mouse_support' into NetHack-3.6
PatR [Fri, 28 Jun 2019 10:08:30 +0000 (03:08 -0700)]
Merge 'curses-mouse_support' into NetHack-3.6

Fully support the mouse_support option for curses, via 'O' as well as
via config file.  At the moment, mouse_support:1 and mouse_support:2
are equivalent.

Also, fix the screen-to-map coordinate translation.  When the mouse
is active and over the map, the pointer's cursor becomes a cross-hair
(may very by platform) and the character cell chosen for a click
seems to be a few pixels to the right of the center of the '+'.

5 years agoPDCurses behaves the same as ncurses
nhmall [Fri, 28 Jun 2019 03:22:34 +0000 (23:22 -0400)]
PDCurses behaves the same as ncurses

5 years agoPDCurses requires PDC_NCMOUSE for compatibility with ncurses
nhmall [Fri, 28 Jun 2019 03:12:06 +0000 (23:12 -0400)]
PDCurses requires PDC_NCMOUSE for compatibility with ncurses

The PDC_NCMOUSE has to be defined on the command line
or above the #include entries in win/curses/cursmisc.c.

This does the former command line change.

5 years agoUNIX|VMS compile warning
PatR [Fri, 28 Jun 2019 00:42:56 +0000 (17:42 -0700)]
UNIX|VMS compile warning

So no one on Unix or Unix-like ever builds without tty support?

options.c:694:11: warning: unused variable 'opts' [-Wunused-variable]

Noticed when producing a curses-only binary to verify that erase_char
and kill_char weren't relying on tty being present.

5 years agocurses erase char and kill char
PatR [Fri, 28 Jun 2019 00:18:07 +0000 (17:18 -0700)]
curses erase char and kill char

Support user's terminal settings for erase char and for kill char.
Erase char is typically <delete> or <backspace>, both of which are
already explicitly handled so probably no effect there.  Kill char
(generally ^U these days) will be honored unless it is a printable
character (don't know whether there are any troglodytes out there
who still use '@' for that...).  The current handling for ESC works
the same if there is any input to kill, but yields 'cancelled' when
there isn't.

That's for message window getline(), which operates char-by-char.
The popup getline() uses a curses routine to get an entire string
and already honors kill char but treats ESC as input of ^[.

5 years agocurses mouse right-click
PatR [Thu, 27 Jun 2019 22:02:49 +0000 (15:02 -0700)]
curses mouse right-click

Right button is button3 rather than button2.  Accept either and treat
both as "not left" to pass CLICK_2 back to the core.

Treat <Ctrl>+left-click as "not left" too, to simplify usage with Mac
one-button mouse (where <Ctrl>+left-click can be configured to send
"secondary click" but might not be set do so) or one-button laptop
trackpad (where having two fingers on the scrolling portion of the pad
while clicking the button is necessary to send "secondary click").

5 years agomouse_support for win/curses using ncurses
PatR [Wed, 26 Jun 2019 22:46:44 +0000 (15:46 -0700)]
mouse_support for win/curses using ncurses

5 years agocoalescing partly eaten globs
PatR [Wed, 26 Jun 2019 22:37:17 +0000 (15:37 -0700)]
coalescing partly eaten globs

Another one which has been around for a while.  When merging two
globs, the result is partly eaten if either (or both) of them was
partly eaten, not just when the one that's going to stick around as
the combined glob already was.

5 years agompickobj sanity, ball&chain theft feedback
PatR [Wed, 26 Jun 2019 22:33:40 +0000 (15:33 -0700)]
mpickobj sanity, ball&chain theft feedback

Something I've had sitting around for quite a while.  Add a sanity
check to mpickobj().  (It will need tweaking if b&c are changed to be
in engulfer's inventory.)

Also, include more information in the feedback when a nymph steals
attached iron ball:  "Nymph removed your chain and stole a heavy iron
ball".

And don't set the avenge-ok flag if uball is the item stolen since
thief was doing hero a favor, or for anything when the thief is under
the influence of Conflict.

5 years agoball&chain bit
PatR [Tue, 25 Jun 2019 18:02:07 +0000 (11:02 -0700)]
ball&chain bit

A check for bad restoration (ball without chain or vice versa) issued
a warning but then left the problem around to trip up other code.
'Fix' the problem by clearing those owornmask slots and their pointers.
Doesn't try to recover memory if the one that's found is OBJ_FREE.

Also some formatting.

5 years agokeyhelp typo
PatR [Tue, 25 Jun 2019 10:27:42 +0000 (03:27 -0700)]
keyhelp typo

5 years agocurses clipped map 'scrollbars'
PatR [Tue, 25 Jun 2019 10:17:47 +0000 (03:17 -0700)]
curses clipped map 'scrollbars'

The position bars shown by curses when the map is clipped weren't
being drawn as intended (integer arithmetic).  Changing parentheses
was enough to get it working, but it didn't handle the edge case
where non-zero got rounded to 0 (so when map was panned down, the
uppermost character of the vertical position bar still showed '*',
falsely indicating that top of map was currently within view.

5 years agocurses cursor
PatR [Tue, 25 Jun 2019 09:30:27 +0000 (02:30 -0700)]
curses cursor

Followup to 1c03d0970115c776d1c4791fea3c33f70b0b5378; that had been
too easy.  When map was clipped and panned to the side, the highlight
for hero's spot was shown next to the '@' instead of on it.

5 years agofix #H7840 - curses ':' menu search+toggle
PatR [Tue, 25 Jun 2019 02:28:50 +0000 (19:28 -0700)]
fix #H7840 - curses ':' menu search+toggle

Using ':' to have search string matching toggle items chosen for
selection would show selection highlighting on the current page for
items matched off-page.

5 years ago'sortpack' vs 'perm_invent'
PatR [Tue, 25 Jun 2019 01:54:38 +0000 (18:54 -0700)]
'sortpack' vs 'perm_invent'

The persistent inventory window wasn't being updated if you toggled
the 'sortpack' option interactively.  (The new setting was honored
once something else triggered a 'perm_invent' update.)

The logic for toggling 'fixinv' seemed backwards.  I hope this "fix"
for that hasn't actually broken it.

5 years agocurses 'perm_invent' fixes
PatR [Tue, 25 Jun 2019 01:39:24 +0000 (18:39 -0700)]
curses 'perm_invent' fixes

I noticed the wrapping issue while testing out the 'bad fruit' fix,
then the other things while fixing it.

1) inventory entries too wide for narrow persistent inventory window
   wrapped without any control; normally can't be seen except for the
   last entry when the list is short enough to leave at least one line
   available; it looked fairly reasonable with window borders Off, but
   when On the last char of the first line and first char of second
   line were clobbered by the border box;
2) when there were too many entries to fit within the height, those
   after the last one which fit were appended to it for borders Off
   (or written on bottom line and then overwritten by the border box
   for borders On); noticed because the selector letter is highlighted
   with inverse video, even when written at an unexpected place;
3) suppress the inverse video hightlighting of inventory letters since
   they can't be selected from that 'menu';
4) for borders Off, the top line was left blank as if a border was
   going to be drawn there;
5) since the entries are truncated due to the narrow window (on a
   modest sized display), strip off leading "a", "an", or "the" prefix
   for inventory entries (written to curses perm_invent window only);
   lets a couple more characters of more interesting stuff be seen.

5 years agofix "Bad fruit #N" warnings when saving bones
PatR [Mon, 24 Jun 2019 22:11:51 +0000 (15:11 -0700)]
fix "Bad fruit #N" warnings when saving bones

savebones() sets all the fruit indices negative, then resets to the
normal positive value for each fruit it actually writes into the bones
file.  But if 'perm_invent' is enabled and something triggers an
update_inventory() while bones saving is in progress, object formatting
for the inventory display won't be able to find any fruits, resulting
in impossible "Bad fruit #N".  Fix is to turn off 'perm_invent' when
the game ends, so it won't be On when bones are written.  Disclosure
uses a popup for inventory so persistent window is obsolete by then
anyway.

[I don't know what is triggering update_inventory() while savebones()
is executing.  Also, I don't see where the fruits whose index stayed
negative--because there aren't any on level being saved--get purged.
Maybe when those bones are loaded by another game?]

5 years agoFix dangling chain bug.
Bart House [Mon, 24 Jun 2019 04:39:22 +0000 (21:39 -0700)]
Fix dangling chain bug.

If a punished player picks up the iron ball, gets engulfed and
saves, then the saved game will have missed saving the dangling
chain since it was not on the floor or in the inventory.  Upon
restoring the saved game, the game will be in a bad state since
the ball will be worn but the chain will be missing.

5 years agoworm segment placement
PatR [Mon, 24 Jun 2019 01:48:13 +0000 (18:48 -0700)]
worm segment placement

random_dir() for picking a spot to put a segment of a long worm's tail
(when it is being placed on the map, perhaps after teleport, not when
movement allows it to grow) had mistakes in three of the four compass
directions.  The one for the top of the map was benign; it just
neglected to use the top row (#0).  But it could pick a value off the
edge of the map for bottom and right or both.

This doesn't explain a couple of long worm [segment] oddities on the
Astral level because that level doesn't go all the way to the edge.

5 years agolevel overcrowding tweaks
PatR [Mon, 24 Jun 2019 00:27:15 +0000 (17:27 -0700)]
level overcrowding tweaks

A couple changes dealing with overcrowded levels.  So many monsters
are moving from the Plane of Water to the Astral Plane that the
latter can start out completely full.

Give monsters who trigger the endgame portals a 6/7 chance to not go
through ('home' elementals or any monster carrying the Amulet already
wouldn't go through).  They should learn about magic portal trap in
the process and not voluntarily step on that afterward.

When the Wizard or other covetous monster tries to teleport next to
the hero and fails, he was being sent to limbo.  There's no need for
that; he's already on the map and can just stay where he is.  That
doesn't actually help with the endgame population issue, it just
fixes a couple of uses of mnearto().

I have significant changes for mnearto() and elemental_clog() that
also help with this but will test those more before committing.

5 years ago\#wizidentify bug - 'Not carrying anything.'
PatR [Sun, 23 Jun 2019 18:31:21 +0000 (11:31 -0700)]
\#wizidentify bug - 'Not carrying anything.'

when carrying things.  The fuzzer toggled on 'perm_invent' and after
interrupting it I used ^I.  Having 'perm_invent' enabled makes the
inventory code avoid having a totally empty inventory display (by
supplying "Not carrying anything" instead--in the menu rather than
via normal pline) so that interface code will see a change and know
that an update is needed.  But to decide whether the menu was empty,
the inventory code was testing union 'any' field 'a_char' to check
whether some item had used the union (implying that something had
been passed to add_menu()), but wizidentify (^I) uses field 'a_obj'
instead.  Apparently the a_char bits stayed 0 because the menu ended
up with "Not carrying anything" after a list of inventory items.
Switch to a separate variable to track whether anything has been put
into the menu instead of trying to rely on the union.

Unrelated but noticed when checking other "Not carrying anything"
instances, the #adjust command ends early when there's no inventory
but it was asking for a letter to adjust even when the only thing in
inventory was gold in '$' slot, which isn't allowed to be adjusted
away from that slot.  Treat gold-only like no-invent.

5 years agomakemon() and clone_mon()
PatR [Sat, 22 Jun 2019 20:47:35 +0000 (13:47 -0700)]
makemon() and clone_mon()

Express the logic of various early returns more consistently.

clone_mon() wasn't handling mon->isminion correctly.  I'm not sure
whether it is actually possible to clone a minion (maybe after
polymorphing it into a gremlin or blue jelly?).  When it wasn't tame,
which is the case for every minion other than the guardian angel on
Astral, the emin structure wasn't being allocated for the clone but
its isminion flag was left set.

Also, clones inherited mon->mtrack[] so would unnecessarily avoid
moving onto spots the original had recently moved across.

Cloned pets are inheriting various pet-specific fields that they
probably should be starting with a clean slate on but I haven't made
any attempt to address that.

5 years agofix #H8922 - no "you finish eating" message
PatR [Sat, 22 Jun 2019 20:03:50 +0000 (13:03 -0700)]
fix #H8922 - no "you finish eating" message

after being interrupted and then resuming.  Resuming a multi-turn
food when it only had one bite left was the culprit.

5 years agocode in parse_conf_file() to trim trailing blanks/cr was missing them
nhmall [Sat, 22 Jun 2019 04:05:16 +0000 (00:05 -0400)]
code in parse_conf_file() to trim trailing blanks/cr was missing them

Observed on a text file with crlf endings on Linux, where the
so-called blank lines weren't being ignored as they should
have been, despite there being a line to remove \r from the
end.

A pointer was being pre-decremented before the check for a
matching whitespace character.

5 years agofix #H8833 - wishing for "<foo> amulet"
PatR [Fri, 21 Jun 2019 01:42:35 +0000 (18:42 -0700)]
fix #H8833 - wishing for "<foo> amulet"

and receiving a random amulet instead of an "amulet of <foo>".
Although the failure to produce the 'right' amulet wasn't a regression
compared to earlier versions as the report indicated, supporting that
wish is straightforward.

5 years agofix #8924 - demonic bribery while hero is deaf
PatR [Thu, 20 Jun 2019 20:08:47 +0000 (13:08 -0700)]
fix #8924 - demonic bribery while hero is deaf

Even though it isn't using verbalize() to make a specific statement,
don't let a demon ask the hero for a bribe when the hero is deaf.

Also, give alternate setup messages in a couple of places where a
divine voice is overriding deafness.

5 years agocomment typo for "transient"
PatR [Thu, 20 Jun 2019 17:59:48 +0000 (10:59 -0700)]
comment typo for "transient"

5 years agomuse wand/horn feedback for monst zapping at self
PatR [Thu, 20 Jun 2019 17:54:59 +0000 (10:54 -0700)]
muse wand/horn feedback for monst zapping at self

Recent commit 5d59b288c9a8e6f15f683007bdf5c4e4549642f4 changed monster
zapping a fire horn at self to cure sliming to not use the wand-zap
feedback routine, but inadvertently did for zaps of wands of fire too.
Use the zap routine for wand and play-instrument routine for horn.

5 years agoRe-do the formatting for help on menu control keys
PatR [Thu, 20 Jun 2019 09:26:48 +0000 (02:26 -0700)]
Re-do the formatting for help on menu control keys

and add the non-configurable keys:  space, return, and escape.

5 years agoupdate contact URL
PatR [Thu, 20 Jun 2019 08:24:10 +0000 (01:24 -0700)]
update contact URL

Reviewing the help choices revealed an out of date one.

5 years agocurses text windows
PatR [Thu, 20 Jun 2019 08:14:50 +0000 (01:14 -0700)]
curses text windows

Most of the entries for '?' looked awful because curses was using
((terminal_width / 2) - 2) for the window width ('- 2' was to make
for for a border around the popup window, regardless of what the
'windowborder' option was set to).  Splitting text that has been
manually formatted for 80 columns "worked" but looked bad when not
required.

Some of the help files are using 79 characters on a few lines,
producing wrapped text when displayed.  Those would look better if
limited them to 78 or if curses can be modified to suppress the
window border when the entire display is being covered by a popup.

5 years agofuzzer tweak tweak
PatR [Thu, 20 Jun 2019 07:53:45 +0000 (00:53 -0700)]
fuzzer tweak tweak

Recent fuzzer tweak had an unintended side-effect:  NUL character is
used to indicate a mouse click and we weren't setting up fake value
for one of those.  Go back to avoiding NUL when obtaining a random
value for user's keystroke.

5 years agocurses map window
PatR [Tue, 18 Jun 2019 10:52:28 +0000 (03:52 -0700)]
curses map window

tty ignores map column #0 (0-based index), like the core, and draws
the map in screen columns 1 (1-based index) through 79, leaving screen
column 80 blank.  curses was drawing all 80 map columns and since #0
was always unused, screen column 1 was blank and the map was shown in
2 through 80.  Change curses to work like tty.

This was too easy; there may be problems lurking.  One known issue: it
should be made smarter about when clipping/panning is necessary since
it thinks that a full 80 columns are needed but 79 suffice.

5 years agomkroom.h update
PatR [Tue, 18 Jun 2019 09:43:41 +0000 (02:43 -0700)]
mkroom.h update

Give room type enums explicit values so that it is easier to find
them when searching by value rather than by name.

Also some reformatting.

5 years agocuring green slime bit
PatR [Tue, 18 Jun 2019 09:39:45 +0000 (02:39 -0700)]
curing green slime bit

A recent change to make_slimed() overlooked a different recent change
in how mon->m_ap_type and youmonst.m_ap_type are referenced.  In this
case it had no impact; fix on general principles.

5 years agomonster overflow on Plane of Air
PatR [Mon, 17 Jun 2019 17:09:16 +0000 (10:09 -0700)]
monster overflow on Plane of Air

Make Air behave the same as Earth, Fire, and Water if monsters are
forced off the level for some reason.

5 years agofuzzer tweaks
PatR [Mon, 17 Jun 2019 16:31:01 +0000 (09:31 -0700)]
fuzzer tweaks

Prevent the fuzzer from randomly toggling the 'silent' option.  If
you use the default value of True then this eliminates most--but not
all--of the beeping that happens when it is running.  I'm not sure
where the remaining beeps are coming from.

Modify the random keystroke selection to implement some bias towards
direction keys that I thought had already been there, plus a higher
chance to entering digits to initiate number responses.

5 years agoEDIT_GETLIN when naming monsters and objects
PatR [Sat, 15 Jun 2019 15:19:32 +0000 (08:19 -0700)]
EDIT_GETLIN when naming monsters and objects

Like #annotate, #name monster, #name individual object, and #name
object type are places where it makes some sense to have an existing
name be the default for the new name, in case taking off from the end
and/or adding to the end is more convenient than retyping everything.

When there is an existing name used as default, clearing that default
and hitting <return> is not enough to remove the name, you still need
to 'assign a new name' of <space> to do that.

5 years agotake two: tty bug with long 'autodescribe' text
PatR [Sat, 15 Jun 2019 14:18:47 +0000 (07:18 -0700)]
take two: tty bug with long 'autodescribe' text

Messages on tty which bypass message history weren't handling long
lines properly.  If the text wrapped to line 2, that continuation
portion was left on the screen after whatever operation that put it
here was finished.  (To reproduce:  assign a long name to a monster
with a long type name so that the combined length exceeds the display
width, then move the cursor over it with ';' or '/' while autodescribe
is On.)

This time prompting isn't adversely affected.

5 years agotty bug with multi-line prompts
PatR [Sat, 15 Jun 2019 12:11:08 +0000 (05:11 -0700)]
tty bug with multi-line prompts

This effectively reverts 1ad2415315c1e6dbcdfcd4a4b22b6fb93ccef1f2
because it was interfering with prompts that spanned more than one
line (by inserting '--More-- + erase' between displaying of prompt and
getting input for the answer).

So we're back to the situation where autodescribe feedback when moving
the cursor will leave text on the second line if it generates text too
wide for one line.  (^R redraws the screen correctly.)

5 years agoEDIT_GETLIN vs monpolycontrol
PatR [Sat, 15 Jun 2019 11:13:34 +0000 (04:13 -0700)]
EDIT_GETLIN vs monpolycontrol

For wizard mode 'monpolycontrol', the getlin() answer buffer for the
"Change <monster> @ <x,y> into what kind of monster?" prompt is also
used to format the coordinate portion of that prompt, so when
EDIT_GETLIN is enabled getlin() was inadvertently given "<x,y>" to use
as default response.  Clear it after the prompt is formatted instead
of via an initializer.  Also, shorten the prompt on the first try:
"Change <monster> @ <x,y> into what?", expanding to the old prompt if
retry is needed.

This also allows specifying 'chameleon' when <monster> is a chameleon,
'doppelganger' when it's a doppelganger, and 'sandestin' when it's one
of those (but not 'doppelganger' when it's a chameleon or sandestin,
and so forth), instead of blanket refusal to accept any non-vampire
shapechanger as the choice.

5 years agodo_mname bit
PatR [Thu, 13 Jun 2019 01:04:00 +0000 (18:04 -0700)]
do_mname bit

Couple of tweaks I made to do_mname() while investigating the tty
autodescribe wrapping issue.

5 years agotty bug with displaying long 'autodescribe' text
PatR [Thu, 13 Jun 2019 00:57:24 +0000 (17:57 -0700)]
tty bug with displaying long 'autodescribe' text

Messages on tty which bypass message history weren't handling long
lines properly.  If the text wrapped to line 2, that continuation
portion was left on the screen after whatever operation that put it
here was finished.  (To reproduce:  assign a long name to a monster
with a long type name so that the combined length exceeds the display
width, then move the cursor over it with ';' or '/' while autodescribe
is On.)

5 years agomklev.c formatting and comments
PatR [Wed, 12 Jun 2019 01:54:32 +0000 (18:54 -0700)]
mklev.c formatting and comments

I made these to 3.7.0- and decided to bring them back to 3.6.2+
because of the 'TODO'.

5 years agowizweight vs globs
PatR [Mon, 10 Jun 2019 16:52:34 +0000 (09:52 -0700)]
wizweight vs globs

The wizard mode runtime option 'wizweight' appends an object's weight
to its formatted description, but that was skipped for globs on the
assumption that it had already been included.  But that inclusion only
happens in shops so most globs lacked weight feedback.

5 years agomuse wand/horn feedback
PatR [Mon, 10 Jun 2019 10:16:52 +0000 (03:16 -0700)]
muse wand/horn feedback

One of the claims in #H8849 was that a monster which zapped a wand
that the hero had fully identified made hero's knowledge of it revert
to "a wand".  That doesn't happen; it had to have been a different
wand which hadn't been seen up close yet.  But the hero should lose
track of known number of charges if a wand is zapped outside his/her
view.  When implementing that I noticed that a monster playing a fire
horn to burn away slime was using the routine that gives wand
feedback.  Add a separate, similar routine for magical horn feedback.

Half this diff is due to moving a naming support routine from mhitm.c
to do_name.c.

5 years agocurses EDIT_GETLIN - discarding preloaded answer
PatR [Sun, 9 Jun 2019 14:07:34 +0000 (07:07 -0700)]
curses EDIT_GETLIN - discarding preloaded answer

EDIT_GETLIN is more complicated on curses than on tty due to way that
long lines are handled....

Using ESC to get rid of the default response removed it from the
answer buffer but didn't erase back to the end of actual prompt,
making it look as if it was still there.  Fixing that for a one-line
prompt+answer was needed and would have been easy but it also needs to
be prepared to go back to prior lines.  Both the prompt and the answer
could conceivably span lines although in practice it will usually just
be one line or else prompt+answer combined spanning to a second line.

This hasn't been exhaustively tested been seems to be working correctly.

5 years agomore ^G of "hidden <monster>"
PatR [Sun, 9 Jun 2019 13:11:09 +0000 (06:11 -0700)]
more ^G of "hidden <monster>"

Fix a couple of glitches and add an enchancement.  The monster
attributes structure left the 'hidden' field uninitialized unless user
specified "hidden".  Mimics were being flagged with mon->mundetected
because they pass the is_hider() test but they 'hide' by taking on an
appearance rather than being unseen due to mundetected.  hides_under()
monsters fail the is_hider() test, but can become mundetected if there
is at least one object present.  Eels/other fish are neither is_hider()
nor hides_under() but can be mundetected at water locations.  So alter
'hidden' handling to deal with these various circumstances.

Asking for 'hidden' for any type of creature will result in having its
location be highlighted if it can't be actively seen or detected.  So
using '2000 ^G piranha' will fill up the Plane of Water "normally" but
'2000 ^G hidden piranha' will result in a ton of draw-glyph/delay/
draw-other-glyph/delay sequences and take a painfully long time.  Moral
of the story:  don't combine 'hidden' with a large count unless you
want to spend quite a while watching the level's fill pattern.  Turning
off the 'sparkle' option will cut the flashing in half but still take
a long time.  If you really need to fill a level with hidden creatures
and can't bear the flashing/highlighting, use blessed potion of monster
detection or #wizintrinsics to have extended detect.  Then all created
monsters will be seen so none will trigger location highlighting.

If you create a 'stalker' or 'invisible stalker' or 'invisible <other-
mon>' its location won't be highlighted, but for 'hidden stalker' or
'hidden invisible stalker' or 'hidden invisible <other-mon>' it will
(provided you don't actually see it due to See_invisible or sensemon()).

5 years agodisplay effect bits
nhmall [Sun, 9 Jun 2019 12:08:50 +0000 (08:08 -0400)]
display effect bits

5 years agoextend wizard-mode display effect to unseen invisible monsters
nhmall [Sun, 9 Jun 2019 11:46:14 +0000 (07:46 -0400)]
extend wizard-mode display effect to unseen invisible monsters

5 years agooverlooked rn2_on_display_rng bit
nhmall [Sun, 9 Jun 2019 11:41:11 +0000 (07:41 -0400)]
overlooked rn2_on_display_rng bit

5 years agomake display effect code reusable and move it to display.c
nhmall [Sun, 9 Jun 2019 03:19:29 +0000 (23:19 -0400)]
make display effect code reusable and move it to display.c

5 years agofixes entry and a display effect related to is_hider wishing
nhmall [Sun, 9 Jun 2019 02:40:51 +0000 (22:40 -0400)]
fixes entry and a display effect related to is_hider wishing

5 years agodebug mode wishing for hidden hiders
nhmall [Sun, 9 Jun 2019 01:54:06 +0000 (21:54 -0400)]
debug mode wishing for hidden hiders

5 years agofix github pull request #197 - curses CR handling
PatR [Sat, 8 Jun 2019 15:55:44 +0000 (08:55 -0700)]
fix github pull request #197 - curses CR handling

Fixes #197
Fixes #195

Add a call to nonl() to tell curses not to convert carriage return (^M)
to newline.  Line input accepts both ^J and ^M as end of line/end of
input, but the core's command processing treats ^M as "unknown command"
(by default; someone could use the BIND option to assign some command
to that character).  The end result is that accidentally pressing the
<return> or <enter> key (or Ctrl+M key combination) won't make the hero
run towards the bottom of the screen as if the user had typed ^J.  The
curses docs also claim that it allows more optimization during screen
updating by making ^J work as plain linefeed rather than ^M^J newline.

The tty interface can achieve this (the 'do not convert ^M to ^J part',
not the 'more optimization' part) by issuing the command 'stty -icrnl'
(on Unix or sufficiently Unix-like system) prior to running nethack,
but that has no effect when using the curses interface (at least with
ncurses on OSX where I've tested it).

A better fix would be to look up the current terminal settings at
program startup and only call nonl() if -crnl was in effect so that
curses and tty would behave the same in this regard, but curses is
supposed to let us avoid those sorts of messy details....

5 years agofix github issue #198 - mon wielding cursed weapon
PatR [Sat, 8 Jun 2019 12:58:42 +0000 (05:58 -0700)]
fix github issue #198 - mon wielding cursed weapon

Fixes #198

Watching a monster try to switch from a cursed weapon to some other
weapon (of any bless/curse state) reported that the old weapon was
welded to the monster's hand and wouldn't switch to the new one.
But watching a monster try to wield a cursed weapon didn't say that
it was becoming welded at the time.  Report correctly pointed out
that the weld-to-hand check wouldn't work unless the weapon was
already flagged as wielded, and the code in question was deferring
wielding so that the message wouldn't include "(weapon in hand)" in
the formatted object description.  There was also another problem:
it was erroneously testing the monster's old weapon (if any, after
unwielding it), instead of the new one being wielded.

Also, Sunsword starting to emit light when first wielded by a monster
only reported that it was shining if hero could see the monster.
Give an alternate message if hero sees the location instead.  (Just
the monster's/Sunsword's location rather than any newly lit spot
within Sunsword's radius.)

5 years agomissile light sources
PatR [Sat, 8 Jun 2019 11:50:40 +0000 (04:50 -0700)]
missile light sources

Throwing or kicking a lit lamp, lit candle, or lit potion of oil
wasn't giving off any light as it travelled to its destination.
Now it does, and dungeon features, objects, or monsters that are
temporarily seen as it moves from square to square till appear on
the map.  In the monster case, they go away as soon as the light
moves beyond range, but when it finishes moving the "remembered,
unseen monster" glyph will be drawn at their location.  I think that
part has some room for improvement, but mapping temporarily seen
terrain features is the primary impetus for this change.

Also, any message delivery while the "lit missile" travelled still
showed its light around the hero.  Noticeable for lamps or stacks
of sufficient candles if hero has no other light source.

This cannibalizes the monst->mburied bit for temporarily seeing a
monster.  It has been present but unused for ages.  I needed to
replace a couple of vision macros to make sure they didn't examine
it any more so that overloading for transient lighting doesn't
introduce any vision oddities.  For version $NEXT, monst->mtemplit
can be given its own bit.  It is only set during bhit() execution
and cleared by the time that returns, so has no effect on save files.

5 years ago\#turn comment
PatR [Thu, 6 Jun 2019 20:30:43 +0000 (13:30 -0700)]
\#turn comment

Remove a potential 'TODO' since it turned out [pun intended] to be a
no-op.

5 years ago\#turn mechanics
PatR [Thu, 6 Jun 2019 20:12:39 +0000 (13:12 -0700)]
\#turn mechanics

This part got left out of yesterday's #turn update.

5 years ago\#turn mechanics
PatR [Thu, 6 Jun 2019 01:36:55 +0000 (18:36 -0700)]
\#turn mechanics

When looking at something else I stumbled across this.  Using #turn
is described as chanting a formula but was allowed even if hero wasn't
able to speak due to strangulation or speechless polymorph form.
Also, the check for whether a potential target monster was in range
used 'cansee(mx,my)' which required the hero to be able to see but
not necessarily to be able to see the target.  I've changed that to
'couldsee(mx,my)' on the assumption that it was intended to prevent
\#turn from operating through walls.

Also, the comment about the effective range was wrong.  I changed the
comment to match the code rather than vice versa.

5 years agolocation viability on Plane of Water
PatR [Wed, 5 Jun 2019 11:16:34 +0000 (04:16 -0700)]
location viability on Plane of Water

While testing, I noticed that I could completely fill the Water level
with air elementals.

Hero can't fly or levitate or water walk into/onto water locations
on Water level without drowning/crawling out the water, and monsters
shouldn't have been able to but could, then they were hit by drowning
since minliquid used different criteria than movement.  But goodpos(),
used for teleport destination and new monster creation among other
things, consided water locations acceptable on that level for
non-aquadic creatures with Fly/Lev/Wwalk ability.

It explains why so many dragons and other 'nasty' monsters have been
ending up on the vanquished monsters list when hero uses level
teleport to go directly there from level 1.  They've either been
getting created in water and then they drown when it's their turn to
move or moving into it to approach the hero and drowning (not sure
whether that case is immediate or on next move).  There's no message
since hero doesn't see it, and air elementals didn't drown since thy
don't breathe.

5 years agofixes whitespace bit
nhmall [Wed, 5 Jun 2019 01:58:44 +0000 (21:58 -0400)]
fixes whitespace bit

5 years agoremove some trailing spaces from data.base
nhmall [Wed, 5 Jun 2019 01:49:20 +0000 (21:49 -0400)]
remove some trailing spaces from data.base

5 years agomake sure end.c can place the bc
nhmall [Wed, 5 Jun 2019 01:46:08 +0000 (21:46 -0400)]
make sure end.c can place the bc

5 years agoallow a parent function to restrict use of placebc
nhmall [Wed, 5 Jun 2019 01:18:46 +0000 (21:18 -0400)]
allow a parent function to restrict use of placebc

placebc was triggering an impossible sometimes on the plane of
water

It turned out to be because movebubbles issued an
unplacebc(), but a downstream function called
placebc(), so when movebubbles() issued its own
placebc() there was a problem.

The downstream function that beat movebubbles to the placebc()
turned out to be unstuck(). There could be others.

5 years agoplug montraits() memory leek
PatR [Tue, 4 Jun 2019 21:54:58 +0000 (14:54 -0700)]
plug montraits() memory leek

If a corpse with a revive timer included obj->oextra->omonst for
remembering the original monster (I think all corpses do these days)
and makemon() failed to create a new monster when the timer expired,
the copy of the original wasn't freed.  makemon() will fail if there
is no room for the monster.

5 years agoconfused blessed scroll of remove curse on itself
PatR [Tue, 4 Jun 2019 20:18:21 +0000 (13:18 -0700)]
confused blessed scroll of remove curse on itself

Noticed when testing the set_bknown patch earlier: something updated
the persistent inventory window while scroll processing was in the
midst of traversing invent and it showed the scroll I'd just read
change from known blessed to bless/curse state not known.  The scroll
should really be removed from inventory because player is told that it
has disappeared, but unlike charging (which does do that so that it is
gone when selecting an item to charge), remove curse isn't auto-IDed
and the code to ask the player to call an unIDed item something only
kicks in when it's still in inventory.  Preventing the scroll in use
from having its bknown flag cleared should be good enough; it won't
have disappeared yet but at least it won't be visibly changing.

5 years agocontainer->{cknown,lknown) vs perm_invent
PatR [Tue, 4 Jun 2019 19:13:46 +0000 (12:13 -0700)]
container->{cknown,lknown) vs perm_invent

Carried containers could have their contents-known state and/or
lock-known state changed without persistent inventory window being
updated to show the new information.

This also changes the behavior when player has hero zap self with
wand of locking or wizard lock spell.  If it doesn't trigger a
holding trap then the effect will hit inventory, similar to how
opening/knock operates (releasing hero from holding trap or hiting
inventory when that doesn't happen).

5 years agofix #H8850 - bless/curse state in perm_invent
PatR [Tue, 4 Jun 2019 17:50:24 +0000 (10:50 -0700)]
fix #H8850 - bless/curse state in perm_invent

Changing an inventory item's bknown flag wasn't followed by a call to
update_inventory() in many circumstances, so information which should
have appeared wasn't showing up until some other event triggered an
update.

5 years agofix github issue #196 - green slime feedback
PatR [Tue, 4 Jun 2019 16:16:00 +0000 (09:16 -0700)]
fix github issue #196 - green slime feedback

Fixes #196

If you didn't die from turning into green slime but then died because
green slimes had been genocided, the message given assumed that you
had just seen "OK, you don't die" from answering No to "Really die?".
Its wording didn't make sense if the reason you didn't die was an
amulet of life-saving.  Give a different message for that case.

Also, if you survive turning into slime (via either method) and either
green slimes are still around or you answer No to "Really die?" when
they've been genocided, give a message after "You survived that attempt
on your life" pointing out that you have done so in green slime form.
Useful since prior to 3.6.2 you would have reverted to original form--
despite the Slimed countdown saying you had turned into green slime.

5 years agodisabled code bit
nhmall [Mon, 3 Jun 2019 22:45:02 +0000 (18:45 -0400)]
disabled code bit

5 years agoadd some debugging BREADCRUMBS to identify caller of some functions
nhmall [Mon, 3 Jun 2019 22:37:45 +0000 (18:37 -0400)]
add some debugging BREADCRUMBS to identify caller of some functions

Only takes effect if a developer uncomments BREADCRUMBS in config.h

5 years agodata.base update
nhmall [Mon, 3 Jun 2019 22:00:19 +0000 (18:00 -0400)]
data.base update

5 years agomore precautions for monster obliteration during overcrowding
nhmall [Mon, 3 Jun 2019 21:11:54 +0000 (17:11 -0400)]
more precautions for monster obliteration during overcrowding

5 years agoextended ball&chain sanity check
PatR [Mon, 3 Jun 2019 09:36:44 +0000 (02:36 -0700)]
extended ball&chain sanity check

Verify that the locations of ball and chain are consistent.
If chain is on floor then ball is on floor or in hero's inventory
else if chain is free then ball is free or in hero's inventory.
When chain is on floor it is under hero or one step away from hero
and when ball is on floor it is on chain or one step away from chain.

5 years agomakedefs: add enum support when generating pm.h
nhmall [Sun, 2 Jun 2019 21:21:35 +0000 (17:21 -0400)]
makedefs: add enum support when generating pm.h

Only changes pm.h content if ENUM_PM is defined when compiling
util/makedefs.c

While NON_PM and LOW_PM could be included, it would require
for the makedefs.c compile, as well as an
around their macro definitions in permonst.h so for now those
particular lines are commented out in makedefs.c

5 years agodon't clear mtmp->mx, mtmp->my even when obliterating
nhmall [Sun, 2 Jun 2019 14:34:38 +0000 (10:34 -0400)]
don't clear mtmp->mx, mtmp->my even when obliterating