Commit Graph

246 Commits

Author SHA1 Message Date
PatR
2c8a359feb fix #H4401 - grammar bug when hallucinating
You kill poor goblin.
"poor" implies a pet; pet has a name; "the" is omitted for named
creature; hallucination suppresses name, so "the" needs to be
reinstated.
  You kill the poor goblin.
2016-06-16 17:39:00 -07:00
PatR
bc8e613719 engulfer tuning
Reported by me ;-} during beta testing last Fall, engulfers have a
tendency to re-engulf the hero immediately after expelling him/her.
Use mspec_used (set when expelling rather than engulfing) to make
them wait a turn or two.  Initially that made the too-soon engulf
attacks always miss, so this changes too-soon engulf to a touch or
claw attack instead.  Some tuning in damage or message may be needed.
2016-06-14 17:37:44 -07:00
Pasi Kallinen
939e507345 When attacking a peaceful monster, make other peaceful monsters react. 2016-06-11 20:27:55 +03:00
Pasi Kallinen
3502cfcc5a Hallucinatory liquids for water, lava, and acid 2016-06-07 20:57:50 +03:00
PatR
c1bfa1360f mon->mhp manipulation
I've hunted for other instances where monster hit points were set
to zero or less without calling the routine that kills off the
monster (see recent mon_unslime() vs zhitm()) and didn't find any
for mhp subtraction.  I haven't checked for direct assignment yet.

For a while I thought I'd found several cases where a monster was
intended to be killed but got left with positive hit points, but
it turned out that lifesaved_monster(), of all places, was setting
them to zero.  I've moved that to its callers so that it isn't so
well hidden.  And changed several ''if ((mon->mhp -= dmg) <= 0)''
into separate subtraction and 'if' just so the mhp manipulation is
a bit more visible.

I think the only actual change here is the message for monster
being killed by lava, where glass golems now melt instead of burn.
2016-05-21 18:25:16 -07:00
PatR
05557ee068 corpse_chance()
It was hard to test the attempting-to-revive-shopkeeper-corpse
fix when dying shopkeepers kept declining to leave corpses.  Make
shopkeepers always leave corpses (modulo various circumstances
which prevent all corpses).  I don't know whether or not temple
priests ought to receive the same treatment.
2016-05-17 18:21:02 -07:00
PatR
26226a1cdb misc core formatting
Some of these are post-3.6.0, some just got overlooked before the
3.6.0 release.
2016-05-14 18:26:48 -07:00
PatR
74ee31e504 more angry god vs pacifist conduct
Do it properly, using the arguments to xkilled() instead of reversing
the conduct counter after the fact.

The xkilled() flag value of '1' has been reversed.  It used to mean
'display message' but now means 'suppress message' since both of the
other flag bits are for suppression.  All callers have been updated
to specify either XKILL_GIVEMSG or XKILL_NOMSG so the underlying
number remains transparent.
2016-05-10 15:59:22 -07:00
PatR
2cffaccb3f fix #H4333 - angry god vs pacifist conduct
When you're swallowed, an angry god trying to zap you will kill
the engulfer and hero gets credit (experience) and blame (possible
loss of luck and/or alignment if engulfer is peaceful or tame) for
the act.  But hero didn't actually kill the critter, so don't
increment the kill counter that monitors pacifism.

I think there are other circumstances where hero gets credit and/or
blame for something he or she didn't directly do, but offhand I
can't think of them.  They might warrant similar treatment.

Tidying of xkilled() triggered by malformed block comment which is
actually a hybrid of an end of line comment (the boulder one, not
the 'dest' parameter one)....
2016-05-09 16:21:35 -07:00
PatR
e0537a76d4 disclosing genocided/extinct monsters
Make the handling of unique monsters consistent between vanquished
monsters and genocided/extinct monsters.  No visible difference to
players.

