While trying in vain to find code that would cause the reported
priest-on-players-location behavior, I did find that the code to find
a usable teleport or similar trap was disallowing lots of locations due to
an && that should have been an ||.
The previous change only affected mimics that started mimicing after the
level was created. This change tries to perform a similar behavior for
randomly placed mimics that are forced to mimic a boulder on special levels.
In this case, since the symbol is fixed and the location is "random", try
several times to find a non-trap location for such a mimic.
On mazelike levels, mimics will mimic either boulders or statues (of giant
ants, as it turns out). However, it does not make sense to mimic a boulder
on a hole or even a pit, since boulders would typically fall in. Also,
statues are not typical objects in Sokoban. So, skip statue special case
in Sokoban and always avoid the forced emulation of a boulder when on a
trap location outside a room. This is a bit drastic, but I couldn't think of
an argument for adding the code to do this only for pits, holes, et al,
which are the most likely traps outside rooms anyway.
Since the rogue level does not have closed doors, mimicking one there makes
no sense. Similar to what wand of locking does there, make mimics that end
up there mimic a wall instead of a door.
There was already code to ensure that if a hidden monster moved, it would
no longer be hidden. However, if the monster is asleep or whatever under
a rotting corpse, when the corpse rotted away, the monster would not
immediately become detected. Add a check to the rot code before the newsym.
Attempting to go > while blind and floating over unknown stairs/ladder
would refer to the stairs in the "high above" message (however, the
stairs/ladder remained unidentified on the map). Change this case so
it only refers to stairs/ladder if that's what the hero remembers on the map.
If you kick something while in the air (i.e. on the Air level or while
in a bubble on the water level), 1) greased objects were treated specially
and 2) messages were given about the object sliding.
- add checks for kicking in the air, and always increased distance a bit
(I didn't add any checks to deal with the transition from air to water or
visa versa)
- don't set the flag that causes the "slides" message in these cases either
This patch simply keeps the score from wrapping by capping it at LONG_MAX.
If someone wants to change the score to be unsigned, some changes will
need to be made to tweak this code (and use ULONG_MAX instead).
I'm assuming that our platforms all have limits.h.
<Someone> reported that freezing the swamp on Juiblex' level would result
in message about a frozen moat. Avoid this by using waterbody_name
to to determine if it's a moat or not.
- as requested by ESR, remove the use of parentheses from the usage
summary, it confused some man page conversion tool he has
- updated documentation for the -p option to mention the word "role"
so anyone search for role in the man page will still find it
- removed use of .UC, it is listed as deprecated in all the current man
documentation I could find, when it was even documented at all
- other minor spelling and formatting (hyphenation) changes
<Someone> reported that dipping acid in a fountain did not always destroy
the acid. It might be best to have get_wet call useup in this case, but
that would require more work.
Reported to the list back in November: scaring a mimicing mimic will
produce a "turns to flee" message, but the mimic does not unmimic nor
does it flee. The latter behavior made sense to me as a defense mechanism,
so I changed monflee to avoid printing the message in this case.
Change pit behavior to always mark a non-flying poly'd player as trapped in
a pit, even when Passes_walls is set. This allows players polymorphed into
xorns to descend into pits and pick things up. In this case, any attempt
to move out of the pit now takes a turn but always succeeds. Also fixed
a related bug (w/o ID) that a player could become trapped as if in a pit
when leaving xorn form because u.utrap wasn't checked, and simplified the
code since the extra Passes_walls checks are no longer needed. Also
updated code in sit.c that duplicated uteetering_at_seen_pit.
<Someone> reported back in December of an invisible monster using an amulet of
lifesaving and looking much better. While the comment in the code says the
amulet is visible, this does not mean the monster is. Add a secondary check.
Both the reported tombstone message and the initial message could be
grammatically incorrect for eating identified artifacts. This begs the
question whether artifacts should be so easy to destroy.
Extend the previous patch to cover all blown instruments. Also covers
the case of the player strangling. The test is moved to a new can_blow
function to keep the test in one place. It supports any monster, although
all current tests are for the player.
Restrict poly'd whistle use to monsters that can blow a whistle. The
restriction includes those that make no sound (or just buzz, which is a
wing-thing) and are either breathless, tiny (eg ants), headless or water
natives. Searching monst.c, this appeared to provide a reasonable set of
restrictions. There are a couple cases one might quibble about if someone
feels like refining this further.
A long time ago, a message to the list suggested that whistles should not
work underwater. I did some google research and this does appear to be
true for most whistles. However, magic whistles are magical, so I left
them alone (also, I did find one high-tech whistle in my research that
claimed to work underwater). Since being underwater affects pitch,
adjusted the magic whistle message slightly for that case.
Ronald Van Iwaarden wrote:
... lines 1845 and 1846 of cmd.c generate a 'value out of range
warning' due to the compiler making 0x80 an integer rather than a character
and '|'ing it with the argument. This requires a minor change to micro.h.
[ Makefile.os2 rev does not currently make sense in the trunk. ]
While looking thru the whole list, I found a few sorting mistakes which
confused my inspection and one misspelling. I didn't inspect the derived
file list.
If a long worm's head is on the drawbridge and a tail segment is at the
portcullis and you raise the drawbridge, bad monster handling occurs
because of some recursion that occurs before set_entity is called again.
Not sure when this last worked; it's broken in 3.4.2 as well. Modified
e_died to ensure both entity objects for the same monster get cleaned up
so subsequent e_at calls behave as expected.
While looking at the behavior of sitting hiders, I noticed other related
odd behavior.
- player hiding while poly'd as a hider that hangs on the ceiling now drops to
the floor before sitting (similar to the behavior of movement commands).
- trappers, as per data.base, don't hang on the ceiling. Changed the
mattacku case dealing with hiders to not treat trappers as ceiling hiders.
- updated can_reach_floor to also exclude ceiling hiders. This covers a
bunch of cases, such as pickup, look-here-while-blind, and so on. Another
alternative would have been to automatically unhide for all such cases.
trunk only, it's a minor bug IMO and we appear to be close to a release.
- gcc warned that the "anything" initializer needed more braces
- gcc also warned of a couple unused variables
- WIN_STATUS, when STATUS_VIA_WINDOWPORT is not defined, had no type
Add the ability to select the windowtype on the command line on Unix using
a new -wwindowtype option. I had thought the proposed patch could core
dump, but the default windowtype selection occurs earlier and ensures
that raw_print will always work. So, the only problem with the proposed
patch was it didn't move the linux and sco special-case code until after
the selection was made. That special-case code really should be moved to
to wintty.c, IMO since it doesn't affect other windowtypes.
The default symbol for lit and unlit corridors are the same. This makes
the lit_corridor option a no-op where the defaults are used and also means
that using a light scroll/spell a corridor has no obvious effect. To
address that, I special-cased the lit corridor symbol and change its color
to bright white when its the same symbol as the unlit corridor symbol (I
didn't change the default color since I thought that made the lit corridor
look strange using the windows console interface).
Guidebook used both "behavior" and "behaviour". I think this was the
only word not using the US-English spelling. Also fixed a spacing bit
in Michael's latest rev to the .mn version.
A trapped monster with one step between you and the monster (@.@) would
repeatedly switch between a ranged and hand-to-hand weapon if carrying both.
Since the monster switches each turn, it will not make ranged attacks.
Modified the test in dochug to prefer a ranged weapon in this case.
A trapped monster with one step between you and the monster (@.@) would
repeatedly switch between a ranged and hand-to-hand weapon if carrying both.
Since the monster switches each turn, it will not make ranged attacks.
Modified the test in dochug to prefer a ranged weapon in this case.
Pat verified something I had wondered about, that various tests of mcanmove
in shk.c should have also been testing mcanmove. There may well be other
tests of mcanmove in other files that need fixing.
when msleeping is set, mcanmove is not cleared. mcanmove applies only to
mfrozen. So, mattackm needs to test both mcanmove and msleeping.
mattackm will not wake the defender if the attack misses.
the message history saver needs the windows to stick around until save
is completed. This usually the case, but end_of_input() was calling
exit_nhwindows prematurely. This is actually an old bug (calling it early,
but wasn't harmful until other recent changes).
Use a new flush_screen(-1) call to toggle 3rd screen update in goto_level.
This keeps the 3rd screen state unchanged, no matter what happens at higher
levels, ensures the map window cursor stays on the hero, ensures the
hero's showrace colors remains bright white, and so on.
<Someone> suggested and I agree (mostly, if you're a Monk poly'd to a
strict carnivore, I think it should still smell delicious):
> "You smell the odor of meat." (if herbivorous)
> "You smell a delicious smell." (otherwise)
> I think that if your character is a monk or still veg(itari)an, you should
> also get the first message. Even if you're not intentionally vegitarian,
> the first message is still appropriate.
Reported a really long time ago (June 2001) by <Someone>:
- stand on the upstairs and engrave Elbereth with a /oFire
- create Demogorgon and e.g. a tame dragon
- cause conflict
- Dragon will kill Demogorgon and Demogorgon will never ever attack Dragon.
All monsters could still attack Demogorgon without response via fightm().
Modified fightm() to include a bit of code in m_move and dog_move, allowing
response to an attack. Testing this in action, Demogorgon still usually
did things detrimental to the player, mostly summoning nasty monsters.
To reproduce: disable lit_corridor, enter a corridor, read a scroll of
light, then read a cursed scroll of light. The corridor won't darken again.
A test of flags.lit_corridor in newsym was at fault. I'm guessing this was
never noticed because lit_corridor is on by default on Windows and the
default lit and unlit corridor symbols are the same on most other platforms.
Cutting a shopkeeper poly'd as a long worm would generate strange messages
and could result in a crash. cutworm didn't deal with all the intricacies
of duplicating a monster. Fixed by changing cutworm() to use clone_mon()
to do most of its dirty work. It seems to me that without this change,
cutting a tame long worm could also have similar bad effects.
Other side effects of this change:
- clone_mon now takes x,y coordinates, 0,0 results in previous behavior
- clone_mon no longer always makes cloned monsters tame/peaceful if player
caused the clone, using the same formula previously in cutworm. Someone
else may wish to tweak this for gremlins.
- clone_mon will christen the new mon with the old shopkeeper's name, even
though clones are never shopkeepers (game can't handle 2 for a shop)
- cutworm can now be called during conflict or pet combat, although I
added no such calls (yet)
I noticed a few panic messages contained newlines, and one included a naked
carriage return. panic() adds a newline itself, and also generally ensures
the message will be on a new line (the initial "oops" ensures the message
itself will be on a new lines). This patch removes the unneeded characters.
Incorporate a slightly modified version of a patch submitted by <Someone> back in June. The basic problem, which I noticed again this past
weekend, is that pets with a high apport value can still try to get to
objects when there's no path to the object. The patch extends the
can_reach_food function to be used for any object, renaming it to
can_reach_location, and adds a could_reach_item function for doing point
checks. This also removes any chance of a pet dragon, for example, eating
something underwater.
When changing levels, the state of rndmonst() is reset, causing the monster
choices to be recalculated. However, the frequency counts for initial
uncommon() monsters were never cleared. Thus, if the first non-extinct
monster were a hell monster, and you returned to the main dungeon, the hell
monster will remain in the list and could be selected.
Calling rehumanize directly when u.mh > 0 doesn't consider Unchanging
(perhaps it should?). But, it's probably better to call losehp anyway.
Also, part of a buglist item: .5PD didn't affect rust trap damage on iron golem
I wrote to the devteam early last week:
> Given my understanding of travel, it's supposed to be somewhat intelligent,
> and "convenient", and should, therefore avoid walking into water, lava,
> traps, or other things that distant movement would avoid, even if you're
> right next it. Unless... the travel destination is the "bad" location
> next to you when the travel starts.
To that end...
- add a context (iflags in 3.4.3 to maintain savefile compat) flag to
differenciate the first travel step from later steps, to allow the
detection of the final sentence, above.
- several changes to set/reset the travel1 flag as needed
- add code to findtravelpath to treat the first step specially if it's
the only step, allowing forced travel into a "bad" location
- correct the "don't travel over traps" code, which was getting confused
because hero's starting location was being avoided
- add code to avoid traveling into water and lava, duplicating
checks used for non-travel running
- fix some strange "guess" travel behavior: avoid zigzag paths when there's
a more direct path (even though the number of moves is the same)
- trunk change adds a new DISP_ALL tmp_at type, and uses it in some debug
code for travel, debug changes not added to the 3.4.3 branch
This hack simply causes ^C to be ignored completely by the gnome interface.
Gnome really cannot handle interrupts, and the window port interface does
not currently provide a way for the gnome interface to just quit. Allowing
the gnome interface to prompt would require a complete overhall to the the
way window ports work.
Allow migrated objects to break on arrival. Added code to obj_delivery to
cause this, along with a flag to keep breakage from occurring. The new
flag isn't used yet, because all the current object migration involve
objects that were moving/dropping. To help make this change, rloco now
returns whether the object was placed or not, so caller can know if an obj
pointer is still valid or not.
Making the breakage messages for MIGR_NEAR_PLAYER objects show up after the
new level is displayed required some effort (rather than while the old level
was still displayed, which was confusing), due to the needs of goto_level.
- obj_delivery now has 2 passes, one for before player arrives, another after,
allowing the two cases to be treated differently
- goto_level calls obj_delivery twice (run_timers is not called twice,
since the run required before the level is displayed will have already run
any timers on migrating object)
- kill_genocided_monsters now kills eggs on the migrating_objs list too
Use fqname buffer 1 for restoring the save file (just like save does when
creating it) so the value won't change out from under the code in unixmain.
- Also moved a tty-specific hack in docompress_file that was causing
the 'y' response to the "keep the save file" prompt to be echoed twice.
Not all of the extended commands worked in the gnome interface because
'#' just caused the next character to be treated as a meta character (this
was a hack I added a while back when none of the extended commands worked).
Resolved by finally adding an extended command menu to the gnome interface.
- updated some formatting so I could read the code
- fixed startup player selection menus so accelerators work
- added necessary calls to make sure selected menu item is visible
- also removed some dead code
The tty menu code wasn't totally reentrant, causing it to free memory
that wasn't on the heap if you had your inventory displayed, ^C then
ask to see the inventory again. Solved this by converting the buffer used
by process_menu_window to be heap-allocated. If the Quit code could return at
this point, this would still be very bad, but since it doesn't, this is OK.
Internals of gnome_yn_function should treat key inputs as 'int' until
returning them, to avoid truncating and not sign extending as needed on
platforms where char is unsigned.
Add a menu item for Quiver. While testing this, found the Quit menu
item still said that you quit using shift-q, so I updated that too.
Trunk change includes some other exit related fixes that don't apply to
the 3.4.3 branch.
cosmetic changes to allow qt_win.cpp to compile cleanly using gcc -Wall.
This corresponds to a debian report that doesn't mention a debian bug ID.
The changes are not identical to the suggested debian patch.
Too much code was being shared between the extended command window
and the popup dialogs for player selection, causing an uninitialized
variable to be referenced, often resulting in a core dump.
Add support for hilite_pet to X11 text map mode (hilite_pet was already
supported when tiles were enabled). While testing this, I found a missing
newsym() in the code implementing the creation of a "tame" monster.
<Someone> suggested that a dragon, lacking hands, shouldn't be able to
throw things. Dragons can pick things up, and it seems they can throw
things the same way. However, it does seem that a notake() monster, which
cannot pick things up, shouldn't be able to throw things either.
Reported a while back, a (stonable) hiding monster will hide at a location
containing only a cockatrice corpse. While it would be interesting to
allow monsters to try, and stone themselves as a result, I chose the
simpler fix which is to not have monsters hide in such situations. I found
the hiding code was duplicated in several places, so I moved it into a new
hideunder() function that works for both the hero and monsters.
When moving the code to bill for tins before eating them (to charge for
them at the pre-eating hunger status), several cases were able to bypass
billing. Moved the bill checking code to a new costly_tin() subroutine so
it could be called in all the necessary places.
Prompted by a question from Pat a long time back, this change finally allows
tiles or text map mode to be chosen dynamically at runtime (using the
"tiled_map" option) rather than having to pick it via an X resource and
keep your selection until you exit. This brings map mode selection up to a
level similar to most other graphical window ports.
In addition, the map mode automatically switches to text on the Rogue
level, also like other graphical window ports.
The default mode for the X11 binary is now tiles, once again, like most (all?)
other graphical window ports.
The patch also removes some dead X11 code that is unlikely to be useful again.
<Someone> reported that randomly placed aquatic monsters can end up in
lava. The placement code allowed lava whenever the WET flag was passed to
it. This was so passing (WET|DRY) would match all locations, but it's not
appropriate for when only the flag WET is used. Since we have no levels
currently affected by this bug, I fixed it only in the trunk.
<Someone> suggested that nagas should eat. This seems reasonable.
I made all but the black omnivores. The black are similar to the AD&D
spirit naga, which are listed as carnivores, while AD&D's other nagas are
omnivores, so I took the same approach.
Change the code involved to use a new #define for the field, like other
overloaded uses of corpsenm. Also remove one check for this field from
potion.c: there are no blessed potions from sinks.
There was some unreachable code in dokick related to drawbridges. Since I
liked the current "Ouch!" behavior, I moved the drawbridge test inside the
IS_STWALL code but made sure to update the maploc so kickstr would return
the right thing. Since there may be more than one drawbridge (perhaps it
should test for Valkyrie?) changed the kickstr prefix for drawbridge to "a".
If you try to put a saddle on a cockatrice, you turn to stone,
even if wearing gloves. This seemed inconsistent with other cases,
and I couldn't think of a reason why you'd touch the cockatrice with
another body part, so I added the uarmg test.
Introduce a new set of functions to manage delayed killers in the trunk, used
in addressing the various reports of delayed killer confusion. Since existing
delayed killers are related to player properties, the delayed killers are
keyed by uprop indexes. I did this to avoid adding yet another set of
similar identifiers.
- the new delayed_killer() is used for stoning, sliming, sickness, and
delayed self-genocide while polymorphed. Some other timed events don't
use it (and didn't use the old delayed_killer variable) because they
use a fixed message when the timeout occurs.
- A new data structure, struct kinfo, is used to track both delayed and
immediate killers. This encapsulates all the info involved with
identifying a killer. The structure contains a buffer, which subsumes the
old killer_buf and several other buffers that didn't/couldn't use killer_buf.
- the killer list is saved and restored as part of the game state.
- the special case of usick_cause was removed and a delayed killer list
entry is now used in its place
- common code dealing with (un)sliming is moved to a new make_slimed function
- attempted to update all make dependencies for new end.c -> lev.h
dependency, sorry if I messed any up
It makes sense that if you cannot normally move to a location containing a
boulder, dismounting there should be avoided if possible. It seems
that it should be possible to land there if there's no other choice.
Perhaps doing so should result in damage, but that's not in this patch.
<Someone> pointed out the inappropriate appearance of the 3.4.2 message when
fog clouds have you engulfed if you happen to be polymorphed into an aquatic
creature. It does seem that a fog cloud should not cause added damage to
amphibious creatures, which includes breathless (but non-flaming) monsters.
I also thought another message was more appropriate for flaming creatures
(see on_fire()), and added a special case for that.
gulpum was missing symmetric code and I added it there too.
This change adds a new flaming() macro and uses it in several places
where the list of flaming monsters was tested. on_fire() didn't list
salamanders as already being on fire, but should have. A couple other
cases were not updated to include flaming sphere.
While wearing the Eyes of the Overworld, one could use a hook or pole thru
walls. The bug report thought they should work past a boulder, but I
disagree, given a pole or hook's rigid nature, and did not special case that.
couldsee() is not affected by the Eyes, so use that after checking cansee().
Incorporate various killer message grammar fixes suggested by <Someone>.
Mostly these deal with using the proper killer_format and prefix ("the" or
no "the") for unique and type_is_pname monsters, or death to to eating
their corpses.
One case is handled by a general fix to name_to_mon to allow it to deal
with "Croesus' corpse".
The pre-3.4.1 topten behavior for "starved to death" messages is also restored.
Some changes for standard C platforms, to avoid declaring errno explictly.
Such platforms should declare errno in errno.h, which is already included
in the files in question.
Nethack's manes are based on AD&D manes which are in turn based on the
manes of Roman legend. They are supposed to be spirits of the dead.
To that end, added them to the nonliving() macro. The biggest behavioral
change is that death spells no longer effect them, which does technically
make them a bit tougher but also makes sense. Also, they're so wimpy, it's
hard to believe anyone would use a death/disintegration on them anyway.