Commit Graph

11969 Commits

Author SHA1 Message Date
PatR
25b1baed84 fix saddle sanity check code
Fix some bad code for "no saddle" caused by careless editing that
changed (uncomitted)
  char *ns = 0;
  if (foo)
    ns = "foo";
  else if (bar)
    ns = "bar";
by splicing lines together and accidentally ended up with
  char *ns;
  ns = foo ? ns = "foo" : bar ? ns = "bar" : 0;
when
  char *ns;
  ns = foo ? "foo" : bar ? "bar" : 0;
was intended.

I'm a bit surprised that the intermediate form without any
parentheses around 'ns = "bar"' compiles at all.  C99?  I don't
think that it would have if it had been processed as C90 or pre-ANSI.
2021-05-11 15:59:19 -07:00
nhmall
708a169917 three warnings building with gcc 10
---
insight.c: In function ‘status_enlightenment’:
insight.c:937:28: warning: ‘ (’ directive writing 2 bytes into a region of size between 0 and 255 [-Wformat-overflow=]
  937 |         Sprintf(buf, "%s %s (%s)", ustick ? "holding" : "held by",
      |                            ^~
In file included from ../include/config.h:631,
                 from ../include/hack.h:10,
                 from insight.c:15:
../include/global.h:274:24: note: ‘sprintf’ output 5 or more bytes (assuming 260) into a destination of size 256
  274 | #define Sprintf (void) sprintf
insight.c:937:9: note: in expansion of macro ‘Sprintf’
  937 |         Sprintf(buf, "%s %s (%s)", ustick ? "holding" : "held by",
      |         ^~~~~~~
insight.c:918:29: warning: ‘%s’ directive writing up to 255 bytes into a region of size 252 [-Wformat-overflow=]
  918 |         Sprintf(buf, "%s by %s",
      |                             ^~
  919 |                 is_animal(u.ustuck->data) ? "swallowed" : "engulfed",
  920 |                 heldmon);
      |                 ~~~~~~~
In file included from ../include/config.h:631,
                 from ../include/hack.h:10,
                 from insight.c:15:
../include/global.h:274:24: note: ‘sprintf’ output 5 or more bytes (assuming 260) into a destination of size 256
  274 | #define Sprintf (void) sprintf
insight.c:918:9: note: in expansion of macro ‘Sprintf’
  918 |         Sprintf(buf, "%s by %s",
      |         ^~~~~~~

---

zap.c:475:1: warning: old-style function definition [-Wold-style-definition]
  475 | release_hold()
      | ^~~~~~~~~~~~
2021-05-11 09:24:21 -04:00
nhmall
4c98a6f550 Merge branch 'NetHack-3.7' of https://rodney.nethack.org:20040/git/NHsource into NetHack-3.7 2021-05-10 18:52:07 -04:00
nhmall
d87a910817 pipelines build attempt 2 2021-05-10 18:51:29 -04:00
PatR
b4967c817a more tribute: Soul Music
Add page citations for first two passages and some missing italics
to the first one.  Fix spelling of "fossil" in passage 8.

Add two short, new passages bringing total to 13.
2021-05-10 15:16:21 -07:00
nhmall
751cce7161 try simple fix for pipelines gcc-8 issue 2021-05-10 14:25:53 -04:00
Pasi Kallinen
1e1d580336 Allow webs to be placed without a giant spider on them
Allow creating webs without spiders in the lua level scripts:

des.trap({ type = "web", spider_on_web = 0 });

Based on xNetHack commit by copperwater <aosdict@gmail.com>.

Also changes the Spider nest themed room to generate without
spiders when the level difficulty is 8 or less.
2021-05-10 17:48:51 +03:00
PatR
09b71fcc95 suppress monster health
For the time being at least, take out "uninjured/barely wounded/
slightly wounded/wounded/heavily wounded/nearly dead" description
on monsters examined with ';' or '//' or '/m' and on final tombstone
and logfile entry if hero gets directly killed by a monster.

Maybe it will be revisited later....
2021-05-09 12:54:45 -07:00
Pasi Kallinen
d2b331abf7 Accept "waiting" on special level des.monster() specifications
Allow specifying "waiting" for monsters created via lua level scripts.
This sets the monster strategy to make it wait for the hero
to be in visual range before allowing the monster to move.

Also makes the monster inside the Mausoleum themed room use this feature,
to prevent out of depth liches bothering the player unprovoked.

For example:

des.monster({ class = "D", waiting = 1 });
2021-05-09 12:24:27 +03:00
Pasi Kallinen
967c7e5b0b Fix compile error on Windows
Fixes #508
2021-05-09 11:43:55 +03:00
PatR
646f247608 corpse eating feedback
Avoid the message combination
|You have a very bad case of stomach acid.
|This acid blob corpse tastes okay.
2021-05-09 01:13:32 -07:00
PatR
c866c9022b fix github issue #507 - filename buffer overflow
when compressing or uncompressing a save file.  Defining
VAR_PLAYGROUND forces PREFIXES_IN_USE to be defined, and the latter
causes docompress_file() to be called with save file name containing
a full path instead of just save/xyzzy.Z relative to the playground.
Depending on the value of VAR_PLAYGROUND, that could be too long for
the buffer used to make a copy of the name with ".Z"/".gz"/".bz2"
appended.

Probably only applies to Unix/linux/OSX configurations.

Fixes #507
2021-05-08 18:02:00 -07:00
PatR
dd6ed5026b fix pull request #505 - undead turning
zapped at corpse flagged as "no revive".  A fairly recent change
made undead turning override no-revive if it hit someone carrying
a corpse flagged that way (corpse of a troll killed by Trollsbane
or stuffed in an ice box or explicitly cancelled) but neglected to
do so for corpses zapped while on the floor.  This fixes that, for
undead turning zapped by monsters as well as by the hero.

Fixes #505
2021-05-07 11:58:58 -07:00
PatR
cecda13ab2 fix pull request #504 - partly eaten food
that has no nutritional value.  Prevent applying the partly eaten
attribute to wished for food if the full nutrition isn't at least 2.
The problem case was 0 nutrition wraith corpse, yielding "partly
eaten food (1) more nutritious than untouched food (0)" when setting
the corpse's weight.  That one was possible in 3.6.x, unlike corpse
that was actually partly eaten and then revived as a zombie (which
was just fixed for triggering the same warning).

Wishing really ought to ignore "partly eaten" for anything that is
normally eaten in one bite but I'm not sure how to handle that.

Fixes #504
2021-05-06 17:52:30 -07:00
PatR
ad7f2afef9 fix github issue #493 - hero item knowledge
Issue was about being asked what to call a previously seen potion
which has been picked up and thrown by an unseen monster.  Hero
shouldn't remember what the item description was.  This is a much
more general change than just fixing that.  Any item picked up by
an unseen non-tame monster will have all its *known flags cleared
since the hero can't see what that monster does to it.  Same if an
item is picked up while seen but then used when unseen.

Unseen pets are excluded from the pick up case--but not the use
case--because they pick up and drop stuff continually and players
would just slaughter them if they caused item information to be
forgotten.

Fixes #493
2021-05-06 12:36:32 -07:00
PatR
86120d4574 fix github issue #503 - bad Magic Key logic
When unlocking a trapped container, any blessed key was behaving
as if it was the rogue's Master Key of Thievery:  detecting the
trap, asking whether to untrap, and always succeeding if player
responds with yes.  The intended behavior is that the Master Key
will behave that way for a rogue if not cursed and for non-rogue
if blessed; it wasn't supposed to affect ordinary keys at all.

Fixes #503
2021-05-06 11:42:14 -07:00
Michael Meyer
9ba4b6ad4d Fix: uninitialized buffer in mhitm theft feedback
If a monster with a theft attack (nymph or leprechaun) stole something
from an invisible monster (e.g. while under the influence of conflict),
and the attacking monster was not itself invisible, the monster name
buffer used when printing the "<foo> suddenly disappears!" message would
be used while still uninitialized.  The attacking monster's name was
only copied into the buffer if the defending monster was visible, but
would be used regardless to print the pline if the attacking monster was
visible and teleported away successfully after the attack.
2021-05-06 19:15:56 +03:00
Michael Meyer
616311125c Fix: nymph theft vs monster
Nymphs' item theft attack against other monsters was broken in 1696019,
when a break used to select a particular item in the target monster's
inventory was changed to an early return.
2021-05-06 18:00:06 +03:00
Pasi Kallinen
9fa9f00f8a Entering special room, wake up only that room
... instead of doing a level-wide wake-up.

Fixes #429
2021-05-05 20:34:05 +03:00
PatR
e8765fb2b8 tribute update: Lords and Ladies, Men at Arms
For Lords and Ladies, add a new, 13th passage.

For Men at Arms, include a page citation for the first passage
and add some missing italics to that one.  Add a missing word to
the second passage.
2021-05-03 14:18:21 -07:00
PatR
04e68b7d32 fix pull request #498 - unseen demon "looks angry"
When a potentially bribable demon lord becomes angry because the
hero is wielding Excalibur or Demonbane, avoid "It looks angry"
if the demon can't be seen.  The pull request just suppressed the
message in that situation; I've added an alternate one.

Fixes #498
2021-05-03 14:10:09 -07:00
PatR
22b320f441 fix github issue #499 - perm_invent menu_headings
Implementation of '|'/#perminv command for scrolling perm_invent
deliberately disabled menu_headings (video attribute for object
class separator lines) on the persistent inventory window under
curses.  I don't recall why (possibly because it isn't actually
a menu) but there's no compelling need to do that, so reinstate
heading attributes.

Fixes #499
2021-05-03 13:50:48 -07:00
PatR
c0c7190f74 fix #K3317 - warning when eating corpse
The report was misleading because the warning about partly eaten
food being more nutritious than untouched food was actually given
when the partly eaten corpse was used to calculate hit points of
the new monster as the corpse was reviving as a zombie, rather
than when a bite was taken from it.  Pull request #497 had correct
analysis and a fix, although I've put the fix in a different place.

Closes #497
2021-05-01 18:36:46 -07:00
PatR
df6413228d fix pull request #496 - ^X feedback typo
Issue #495 and pull request #496 are both about a typo in recently
modified ^X feedback displayed when held by a monster:  "createure"
should be "creature".

Closes #496
Closes #495
2021-04-28 13:08:39 -07:00
PatR
a5410c8bbb explode() arguments
Argument explanation and Formatting.
2021-04-27 12:53:50 -07:00
PatR
b4ae19ed0c fix "Killed by foo, while paralyzed by a monster"
If the killer and the paralyzer are the same monster, truncate
that to "Killed by a foo, while paralyzed".  When not the same,
spell out the paralyzer's monster type instead of using generic
"monster".  "Killed by a fox, while paralyzed by a ghoul", or
"Killed by a ghoul, while paralyzed by a ghoul" *if* they were
two different ghouls.
2021-04-22 16:13:41 -07:00
PatR
3aacb38006 tribute: Small Gods
Add page number citations for the first two passages and add three
new passages.  That brings the total for Small Gods up to 15 which
is a bit on the high side, but they all seemed worthy.

While in there, fix a transcription mistake in Lords and Ladies #7:
"to" should be "be".

And two fixes for Jingo #11's footnote, change "genious" to "genius",
remove second "was" from "was, oddly enough, was one [...]".

Also, add a comment about the Amazing Maurice.

I've tried to bring the fixes37.0 entries about tribute fixes up to
date.  They're mostly minor and mostly neglected to include updates
for that.
2021-04-20 14:53:42 -07:00
Patric Mueller
f5904824e2 Hallucinatory liquids for water damage messages 2021-04-20 13:38:34 +02:00
PatR
2d2c584c96 another scrambled message when given '-' as object
This is similar to commit 98d381de46
(which mis-classified the bug as post-3.6), using #rub on a lump
of royal jelly and supplying '-' rather than an egg as the target
yielded "You mime rub the royal jellying on something."  Change
it to be "You mime rubbing the royal jelly on something."
2021-04-18 17:34:26 -07:00
PatR
221d82f899 fix pull request #488 - regressions for 'a'pply
Restore some old behavior for the apply command that was changed
by the "getobj refactor" patch.  You couldn't attempt to apply
potions to determine whether they were oil, couldn't apply gray
stones once touchstone was discovered, and attempting to apply
arbitrary items gave "that is a silly thing to apply" rather
than "sorry, I don't know how to use that."
2021-04-18 17:02:11 -07:00
PatR
141cafb210 fix pull request #492 - select_do_line of a point
Latent bug:  selection_do_line() for a single point produced
spurious line(s).

I haven't got a test case so am taking this one on faith....

While in there, do some nearby formatting fixups in sp_lev.c.

Fixes #492
2021-04-18 14:13:57 -07:00
PatR
28a77b9ab0 fix github issue #490 - rolling boulder traps
Don't include "Click!" in the feedback when a rolling boulder
trap is triggered if the hero is deaf.  Some feedback based on
being able to see a monster be hit by a rolling boulder should
also be reported if the location can be seen and an invisible
monster can be sensed there.  Change "you hear rumbling in the
distance" to "you hear rumbling nearby" when unseen activity is
close.  If the boulder itself is visible when it starts to roll,
report seeing that instead of hearing rumbling.

Fixes #490
2021-04-18 14:02:57 -07:00
PatR
6a7bd22d64 fix github issue #486 - feedback while engulfed
Issue is about monster shape changes being sensed via telepathy
while hero is swallowed, so player gets told about things that
aren't being shown on the map.  Similar situation while underwater;
only monsters in adjacent water spots are shown on the screen, but
messages about sensed monsters will continue to be given.  It isn't
limited to shape changing; lots of places include telepathy,
extended monster detection, and warning against specific types of
creatures as criteria to decide whether the hero 'sees' something
that isn't directly visible happen.

Change sensemon() to behave as if being swallowed or underwater
blocks telepathy, extended monster detection, and warning.  I
consider this to be experimental, but it needs much wider testing
than would take place if put into its own test branch.  It can be
tweaked or reversed if that turns out to be necessary.

There should be no change in behavior when not swallowed and not
underwater.  But for either of those two situations, some messages
that have been getting delivered may be different (such as using
"it" instead of sensed monster's name) or suppressed.

Fixes #486
2021-04-18 13:29:54 -07:00
PatR
a70927b95f fix pull request #489 - applying an empty lantern
The message given when attempting to light a lantern with no power
left described it as a lamp.  Change that to lantern.  Also, "has
run out of power" duplicates the message given when it burns out;
change that part to "is out of power".

Your lamp has run out of power.  ->  Your lantern is out of power.

Fixes #489
2021-04-17 17:36:14 -07:00
PatR
c79e7601a0 fix pull request #491 - color of converted altar
A display optimization assumed that the color of a glyph wouldn't
change unless the glyph itself changed, but there is a single glyph
for all altars and unaligned is shown with a different color than
the three aligned ones.  If there was an unaligned altar outside
of Gehennom (orcish mine town, some quests) and an invisible hero
(without see invisible) converted it, it stayed the old color until
there was some other reason to update that screen location.

Fixes #491
2021-04-17 17:16:44 -07:00
PatR
f90bb4fb6b container vulnerability to water damage
We used to have the contents of chests and large boxes be immune to
water damage, oilskin sacks immune unless the sack was cursed, other
containers be vulnerable.  Some reddit discussion about ice boxes in
unnethack indicates that they are treated like oilskin sacks, which
makes sense.  This adds that to nethack and also makes chests and
large boxes behave similarly.  So it's now:  nothing is immune even
when cursed (except statues); oilskin sacks, ice boxes, and other
boxes are immune to water damage unless cursed; all other containers
vulnerable even when not cursed.
|
|                  Old                  New
|immune all        statues,             statues
| the time         chests, large boxes
|
|immune when BU,   oilskin sacks        oilskin sacks,
| vulnerable if C                       ice boxes,
|                                       chests, large boxes
|
|vulnerable        ordinary sacks,      ordinary sacks,
| all the time     bags of holding,     bags of holding
|                  ice boxes
|
I suspect that the old ice box classification might have been an
accident caused by the Is_box() predicate yielding False for it.

The changes won't make much difference to actual play.  Chests and
large boxes are rarely carried and never start out cursed, ice boxes
even more so, and sacks/bags haven't been changed.  However, players
might intentionally curse a container to keep strong pets from
picking it up, or be carrying a box because they haven't found a bag
yet and then muck about with fountains or thrones and get it cursed.
2021-04-17 12:41:30 -07:00
PatR
7880be807a topten: UPDATE_RECORD_IN_PLACE
'final_fpos' shouldn't have been moved to the 'g' struct.  Even if
a game went all the way through topten and was restarted as a new
game that also went all the way through topten, 'final_fpos' would
get a new value rather than being messed up by a stale old one.
2021-04-16 23:01:04 -07:00
PatR
563ed2f7db OPTIONS=scores:own
From a beta tester six years ago:  specifying 'scores:own' resulted
in an option setting of 'scores:3 top/2 around/own' when player
wanted 'scores:0 top/0 around/own'.  Change it so that when fewer
than all three fields are given new values, the others are reset
rather than having their old values merge with new settings.

Also, 'scores:none' can be used to get 'scores:0 top/0 around/!own'
to skip the scores at the end without skipping notification of
whether the ending game's score made it into the top N list.
Options parsing accepts '!scores' and then ignores the negation.
Changing the optlist flags for 'scores' to allow negation resulted
in a complaint about missing value; I gave up instead of pursuing
that.  'scores:none' should suffice.

Setting 'scores:!top/own' or 'scores:!around/own' would behave as
'scores:1 top/!own' or 'scores:1 around/!own', respectively.
'scores:!top/!around/own' behaved as 'scores:1 top/1 around/own'
(note affect of two prior negations on final field compared to
single negation in the earlier two variations).  This fixes those.
2021-04-16 15:35:25 -07:00
PatR
cf62687630 remove curse vs saddle
Prayer reward can already uncurse a cursed saddle because hero is
stuck on it.  Allow scroll/spell of remove curse to do so too.

The original riding implementation in slash'em operated with the
saddle in hero's inventory rather than in the steed's, so it would
have handled this without any extra effort.  Presumeably that was
overlooked when incorporating riding into nethack changed it to
have saddle be part of the steed's inventory instead of hero's.
2021-04-14 12:51:20 -07:00
PatR
519f00e3c4 ^X feedback when held by unseen monster
When swallowed and blind, the swallowing monster is described
accurately, but being held rather than swallowed describes the
monster as "it".  That's normal, but the status feedback section
of ^X output lists
|You are held by it.
which looks pretty weird.  Change that to be
|You are held by an unseen creature.
2021-04-13 14:50:12 -07:00
PatR
5d6ab55372 opening magic vs holding monster
Zapping wand of opening or spell of knock at engulfer while swallowed
would make the engulfer expel the hero; this change makes zapping
other holders release their hold.  Zapping self now achieves the same
effect, as does breaking a non-empty wand of opening.  When poly'd
hero is holding a monster rather than being held, that monster will
be released.

Engulfers can't re-engulf for 1 or 2 turns after releasing the hero
in order to prevent hero from being immediately re-engulfed.  Impose
the same limitation on other holders.
2021-04-13 13:51:57 -07:00
PatR
8bd08ebb71 level teleporters vs Ft.Ludios
From newsgroup discussion where slash'em changes have revealed a
latent nethack bug:  prevent placing level teleporters in single-
level branches.  The Knox level doesn't have any level teleporters
(or random traps) but wizard mode wishing could create them there.
They wouldn't do anything because the only possible destination
would be the same level.  Pushing a boulder onto one used to trigger
an infinite loop (and still does in slash'em, which has other
single-level branches besides Ft.Ludios) trying to relocate it.

Boulder pushing was changed 15 years ago to prevent the infinite
loop and to avoid giving "the boulder disappears" message when a
level teleporter failed, but rolling boulder traversal lacked that
same change--it wasn't vulnerable to looping but could give an
inaccurate message claiming that the boulder disappeared when it
actually didn't.  Fixing this is a bit late; rolling boulder trap
creation was recently changed to not choose a path that rolls over
teleportation or level tele traps any more.
2021-04-12 13:25:52 -07:00
PatR
a8388c8cb5 Qt extended command "rest"
When Qt's extended command selection dialog is set for all commands
or all normal mode commands, it displays the "#wait" command as
"wait (rest)".  Picking by mouse is straightforward; the extra text
on the button has no effect.  Picking by typing "#wa" will choose it;
there aren't any other choices matching that so the player never gets
as far as typing 'i'.  This change allows the player to type "#rest"
as an alternate way to choose it.  "#re" matches some other stuff
and the choice is left pending, adding 's' makes it unique but not
explicitly chosen (so still possible to back up), then adding 't'
chooses it.  The core never knows the difference.
2021-04-11 17:53:57 -07:00
PatR
506ce2081a Qt extended command selection
Simplify extended command selection under Qt by allowing the
autocomplete subset be one of the choices for its [filter].  That's
the same subset as X11 uses, where #q is unambiguous for #quit
instead of competing with #quaff and #quiver.

Unlike under X11, the player can use [filter] to switch to the full
command set and get access to a few commands which have no useable
key and aren't flagged to autocomplete.  (Mostly obscure wizard mode
commands but #exploremode is in that situation.)

In normal and explore modes, the [filter] button just toggles between
two sets of commands (all normal mode commands vs autocomplete normal
mode commands).  In wizard mode there are four choices and you might
need to click on [filter] up to three times to step through to the
target one among four sets (all commands, all normal mode commands,
autocomplete commands for both normal and wizard, full subset of just
the wizard mode commands).
2021-04-11 14:55:45 -07:00
PatR
7856f5a5d8 tweaks to a few command flags
The #twoweapon command was flagged as autocomplete back when using
an extended command was the only way to execute it.  Take that off
since simple 'X' suffices.  Do the same for wizard mode commands
that can be invoked with control characters.  Probably ought to do
the same for #overview too but this change doesn't.

I started to add the autocomplete flag for #exploremode but that
would require an extra letter for #enhance so I decided not to.

There are some wizard mode commands that can't be executed under
X11 because they aren't flagged to autocomplete and its extended
command selection widget only offers autocomplete commands as
choices.  I haven't attempted to change that.

Always require paranoid confirmation for #panic rather than just
when it has been enabled for #quit.
2021-04-11 14:13:52 -07:00
PatR
7aa62b27de data.base novel titles
Reduce the extra indentation of the Discworld titles from 4 spaces to 2.
2021-04-08 11:49:10 -07:00
PatR
4445e06d1c Qt text windows
For Qt, always render text windows with fixed width font instead
of switching from proportional to fixed when the text contains
any line(s) with four consecutive spaces.  That was really meant
for menu lines without selector letters which want to be lined
up under or over ones with such, and wasn't a very good heuristic
for text windows.

Most of the text files for the '?' command happen to have such
lines so are already being shown with fixed-width font.  data.base
entries were hit or miss; most have attribution lines indented by
four or more spaces but some don't, so display was inconsistent:
some were shown with fixed-width font and some with proportional.
2021-04-08 11:42:55 -07:00
PatR
28f112fb17 fix pull request #485 - genetic engineer attacks
Pull request fixed two genetic engineer problems:
1) lack of "you hit <foo>" message when you were poly'd into one;
2) lack of shield effect animation ('sparkle') when a genetic
   engineer hit magic resistant hero.

That opened a can o' worms.
3) hero lacking see invisible, poly'd into genetic engineer, and
   turning target into an invisible stalker got no feedback about
   the target vanishing.

A genetic engineer attacking a monster would polymorph it turn
after turn.
4) put back the teleport capability I removed when bringing it over
   from slash'em;
