]> granicus.if.org Git - nethack/log
nethack
4 years agocross-compile update
nhmall [Tue, 29 Sep 2020 19:01:37 +0000 (15:01 -0400)]
cross-compile update

Update the cross-compiling doc at the top.

Remove sys/msdos/Makefile1.cross, sys/msdos/Makefile2.cross, and
sys/msdos/msdos-cross-compile.sh as they are no longer required.

Remove occurrences of CROSSCOMPILE_HOST as the host-side of a
cross-compile can be determined from:
    defined(CROSSCOMPILE) && !defined(CROSSCOMPILE_TARGET)
without the additional macro.

4 years agoFixes and lua doc
Pasi Kallinen [Tue, 29 Sep 2020 14:35:16 +0000 (17:35 +0300)]
Fixes and lua doc

4 years agoAvoid calling rn2(0) when the first room(s) have frequency 0
copperwater [Sat, 23 May 2020 21:11:36 +0000 (17:11 -0400)]
Avoid calling rn2(0) when the first room(s) have frequency 0

This probably won't happen in practice, but it is a good safeguard
if this ever does happen (it happened for me in debugging when I wished
to have no "regular" rooms and only generate themed rooms).

4 years agoAdd minimum difficulty cutoffs to two themed rooms
copperwater [Thu, 14 May 2020 00:52:33 +0000 (20:52 -0400)]
Add minimum difficulty cutoffs to two themed rooms

This sets the minimum level depth of "Spider nest" to 10, somewhat above
the difficulty of an individual giant spider, because a whole room full
of them is a tougher challenge. Note that this isn't the only possible
fix to this problem; another solution would be to alter the special case
in mktrap that hardcodes a giant spider to generate with each web to
produce cave spiders if giant spiders would be too tough. Even then, a
lower difficulty cutoff is probably still warranted for this room, since
a large number of cave spiders might be too tough for level 1 or 2.

This also sets the minimum level depth of "Boulder room" to 4, based on
the fact that individual rolling boulder traps normally can't appear
until level 2, and having a bunch of them in one place which may be
required to reach the downstairs could be problematic.

This doesn't do anything to address the "Mausoleum" room problem, in
which a master or arch-lich can generate and immediately warp out and
attack the player. Even with a high difficulty threshold, it won't fix
the problem of these liches generating out of their normal difficulty
and Gehennom constraints.

Other potential candidates for difficulty thresholds:
 - "Trap room": This room might be perilous on the first few levels,
   especially if the level generates with it blocking the way to the
   downstairs.
 - "Massacre": Doesn't have any particular hazards, but might be
   interesting if it only generated at deeper levels.

4 years agoEnable themed rooms to be constrained by level difficulty
copperwater [Wed, 13 May 2020 04:15:10 +0000 (00:15 -0400)]
Enable themed rooms to be constrained by level difficulty

The system of themed rooms currently makes it so that any themed room
can potentially generate anywhere a themed room can be placed. This is
problematic in the long run, since it makes it difficult to design new
rooms that are an appropriate amount of challenge at all levels of the
dungeon. (A few themed rooms already have this problem: a hero starting
out on level 1 probably won't live very long when the neighboring room
is full of giant spiders, or an arch-lich has generated in a mausoleum
nearby).

This commit adds optional "mindiff" and "maxdiff" properties for
themerooms defined as tables and exposes level_difficulty() to Lua. A
themeroom whose mindiff exceeds the current level difficulty, or whose
maxdiff is lower than the current level difficulty, is prevented from
being selected.

Because the set of rooms eligible to generate on a given level is no
longer fixed, the total frequency of all the rooms can't be computed
once per game when the file is first parsed, as it was before. In place
of this, the themerooms_generate() function now uses a reservoir
sampling algorithm to choose a room from among the eligible rooms,
weighted by frequency.

4 years agomsdos cross-compile follow-up bits
nhmall [Tue, 29 Sep 2020 13:41:31 +0000 (09:41 -0400)]
msdos cross-compile follow-up bits

add missing make rule for ../win/share files to cross-pre.2020

adjust .travis.yml to use the new approach for building msdos target

4 years agocron-daily Files update
nhmall [Tue, 29 Sep 2020 01:58:12 +0000 (21:58 -0400)]
cron-daily Files update

4 years agomove some left-over outdated files from old Mac
nhmall [Mon, 28 Sep 2020 22:42:27 +0000 (18:42 -0400)]
move some left-over outdated files from old Mac

4 years agocron-daily Files update
nhmall [Mon, 28 Sep 2020 22:33:46 +0000 (18:33 -0400)]
cron-daily Files update

4 years agofollow-up bit
nhmall [Mon, 28 Sep 2020 22:19:20 +0000 (18:19 -0400)]
follow-up bit

break into TARGETDIR and TARGETPFX

4 years agoMerge branch 'crosscompile-integration-amiga' into NetHack-3.7
nhmall [Mon, 28 Sep 2020 22:08:15 +0000 (18:08 -0400)]
Merge branch 'crosscompile-integration-amiga' into NetHack-3.7

4 years agoMerge branch 'crosscompile-integration-msdos' into NetHack-3.7
nhmall [Mon, 28 Sep 2020 22:07:55 +0000 (18:07 -0400)]
Merge branch 'crosscompile-integration-msdos' into NetHack-3.7

4 years agoMerge branch 'crosscompile-integration-core' into NetHack-3.7
nhmall [Mon, 28 Sep 2020 22:07:19 +0000 (18:07 -0400)]
Merge branch 'crosscompile-integration-core' into NetHack-3.7

4 years agoadd cross-compile recipe for amiga
nhmall [Mon, 28 Sep 2020 21:30:22 +0000 (17:30 -0400)]
add cross-compile recipe for amiga

Disclaimer: This is a minimal recipe, just to get someone else
started if they have a desire to get a full cross-compile of
NetHack-3.7 going for the Amiga. Some NetHack code bitrot was
corrected, and it does seem able to compile the game itself
to a point. See caveats below.

- If you want to obtain the cross-compiler and tools/libs for Amiga
         https://github.com/bebbo/amiga-gcc

  To our knowledge, a pre-built copy isn't available, so you have to
  obtain the source via git and build it on your system.

  The build prerequisite packages for Ubuntu are easily obtained:

    sudo apt install make wget git gcc g++ lhasa libgmp-dev \
        libmpfr-dev libmpc-dev flex bison gettext texinfo ncurses-dev \
        autoconf rsync

  The build prerequisite packages for macOS are apparently easily
  obtained via homebrew, but that was not tested:

    brew install bash wget make lhasa gmp mpfr libmpc flex gettext \
    texinfo gcc make autoconf

  After installing the prerequite packages and the cross-compiler
  it was a straightforward build:

        git clone https://github.com/bebbo/amiga-gcc.git
        cd amiga-gcc
        make update
    [Note that you may have to take ownership of the files in the
     bebbo repo via chown before succesfully carrying out the next
     steps]
        make clean
        make clean-prefix
        date; make all -j3 >&b.log; date
  The compiler pieces are installed in /opt/amiga by default which
  was satisfactory for our initial attempt, but if you want you can
  alter the prefix before you build if you want. That is all
  spelled out on the page at: https://github.com/bebbo/amiga-gcc

  The Amiga cross-compile can then be carried out by specifying
  CROSS_TO_AMIGA=1 on the make command line.

  For example:
       make CROSS_TO_AMIGA=1 all
       make CROSS_TO_AMIGA=1 package

You can explicitly include tty and curses support if desired, otherwise
you'll end up with a tty-only cross-compile build. The SDL1 pdcurses
support has not been tested.

       make WANT_WIN_TTY=1 WANT_WIN_CURSES=1 CROSS_TO_AMIGA=1 all

