Found by the #221 fc_alcove lab, and it is one of that segment's four deaths rather than a theoretical hole.
Brainpan's $EF Special is Smirk, which inflicts Stop. tools/tests/fcalcovelab/stop_stalls.py over the lab's 12 control seeds counts 19 Stop landings, 11 of which left the party with no plan for 600+ ticks. In control seed 0 the battle sat 2,276 ticks with nobody acting while SHADOW fell 1050 -> 0.
The cause looks like lib/ot6.lua's #187 assumption that when a command window goes away the engine is about to take it — under Stop the window goes away and does not come back for that actor, and the driver waits on it instead of driving the actors who can still act. A Stopped member is not a denied turn; it is a member who will be back, and the rest of the party has turns in the meantime.
What a person does under Stop is keep fighting with everyone else, and heal the member who cannot move.
Fix the class, not the fight: the driver should notice a Stopped (and by the same argument Sleep / Petrify / Frozen) actor, stop waiting on that actor's window, and keep planning for the others. M.turnDenied / M.statusCure (#187) are the existing surface. The lab's retained logs are under build/lab/fc-alcove/ and stop_stalls.py prints the stalls per seed.
Related: #187 (turn denial), #190 (Zombie / Vanish / Condemned in the fight lib) — the same family of "a status the driver does not model" bugs.
Found by the #221 fc_alcove lab, and it is one of that segment's four deaths rather than a theoretical hole.
Brainpan's
$EFSpecial is Smirk, which inflicts Stop.tools/tests/fcalcovelab/stop_stalls.pyover the lab's 12 control seeds counts 19 Stop landings, 11 of which left the party with no plan for 600+ ticks. In control seed 0 the battle sat 2,276 ticks with nobody acting while SHADOW fell 1050 -> 0.The cause looks like
lib/ot6.lua's #187 assumption that when a command window goes away the engine is about to take it — under Stop the window goes away and does not come back for that actor, and the driver waits on it instead of driving the actors who can still act. A Stopped member is not a denied turn; it is a member who will be back, and the rest of the party has turns in the meantime.What a person does under Stop is keep fighting with everyone else, and heal the member who cannot move.
Fix the class, not the fight: the driver should notice a Stopped (and by the same argument Sleep / Petrify / Frozen) actor, stop waiting on that actor's window, and keep planning for the others.
M.turnDenied/M.statusCure(#187) are the existing surface. The lab's retained logs are underbuild/lab/fc-alcove/andstop_stalls.pyprints the stalls per seed.Related: #187 (turn denial), #190 (Zombie / Vanish / Condemned in the fight lib) — the same family of "a status the driver does not model" bugs.