This also prevents Nazgul and erinys from being polymorphed into
some other form to reduce the chance that their kill count fails
to match the expected number when they're reported to be extinct.
[My long test game (with 3451 total dead critters as of the last
save file) used for exercising the sorting of vanquished monsters
included
 120 soldiers
 111 wolves
   9 Nazgul
   2 erinyes
and the genocided/extinct list had none genocided, those four
extinct.  No doubt the missing third erinys was alive somewhere
rather than counted as something else after getting polymorphed,
so this band-aid wouldn't have helped this particular game.]
2016-05-04 17:42:58 -07:00
PatR
759544dd33 long worm #stats
When #stats shows memory use for monsters, include long worm tails.
2016-05-01 00:34:36 -07:00
PatR
23b3d5a126 newcham() feedback: "A <mon> turns into it!"
Silly shapechange message if <mon> is sensed via telepathy and takes
on a mindless form.  In the case I noticed, it was a doppelganger on
the far side of a maze wall who changed from something ordinary into
a mummy while the hero was wearing an amulet of esp.

3.6.0 could deliver this message, but I think changes since then have
increased the chance for newcham() to give shapechange feedback.
2016-04-21 16:45:19 -07:00
Pasi Kallinen
a181c2f93b Fix dead mon and guard sanity checking 2016-04-18 19:52:54 +03:00
Sean Hunt
1e47807302 Merge remote-tracking branch 'github/UniQP/break' into NetHack-3.6.0 2016-04-12 20:52:13 -04:00
PatR
41b8f38272 shapechanger polymorph bit
Rescuing an old revision from bit rot:  If one of fog clouds or
vampire bats has been genocided and you try to polymorph a vampire
disguised as the other, it won't change form because the shape it's
currently in is the only candidate shape left for vampshifting.
This makes shapechangers who fail to take on a new shape when
polymorphed try again, specifying original form on the second try.
It's unlikely to affect chameleons, but disguised vampires will
sometimes become undisguised instead of seeming to be immune from
polymorph.
2016-03-25 16:49:01 -07:00
PatR
77fe8db320 monster sanity checking
Add some more checks for monsters when the sanity_check option
is enabled.
2016-03-14 15:42:03 -07:00
Sebastian Buchwald
9d01178e5b Remove unreachable break statements. 2016-03-09 11:42:15 +01:00
David Cohrs
d01e45a6cc vortexes and unsolid monsters need not avoid webs
Based on a bug report from beta testers in 2010. mintrap()
already had partial checks for this (now fire vortex also burns
a web, as per suggestion in the bug report) but mfndpos()
lacked checks so mintrap() code was almost never exercised.
2016-02-03 11:50:03 -08:00
PatR
45ba0addf2 another vampire shape-shifting bit
Chameleon impersonating a vampire and vampire subject to protection
from shape changers weren't the only ways to have a vampire monster
which isn't a vampshifter.  One-shot polymorph could produce that too.
2016-01-23 19:15:38 -08:00
PatR
885de116e1 fix #H4204 - shapeshifter taking vampire form
When a chameleon/doppelganger/sandestin took vampire or vampire lord
shape, it stopped taking on new shapes.  Vampire shapeshifting was
being applied to all vampires rather than just to is_vampshifter().
When is_vampshifter() is false, the vampire is some other shapeshifter
or Protection_from_shape_changers is in effect, so vampire shifting
doesn't apply.

While testing, I noticed that vampires/lords only turned into bats/
wolves during initial creation.  They did turn into fog clouds in
order to pass closed doors but the other alternate forms were ignored.
That's fixed too.
2016-01-21 02:12:47 -08:00
PatR
7e3f82ed3c fix #H4187 - doppelgangers posing as Riders...
... never transform and can leave Rider corpses

Riders can't be polymorphed, and the code to prevent that was also
preventing doppelgangers in Rider form from changing shape.

Using ring of protection from shape changers effectively turned such
doppelgangers into actual Riders which would leave self-reviving
corpses.  That didn't prevent Riders from appearing on the Astral
Plane though.
2016-01-09 13:57:15 -08:00
Pasi Kallinen
a2a1027be1 Fix bz62: Pets walk into poison clouds
Makes monsters who would be damaged by the poison cloud
not walk into it
2016-01-09 02:25:52 +02:00
Pasi Kallinen
fd709d6840 Clear mimic vision blocking after genocide
Fix via Dynahack by Tung Nguyen
2016-01-06 01:55:39 +02:00
Pasi Kallinen
db4120012d Make mimics mimicing walls or trees also block light 2016-01-06 01:44:18 +02:00
nhmall
fce9f1131d improve messaging on vampire bat to fog cloud transition in Vlad's
Bug 271 - #H4167: vampires being fog clouds show up as bats on telepathy

A bug reporter wrote:
> In top level of Vlad's, the vampires hiding as fog clouds in the closets show
> up on telepathy as B, when far-looked as vampire bat.  once the door opens they
> are fog clouds.
>
> I currently have telepathy from the PYEC.

The vampire /was/ shapeshifted into a vampire bat, but once the secret door
was revealed, it shifted into a fog cloud in order to pass under the door.

If you were to blast the door with a wand of striking from a distance,
you would have encountered the vampire bat.

This clarifies the situation through better messaging.

--------
Original debug call stack trace:
     NetHack.exe!newcham(monst * mtmp, permonst * mdat, char polyspot, char msg) Line 3140
     NetHack.exe!vamp_shift(monst * mon, permonst * ptr) Line 1598
     NetHack.exe!m_move(monst * mtmp, int after) Line 1219
     NetHack.exe!dochug(monst * mtmp) Line 566
     NetHack.exe!dochugw(monst * mtmp) Line 100
     NetHack.exe!movemon(...) Line 707
     NetHack.exe!moveloop(char resuming) Line 105
     NetHack.exe!main(int argc, char * * argv) Line 105
2016-01-01 11:17:57 -05:00
nhmall
5226484bab remove extraneous bit from cut and paste 2015-12-26 19:35:58 -05:00
nhmall
6117eddc62 one statue from single vampire via cockatrice corpse
Changes to be committed:
	modified:   doc/fixes36.1
	modified:   include/extern.h
	modified:   src/mon.c

Fixes H4148 (bz246) and H4150 (bz248)

comments:
I wielded a c-corpse against a shapeshifting vampire bat (checked with a
stethoscope, it said "shapeshifter".) The bat turned to stone and spawned a
vampire.  I hit the vampire and it also turned to stone, so I had two statues
from one monster (vampire bat and vampire.)  Not sure if this is a bug or a
feature...

comments:
Engulfed by a fog cloud that was actually a Vampire,
and got the message: "You break out of the vampire!"
2015-12-26 19:08:08 -05:00
PatR
757e6f9c4d vampire genocide could produce unkillable critter
Vampires who were currently shape-shifted into a fog cloud, bat, or wolf
became an unkillable fog could, bat, or wolf if the player genocided
vampires.  When such a creature was killed, the attempt to transform it
back into a vampire failed, but the monster continued to be resurrected
anyway.
2015-12-12 00:34:16 -08:00
PatR
171fb90746 !DEBUG warnings
With DEBUG suppressed, I started getting
16      warning: empty body in an if-statement
and 2   warning: empty body in an else-statement
from gcc.

Using braces for an empty block instead of just ';' avoids the warning:
    if (foo)
        debugpline("foo");
is bad,
    if (bar) {
        debugpline("bar");
    }
is good.  ;-)