Also note that building the amiga targets using the make command
above, does not preclude you from building local linux or macOS
targets as well. Just drop the CROSS_TO_AMIGA=1 from the make
command line.

The cross-compiler hints additions are enclosed inside ifdef sections
and won't interfere with the non-cross-compile build in that case.

CAVEATS: The original NetHack Amiga build steps included the source for
some utilities that were built and executed on the amiga: txt2iff and
xpm2iff as part of the NetHack build procedure on amiga. Those did not
compile out-of-the-box on the linux host. They will either have to be:
    - ported to build and run on the linux or macOS cross-compile host

   or

    - their functionality will have to be rolled into amiga NetHack
      itself and executed on the target Amiga the first time the game
      is run, perhaps.

Good luck amiga aficionados, perhaps you'll be able to take this
initial effort forward and get NetHack-3.7 available on the amiga or
amiga-emulator. Let us know if you do, and we can roll changes in
if you provide them.

4 years agoadd cross-compile recipe for msdos
nhmall [Mon, 28 Sep 2020 20:28:15 +0000 (16:28 -0400)]
add cross-compile recipe for msdos

- If you want to obtain the djgpp cross-compiler and tools/libs for MSDOS,
which is available for linux and macOS, you can use the following script
to obtain it:

       sh sys/msdos/fetch-cross-compiler.sh

That script won't install anything, it is just file fetches. It will
store the cross-compiler in subfolders of lib and the hints files are
configured to find it appropriately there.

Note: Both the fetch and the msdos cross-compile package target require
unzip and zip to be available on your host build system.

Cross-compiler bits:
       https://github.com/andrewwutw/build-djgpp
   and the pre-built binary for your platform from:
       https://github.com/andrewwutw/build-djgpp/releases/download/v3.0/
   and a DOS-extender (for including in msdos packaging) from
       http://sandmann.dotster.com/cwsdpmi/csdpmi7b.zip
   and pdcurses from:
       https://github.com/wmcbrine/PDCurses.git

The MSDOS cross-compile can then be carried out by specifying
CROSS_TO_MSDOS=1 on the make command line.

For example:
       make CROSS_TO_MSDOS=1 all
       make CROSS_TO_MSDOS=1 package

You can explicitly include tty and curses support if desired, otherwise
you'll end up with a tty-only cross-compile build:
       make WANT_WIN_TTY=1 WANT_WIN_CURSES=1 CROSS_TO_MSDOS=1 all

Also note that building the msdos targets using the make command
above, does not preclude you from building local linux or macOS
targets as well. Just drop the CROSS_TO_MSDOS=1 from the make
command line.

The cross-compiler hints additions are enclosed inside ifdef sections
and won't interfere with the non-cross-compile build in that case.

4 years agoexpand sys/unix Makefiles scope
nhmall [Mon, 28 Sep 2020 20:25:31 +0000 (16:25 -0400)]
expand sys/unix Makefiles scope

Expand the use of the sys/unix Makefiles to be used for both normal
local builds and installs, as well as cross-compiles for other
platforms/targets.

Up until now, the primary unix Makefiles have treated util/host-side
component compiles, links and target object files just the same as
the game component compiles, links, and target object files.

Unfortunately, that meant that cross-compile effort typically had
to re-invent Makefiles specific to the cross-compile, creating a
maintenance burden and deviation from the typical local unix build
and providing a daunting obstacle to those that want to establish
build for a target environment/platform.

This change distinguishes between util/host-side component builds,
links, and component builds and targets object files destined for
the game (and other target platforms) in the Makefiles.

In theory, this will ease the effort for people that want to try to
resurrect NetHack perhaps on an old platform where it is no longer
viable to build NetHack-3.7 on the platform itself using old, outdated
compile tools, possibly with an old, outdated C dialect.

Some details:

-  Game-related targets in the Makefiles (as opposed to util/host-side
   targets that will be executed on the host), which could be destined
   for another platform in a cross-compile scenario are prefixed with
   $(TARGETPFX) so that they are distinguished.

   The default scenario where no cross-compiler is involved, is to
   define TARGETPFX to nothing, and therefore meant to have no effect.

-  Game-related compile and link commands in the Makefiles and their
   associated command line flags are distinguished from util/host-side
   compile and link commands in the Makefiles by using $(TARGET_CC),
   $(TARGET_CFLAGS), $(TARGET_LINK), $(TARGET_LFLAGS), $(TARGET_CXX),
   $(TARGET_CXXFLAGS), $(TARGET_LIBS).

   Those are used in the Makefile in place of $(CC), $(CFLAGS), $(LINK),
   $(LFLAGS), $(CXX), $(CXXFLAGS), $(LIBS).

   The default scenario where no cross-compiler is involved, defines
   the TARGET_ version of those Makefile variables to match their
   typical non-TARGET_ ounterparts.

-  The dependency lists in the Makefiles includes the $(TARGETPFX)
   prefix for stuff that would potentially be produced from a
   cross-compile build.

-  It adds pregame targets and $(PREGAME) variable, so that hints files
   can add some additional stuff if required for a cross-compile
   scenario.

   The default scenario where no cross-compiler is involved doesn't
   do anything for $(PREGAME).

-  It adds $(BUILDMORE) target and variable, so that hints files
   can add some additional things to be built for a cross-compile
   scenario.

-  It adds a "package" target and $(PACKAGE) variable, so that hints files
   can add steps for the target platform in a cross-compile
   scenario.

   The "install" target assumes local build and placement and
   isn't really applicable to a cross-compile scenario where the results
   really just need to be bundled up for transport to the target platform.

-  Also, this adds a pair of include files that can be updated with some
   cross-compile recipes as they evolve. They are named "cross-pre.2020"
   (for stuff to be included in the PRE section) and "cross-post.2020"
   for stuff to be included in the POST section via sys/unix/setup.sh.

   Those are included in sys/unix/hints/linux.2020 and
   sys/unix/hints/macOS.2020 hints files.

4 years agoPrevent any type of terrain overwrite from replacing stairs/ladders
copperwater [Mon, 28 Sep 2020 16:48:34 +0000 (12:48 -0400)]
Prevent any type of terrain overwrite from replacing stairs/ladders

Consider the following scenario: There's a level where there's a zone of
des.replace_terrain() between the stairs and some other objective, and
the terrain is something non-walkable like trees. There's a chance that
the path is entirely blocked off by random replace_terrain, so you
make the level set terrain to '.' along a randline (or normal line, or
whatever) between the randomly placed stairs and the other side of the
replace_terrain zone. The problem: this overwrote the stairs with a '.'
as well.

This can be worked around in the lua file by first picking the desired
location of the stairs, then setting the terrain that overlaps with the
stairs, then doing des.stair() after that, but this is awkward and hard
to read.

So this makes it impossible for anything calling SET_TYPLIT (only called
in sp_lev.c) to overwrite stairs. I can't really think of a situation
where a level designer would want to define stairs, then maybe overwrite
them.

4 years agoFix: randomly generated vaults weren't being filled
copperwater [Mon, 1 Jun 2020 14:08:21 +0000 (10:08 -0400)]
Fix: randomly generated vaults weren't being filled

This also caused the unexpected "You hear someone searching" message on
a level with an unlooted vault.

4 years agoFix: irregular rooms' walls were not part of the room
copperwater [Sun, 24 May 2020 18:59:50 +0000 (14:59 -0400)]
Fix: irregular rooms' walls were not part of the room

This was leading to problems with special themed rooms which were
irregular. Walls of ordinary rooms count as part of the room, and
irregular rooms should be no different.

This also makes doors on the room edge be considered as part of the
room, which affected special room entry messages and filling.

All irregular rooms' walls getting marked as SHARED instead of their own
room is probably a latent bug in upstream NetHack, but will prevent
future issues for when/if themed rooms that involve special
rooms/subrooms get added.

