Commit Graph
100 Commits
Author SHA1 Message Date
PatR 32b69f5c33 avoid #wizrumorcheck crash on bad rumor input
If either rumors.tru or rumors.fal was empty when makedefs made
'rumors', init_rumors() will set true_rumor_size to -1 to indicate
that rumors aren't available.  It also closes the input file, and
then #wizrumorcheck closed that again, triggering a crash in the
dlb code.

Fortune cookies and oracles work ok (just not very interesting)
when rumors aren't available.  Only the check command had trouble
with that.
2020-03-05 13:55:45 -08:00
PatR 60bc28154a fix github issue #302 - divide by 0 crash
The traceback points directly to the problem:  divide by 0 happens
if the 'bogusmon' file only contains the "do not edit" line, which
would happen if 'bogusmon.txt' is empty.  makedefs probably ought to
complain about that.

There is now one hardcoded bogus monster to fall back to:  'bogon'.

Random tombstone epitaphs report divide by 0 if their text source is
empty, but it is done by rn2() rather than rn2_for_display_rng() so
is just a warning for pre-release code.  It would crash for release
version though.

I tried placing an empty engravings file and expected similar results
but didn't see any response.  Not sure what that means.

After the fix, empty epitaph file yields blank result so graves that
want a random epitaph won't have any epitaph.

Fixes #302
2020-03-04 15:57:33 -05:00
PatR 7220c9d2d2 more #302 - empty {bogusmon,engrave,epitaph}.txt
Have makedefs add a real data line to the output for the files that
caused trouble when empty.
2020-03-04 15:45:10 -05:00
PatR 12c2f84f64 corpse_xname() fix
Potential write out of bounds, in front of the block of obufs.
Not exploitable but could conceivably trigger a crash.
2020-03-04 01:58:22 -08:00
PatR cb18f60331 match_str2clr() fix
Integrity fix.  Make sure color values obtained via atoi() are sane
so that use as array indices can't go out of bounds.
2020-03-03 16:46:04 -08:00
PatR 452962aa72 reglyph_darkroom map traversal 2020-03-02 16:33:43 -08:00
PatR 4b78763d70 Mister Fantastic's sea monster form
While polymorphed and underwater, an eel bite killed the hero who
rehumaized and crawled out of the water, then the eel continued with
its second attack and "wrapped itself around you" even though no
longer adjacent.  That's a long reach....

| ...@.
| .;}..
| .}}..

Make any additional attacks silently miss if hero changes location
during the attack sequence of a monster who has pinpointed the hero.
2020-03-02 15:58:42 -08:00
PatR 661570f7a9 conditional status condition tracking
If 'sinking-into-lava' is disabled as a displayed status condition
but general 'trapped' is enabled, then display 'trapped' when in lava.
Similarly, if 'grabbed-by-eel' is disabled but more general 'held' is
enabled, display 'held' when grabbed.
2020-03-02 15:16:50 -08:00
PatR 991dbc5b8f panictrace_libc
Try to make the tracebacks generated via PANICTRACE's libc method
be more readable.  There tends to be a lot of blank space in the
middle of lines, depending on the length of the program's or
libraries' file names, which can make lines wrap and the whole
thing sometimes be harder to make out.  Narrow it by squeezing out
some spaces from each line before writing to reduce the chance of
line wrapping.  That isn't guaranteed to make things ledgible but
seems to help quite a bit.  Also, force the line number inserted
by nethack to be two digits so when spanning from line 9 to line 10
it doesn't cause the field positions to shift by a column.  (Using
'#panic' doesn't have enough stack frames to illustrate that.)

I think the original libc formatting was designed for the address
column to hold a 32-bit value ('0x' prefix and 8 hex digits), and
eventually extending that to handle 64 bits ('0x' prefix and 16 hex
digits) made things wider than intended.  But the gradual increase
in the length of function names we use is also a factor.
2020-03-02 15:05:06 -08:00
PatR ffcd471ef7 fix github issue #309 - random role segfault
Role selection is insanely complex.  I had to use a debugger to force
the relevant routine to be executed.

The analysis was correct:  it could use rn2(14) to pick a role (valid
values 0 through 12) and randomly getting 13 would lead to a crash.

