v2.94.6 - stop re-picking a dead address, and let the nets repeat
Changes since v2.94.5
Stop re-picking a known-bad memory address, and let the nets repeat
Tonight's log showed two components sharing the player's maxima: one intact
(life 886/886, mana 366/366, shield 1136/1136) and one a corpse (life 0/886,
shield 0/1136) that outscored the real one on a stale OCR current-value hint.
The zero-persistence and frozen-unchanged checks already detected this and
called Rescan(), but a plain rescan let Search() pick the identical bad
address again every time, looping on a nine-second cycle that never once
protected the character - "it has a lock on my hp" (a component was always
found) and "it is not potting" (that component was worthless) were the same
bug. Both call sites now use the existing Distrust() instead, which
blacklists the address for five minutes and forces the next search onto a
different candidate.
Separately: the emergency and last-ditch nets fired once and then refused to
fire again until the pool recovered above its floor by a margin, even while
still falling. Below emergency there is now no cap, and last-ditch may fire
up to three times; both stop the moment life is climbing at least as fast as
the pool's own configured fast-drop rate, so a press is never wasted once
recovery has actually started. The decision is a pure function (NetMayFire),
tested directly rather than through the side-effecting Net() closure.
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
Full Changelog: v2.94.5...v2.94.6