4 years agoFix: stairs could generate in themed rooms if others were available
copperwater [Sun, 24 May 2020 01:38:03 +0000 (21:38 -0400)]
Fix: stairs could generate in themed rooms if others were available

This is a simple && vs || bug. The clear intention of the code is that
stairs aren't supposed to generate in themed rooms unless there is no
other choice.

Fixes #348

4 years agoFixes doc
Pasi Kallinen [Mon, 28 Sep 2020 15:28:19 +0000 (18:28 +0300)]
Fixes doc

4 years agoYou can reread a spellbook to refresh your memory at any time
copperwater [Sun, 2 Sep 2018 18:55:03 +0000 (14:55 -0400)]
You can reread a spellbook to refresh your memory at any time

Aimed at fixing the problem where the player knows they're going to
forget a spell in a few thousand turns, so they go back and get the
book... only to find out that they "know it quite well already", and
need to wait an indeterminate amount of time until they are on the verge
of forgetting it (< 2000 turns) before the book will let them read it
again.

This commit simply removes that 2000 turn limit, so the player can fully
restore their memory at any time with the spellbook. Naturally, this
still consumes a read charge, so the book won't ultimately last as long
if you keep rereading it early.

If you do have more than 2000 turns left, the game will prompt you to
confirm that you do want to refresh your memory anyway. As before,
rereading with fewer turns will not prompt.

4 years agoFix: missing filled flags in various levels
copperwater [Thu, 17 Sep 2020 01:12:51 +0000 (21:12 -0400)]
Fix: missing filled flags in various levels

This is an omission in the filled/prefilled unification. The default for
filled on regions now being 0 meant that regions that had previously had
no need for any fill declaration at all (regions' prefilled defaulted to
0 before this, the effect being to fill them) now failed to get filled.

The rule of thumb is that all des.regions with a type for which filled
is meaningful (e.g. special rooms) should declare the fill status. I
added it to a bunch of temples even though this doesn't really seem to
affect anything there (the priest and altar come with the altar
definition). I assigned temples filled=1 and filled=2 loosely based on
if there is ever being some other generation that would put other
furniture or items in a temple, but the distinction should not affect
anything right now.

Cases fixed where non-temple regions weren't getting filled:
- Barracks, a graveyard, and shops in Tou-goal
- The beehive in the Wizard's Tower

4 years agoFixes doc of the recent pull requests
Pasi Kallinen [Sun, 27 Sep 2020 19:26:39 +0000 (22:26 +0300)]
Fixes doc of the recent pull requests

4 years agoStock all special rooms at the end of level creation
copperwater [Fri, 22 May 2020 04:02:51 +0000 (00:02 -0400)]
Stock all special rooms at the end of level creation

This unifies the two separate special-room-stocking code paths, one in
the standard dungeon generator and one in the special level generator
(neither of which reacted to themed rooms, which is the reason for this
commit) into the end of makelevel(), placing the special room stocking
as the very last step of level creation.

Under the new system, when a regular or special level decides to create
a special room, it sets that room's rtype, but the room is not stocked
until later. It already worked this way for special levels, so the main
difference here is in the normal level generation, where the mkroom
family of functions identifies and marks a room as a special room, but
stops short of filling it. (I suppose perhaps the mkroom, mkzoo, mkshop
family of functions would be better off changing their names to
"pickroom" and so on.)

This also restructures makelevel() itself a bit, but the only real
change is that the paths that call makemaz don't return immediately
afterward; they continue to the special room stocking code. Also, this
code was lifted from fill_special_rooms, which is now not used
anywhere, so it has been deleted.

I don't really like how fill_ordinary_room is in mklev.c and
fill_special_room is in sp_lev.c; they seem like they'd be better off in
mkroom.c, but in the interest of not making unnecessary code changes,
I'll just recommend it.

4 years agoMove Orcus shopkeeper removal from fixup_special into stock_room
copperwater [Fri, 22 May 2020 01:04:06 +0000 (21:04 -0400)]
Move Orcus shopkeeper removal from fixup_special into stock_room