The terminating element of roles[] passes all the ok_role(), ok_race(),
etc tests.  Explicitly exclude that element when collecting the roles
to choose from.
2020-03-01 14:36:28 -08:00
PatR 99035e72ee throw-and-return vs !fixinv
Implement the request that a wielded+thrown aklys be given the same
inventory letter when it returns and is caught and rewielded, even for
the !fixinv setting where inventory letters don't stick.  Works for
Valkyrie-thrown Mjollnir and returning (ie, didn't hit) boomerangs as
well as for aklys.

I'm not sure how useful this really is, because on the rare occasions
that it either doesn't return or fails to be caught, it won't be given
the same letter when subsequently picked up.  So the player who relies
on it will still be vulnerable to using the wrong letter next time a
throw is attempted.  But at least picking it up explicitly displays
the new inventory letter, unlike catching it upon return.
2020-03-01 06:46:37 -08:00
PatR 95385cfc40 hard quit vs botl
For
 Really quit? [yn] y
 Dump core? [ynq] q
skip the final status update.  Noticeable when debugging and some
status breakpoints are set.
2020-02-29 16:44:48 -08:00
PatR ae27942cd6 haste timeout, vomit countdown feedback
Change a couple of messages.  When speed/haste-self times out:
"you feel yourself slowing down" -> "you feel yourself slow down"
because the former was too close to the turn-to-stone countdown and
the loss of speed is immediate rather than gradual.

The vomiting countdown causes confusion and stun; vary the messages
for those if already confused or stunned:
"you feel slightly confused" -> "you feel slightly more confused";
"you can't seem to think straight" -> "you can't think straight".
2020-02-28 13:30:59 -08:00
PatR ab66475f21 X11/winstat.c formatting
Separate out the reformatting from other changes I'm working on
for X11 "fancy status".  Splits a few wide lines but mostly just
switches to the X11 idiom of combining
 XSetArg(arglist[argcount], ...);
 argcount++;
onto one line:
 XSetArg(arglist[argcount], ...); argcount++;
2020-02-27 11:51:10 -08:00
PatR be50da07d9 botl update for trapped/untrapped
Make set_utrap() set context.botl when changing between untrapped and
trapped or vice versa.
2020-02-27 02:26:57 -08:00
PatR bc0112bef7 showscore typo 2020-02-26 12:28:33 -08:00
PatR cff63b5b4c fix curses' create_nhmenu() warning
The extra flags argument to create_nhmenu() wasn't propagated to
anywhere useful.  It still doesn't do anything yet.
2020-02-25 16:18:58 -08:00
PatR 19df82971d fix nhlsel.c warning
A recent change has resulted in complaints about 'sel' not being
used in
  struct selectionvar *sel = l_selection_check(L, 1);
  struct selectionvar *ret;
  int p = (int) luaL_checkinteger(L, 2);

  lua_pop(L, 1);
  (void) l_selection_clone(L);
  ret = l_selection_check(L, 1);
  selection_filter_percent(ret, p);

This preserves the semantics of that code while getting rid of the
warning, but I have no idea whether it makes any sense.
2020-02-25 16:04:41 -08:00
PatR 04d15b099b level flip comment bit 2020-02-24 17:29:32 -08:00
PatR 194b174bbc flipping current level with #wizlevelflip
Give wizard mode player control over how a level gets transposed by
prompting for the desired outcome.

Refreshing the screen showed that remembered, no longer in view wall
corners and T walls were shown with their old orientation instead of
being transposed along with the level.  This fixes that, but does so
by adding a chunk of code that will be irrelevant for normal play.
2020-02-24 17:07:01 -08:00
PatR cbdda9dc9d adopt github pull request #286 - rndmonst()
Eliminate the cache that was supporting rndmonst() and pick a random
monster in a single pass through mons[] via "weighted reservoir
sampling", a term I'm not familiar with.

It had a couple of bugs:  if the first monster examined happened to
be given a weighting of 0, rn2() would divide by 0.  I didn't try
to figure out how to trigger that.  But the second one was easy to
trigger:  if all eligible monsters were extinct or genocided, it
would issue a warning even though the situation isn't impossible.

Aside from fixing those, the rest is mostly as-is.  I included a bit
of formatting in decl.c, moved some declarations to not require C99,
and changed a couple of macros to not hide and duplicate a call to
level_difficulty().

Fixes #286
2020-02-22 17:40:55 -08:00
PatR 5d4b9784ac more #302 - empty {bogusmon,engrave,epitaph}.txt
Have makedefs add a real data line to the output for the files that
caused trouble when empty.
2020-02-22 12:32:00 -08:00
PatR 29321c6f80 fix github issue #302 - divide by 0 crash
The traceback points directly to the problem:  divide by 0 happens
if the 'bogusmon' file only contains the "do not edit" line, which
would happen if 'bogusmon.txt' is empty.  makedefs probably ought to
complain about that.

There is now one hardcoded bogus monster to fall back to:  'bogon'.

Random tombstone epitaphs report divide by 0 if their text source is
empty, but it is done by rn2() rather than rn2_for_display_rng() so
is just a warning for pre-release code.  It would crash for release
version though.

I tried placing an empty engravings file and expected similar results
but didn't see any response.  Not sure what that means.

After the fix, empty epitaph file yields blank result so graves that
want a random epitaph won't have any epitaph.

Fixes #302
2020-02-22 01:41:04 -08:00
PatR 9366307210 extra ^X info (mon's location) for u.ustuck 2020-02-21 13:46:03 -08:00
PatR 12016966b1 build warning 2020-02-21 13:45:17 -08:00
PatR d9672823f9 better ^X feedback when swallowed/engulfed 2020-02-20 14:34:58 -08:00
PatR cfd425d5db Wounded_legs condition
Mounting a steed while legs are wounded would offer to cure them
but wasn't going through the heal_legs() routine so didn't update
the status line when Wounded_legs condition is enabled.

Move some common code for describing left/right/both legs into a
new routine used for feedback by jumping, kicking, and ridiing.

For ^X, distinguish between one wounded leg and both but don't
bother with left vs right when it is just one.
2020-02-19 15:47:55 -08:00
PatR 8659dcd7bc monster sound changes
MS_MOO was placed among the humanoid sounds, resulting in a minotaur
being able to articulate "I'm hungry".  Move it to the animal sounds,
which causes almost all the sounds to be renumbered.

Give MS_MOO to rothes.

Change mumak from MS_ROAR to new sound MS_TRUMPET and mastodon from
silent to that.

I changed MS_ORC from a synonym for MS_GRUNT into a distinct type
which also just grunts.  Grunt is in the animal group of sounds and
orc is now in the 'other' group (neither animal nor understandable
humanoid).  [There are a bunch of other humanoid monsters (gnomes and
ogres, for example) that still use MS_GRUNT.  They aren't animals so
that's not right.]

Have pets who beg for food but happen to have 'other' sounds between
animal and humanoid be described as looking hungry instead of being
skipped.

Hat tipped to a peaceful humanoid will behave as non-peaceful if
Conflict is active (without giving the monster a resistance check).

Despite mons[].msound getting new values, save files should be ok.
2020-02-18 13:33:00 -08:00
PatR 814adb41b8 fix #K376 - tipping cap
Allow #tip to do something if you pick your worn helmet instead of
a container.  It's mostly just a variation of #chat but probably adds
several new bugs....
2020-02-18 03:14:22 -08:00
PatR 3981e3e6e5 controlling u.ustuck
Setting or clearing u.ustuck now requires that context.botl be set,
so make a new routine to take care of both instead of manipulating
that pointer directly.
2020-02-16 13:04:12 -08:00
PatR 63c3ec21b8 yet more Guidebook tweaks
A couple of indentation adjustments:  a bit more space for continued
lines in the table for suits of armor, and restore the indentation of
the list of Achievements in the Postscript version (lost when dealing
with the wouldn't-span-page-boundary issue).
2020-02-15 17:44:41 -08:00
PatR 2d150d323b new status conditions
Several conditions result in stale data on the status line when
starting or stopping because things which didn't used to affect it
haven't been setting context.botl to force an update.  This wasn't
systematic; there are bound to be lots more.
2020-02-15 15:41:24 -08:00
PatR c78a69bc44 Guidebook.dat typo
A typo in Gbk-1pg-sfx.mn resulted in " /" as a "last word" on the
end-of-data marker line of the intermediate 12345 line single page.
That was effectively invisible because it immediately got deleted
during the post-processing which strips off that marker through to
the end (producing a 5266 line single page at present).
2020-02-15 14:42:00 -08:00
PatR c21921668a fix github issue #293 - raven vs raven
The saying /corvus oculum corvi non eruit/ (Latin) means "a crow
doesn't pluck out the eye of another crow" (roughly).  Something
along the lines of "like-minded people stick together".  Honor the
literal meaning by preventing a raven's blinding attack that gets
directed at another raven from being able to cause blindness.

Fixes #293
2020-02-15 13:55:51 -08:00
PatR 998d8b1fd4 more Guidebook tweaks
Add a missing word to Guidebook.tex and add a couple of new sentences
to both Guidebook.{mn,tex}.

Also, add Guidebook.dat to .gitignore.
2020-02-15 13:08:34 -08:00
PatR 5c2c517c35 Guidebook.tex catch up 2020-02-15 05:45:27 -08:00
PatR 4bd3fdbd57 Achievements documentation
> Todo:  redo the recently revised Achievements table again.  Current
> formatting isn't spanning page boundaries, resulting in a big chunk
> of blank space preceding it so that it will start on the next page.

The '.SD i' environment was causing this, and also changing the font
somehow when forcing the text to start on the next page (but not when
it fit on current page?).  Taking '.SD i' out loses the indentation
that Guidebook.ps had (one of the explicit differences between it and
Guidebook.txt), which looks a little inferior, but fixes the page
boundary issue.
2020-02-15 05:19:23 -08:00
PatR 91b569e6c4 Guidebook.dat, one-page edition of Guidebook.txt
Update sys/unix/Makefile.doc to be able to build Guidebook.dat, an
unpaginated copy of the plain text Guidebook.  It's generated from
the 'roff source rather than by attempting to post-process the
regular text Guidebook.

No doubt there are easier ways to do this.
2020-02-14 18:15:25 -08:00
PatR eb919d3cdb fix #K355 - grammar issues with monster+container
Mon rummages in <container> and Mon takes <item> from <container>
was missing an() for the container itself and should have been
using doname() rather than xname() for any items taken out (when
done adjacent to hero).
2020-02-14 16:24:49 -08:00
PatR 629e417bba Guidebook update
This adds a new figure that shows the 3-line status.  Also expands
a couple of status items.

In the commands section, redo the hjkl direction diagram to make
"Figure 2" (now Figure 3) line up with the rest of the table.  Lot's
of trial and error involved, and the plain text version didn't come
out as expected (but still looks better than before).

Modify suit of armor table to wrap an additional line and make the
table narrower.  Having the pair of columns closer together is a bit
easier on eyes when tracking from the suit names to the AC number.

Todo:  redo the recently revised Achievements table again.  Current
formatting isn't spanning page boundaries, resulting in a big chunk
of blank space preceding it so that it will start on the next page.
(Only noticeable at the moment with the Postscript output; plain
text had enough room on its current page to not need to force next.)

Guidebook.tex is lagging again.
2020-02-14 15:28:28 -08:00
PatR cbe27c7702 unseen pet drowning
The "you have a sad feeling for a moment" message was only given when
one monster kills another (and the latter is an unseen pet).  Give it
for drowning too.  There are probably a bunch of other circumstances
which warrant it as well but I've settled for handling minliquid().
2020-02-13 15:38:59 -08:00
PatR 75e9055b89 plug a couple of memory leaks in sp_lev.c, take II
[...]
| Change selection_free(foo) to also free(foo) after freeing foo's
| fields.  Every use was already
|   selection_free(foo);
|   free(foo);
| except for the two instances of memory leak.

And except for the three which aren't in sp_lev.c, one of which was
dealing with memory managed by Lua.  This time it seems to be working
as intended.
2020-02-12 18:56:41 -08:00
PatR 914c78546f Guidebook spelling mistake 2020-02-12 16:22:33 -08:00
PatR 804499d9be add some new, easier achievements
Introduce eight achievements that can be attained by more players.
 Entered Gnomish Mines  - self explanatory
 Entered Mine Town      - the town portion, not just the level
 Entered a shop         - any tended shop on any level
 Entered a temple       - likewise for temple
 Consulted the Oracle   - bought at least one major or minor oracle
 Read a Discworld Novel - read at least one passage
 Entered Sokoban        - like mines
 Entered the Big Room   - not always possible since not always present

The novel and bigroom ones aren't always achieveable since novels are
only guaranteed if a book or scroll shop gets created and bigroom is
only guaranteed in wizard mode.  No one ever claimed that every
possible achievement can be attained in a single game.  (If one for
entering the Fort Ludios level--or perhaps entering the Fort itself--
eventually gets add, that won't be possible in every game either.)

The mine town one probably needs some tweaking.  Two of the town's
seven variants have no town boundary (despite a rectangular area of
pre-defined map) and at present simply arriving on either of those
levels is enough to be credited with the entered-town achievement.

Bump EDITLEVEL because u.uachieved[] has increased in size.  This
time it has been expanded to the maximum that xlogfile's bitmask of
achievements can handle, enough for up to 9 more achievements without
another EDITLEVEL increment.
2020-02-12 14:35:37 -08:00
PatR 1ec6e6f96b Guidebook.mn streamlining
Set up variable 'fF' once and use it to conditionalize between
fixed-width font Guidebook.txt and proportional-width font
Guidebook.ps instead of making the width comparison of 'f' and 'F'
each time.  There are four instances where it is used; three that
suppress some indentation for the plain text output and one that
manually wraps a couple of long lines for it.

This change shouldn't produce different output from before (last
night) and doesn't need any corresponding change in Guidebook.tex.
2020-02-12 11:43:25 -08:00
PatR bfe23d0c8c Guidebook update: Achievements
Redo the Achievements section in Guidebook.mn to be more compact.
It's also become more complicated because it formats Guidebook.txt
differently from Guidebook.ps/.pdf.

Finally add the Achievements section to Guidebook.tex to catch up.
Not as complicated but also not tested.
2020-02-12 02:35:35 -08:00
PatR 7da5a8b8e3 Guidebook update: armor and other objects
Condense the clunky one entry per line table of suits of armor and
their AC values in Guidebook.mn.  Guidebook.tex uses a two-column table
that I've left alone.

Mention all the other types of armor instead of leaving out gloves and
shirts.  For armor commands, mention that P and R work.

Rings:  describe their interaction with gloves.  For ring commands,
include a pointer to amulets.

Amulets:  for amulet commands, mention that A, W, and T work.

Tools:  mention that some can be worn and include a pointer to amulets
for the relevant commands.  Also, that some can be wielded as weapons.

Boulders and statues:  boulders can be pushed and smashed, statues can
be smashed.

Gold:  not subject to blessing or cursing.  goldX option affects BUCX
filtering.
2020-02-11 17:21:39 -08:00
PatR 9a8bea550f Revert "plug a couple of memory leaks in sp_lev.c"
This reverts commit 1b7ac93930.

I just got a crash from within Lua when loading mine town and it
appears to be memory related, so back out the "plug leaks" commit
for the time being.
2020-02-10 15:44:16 -08:00
PatR 1b7ac93930 plug a couple of memory leaks in sp_lev.c
selection_floodfill() would free the contents of its temporary
selection structure when the check function was Null but neglected
to free the allocated structure itself.  I don't know whether that
was ever triggered.

generate_way_out_method() did likewise when trying to make a hole
or trapdoor.  It reused the 'ov3' pointer without freeing it first.
'heaputil' reported instances of non-freed memory that were
allocated at line 3612 by selection_clone(), only called within
generate_way_out_method().

Change selection_free(foo) to also free(foo) after freeing foo's
fields.  Every use was already
  selection_free(foo);
  free(foo);
except for the two instances of memory leak.
2020-02-10 14:23:47 -08:00
PatR bade2f19b2 simplify Achievements display
The you-acquired-the-Amulet achievement uses alternate wording when
you were carrying it but just gave it up via #offer to ascend.  That
wording looks much better when displayed right before "You ascended!",
without entered-endgame and entered-astral (and maybe always-blind or
never-wore-armor) achievements in between.  That was and still is done
by taking it away.  Adding it back in the desired spot is simpler than
leaving it out while tracking whether it was removed.

Effectively, ACH_UWIN (ascension) is forced to be very last--where it
will always be anyway, but at one point the blind and nudist ones came
after it--and ACH_AMUL (you obtained the Amulet) is sorted to right
before that.  For non-ascending games, the Amulet achievement is left
in the position where it was attained.
2020-02-10 11:21:44 -08:00
PatR d462bdffca redo achievement tracking
Instead of an assortment of bits, assign numeric indices to the
potential achievements and keep an array of those in the order they
were attained.  So disclosure might show the same subset occurring
differently in different games depending on the player's actions.
The encoded field in xlogfile doesn't care about that and remains
the same.

Modifies 'struct u', so EDITLEVEL has been incremented and existing
save files are invalidated.
2020-02-10 00:17:54 -08:00
PatR 89c1b09d70 Achievements doc bit
Confusion on my part.  "Entered Gehennom" achievement is recorded if
you enter the Valley of the Dead rather than requiring that you get
past that level.

Guidebook.tex is still lagging but not forgotten.
2020-02-09 16:56:23 -08:00
PatR e09bfeb8af remove another unused variable 2020-02-09 12:28:19 -08:00
PatR e198150ad8 more level teleport feedback
Level teleporting to current level doesn't give any feedback but
is usually done intentionally to abort the level teleport.  Being
on the bottom level of branch and attempting to teleport even lower
failed silently like choosing the current level.  Have it give some
feedback about not being able to go any lower.
2020-02-08 17:15:18 -08:00
PatR 916366fbd1 new data.base quote: win/winner/winning
A quote about "winning team" doesn't fit nethack very well but this
is too good to pass up.  I considered adding "/Rule Six/" as a false
rumor, but the rumors don't offer any way to specify attribution.

Also, give full attribution for another Douglas Adams quote that's
used for a random ungraving.
2020-02-08 16:05:29 -08:00
PatR f3338e6e30 remove unused variable 2020-02-08 09:59:08 -08:00
PatR 84daf75981 'travel' option
Change '!travel' to only prevent travel-by-mouse and leave '_' alone.
2020-02-07 14:37:51 -08:00
PatR b4d8475b95 populate insight.c
Move enlightenment and conduct from cmd.c to insight.c.  Also move
vanquished monsters plus genocided and/or extinct monsters from end.c
to there.  And move the one-line stethoscope/probing feedback for
self and for monsters from priest.c to there.

Achievement feedback has been overhauled a bit.  When no achievements
have been recorded, the header for them (after conducts) won't be
shown, and when at least one has been recorded, make the prompt for
asking whether to disclose conduct be about disclosing conduct and
achievements.  Also, describe achievements in the Guidebook.

I ran out of gas before updating Guidebook.tex; it will catch up to
Guidebook.mn eventually.

Some of the MS-DOS Makefiles haven't been updated yet so linking
without insight.{o,obj} will break there.
2020-02-06 17:42:15 -08:00
PatR 00ce339c15 muse looting
Give better feedback than "<Monster> rummages through something"
when hero sees a monster looting a container.

Have monster take out up to 4 items at a time instead of always 1.
(Hero can take out an arbitrary number in one move.)

When deciding what to try to take out, 'count' (now 'nitems') was
initialized to 1 instead of 0, giving the monster a 1 out of N+1
chance of not trying to take anything out.  It wasn't clear whether
that was intentional (there's already a chance for not taking things
out when deciding whether to use the container).  I kept that result
in and made it more explicit now.

When deciding whether the chosen item could be moved from container
to monster's inventory, the can_carry(item) check was counting the
weight of the item twice, once explicitly when considering adding it
to minvent but also implicitly as part of the carried container's
weight already in minvent.
2020-02-02 15:22:42 -08:00
PatR 2ebbe61f53 fix github issue #285 - spellcasting monster
After casting a spell, a monster got a chance to make a regular attack
despite the apparent attempt to set up a return value indicating that
it wouldn't move.

When looking over the return value situation, I noticed 'wormhitu()'
for the first time.  It gives worms additional attacks when the hero
is adjacent to some of the tail, that only works if the head is within
reach of a melee attack.  The hidden tail segment at head's location
always met that criterium so gave an extra attack that didn't make
sense; change wormhitu() to skip that segment.

Do some formatting in mcastu.c; no change in actual code there.

Fixes #285
2020-02-02 00:55:26 -08:00
PatR 7bc799f06b insert omitted 'static' for two sp_lev.c variables 2020-02-01 18:27:36 -08:00
PatR 158ea1a23f failing level change messsage confusion
While testing the changes to dungeon and special level handling, I got
|A mysterious force prevents you from descending!
|You materialize on a different level!
The mystery force is handled by goto_level() so level_tele() doesn't
know that the failure is going to happen when it sets up the message
for deferred delivery.  Suppress the message if you don't change levels.
2020-02-01 17:53:07 -08:00
PatR 5d6b3b6f51 get_table_str use
Some cleanup when chasing a memory leak.  get_table_str() and
get_table_str_opt() return a value from dupstr() and it wasn't always
being freed.  I'm not sure that I found the problem--maybe it involved
pointers turned over to Lua garbage collection--but did find a couple
of suspicious things in dungeon setup.
2020-02-01 17:33:50 -08:00
PatR 32f0520fe0 sp_lev.c private variables
Make a start at reducing the size of 'g' by removing some special
level stuff that doesn't need to be there.
2020-02-01 15:44:42 -08:00
PatR 10b8356a15 splitting cmd.c, phase 1B
I neglected to use -f with 'git add' and the stub file didn't make
it into the previous commit.
2020-02-01 09:14:18 -08:00
PatR 70611afc48 splitting cmd.c, phase I
Preparation for moving enlightenment and conduct into new source
file insight.c.  Right now it's a stub that shouldn't break anything
whether included or omitted.  Once makefiles and project files have
been updated to compile and link it, the actual code will be moved.

unix/Makefile.src has been updated;
vms/Makefile.src and vmsbuild.com have been updated but not tested.
2020-02-01 08:59:19 -08:00
PatR c03ed894de loadlua() simplification
nhl_loadlua() went from too simple to too complicated, now somewhere
in between.  Still doesn't assume that an entire file can be scooped
up with a single fread(), but no longer mucks about with the contents
of the file in order to insert a comment containing the file's name.
In order to have useful filename feedback in Lua error messages, just
use a different liblua routine to feed the file's contents to it.
2020-01-31 13:36:22 -08:00
PatR 625a9a7b79 fix 'Couldn't place lregion type 1' on Orc town
Stairs up from Orcish Town variation of Mine Town were being forced
to be near the bottom of the left side of the level due to a bogus
exclusion region in the level description.  If that small area was all
solid rock then a warning was issued and no stairs up were created.
2020-01-31 12:58:24 -08:00
PatR fe664435dc royal jelly
Applying royal jelly listed all of inventory as likely candidates for
  what to rub it on, including itself.
Applying it to anything took no time.
After the "you smear royal jelly on <foo>" message,
  unsuccessfully applying it to non-eggs gave no other feedback;
  successfully applying it to eggs gave no additional feedback.

Allow #rub to use royal jelly too.

Also, require hands to apply or #rub anything.

Not done:  fumbling and/or slippery fingers should have a chance to
  drop the jelly or to drop whatever gets rubbed with it.
2020-01-31 05:10:00 -08:00
PatR fb05f30167 update EDITLEVEL for achievement tracking 2020-01-30 18:28:55 -08:00
PatR 6c479f2317 more simplification of achievement tracking
Instead of hardcoding the "prize" type and then watching for that
to be created, specify it in the level description.

Also, instead of giving both Sokoban end levels 50:50 chance for
either prize, bias the one that used to always have the bag of
holding to now have 75% chance for that and 25% chance for amulet
of reflection, with the other one having those chances reversed.
So still 50:50 overall.
2020-01-30 17:35:32 -08:00
PatR be12ed6859 reformatting for sp_lev.c
Also change a bunch of automatic arrays with initializers to static
so that they won't be reinitialized every time their block is entered.

get_table_buc() is changed to support bless/curse specifiers for
"not-cursed", "not-uncursed", and "not-blessed" but they aren't used
yet.
2020-01-30 16:48:55 -08:00
PatR 162163c325 reformatting for nhlua.c 2020-01-30 15:44:55 -08:00
PatR 5dd6879efe Guidebook bits
"The 'm' prefix before a movement command can be used" is awkwardly
worded.

"Various ... variations" is redundant all by itself but doubly so
when "various" is used again two sentences later.

mention_decor is missing a sentence between "Normally only shown
when obscured" and then an exception when it is enabled.
2020-01-29 17:10:38 -08:00
PatR a219eed6eb 'make depend' for unix/Makefile.src
Add the new header file to HACKINCL which only matters to HSOURCES
which only matters for the 'tags' target.

'make depend' reordered some stuff that could have stayed as-is but
also found a missing dependency for nhlobj.{c,o}.
2020-01-29 12:16:24 -08:00
PatR 1641c864a2 wands vs no-hands
Hero shouldn't be able to zap wands when polymorphed into a form which
lacks hands.

The other tweaks to dozap() shouldn't produce any change in behavior.
2020-01-29 10:35:02 -08:00
PatR ea8248e3c6 new 'mention_decor' option
Somewhat similar to 'mention_walls', 'mention_decor' is a way to
request additional feedback when moving around the map.  It reports
furniture or unusual terrain when you step on that.  Normally stepping
on furniture only mentions it when it is covered by object(s).  And
moving onto (rather than into) water or lava or ice doesn't bother
saying anything at all.  With the new option set there will be a
message.  It uses Norep so won't repeat when moving from one water
spot to another or one lava spot to another or one ice spot to another
unless there has been at least one intervening message.  There is also
a one-shot message when moving from water or lava or ice onto ordinary
terrain (not Norep, just once since there's no land to land message).

Having the verbose flag Off doesn't inhibit these new messages but it
does shorten them: "A fountain." instead of "There is a fountain here."

The Guidebook gets a new subsection "Movement feedback" of the "Rooms
and corridors" section and it covers more than just 'mention_decor'.
As usual, Guidebook.tex is untested.

'mention_decor' persists across save/restore, so 'struct flags' has
changed and EDITLEVEL is being bumped, hence save files are invalided.
2020-01-29 09:47:36 -08:00
PatR 4e59f0ead9 level teleport "you materialize" mesg sequencing
If level teleport took you somewhere special, things like shop entry
or quest summons or valley atmosphere messages were being given first,
then "you materialize on a different level" after.  schedule_goto()
takes before-change-message and after-change-message arguments; it
ought to be extended to have a mid-change-message one too but I didn't
think of that until just now.
2020-01-28 15:28:31 -08:00
PatR c9166bc00c black and white ice
Like lava when that looks the same as water with color Off, render ice
in inverse video if it looks the same as the floor of a room.  (I tried
bold first but the result didn't look very good.)

Done for tty and curses; others may want to follow suit.
2020-01-28 15:01:41 -08:00
PatR 2f0676c1b8 beauty no longer in eye of the beholder
There was a complaint that despite charisma of 13 being above average,
the character was described as "ugly".  The cut-off was actually >14
for "beautiful" or "handsome" vs <=14 for "ugly".  This adds several
more grades of appearance.
2020-01-28 12:49:38 -08:00
PatR 5146827307 Another VMS tweak
One of the new paragraphs inadvertently duplicated an existing one.
2020-01-27 12:14:19 -08:00
PatR 858bd2f376 Readme tweaks
Replace a few tabs, remove a few trailing spaces, and shorten a few
long lines.

Readme still needs another fix:  if falsely claims to contain all bug
fixes since 3.6.4.  I wasn't sure how to reword that so didn't try.

Also, fix a couple of old typos in Install.vms.
2020-01-27 11:53:18 -08:00
PatR eb61690f34 Install.vms update 2020-01-27 02:20:47 -08:00
PatR c911446188 more wizard mode wishing for terrain
Try a lot harder to keep terrain/level flags in a sane state.  They're
overloaded so it's not simple.

Creating a fountain or sink incremented the corresponding counter (for
controlling ambient sounds) but removing one by wishing for something
else in its place didn't decrement.

Allow wish for "disturbed grave" to create a grave with the 'disturbed'
flag set, similar to existing "magic fountain" and 'blessedftn' flag.
(I didn't add "looted throne", "looted tree", and several other things
that use the 'looted' overload of 'rm.flags'.)

Automate block_point (tree, cloud, secret corridor, or secret door in
open doorway) and add unblock_point (use Pass_wall to move into wall
or tree or stone, or just walk onto a cloud, then make iron bars or
almost any other wishable terrain to replace the blocking feature).
2020-01-26 12:23:50 -08:00
PatR 4505a8dc4c left out of "limit rate of long worm growth" 2020-01-26 05:12:55 -08:00
PatR 9b2c9e79d8 limit rate of long worm growth
Make long worms grow more slowly (although that didn't seem to make
as much a difference as expected) and limit the amount of HP they
acculate if they shrink and then re-expand.  Shrinking doesn't take
away max HP but growing used to always add to max.  Now it won't add
to max HP unless the number of segments is at that worm's peak, so
shrinking will inhibit the exhorbitant HP expansion that idle worms
have had.
2020-01-26 04:57:13 -08:00
PatR 206e9668f1 achievement tracking oversight
obj->record_achieve_special (overlay of obj->corpsenm) is no longer
used.
2020-01-26 02:58:18 -08:00
PatR b0b25db4f0 worm.c cleanup
Mostly removing 'register', but also clear stale wgrowtime[] values
at the time they become obsolete instead of waiting for initworm()
to replace them when eventually re-used.
2020-01-25 14:12:10 -08:00
PatR 2b5dc80278 unix 'make clean' update
Remove dat/gitinfo.txt which has been getting overlooked.
Hardly urgent, but useful if this is the last 3.5.x release.
2020-01-25 12:08:28 -08:00
PatR a453215a06 disclose achievements
When disclosing conduct at end of game (but not during except in
wizard mode), display achievements too.  They're also included in
dumplog if it's enabled.  Previously they were only output as an
extra field in xlogfile.
2020-01-24 17:00:49 -08:00
PatR 0166239a22 simplify achievement tracking for special objects
This turned out to be a lot more work than I anticipated, but it is
definitely simpler (other than having #wizmakemap take achievements
away if you replace the level that contains the 'prize', which wasn't
handled before).

I cheated and made Mine's End into a no-bones level because the new
flagging scheme for luckstone, bag, and amulet can't carry over from
one game to another.  It probably should have been no-bones all along.
Sokoban didn't have this issue because it's already no-bones.

Existing save files are invalidated.
2020-01-24 13:54:23 -08:00
PatR dba6c20e2d loading Lua scripts
When loading a Lua script, modify it with a comment containing the
file name (or DLB module name) so that error reporting doesn't just
show the first 60 bytes of the script.  Also, don't assume that it's
possible to load an entire script in one fread().  Unfortunately
that got way out of hand and the result isn't pretty.  But something
of the sort is necessary.  (Reading the script into one string first
and then applying modifications while copying it into a second one
would probably be a lot cleaner than mixing the two operations.)

If a script starts with a comment or a blank line, the insertion of
the file name comment won't disturb the line number reported in an
error message.  But if the script starts out with code on its first
line, error reports will be off by one for the line number.  Showing
the file name is more useful than keeping that number accurate.
2020-01-24 13:26:01 -08:00
PatR b2fa6292db Lua error reporting buffer overflow
nhl_error() was clobbering the stack.  I assume that the 'source'
field in the Lua debugging structure is normally a file name, but
nethack loads an entire Lua script into one long string because it
usually comes out of the DLB container, and 'source' contained the
full string.  That would overflow the local buffer in nhl_error()
if nethack encountered a Lua problem and tried to report it. (In
my case, the problem was in a level description file modification.)

[Not something under user control unless user can modify dat/*.lua
and put the result into $HACKDIR/nhdat.]
2020-01-24 12:52:35 -08:00
PatR 424750867a wizard mode un-polymorph
When already polymorphed, polymorphing into 'human' (or character's
species) to revert to normal when at low level has the infuriating
tendency to yield "your new form isn't healthy enough to survive".
Allow specifying your own role as a way to rehumanize() instead of
going through newman() and level/sex/characteristics randomization
which that performs.
2020-01-21 18:29:23 -08:00
PatR 3e18804371 half poison gas damage from wearing a wet towel
Make wearing a wet towel confer new attribute Half_gas_damage in
addition to the usual blindness.  It reduces damage from being inside
a gas cloud region and from being hit by poison gas breath attack.
It also fully blocks breathing of potion vapors.

Might make the Plane of Fire easier although overcoming its blindness
with telepathy won't reveal elementals.  Definitely has the potential
to make blind-from-birth conduct easier which wasn't the intent and
probably isn't significant.
2020-01-21 17:03:54 -08:00
PatR a13d6c03c9 no more headless eyewear
Noticed while working on something else:  hero kept wearing a towel
after polymorphing into a form without any head.  And when not already
wearing one, could put on a blindfold/towel/lenses while in a headless
form.
2020-01-21 15:36:33 -08:00
PatR fa890fc7a2 wielded tin opener
For simplified weapon description (used by ^X and a few other places),
show "tin opener" instead of generic "tool" for that item since there
are cases where it is expected to be wielded.

Also, don't describe a wielded "glob of <foo>" as "food".
2020-01-21 15:11:59 -08:00
PatR 08775c2c78 add some long worm comments
and keep the remove_monster()+place_monster() followed by worm_move()
operations together.  No change in behavior.
2020-01-21 06:20:45 -08:00
PatR f3def5c0b9 command line triggered buffer overruns
Prevent extremely long command line arguments from overflowing local
buffers in raw_printf or config_error_add.  The increased buffer
sizes they recently got to deal with long configuration file values
aren't sufficient to handle command line induced overflows.

choose_windows(core): copy and truncate the window_type argument in
case it gets passed to config_error_add().

process_options(unix): report bad values with "%.60s" so that vsprintf
will implicitly truncate when formatted by raw_printf().
2020-01-20 16:08:59 -05:00
PatR 3f0b9f26c5 losing via #offer to Moloch
Recently added "you hear an invisible choir chant in Latin ..."  is
jarring.  Unfortunately, something like "in an archaic language" would
make the message too long so just take out "in Latin".

Also a few reformatting bits for pray.c.
2020-01-18 18:47:01 -08:00