The safe_teleds() change that restored picking random destination attempts prior to making an exhaustive search contained a typo tjat accidentally only accepted invalid positions instead of valid ones. So unless it randomly picked 40 good spots, erroneously rejecting all of them and then falling back to the try-everywhere situation (which has its own testing without any typo), it would yield strange results by placing the hero in walls or solid rock via choosing the first inappropriate spot it tried. Not part of that bug but related, sort of: for rloc(), use rloc_pos_ok() instead of goodpos() during the exhaustive search as well as during the random tries, but hang on to the first (after randomization) position that passes goodpos() for a last resort. The collect_coords() flag for 'skip-inaccessible' intended to be a quick way to filter out walls and solid rock was using !ACCESSIBLE() which also rejects water and lava locations. So such spots wouldn't be picked by either safe_teleds() or rloc() when they were finding a spot for aquatic or lava-tolerant forms. Instead of duplicating a bunch of code to decide whether the hero's current form or the teleporting monster should avoid !ACCESSIBLE() for a reason other than having Passes_walls, make collect_coords(CC_SKIP_INACCS) use !ZAP_POS() which rejects walls and rock but allows pools.
54 KiB
54 KiB