fix #K3895 - 'o' at own spot during pass-walls

If standing at the location of a closed door while having Passes_walls
ability, attemping to open that door with 'o' reported "you don't find
anything here to loot".

Using 'o' to loot for direction ./>/< is intentional but it ignored
the possibility of there also being a closed door present.  When the
latter applies, only switch from open to loot for direction '>' so
that '.' (and '<') will open the door.  Doesn't matter for creatures
that can ooze under a closed door--trying to use 'o' gets rejected for
them because they lack hands.

Also allow hero in Passes_walls form to use 'c' when at open door spot.
(For creatures that ooze under doors, 'c' is rejected just like 'o'.)

Unrelated:  fix a typo in a recently added comment.
This commit is contained in:
PatR
2023-03-29 13:48:42 -07:00
parent 4194b01c17
commit dad67436e6
3 changed files with 8 additions and 4 deletions

View File

@@ -1129,6 +1129,9 @@ having worn levitation boots removed and destroyed (scroll, monster spell,
ensure that all window interfaces respect flags.silent (suppress terminal beep)
falling into lava, being life-saved, and teleporting out could yield redundant
descriptions of what was present at hero's new location
if hero had passes-walls capability and was at the location of a closed door,
attempting to use 'o' on own spot reported "you don't find anything
here to loot"; change to open door for '.' (or '<'), only loot for '>'
Fixes to 3.7.0-x General Problems Exposed Via git Repository

View File

@@ -794,8 +794,9 @@ doopen_indir(coordxy x, coordxy y)
return ECMD_OK;
}
/* open at yourself/up/down */
if (u_at(cc.x, cc.y))
/* open at yourself/up/down: switch to loot unless there is a closed
door here (possible with Passes_walls) and direction isn't 'down' */
if (u_at(cc.x, cc.y) && (u.dz > 0 || !closed_door(u.ux, u.uy)))
return doloot();
/* this used to be done prior to get_adjacent_loc() but doing so was
@@ -958,7 +959,7 @@ doclose(void)
x = u.ux + u.dx;
y = u.uy + u.dy;
if (u_at(x, y)) {
if (u_at(x, y) && !Passes_walls) {
You("are in the way!");
return ECMD_TIME;
}

View File

@@ -6162,7 +6162,7 @@ lava_effects(void)
iflags.in_lava_effects--;
/*
* 3.7: this used to be uncondtional "back on solid <surface>"
* 3.7: this used to be unconditional "back on solid <surface>"
* but surface() could return a lot of things where that ends up
* sounding silly. Deal with water, ignore furniture; assume
* surface types 'air' and 'cloud' won't be present on same level