The plan is to unify special room filling code and cause special rooms
to be filled as the very last stage of level creation. Since this will
occur after fixup_special, it was necessary to address the one remaining
piece of code in there that affects special room filling. (The Medusa
code remaining in there doesn't have to do with special rooms.)

4 years agoAdjust rooms in Medusa levels to account for player monster statues
copperwater [Thu, 21 May 2020 17:23:41 +0000 (13:23 -0400)]
Adjust rooms in Medusa levels to account for player monster statues

There is code in fixup_special for stocking Medusa's lair with statues
of players from the leaderboard. It makes two assumptions: that there
will always be at least one room defined on Medusa's level, and that
the statues should be placed in the first room defined. In the process
of removing prefilled, some of these rooms suddenly became non-rooms,
and this caused problems. This commit ensures that the regions for
turning into rooms to hold the statues are present and come first.

In the process of writing this commit, I discovered a bug: the statue
stocking code for medusa in fixup_special naively chooses the spot at
which to place its final statue by selecting independent x and y
coordinates with somex and somey. This is responsible for a statue
occasionally being embedded in a wall or in iron bars on medusa-2 and
medusa-4: the rooms defined to receive statues are irregular, and some
of the possible coordinates happen to be walls, bars, and water.

The proper fix here is to add lua functionality so that the level
designer can specify that they want a leaderboard corpse or statue, and
remove the medusa special case from fixup_special, but that's rather
out of scope for what I'm doing here.

4 years agoFill special rooms recursively rather than only at top level
copperwater [Thu, 21 May 2020 12:48:24 +0000 (08:48 -0400)]
Fill special rooms recursively rather than only at top level

The fill_special_rooms function was only stocking two types of rooms:
top-level rooms in g.rooms, and their immediate subrooms. If there were
a special room 2 or more levels down, it would not get filled. (No
special levels currently define such a special room, so this bug is
latent.)

To address this, I changed fill_special_rooms to iterate only through
the top level rooms, and fill_special_room to recurse through all of its
subrooms (if any) before filling itself.

4 years agoUnify all special level filling options
copperwater [Tue, 19 May 2020 04:13:41 +0000 (00:13 -0400)]
Unify all special level filling options

The existing system was a confusing mess of competing names (filled,
needfill, prefilled, etc) that had varying semantics, with prefilled
being the worst offender as it meant at least three different things in
various contexts. This commit unifies everything in the code under
"needfill", and everything in Lua under "filled", which defaults to 0
everywhere.

This also removes the second argument to fill_special_room; that
function now just checks the needfill of the room it's passed. As
before, a filled == 2 value is used for a special room to indicate that
the room should set the appropriate level flag, but shouldn't actually
be stocked with anything (for instance, King Arthur's throne room); the
difference is that this now comes directly from the lua script instead
of being manipulated within sp_lev.c.

The prefilled argument had one use case that is occasionally used in the
level files: if the level designer had specified an ordinary region with
prefilled = 1, it would become a room to control monster arrivals on a
level -- monsters that arrive within the bounds of a room are supposed
to stay there.
However, not all of the places where the comments indicated this was
being used were using it correctly; I tested this by letting a few
monsters fall through the knox portal (they're supposed to be
constrained to the entry room) and waiting a hundred turns, then going
through the portal; they were not constrained to the room and had
"wandered" through its walls.
Instead of trying to maintain this special case, I have added an
optional "arrival_room" boolean argument to des.region, which forces it
to create a room for the purposes of constraining monster arrival.

I have gone through and replaced occurrences of prefilled in lua files
with the appropriate filled option (or arrival, as needed). In some
cases, that resulted in questionable regions such as a filled ordinary
area in a non-themeroom (I just dropped the filled=1), or an area which
didn't do anything, not even lighting (which I deleted).

4 years agoMake fill_special_room avoid themed rooms
copperwater [Mon, 18 May 2020 01:47:10 +0000 (21:47 -0400)]
Make fill_special_room avoid themed rooms

No code in this function would actually do anything if it were called on
a themed room, but since it is pretty clearly intended for the "regular"
special rooms, it's probably best to explicitly avoid themed rooms as
well.

4 years agoAllow themed room subrooms to be filled
copperwater [Mon, 18 May 2020 01:21:10 +0000 (21:21 -0400)]
Allow themed room subrooms to be filled

I noticed that any subrooms created within a themed room were bare -
they never had any monsters, objects, traps, or anything really,
regardless of whether filled = 1 was set on them. As a result, they're
pretty boring.

It turns out that the code in makelevel() responsible for stocking
ordinary rooms with stuff only looped through g.rooms, and completely
ignored subrooms. (Subrooms would not get stocked with items by virtue
of being part of the larger room; I tested this by dialing the item
generation in rooms way up, and none of those items ever got placed in a
subroom.)

To fix this, I've extracted the code that populates an ordinary room
into its own function, fill_ordinary_room, and made it recurse into its
own subrooms. (I also renamed fill_rooms and fill_room to include the
word "special" in their names, because they only deal with special
rooms.) Note that since special rooms follow a separate codepath, an
ordinary subroom of a special room won't get stocked; perhaps these
functions should be unified in the future.

The fill_ordinary_room code is pretty much a verbatim cut and paste from
makelevel, so there is not currently any consideration for the size of
the subroom or the fact that it is a subroom with respect to how many
monsters, traps, objects, etc get placed.

I'm not sure whether other things such as stair selection will ever
select themed room subrooms, or whether they too only look at g.rooms.

4 years agoFix the "stuck pets" bug (github issue #329)
copperwater [Fri, 18 Sep 2020 23:10:54 +0000 (19:10 -0400)]
Fix the "stuck pets" bug (github issue #329)

This commit is intended to fix the bug where a pet will get fixated on
an unmoving monster and stop moving itself. I described the cause in the
github issue; the gist is that the pet AI chooses the unmoving monster
as its ranged target, doesn't do anything when it calls mattackm
(because it doesn't have ranged attacks), then returns a value
indicating it didn't move and can't take further actions.

I initially implemented a fix that refactored mattackm to distinguish
between "attacker missed" and "attacker did nothing", which the pet AI
could then use to determine whether the pet could continue doing things.
But then I realized that if mattackm is called with non-adjacent
monsters, a return of MM_MISS more or less unambiguously indicates that
the attacker did nothing (because the ranged functions it calls like
breamm don't actually check to see whether the target was hit, just
whether the monster initiated the attack.) So, this only really needed
to check whether mattackm returned with MM_MISS.

I also found a probable bug in mattackm, in that the thrwmm call isn't
treated the same as breamm or spitmm. In the latter two, mattackm
returns MM_HIT even though it doesn't check whether the ranged attack
actually hit its target. But there was no logic doing the same for
thrwmm, so this commit also adds that. (Otherwise, a pet could possibly
use a ranged weapon attack and then get to keep moving on its turn.)

4 years agoQt popup_dialog tinkering
PatR [Sun, 27 Sep 2020 02:35:37 +0000 (19:35 -0700)]
Qt popup_dialog tinkering

Some changes to the YnDialog widget used when popup_dialog is On.

If a button is labelled with a space, it just looks like an
unlabelled button.  Switch to "Spc" for space, "Ent" for \n and
"Ret" for \r.  (The last two aren't completely logical but I
haven't seen any dialogs that need them and they'll be better
than "^J" and "^M" if there are such.)

For yn#aq dialogs, preload a grayed-out "#" in the count widget.
Just for show; has no tangible effect.

The count widget should return long rather than plain int.

4 years agopeacefuls witnessing attack against peaceful mon
PatR [Thu, 24 Sep 2020 07:44:07 +0000 (00:44 -0700)]
peacefuls witnessing attack against peaceful mon

The short exclamations ("Gasp!", "Why?", &c) led to ambiguity
about which monster was vocalizing them.  Use full sentences
which refer to the speaker.  It can become quite a bit more
verbose but is less likely to lead to confusion.  Perhaps it
should cut those off after a modest number of them have been
issued?

4 years agopull request #345 - theme room dimensions
PatR [Thu, 24 Sep 2020 00:57:19 +0000 (17:57 -0700)]
pull request #345 - theme room dimensions

"When a room is created and passed down to a contents function in
Lua, the width and height properties of that room are computed by
subtracting lx from hx and ly from hy, which means e.g. a room
which is 8 floor squares wide and 5 tall appears to the contents
function as having a width of 7 and height of 4.  This patch fixes
that off-by-one."

I don't understand the details here:  should a room's dimensions
include its boundary walls or just the inner amount?  This change
didn't seem to cause any problems so I've put it in.

Closes #345

4 years agoQt's 3.6 status conditions
PatR [Wed, 23 Sep 2020 23:40:26 +0000 (16:40 -0700)]
Qt's 3.6 status conditions

Replace the blank placeholder icon with individual placeholders
for Stone, Slime, Strngl, Deaf, Lev, Fly, and Ride.  They're just
40x40 tiles showing solid color (different for each) holding white
block letters spelling the condition.  For the first four of those,
the text runs from upper-left to lower-right, for Lev and Fly the
text runs from lower-left towards upper-right, and for Ride it's
horizontal.  Not particularly exciting but better than blank.  We
still need real artwork to make them be similar to the older
conditions.

Also moves the two petmarks and the pilemark from qt_xpms.h to
qt_map.cpp.  The marks and the assorted status icons are all
static arrays, and including that header in two source files
meant that they were all duplicated unless the compiler or linker
was smart enough to discard the unused ones.

4 years agoQt status fix: 'showexp'
PatR [Wed, 23 Sep 2020 12:21:31 +0000 (05:21 -0700)]
Qt status fix: 'showexp'

For Qt, experience points weren't shown when enabling 'showexp'
option because they were conditional upon '#if EXP_ON_BOTL'.  That
got eliminated prior to 3.6.0 so wasn't defined for qt_stat.cpp.

When displayed, show Exp as Level:Xp/Exp instead of as a separate
status field.  This has the intentional side-effect of omitting it
when hero is polymorphed and status shows HD instead of Xp.

Label the six characteristics in mixed case instead of all upper
case:  Str, Dex, and so forth.

4 years agomakedefs: hide conditionally unused routine
PatR [Wed, 23 Sep 2020 10:03:46 +0000 (03:03 -0700)]
makedefs: hide conditionally unused routine

Avoid a new build warning for the default configuration.

4 years agowhitespace bit
nhmall [Tue, 22 Sep 2020 14:28:22 +0000 (10:28 -0400)]
whitespace bit

4 years agofollow-up bit; ensure the mkstemp() file is unlinked
nhmall [Tue, 22 Sep 2020 14:11:51 +0000 (10:11 -0400)]
follow-up bit; ensure the mkstemp() file is unlinked

4 years agounique temp files for makedefs invocations (GitHub issue #391)
nhmall [Tue, 22 Sep 2020 13:03:15 +0000 (09:03 -0400)]
unique temp files for makedefs invocations (GitHub issue #391)

As reported in https://github.com/NetHack/NetHack/issues/391
if make was invoked with -j, makedefs instances could end up running in
parallel and could trample on each other's grep.tmp tempory files.

Default to using mkstemp(); allow a port runtime library implementation
that lacks mkstemp() to define HAS_NO_MKSTEMP to revert to the old behaviour.

Provide a work-alike mkstemp() implementation for windows Visual Studio build
in mdlib.c so there is no requirement to define HAS_NO_MKSTEMP there.

Fixes #391

4 years agofix #K2203 - animals can talk
PatR [Mon, 21 Sep 2020 01:38:31 +0000 (18:38 -0700)]
fix #K2203 - animals can talk

The code for peaceful monsters witnessing the hero attack another
peaceful monster and getting angry had a 20% of making them gasp in
surprise or exclaim "why?" in shock.  It was only requiring them to
have humanoid shape rather than checking for speech capability, so
peaceful zruty or minotaur, possibly other animals, could exclaim
comprehensibly.  Other things which shouldn't talk, like mummies,
would behave similarly.

This categorizes how a bunch of MS_foo types should react.  It has
only been lightly tested.

4 years agoQt non-issue
PatR [Sat, 19 Sep 2020 00:30:48 +0000 (17:30 -0700)]
Qt non-issue

Any key bindings in player's run-time config file will already be
in place by the time the Qt menus are constructed.  Those menus
will use the new key assignments rather than the defaults, so not
a bug.

4 years agofix pull request #386 - monster interaction
PatR [Fri, 18 Sep 2020 22:53:43 +0000 (15:53 -0700)]
fix pull request #386 - monster interaction

The previous teleport scroll fix was mislabeled with this pull
request number.  Too late to fix that now; should have been

Closes #307

Now...  Interaction between voluntarily busy hero (resting,
searching, and so on) with approaching monsters to decide whether
to stop had some inconsistencies.

Really closes #386

4 years agopull request #386 - discovering teleport scroll
PatR [Fri, 18 Sep 2020 22:34:29 +0000 (15:34 -0700)]
pull request #386 -  discovering teleport scroll

Since teleporation gives a "you matrialize" message even when
arriving close by, the old behavior of not learning a scroll of
teleportation when you land quite close to your original spot
no longer made sense.  Always [almost] discover teleport scroll
when reading it.

Also adds one-shot teleport control when reading a blessed scroll
of teleportation.  I changed that to be prevented when hero is
stunned, same as with full-fledged teleport control.

I reworded or reformatted several of the comments.  And removed
the EDITLEVEL increment in patchlevel.h; save and bones file
contents are not affected.

I've also added an unrelated comment about reading mechanics to
doread().

Closes #386

4 years agoanother Qt "issue"
PatR [Fri, 18 Sep 2020 02:02:23 +0000 (19:02 -0700)]
another Qt "issue"

4 years agomore Qt menu
PatR [Thu, 17 Sep 2020 17:47:33 +0000 (10:47 -0700)]
more Qt menu

The #enhance menu revealed a couple of menu problems for Qt.

Items flagged with "*" or "#" were showing tiny "..." instead of
the flag character.  An existing problem rather than something
caused by yesterday's overhaul patch.

The "(Skills flagged by "*" may be enhanced when you're more
experienced.)" legend line was causing the regular entries to be
formatted strangely (their skill name column was much too wide).
That was caused by me dropping something (special case for header
lines during tab-separation handling) in yesterday's patch that
I mistakenly thought wasn't needed.

4 years agosilence a Qt complaint
PatR [Thu, 17 Sep 2020 09:49:37 +0000 (02:49 -0700)]
silence a Qt complaint

The save file selection widget was issuing a complaint to stderr:
|QLayout: Attempting to add QLayout "" to QDialog "", which already
| has a layout

This shuts that up, but doesn't fix the broken save file selection
so I haven't added a fixes37.0 entry.

4 years agoQt menu overhaul
PatR [Wed, 16 Sep 2020 22:51:33 +0000 (15:51 -0700)]
Qt menu overhaul

handle preselected item in pick-one menu; picking it returns that
  item rather than toggling it off and returning nothing, picking
  something else only returns the other thing (was returning first
  of the chosen item or the preselected item, foiling core's attempt
  to deal with both and giving wrong result whenever the preselected
  one came first--like pick-an-attribute for menu colors);

when handling typed input, check selector letters before menu
  command keys so that special "letters" '-' (fingers, hands, self)
  and ':' (look inside container) that are specified by a few menus
  can be chosen by keyboard;

menus were using default line heights which are excessively tall,
  effectively making them be double spaced and using more screen
  space than should have been needed; reduce height to 60% of what
  it was, still a bit taller than regular spacing; look at ^X--which
  is rendered via menu--before and after to see the difference;

start with count column empty instead of 6 spaces; grow it as counts
  get entered; reset to empty if [all], [none], or [invert] is used;
  treat intermediate counts as long rather than int; right justify
  formatted count values;

simplify creating menu return data (pick-one doesn't need separate
  handling);

for pick-one menus,
  enable [ok] button if there is one preselected item,
  enable [all] button if there is only one item (may never happen),
  enable [none] if there is a preselected item (menu remains active
    if [none] is used to clear the preselection);
  enable [invert] if there is one item (may never happen; should
    allow two items if one of them is preselected--definitely does
    happen--but that wouldn't work as intended without code changes);

honor pending count if an item is selected by clicking its checkbox
  (already done for typing its letter or for clicking another part
  of item's menu line);

accept <delete>/<rubout> in addition to <backspace> when backing out
  a digit as a count is being typed;

accept ^[ as well as ESC key for cancelling count or entire menu;

honor 'menucolors'=false to ignore any defined menu color patterns.

4 years agonew file win/Qt/Qt-issues.txt
PatR [Wed, 16 Sep 2020 09:04:15 +0000 (02:04 -0700)]
new file win/Qt/Qt-issues.txt

Record a bunch of Qt stuff before I forget it all.  It's probably
too late:  I'll bet I've left some things out.

Doesn't include several menu problems that I've already fixed but
not checked in yet.  (I don't have any other Qt changes pending.)

4 years agounexplored terrain on Qt map
PatR [Tue, 15 Sep 2020 14:26:42 +0000 (07:26 -0700)]
unexplored terrain on Qt map

Qt's map hadn't been updated to draw unexplored locations with
the unexplored glyph so was still using solid stone instead.

Column 0 should be removed but I'll leave that for someone more
adventurous; I did it for curses and for X11 but am going to
pass here.  It's very noticable after magic mapping but is only
"bad" (by wasting space) if clipping is being performed.

4 years agohistory formatting
PatR [Tue, 15 Sep 2020 10:51:20 +0000 (03:51 -0700)]
history formatting

Qt's text window for 'history' was unexpectedly wide and it turned
out that that was to fit in one excessively wide line.  tty has
been formatting it by splitting it into one normal sized line
followed by an excessively short line.

4 years agopick-a-color tweak
PatR [Sat, 12 Sep 2020 06:59:20 +0000 (23:59 -0700)]
pick-a-color tweak

Move a minor conditional out of a short loop.  I only bothered
because I wanted to fix a comment.

4 years agosyntax bit
nhmall [Sat, 12 Sep 2020 04:32:05 +0000 (00:32 -0400)]
syntax bit

4 years agopick-a-color in color
PatR [Thu, 10 Sep 2020 23:01:18 +0000 (16:01 -0700)]
pick-a-color in color

Similar to how the pick-an-attribute menu for menu colors and
status highlights shows the attribute names using the attribute
so that you can see how it looks (or whether it is supported),
have the pick-a-color menu show the color names in the
corresponding color.  Does so by temporarily removing any
user-specified menu colors and setting up another list of such
for matching color names.

Forces the 'menucolors' option On while the pick-a-color menu is
in use, then restores the previous setting along with the user's
menu colorings.  Might need some way to avoid setting that for a
configuration where colors don't work.

4 years agohints/*.2020 vs CFLAGS, take 3...
PatR [Wed, 9 Sep 2020 21:40:22 +0000 (14:40 -0700)]
hints/*.2020 vs CFLAGS, take 3...

Avoid use of GNU make's 'override' feature by requiring
'make CCFLAGS=-O' to replace -g from the make command line instead
of 'make CFLAGS=-O'.  Note the extra 'C' in the spelling.

Revert the previous umpteen MORECFLAGS+= back to normal CFLAGS+=.

4 years agoboolean option processing
PatR [Wed, 9 Sep 2020 21:19:48 +0000 (14:19 -0700)]
boolean option processing

In addition to 'true', 'yes', 'on' and 'false', 'no', 'off',
accept 1 and 0 for the value of a boolean option.  Other numeric
values are rejected rather than treated as non-zero.

Relax the parsing for true, false, yes, no to accept one or more
letters instead of requiring at least three for true and false
and full word for yes and no.  Full word is still required for
on and off.

Don't report two errors for the same mistake:
 |% NETHACKOPTIONS='legacy:flase' ./nethack
 | * Illegal parameter for a boolean.
 | * Unknown option 'legacy:flase'.
 |2 errors in NETHACKOPTIONS.
is changed to
 | * 'legacy:flase' is not valid for a boolean.
 |1 error in NETHACKOPTIONS.

4 years agoqt_map.cpp source formatting
PatR [Tue, 8 Sep 2020 20:26:13 +0000 (13:26 -0700)]
qt_map.cpp source formatting

Clean up the Qt code a bit.  The only intended change is to use
a different check for being polymorphed.

4 years agohints/{linux,macOS}.2020
PatR [Tue, 8 Sep 2020 19:36:13 +0000 (12:36 -0700)]
hints/{linux,macOS}.2020

A recent change was intended to allow specifying
  make CFLAGS=-O
on the command line to override our default of -g, but it didn't
work as intended.  foo=bar and foo+=bar don't work if foo has
been given a value on the command line.  The first was expected
behavior but the second wasn't, at least for me.  GNU make allows
'override foo+=bar' to cope with that.  (We're already implicitly
requiring GNU make for the linux and OSX hints.)

4 years agofix #K1963 - warning after placing worm tail
PatR [Tue, 8 Sep 2020 10:03:03 +0000 (03:03 -0700)]
fix #K1963 - warning after placing worm tail

Report described this as a panic triggered by the sanity_check
option, but that's because it was running under the fuzzer, which
escalates any impossible() to panic(), rather than because nethack
panicked.

I couldn't find anything wrong--which doesn't mean that there
isn't something wrong--with place_worm_tail_randomly() and
random_dir().  They use xchar for map coordinates which should be
fine as long as no negative values are generated and I couldn't
discover any such.  The suggested fix of changing xchar to int
might indicate a compiler bug (although the odds of that are low).
The bogus coordinate of -15000 in the report suggests that
 typedef short int schar;
(which changes xchar too) is being used in the configuration but
I don't recall having any problems attributable to that.

This switches from xchar to int as a side-effect of replacing the
offending code entirely.  The new code might produce an 'ny' of -1
before goodpos() rejects it, so xchar would be inappropriate now.
The old code is commented out via #if 0 _after_ changing it from
xchar to int.

This also adds an extra sanity_check for worm tails, unrelated to
the current bug.  I'm not aware of any instance where it fails.
EXTRA_SANITY_CHECKS needs to be defined for it to do anything.

4 years agospecial level's lit state when changing terrain
PatR [Sun, 6 Sep 2020 23:17:33 +0000 (16:17 -0700)]
special level's lit state when changing terrain

Part of pull request #308:  when using des.terrain to set terrain,
default for lit state becomes 'unchanged' rather than 'unlit'.
des.replace_terrain already operates that way.  Replace lit state
magic numbers -1 and -2 with SET_LIT_RANDOM and SET_LIT_NOCHANGE.

Also change SET_TYPLIT() to not operate on map column 0 and move
it from rm.h to sp_lev.h.  It never belonged there, is only used
in sp_lev.c, and now because of the SET_LIT_ macros it couldn't be
used anywhere else unless sp_lev.h gets included too.

4 years agoupdate unix Makefile hints
PatR [Sat, 5 Sep 2020 20:28:46 +0000 (13:28 -0700)]
update unix Makefile hints

4 years agopolearm context
PatR [Sat, 5 Sep 2020 18:35:28 +0000 (11:35 -0700)]
polearm context

Move clearing of polearm context from migrate_to_lev() to lower
level relmon().  Add missing transfer of polearm context from
old mon to new mon in replmon().  These days it seems to only be
used for creating a monster from saved traits, so polearm context
in it should be moot.

4 years agomore hunger checks
PatR [Fri, 4 Sep 2020 22:29:22 +0000 (15:29 -0700)]
more hunger checks

I don't know what I was thinking before.  'moves + rn2(20)' can
be simplified to just rn2(20) and ignore moves altogether.

4 years agohunger checks
PatR [Fri, 4 Sep 2020 21:31:44 +0000 (14:31 -0700)]
hunger checks

Eliminate the feasibility of micro-managing ring hunger by swapping
back and forth between a pair of rings of slow digestion.  Wearing
one at a time causes normal ring hunger (wearing both at once just
increases such hunger), but being able to put on the second ring
and take off the first just before the 1 out of 20 turns where it
affects hunger, then vice versa a few turns later, is an insanely
tedious way to avoid any hunger at all, made possible by the 'time'
option.  Make the turns where extra hunger get imposed be randomized
so that that can't be done reliably.

Also closes githib issue #336:  hunger caused by melee attacking
adds ring and amulet hunger a second time for that turn.  That has
always been intentional behavior; now the amount varies for any
given attack due to the randomization, but on average is the same
as before.

Closes #336

4 years agoQt input overhaul
PatR [Fri, 4 Sep 2020 02:01:36 +0000 (19:01 -0700)]
Qt input overhaul

Enable existing wc_popup_dialog option.  Use it in yn_function()
instead using a mystery value which apparently used to live in Qt
Settings but isn't there anymore so couldn't be turned on or off.
Also replaces conditional USE_POPUPS which isn't defined anywhere
either so presumably came from CFLAGS and only supported "yn?",
"ynq?", and "rl?" with hardcoded Qt popups rather than using
NetHackQtYnDialog.

Doing that revealed that the popup dialog for ynaq was in pretty
bad shape.  It's functional but still needs a lot of work, beyond
the limited Qt/C++ capability I possess.  The KeyPress issue which
accepts <shift> as input, thereby preventing <shift>+<character>
from being typed during ynaq prompting, is particularly nasty.

Append the ynaq dialog's response to the message line containing
the corresponding prompt similar to what's now done for regular
yn_function().

Add getlin() prompt+response to the message window.

4 years agopotential infinite loop on hangup (ring prompt)
PatR [Tue, 1 Sep 2020 11:11:01 +0000 (04:11 -0700)]
potential infinite loop on hangup (ring prompt)

Core issue noticed while working on some Qt stuff.  If hangup
occurred while prompting for "right or left?" ring finger, the
hangup yn_function() would return ESC and the accessory-on routine
would not see '\0', 'r', or 'l' so reprompt.  Endlessly.

4 years agoQt without tiles again
PatR [Mon, 31 Aug 2020 22:47:49 +0000 (15:47 -0700)]
Qt without tiles again

"Qt without tiles" (commit ae4c180cf62ce4f19bd020495d6b089584b2426b)
two weeks ago accidentally took out a line that should have stayed.

4 years agoQt prompt responses in message window
PatR [Mon, 31 Aug 2020 07:30:36 +0000 (00:30 -0700)]
Qt prompt responses in message window

When Qt issues a prompt string in the message window, update it
with the player's response once that has been obtained.

4 years agoQt message [un]highlighting
PatR [Mon, 31 Aug 2020 05:50:02 +0000 (22:50 -0700)]
Qt message [un]highlighting

The Qt interface highlights the last message issued (using a
mechanism for selection, as if for copy+paste or similar operation)
but it was staying highlighted until another message was eventually
given.  Having an old message seem to stick around is annoying and
is particularly bad when the message is a prompt.  If the player's
answer doesn't cause a message to be shown then it seems as if the
prompt is still pending.

This removes the highlighting (by bulk unselecting) once the player
gives another input keystroke or mouse click.

It would be much better if the selecting/highlighting was for all
messages issued since last time highlighting was cleared.  Figuring
out how to do that correctly is more effort than I want to expend.

4 years agoQt keyboard fixups
PatR [Sun, 30 Aug 2020 23:44:39 +0000 (16:44 -0700)]
Qt keyboard fixups

Make ASCII control characters ^[, ^\, ^], ^^, and ^_ work on Qt,
at least partly.  Mainly for ^[ to be treated as ESC, which works
if you're aborting a count on the map but doesn't cancel out of
menus [yet?].  I didn't attempt to make ^@ send NUL.

Also, fix the hardcoded macros (activated by F1: rest 100 turns,
F2: search 20 times, and Tab: ^A to do-again).  The first two sent
'n' before the count so wouldn't work as intended with number_pad
off, and the third was executing twice as if Tab sent two ^A's
instead of just one.  Resting and searching might have been getting
duplicated too; I don't know how to simulate the relevant keys.
(I temporarily swapped definitions for F2 and Tab to test the
number_pad fix but hadn't done that earlier when I discovered the
Tab bug.)

4 years agoqt_win.cpp cleanup
PatR [Sun, 30 Aug 2020 23:00:18 +0000 (16:00 -0700)]
qt_win.cpp cleanup

Started out fixing a comment typo and ended up removing a bunch of
unnecessary stuff, plus a little bit of lackluster reformatting.

4 years agoQt menu fix
PatR [Sat, 29 Aug 2020 00:31:33 +0000 (17:31 -0700)]
Qt menu fix

Menus have [ok], [cancel], [all], [none], [invert], and [search]
buttons across their top but the [all], [none], and [invert] choices
didn't redraw the menu after making changes to the pending selections
so it seemed as if they weren't doing anything.  Subsequently picking
[ok] revealed otherwise.

[search] is broken (instead of accepting a search string, the letters
I type are being used to toggle individual entries as I type).  This
doesn't attempt to address that.

4 years agofix pull request #379 - is_displacer()
PatR [Fri, 28 Aug 2020 00:38:11 +0000 (17:38 -0700)]
fix pull request #379 - is_displacer()

A couple of places which could/should have been using existing
is_displacer() macro weren't.

No change in behavior.

Fixes #379

4 years agofix pull request #380 - turning into slime
PatR [Thu, 27 Aug 2020 23:14:17 +0000 (16:14 -0700)]
fix pull request #380 - turning into slime

The turn-to-slime countdown is one of the ones that uses turns/2
to stretch the sequence out longer and it was displaying the hero
as green slime when there was another turn before it happened.
(In theory anyway.  I could not get my hero to be shown as slime
and still have one move left, even when hasted.)

Make the hero mimic green slime starting on the last turn before
being polymorphed instead of next to last.

Fixes #380

4 years agofix commented-out debugging code
PatR [Wed, 26 Aug 2020 21:47:02 +0000 (14:47 -0700)]
fix commented-out debugging code

I was actually using fprintf(stderr,...) when testing and didn't
retry this bit after changing it to raw_printf(...).  It's commented
out but needs fixing.

4 years agosys/winnt/Makefile.msc update for VS 2019 16.7.2
nhmall [Wed, 26 Aug 2020 02:41:54 +0000 (22:41 -0400)]
sys/winnt/Makefile.msc update for VS 2019 16.7.2

4 years agoqt_key.cpp
PatR [Wed, 26 Aug 2020 01:59:22 +0000 (18:59 -0700)]
qt_key.cpp

I've been trying to figure out how to make ^[ be treated as ESC but
so far have failed.  That key combination just acts like a dead key.
But one bit of cp_key.cpp can be implemented instead of ignored.

No change in behavior because the keyboard-state value isn't being
used anywhere.

4 years agoQt tombstone bugs
PatR [Thu, 20 Aug 2020 23:56:50 +0000 (16:56 -0700)]
Qt tombstone bugs

Infrastructure bits:  Qt tombstone uses a short buffer; make sure that
the plname value fits instead of relying on snprintf() to truncate it.
A warning about gold, if any, was iffy but this should guarantee no
reason for future complaint.  Year was safe but a compiler sensitive
to buffer overflows wouldn't know that.

Actual bugs:  Qt used money in inventory for gold amount on tombstone;
that overlooks gold in containers and will be 0 by tombstone stage if
bones get saved.  Year was recalculated from current date+time instead
of using the value that gets passed in--blindly flagging that variable
as UNUSED was a mistake.

4 years agoMerge branch 'NetHack-3.7'
nhmall [Thu, 20 Aug 2020 15:20:26 +0000 (11:20 -0400)]
Merge branch 'NetHack-3.7'

4 years agobuild warning fix on g++ >= 9 and Qt
nhmall [Thu, 20 Aug 2020 15:18:32 +0000 (11:18 -0400)]
build warning fix on g++ >= 9 and Qt

../win/Qt/qt_menu.cpp: In member function ‘virtual void nethack_qt_::NetHackQtTextWindow::UseRIP(int, time_t)’:
../win/Qt/qt_menu.cpp:680:54: warning: ‘%s’ directive output may be truncated writing up to 31 bytes into a region of size 17 [-Wformat-truncation=]
  680 |     snprintf(rip_line[NAME_LINE], STONE_LINE_LEN+1, "%s", g.plname);
      |                                                      ^~   ~~~~~~~~
In file included from /usr/include/stdio.h:867,
                 from ../include/global.h:9,
                 from ../include/config.h:608,
                 from ../include/hack.h:10,
                 from ../win/Qt/qt_menu.cpp:8:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:67:35: note: ‘__builtin_snprintf’ output between 1 and 32 bytes into a destination of size 17
   67 |   return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
      |          ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   68 |        __bos (__s), __fmt, __va_arg_pack ());
      |        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~../win/Qt/qt_menu.cpp: In member function ‘virtual void nethack_qt_::NetHackQtTextWindow::UseRIP(int, time_t)’:
../win/Qt/qt_menu.cpp:680:54: warning: ‘%s’ directive output may be truncated writing up to 31 bytes into a region of size 17 [-Wformat-truncation=]
  680 |     snprintf(rip_line[NAME_LINE], STONE_LINE_LEN+1, "%s", g.plname);
      |                                                      ^~   ~~~~~~~~
In file included from /usr/include/stdio.h:867,
                 from ../include/global.h:9,
                 from ../include/config.h:608,
                 from ../include/hack.h:10,
                 from ../win/Qt/qt_menu.cpp:8:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:67:35: note: ‘__builtin_snprintf’ output between 1 and 32 bytes into a destination of size 17
   67 |   return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
      |          ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   68 |        __bos (__s), __fmt, __va_arg_pack ());
      |        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

4 years agogrammar bit
nhmall [Thu, 20 Aug 2020 13:50:07 +0000 (09:50 -0400)]
grammar bit

4 years agocomment out what appears to be an obsolete bit in windows Makefile.gcc
nhmall [Tue, 18 Aug 2020 14:36:15 +0000 (10:36 -0400)]
comment out what appears to be an obsolete bit in windows Makefile.gcc

4 years agomirror recent make depends update in some other Makefiles
nhmall [Tue, 18 Aug 2020 14:26:24 +0000 (10:26 -0400)]
mirror recent make depends update in some other Makefiles

4 years agoQt without tiles
PatR [Mon, 17 Aug 2020 23:42:24 +0000 (16:42 -0700)]
Qt without tiles

Qt is capable of using an ascii map, and does so on the rogue level.
So failing to load tiles doesn't need to quit; it can continue in
text mode.

Not extensively tested.  This disables the paper doll when the ascii
map is forced (either via options settings or due to tiles loading
failure, but not when simply on the rogue level) rather than trying
to display it with object class characters.

4 years agoQt install dependencies
PatR [Mon, 17 Aug 2020 22:53:18 +0000 (15:53 -0700)]
Qt install dependencies

Playground setup:  Qt does not use external files pet_mark.xbm and
pilemark.xbm, it has pixmaps for those compiled in via qt_xpms.h.
Presumably because the pet mark heart has two sizes there.

4 years agowin/Qt/* dependencies update
PatR [Mon, 17 Aug 2020 22:44:16 +0000 (15:44 -0700)]
win/Qt/* dependencies update

A couple of qt_*.h headers now include other qt_*.h headers,
adding a bunch of new dependencies for the qt_*.cpp sources.
This is from 'make depend'.

4 years agoQt: paper doll display of BUC status
PatR [Mon, 17 Aug 2020 22:41:33 +0000 (15:41 -0700)]
Qt: paper doll display of BUC status

When items in the paper doll inventory subset (primary worn and
wielded items) have known BUC state, indicate what that is.  It
now draws a one pixel wide white border around each doll tile,
and if BUC is known, that border gets its color changed (red for
known cursed, yellow for known uncursed, cyan for known blessed).
That isn't very visual so the first pixel inside the tile is
overwritten with the same color, and alternating pixels are also
overwritten for the second rectangle within.  The 2..3 pixel wide
border is visible without cluttering the tile for 'normal' sized
paper doll.  The tiles are allowed to be scrunched down to as
small as 6x6 so there won't be much left after 1 or 2 around the
edge are replaced.

Initially I was going to try to highlight welded items but the
more general BUC highlighting is simpler and usually more useful
to the player.

The qt_map.* bits are just reformatting.  I was looking at pet
and pile annotations as a way to do BUC annotations but decided
not to attempt that.

4 years agopaper doll inventory display vs hallucination
PatR [Mon, 17 Aug 2020 21:48:00 +0000 (14:48 -0700)]
paper doll inventory display vs hallucination

During hallucination, actions which triggered update of persistent
inventory made Qt's display of map tiles for equipped objects have
those tiles switch randomly, but ordinary move-by-move fluctations
applied to floor objects left them alone.

Initially I took out hallucination of inventory items altogether,
but ended up putting that back and changing the floor hallucination
to affect Qt's paper doll too.  The display.h change isn't needed
but I've left it in.

4 years agoQt "Paper Doll" inventory
PatR [Sun, 16 Aug 2020 02:48:33 +0000 (19:48 -0700)]
Qt "Paper Doll" inventory

Enhance the "Qt Settings" dialog box to provide control over the
paper doll subset of inventory displayed between the message and
status windows (above the map).  A ton of flailing about for a
fairly small but useful change in functionality.

Old dialog (no title):
| [ ] Zoomed            -- check box
| "Width:"  [      ]    -- number entry spinner
| "Height:" [      ]    -- ditto
| "Font:"   [      ]    -- Huge:18pt, Large:14, Medium:12, Small:10, Tiny:8
| [      Dismiss      ] -- button

New dialog:
|     "Qt NetHack Settings"
|
| "Map:"    [ ] "Zoomed"        -- check box
|           "Tile Width"   [  ] -- number entry spinner
|           "Tile Height"  [  ] -- ditto
| "Invent:" [ ] "Shown"         -- check box
|           "Doll Width"   [  ] -- number entry spinner
|           "Doll Height"  [  ] -- ditto
| "Font:"   [      ]    -- Huge:18pt, Large:14, Medium:12, Small:10, Tiny:8
| [          Dismiss          ] -- button

The inventory subset can now be suppressed.  When shown (the default),
its size can be set independently of the map tiles' size.  I've set
the default to be 32x32 tiles instead of 16x16 used for the map.

The settings are saved and restored automatically by Qt, and persist
not just across save/restore cycles but into new games.  (That's not
a change, just a reminder.)

4 years agoremove duplicate line in .travis.yml
nhmall [Sat, 15 Aug 2020 20:52:19 +0000 (16:52 -0400)]
remove duplicate line in .travis.yml

4 years agoadjust travis-ci builds
nhmall [Sat, 15 Aug 2020 20:43:59 +0000 (16:43 -0400)]
adjust travis-ci builds

add builds that tests tty, curses, X11, and Qt5 on
all of the following:
linux-xenial, linux-bionic, linux-focal

Also still tests "nocommon" on earlier gcc versions.
Add a focal with gcc9 build to test that compiler version.

Here are the test builds:
linux-xenial-gcc-win-all
linux-bionic-gcc-win-all
linux-focal-clang-win-all
linux-xenial-gcc-nocommon
linux-focal-gcc9-win-all
linux-xenial-gcc-minimal
windows-visualstudio
windows-mingw
msdos-linux-focal-djgpp-crosscompile

4 years agomake sys/msdos/msdos-cross-compile.sh build msdos NetHack entirely
nhmall [Fri, 14 Aug 2020 22:23:31 +0000 (18:23 -0400)]
make sys/msdos/msdos-cross-compile.sh build msdos NetHack entirely

- should work on linux or MacOS to build an msdos zipfile distribution
- no longer requires env variables be set ahead of it because it will set some
  defaults within
- you must have zip and unzip on your system though
- you have to "make fetch-lua" first if you haven't already done that
- script takes care of obtaining the djgpp-cross-compiler etc, then
  uses it to build msdos NetHack
- to clean and rebuild from scratch:
  make -f sys/msdos/Makefile1.cross clean

4 years agomsdos cross-compile djggp build now with gcc 10
nhmall [Fri, 14 Aug 2020 21:25:05 +0000 (17:25 -0400)]
msdos cross-compile djggp build now with gcc 10

Also updates the travis build to Ubuntu focal because of an
ar libfl.so.2 shared library load error on xenial that was
easier to just get away from by moving to focal.

4 years ago'O' couldn't change 'symset'
PatR [Thu, 13 Aug 2020 22:24:24 +0000 (15:24 -0700)]
'O' couldn't change 'symset'

The revised options processing from however long ago broke using
'O' to change 'symset'.  ('roguesymset' worked ok.)  Picking it
in the main 'O' menu behaved as it nothing had been picked.  The
symset-specific submenu wasn't offered to the player because a
two-line block of code was omitted.

It seems amazing that no one has noticed in all this time.

4 years agoanother typo
nhmall [Thu, 13 Aug 2020 17:48:33 +0000 (13:48 -0400)]
another typo

4 years agowording bit
nhmall [Thu, 13 Aug 2020 17:42:40 +0000 (13:42 -0400)]
wording bit

4 years agominor typo bit in NewInstall.unx
nhmall [Thu, 13 Aug 2020 17:39:17 +0000 (13:39 -0400)]
minor typo bit in NewInstall.unx
missing closing bracket ')' and wording change

4 years agoThis is cron-daily v1-Jan-20-2020. files updated: Files
nhw_cron [Thu, 13 Aug 2020 16:24:07 +0000 (12:24 -0400)]
This is cron-daily v1-Jan-20-2020.  files updated: Files

4 years agoMerge branch 'NetHack-3.7' of https://rodney.nethack.org:20040/git/NHsource into...
nhmall [Thu, 13 Aug 2020 17:35:37 +0000 (13:35 -0400)]
Merge branch 'NetHack-3.7' of https://rodney.nethack.org:20040/git/NHsource into NetHack-3.7