5) have genetic engineer teleport away after polymorphing someone.

The various mhitm_ad_XXXX() routines used g.vis to have caller
decide visibility, but hmonas() for poly'd hero didn't set that so
some messages--not just attack induced polymorph--were based on
visibility of earlier monster vs monster activity.
6) have hmonas() set up g.vis even though it doesn't use that.

There may have been one or two other minor fixes before I managed
to force the lid back onto the can.

Fixes #485
2021-04-04 20:06:45 -07:00
PatR
7d77267f93 fix pull request #487 - one-step diagonal travel
When travel destination is one step away the code stops probing
for a path and reverts to normal movement, but it wasn't handling
the case where the one step was an impossible diagonal except for
hero being a grid bug.  If the situation was a diagonal that's
too narrow to squeeze through, travel would end and regular move
would fail.

I've rejected the suggested fix and done it differently, without
attempting to figure out why the change to end_running() would
have been wrong.  Clearly it was code that called end_running()
which needed to be fixed.

The test case was
 ..x|.
 ..|@.
 .....
while carrying enough that directly moving from '@' to 'x' will
not be allowed.  '@' would move one step south west and then stop
because findtravelpath() had ended travel due to single step move.
A similar case is
   ###
  |x-#-
  |0@.|
where 'x' is a doorway with intact open door and '0' is a boulder.
Prior to this fix, player would get "a boulder blocks the way" and
not move.  After, '@' will move northeast then northwest then west
to get into orthogonal position and finally south into the doorway.

Even though it definitely fixes both mentioned test cases, I won't
be surprised if this results in regressions for other situations.

Fixes #487
2021-04-04 17:23:46 -07:00
PatR
097e746bc3 data.base for role ranks and for discworld novels
Requesting a lookup of "arc ranks" or "wizard ranks" will show a
list of the rank titles and the experience levels that use them
for the specified role.  Looking up a specific rank title such
as "curator" works for many of them, but some such as "wizard"
already match existing entries and continue to do so.  There is
just a bare list of the titles with the levels they apply to, no
attempt at flavor text.

Also, add a lookup key for "novel" and "paperback book" which
have been yielding the "no match" result.  It lists all 41 of
the Discworld titles.  Again, just a bare list, no added flavor.

These all look ok on tty, curses, Qt (which watches for any line
containing four consecutive spaces while collecting the text to
be displayed and switches to fixed-width font if it is sees that),
and X11 (which specifies fixed-width font for popup text windows
in default NetHack.ad file).  It might not look good on Windows
GUI if that is using a proportional font.
2021-04-03 19:04:16 -07:00