Commit Graph

11993 Commits

Author SHA1 Message Date
Pasi Kallinen
20cbadcf85 Unlock your quest by killing your quest leader
Allow killing your quest leader, just to make games winnable if you
converted before doing the quest.
Boost the quest leaders and give them some equipment. King Arthur
gets Excalibur. Killing quest leader gives really bad luck and
makes your god angry at you, and killing quest guardians gives
smaller penalties.

This is based on both the EvilHack implementation by
k21971 <keith.simpson1971@gmail.com>, and xNetHack
implementation by copperwater <aosdict@gmail.com>.
2021-05-23 11:11:58 +03:00
copperwater
882efdcf58 Pets are more careful about attacking monsters at low health
Another SliceHack feature. However, the math implemented by SliceHack
seemed incorrect, so I tweaked it.

Pets previously attacked monsters of up to one level higher than them as
long as they were above 25% health. Now, they will attack monsters as
follows:
100%: up to level + 2 (pets could not attack this high before)
80%+: up to level + 1
60%+: up to same level
40%+: up to level - 1
25%+: up to level - 2

The case that prevents any attacks below 25% health still exists.
2021-05-22 16:44:58 +03:00
Pasi Kallinen
6b60618e0e Exploding spheres cause real explosions
Despite active explosion attacks being called explosions in-game,
they only affected a single target, and were handled differently
from actual explosions. Make them do an actual explosion instead.
This should make spheres more interesting and inspire different
tactics handling them.

Because spheres deal more damage on average and can destroy items
in their explosions, their difficulty has been increased slightly.

Polyselfed hero exploding won't cause elemental damage to their
own gear.

Originally from xNetHack by copperwater <aosdict@gmail.com>.
2021-05-22 13:37:39 +03:00
Pasi Kallinen
7f8cfb43d2 More hallu colors 2021-05-22 08:56:54 +03:00
Pasi Kallinen
29868036f1 Lua: nhcore script with function callbacks
Adds possible callbacks for "start_new_game", "restore_old_game",
"moveloop_turn", and "game_exit" which when defined, will be called
from core code at the appropriate time.

Adds lua hooks for dump_fmtstr (only if DUMPLOG), dnum_name, u.moves,
u.uhave_amulet, and u.depth.
2021-05-21 21:24:59 +03:00
PatR
0e9bf2e03c config error reporting
Try to handle the convoluted error handling better.  Not very
thoroughly tested...
2021-05-21 08:52:18 -07:00
PatR
164417f01f fix github issue #514 - 'O' segfault
The #version command retrieves the lua version number to include
in its output, but it was leaving the 'in_lua' flag set.  So if a
later 'O' command tried to complain about a bad option value, the
error reporting routine crashed.
2021-05-21 08:40:39 -07:00
PatR
d6cafdc527 fix github issue #515 - grappling hook internals
Grappling hook used to have an undiscovered description of "iron hook"
and when that was removed, the oc_name_known flag was left set as if
for something that could become discovered.  I'm not sure whether that
made any difference anywhere.

Gold piece was in a similar situation, except that it wasn't because
an alternate description had been present and then removed.  That one
definitely didn't make any difference anywhere.

Fixes #515
2021-05-20 18:56:03 -07:00
Pasi Kallinen
5ad45fc696 Make anti-magic fields drain more energy
... and make them actually deal damage based on the energy
it would've drained, if you have Antimagic.
Also prevent them appearing too early in the dungeon.

Allow drain energy attacks (and anti-magic traps) drain more
than your level of energy.

Make eating magical monsters such as wizards and shamans give
the same tiny buzz bonus as eating a newt.
2021-05-20 21:35:23 +03:00
Pasi Kallinen
a1b765936f Boost HP of some golems
Idea from SporkHack by Derek Ray, but values are different.
2021-05-20 19:25:16 +03:00
PatR
2c92049821 tribute: Interesting Times
Add missing italics to several words in passage 1.

Add three new passages, bringing the total to 13.

The third one ended up being fairly long.  I made note of it
intending just the bacon joke but when transcribing I backed up
quite a ways.  The context is fairly unusual for a Discworld story.
2021-05-20 03:04:31 -07:00
Pasi Kallinen
2f25556025 Conflict based off of charisma
Higher charisma will make it more likely for monsters to be affected.
Conflict will also now require the monster to see the hero.

