27d40504cc1b08c4d9884c4c35c7ae211254aafb
Bug: with crazy-mode balls on the table and a ball parked in the special hole, the parked ball stayed there after every other ball had drained. It was reported after a tilt, which drains all balls quickly because the flippers are dead. Cause: the special respawn only fired when the drained ball was the very last ball in Game::balls. In crazy mode a ball is often still waiting in the launcher (crazy mode pressed before launching, or a ball that rolled back onto the shooter stop). That waiting ball kept the list non-empty, so each drain simply removed its ball and the parked ball never came out. Reproduced deterministically: 30/30 seeds ended with only the launcher ball left and the special hole still armed. Fix: - special_respawn_pending(leaving) now asks whether the leaving ball is the last one *in play*: every other ball waits in the launcher, and no effect-seven ball is about to be published. It no longer looks at the score mode; in the original, normal scoring there meant "no second ball", which this expresses directly. - lose_ball: with other balls still in the list, the drained ball is removed and, if it was the last one in play, the parked ball is released onto the table (same position, velocity, contact clearing, and gate suppression as the original respawn). With no other ball it respawns in place as before, keeping the original's continuation of the drained ball's response. - A ball that leaves because it came to rest on the shooter stop while the launcher was occupied also releases the parked ball if it was the last one in play. Tilt is untouched: it still ends only with the player's ball, and the released ball plays under it like the original respawned ball. Test Plan: - cargo test parked_ball_is_released_when_only_a_waiting_ball_remains: a tilted game with a launcher ball and one ball in play; draining it releases the parked ball without costing a ball. A second case with another ball still in play keeps the parked ball. - The temporary reproduction (30 tilted crazy-mode games) now releases the parked ball in 30/30; a 40-game crazy-mode stress run still finishes every game.
Languages
C
73.2%
Rust
14.6%
C++
5%
Python
4.1%
Shell
1.4%
Other
1.6%