The changes to lint.h are just precautionary.

modified:
    include/lint.h
    src/attrib.c, bones.c, dbridge.c, dig.c, eat.c,
        makemon.c, mkmaze.c, mon.c, sp_lev.c
2015-12-04 14:58:49 -08:00
Pasi Kallinen
7063488621 Pacify some clang compile warnings 2015-11-21 23:40:06 +02:00
Pasi Kallinen
dc09a991fe Fix some warnings from clang's static code analyzer 2015-11-18 22:54:28 +02:00
PatR
95772261dc fix memory leak: obj->oextra->omonst->mextra
The memory leak (monst->mextra->edog, monst->mextra->mname,
monst->mextra for some monster were not released) I noticed recently
was due to recording a pet's full monster attributes with its corpse.
During save and restore, obj->oextra->omonst was being treated as a
full-fledged monster so worked as intended, but when freed, omonst
was treated as a black box and its mextra details weren't handled.
2015-11-13 20:39:10 -08:00
Pasi Kallinen
99925ff155 Update version numbers in source comments 2015-11-06 16:05:36 +02:00
PatR
80d4acdc81 fix can_carry()
Noticed while going through more reformatting:  can_carry() was changed
to return a number rather than yes/no, but it's trying to return a long
value (obj->quan) as an int.

Gold is the only thing likely to exceed LARGEST_INT in actual play
(although rocks could manage it if somebody tried hard enough).  This
makes sure that the value returned doesn't exceed LARGEST_INT, but only
tame monsters honor the resulting subset value (at least for gold) and
split the stack.  The proper fix is to convert can_carry() and all its
uses to long, but I'd rather spend my time on other stuff.
2015-11-02 01:53:38 -08:00
PatR
41a40d41a0 monsters moving after player leaves level
Fix the problem reported by ais where it was possible for one monster
to knock the hero onto a level teleporter (or trapdoor or hole),
destination was selected and allowed-to-level-teleport checks were made,
then for another monster to knock or teleport the not-yet-relocated-hero
onto the Amulet and have auto-pickup move it into inventory.  At the end
of that turn's monster movement, hero would level teleport successfully
despite carrying the Amulet.