Originally from SporkHack by Derek Ray.
2021-05-19 18:35:00 +03:00
PatR
11e98efb94 fix pull request #513 - applying books
Applying a novel to flip through its pages described them as having
"ink" rather than "magical ink" but that wasn't a very suitable way
to distinguish them from spellbooks since their ink never fades.

The Book of the Dead's pages "glowed faintly red" even when the
hero couldn't see them.

Fixes #513
2021-05-18 18:31:04 -07:00
PatR
09ec492dd8 fix github issue #511 - no death message when
level-drained below level 1.  No "you die" or equivalent, just
straight to being life-saved or to "do you want your possessions
identifed?".  Change it to issue "Goodbye level 1."  The fact
that it is has been fatal will become obvious.  An issue comment
on github pointed out where the fix was needed.

Fixes #511
2021-05-18 16:26:38 -07:00
PatR
f88508cd25 fix github issue #512 - fuzzer vs #exploremode
When the fuzzer is running, don't allow a randomly generated M-X
keystroke to switch from debug mode to explore mode.

[Unintended side-effect of the combination of two earlier changes:
assigning M-X as default key for #exploremode and allowing someone
in debug mode to voluntarily downgrade to explore mode (which should
never impact normal play and makes some types of testing simpler).]

Fixes #512
2021-05-18 15:41:51 -07:00
Pasi Kallinen
16105ad0d5 Change touch of death from instadeath to maxhp reduction and damage
Touch of death will now do 50 + 8d6 damage, and drain max HP for half
of that. If the drain is equal or greater than your max HP, then it
will kill you instantly.

Change originally from SporkHack by Derek Ray.
2021-05-18 18:58:34 +03:00
Pasi Kallinen
f057ef573c Knights get no metal armor penalty for clerical spells
Originally from SporkHack by Derek Ray.
2021-05-18 17:02:28 +03:00
Pasi Kallinen
2288452278 Monsters can see player resistances
If monsters see you resist something, generally elemental or magical
attack, or if they see you reflect an attack, they learn that and
will adjust their attack accordingly.

Originally from SporkHack, but this version comes via EvilHack with
some minor changes.
2021-05-17 20:01:11 +03:00
PatR
2a10b3003d kill extremely long running games
If move counter ever hits one billion, quit.  Leaving it unlimited
means that it could eventually wrap to a negative value and break
various things.
2021-05-16 16:48:33 -07:00
PatR
716c50635f food prayer tweak
Guard against 16-bit int overflow when augmenting prayer timeout
for long running games.
2021-05-16 16:42:20 -07:00
PatR
bc856e9a55 tweaks to role-specific prediscovered objects
Characters who start out knowing non-magic armor should not know
cornuthaum and dunce cap.  (Which suggests that those probably
ought to be classified as magic.)

Take away knowledge of polearms from barbarians and valkyries.

Add knowledge of all bows/crossbows, arrows/bolts, and spears to
rangers.

Add knowledge of all daggers to rogues.  (Very minor; non-elves
recognize elven daggers and non-orcs recognize orcish daggers.)
2021-05-15 19:13:29 -07:00
PatR
e3d6fa038b fix #K586 - eucalyptus leaf falling on hero's head
[From 14 months ago; I've got an old email for this but can't find
 it in the bug list.]

Some things shouldn't hurt the hero when thrown upward and falling
back on head.  I've been pretty conservative about what won't do
any harm.
2021-05-14 17:13:48 -07:00
PatR
dae25564bc more object->dknown handling
Fix a couple of places that set obj->dknown to 0 to deal with some
special cases where it should be left at 1.  (Other places do that
but deal with potions where hardcoded 0 remains appropriate.)
2021-05-13 09:38:53 -07:00
PatR
b630d5e038 fix issue #509 - shop 'glob' pricing segfault
A recent change made it possible for a glob to have its dknown flag
cleared and that exposed globby_bill_fixup() passing Null shopkeeper
to get_cost(), triggering a crash.

Make the routine that clears dknown/known/bknown/&c also be the
routine used to initialize those flags for a new object so that it
is the place that handles various special cases.  That hides the
shop bug again.

But also fix the shop bug even though it won't be triggered.

Fixes #509
2021-05-12 16:13:40 -07:00
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