This short-circuits monster movement if the hero is scheduled to be
moved to a different level.  The monsters who haven't moved yet don't
lose their pending movement points; they'll catch up if/when the hero
returns to the level.
2015-10-29 18:18:12 -07:00
PatR
ea8a1beb0a formatting: src/m*.c - p*.c continuation lines
Somewhere along the line I started removing redundant parentheses from
return statements, but only in files that needed continuation fixups
so it's not comprehensive.
2015-10-22 16:35:01 -07:00
Pasi Kallinen
581b1830ff Fix segfault when chameleon form fails on the Rogue level 2015-10-20 17:28:16 +03:00
PatR
2c20805b16 unsplitting split object stack
Replace the code that Dean objected to with something a little bit more
robust.  It doesn't rely on the two stacks being adjacent or having the
same inventory letter.  It is still vulnerable to having another
splitobj() occur between the offending split and its attempted unsplit,
or to either of the two halves of a split being extracted from their
object chain.  As before, failure to unsplit only results in the two
halves of the split remaining separate stacks, not anything more drastic
like the panic() that prompted all this.

Simplification of hallucinated currency names got mixed in with this
patch.  I haven't bothered separating it back out.

Whoever reset PATCHLEVEL to 0 jumped the gun.  This patch increments it
since change to the 'context' structure breaks save file compatibility,
so it will need to undergo another reset before release.
2015-10-18 17:37:15 -07:00
Pasi Kallinen
95983f6ae6 Use macros for monster appearances 2015-10-18 13:55:11 +03:00
Pasi Kallinen
af1c77808b Comment typofixes, pt 4 2015-10-17 18:47:31 +03:00
Pasi Kallinen
66dd87454b Comment typofixes, pt 3 2015-10-17 13:47:25 +03:00
Pasi Kallinen
05adaa2a75 Extra checks when freeing objects and monsters
Just in case, so we don't leave objects or monsters inaccessible
by accident.
2015-10-11 21:41:55 +03:00
Pasi Kallinen
f0220c4203 Add monster data sanity checking 2015-10-11 20:36:28 +03:00
Pasi Kallinen
16018ac824 Put monsters into limbo if they cannot be placed
Whenever mnearto tries to displace a monster from underneath
another, and the displaced one cannot be placed anywhere,
make it drop special objects and put it into migration, with
the current level as the target.

This should be a good enough stopgap measure - it's not going
to happen unless the level is (nearly) full of monsters.

And it seems to cure a near-impossible-to-track data corruption,
with monster list pointing to garbage.
2015-10-11 18:52:27 +03:00
PatR
a51531776d flesh golem healing
Fix one of the entries in the "A few bugs" mail.  Flesh golems hit by
electric damage calculated a healing amount of dam/6, then ignored it
and used dam instead.  Probably never noticed in actual play....
2015-10-05 18:32:40 -07:00
PatR
5e909d3b44 obj bypass: move vs turn
Reported by ais; clearing object bypass bits once per turn isn't often
enough.  Clear them after the hero moves (which might be more than once
in a turn) and before each monster moves (ditto) and after last monster
moves.  This might not be optimal but that shouldn't matter since it's
usually a no-op.
2015-08-02 01:54:51 -07:00
PatR
fe09f7156d vampshifter messages
If you've just received the "dead bat revives as a vampire" message,
suppress the rather obscure "Maybe not..." message given when an unseen
creature gets life-saved since it ends up being out of sequence.  You
could get them both when the death/revival was sensed via telepathy
without being in sight.

Also, some formatting cleanup and a couple miscellaneous code tweaks.
2015-07-06 18:24:13 -07:00
Derek S. Ray
2224df66f0 Slight improvement to handless pets' pickup changes
Allow one item to be taken out of a pile, and leave framework in place
for partial splits so that all monsters will take up to their capacity,
rather than leaving the whole pile if it's too big to take all at once.
2015-06-21 15:16:22 -04:00
Pasi Kallinen
c574df1239 Prevent unique monsters waking up prematurely
Reported by Stefan:
> I just did the valkyrie quest. When I arrived on quest goal, I took only
> a few steps away from the upstairs and Lord Surtur jumped me. One of the
> monsters in his lair had stepped on one of the guaranteed squeaky boards

Squeaky boards (and other noisy things) woke up monsters that were
meditating. Unfortunately this also woke up such meditating monsters
as the Wiz, or the quest nemesis.

Prevent unique monsters with waiting strategy being woken up by the noise.
2015-06-20 14:15:08 +03:00
PatR
def2549592 shapeshifting on rogue level
Limit vampire shapeshifting on rogue level to vampire bats (only
choice represented by uppercase letter) and have other shapeshifting
try for uppercase.  The latter isn't rigorous because shapeshifters
(chameleon=':', doppelganger='@', sandestin='&') aren't uppercase
themselves, so won't be created there under ordinary circumstances.
It applies to the "summon nasties" monster spell and post-invocation/
post-Wizard's-death harassment effect too.
2015-06-04 15:31:25 -07:00