Deal around a player who busted and hasn't rebought #65
Closed
jheaps
wants to merge 1 commits from
fix/casino-holdem-deal-around-broke into fix/casino-holdem-settle-up
pull from: fix/casino-holdem-deal-around-broke
merge into: :fix/casino-holdem-settle-up
:master
:feature/socialism
:polish/holdem-seats-one-size
:fix/holdem-dealer-chip-eats-its-seat
:polish/holdem-game-night-ready
:polish/holdem-round-next
:polish/holdem-seat-collisions
:polish/holdem-offline-and-render
:fix/naming-a-blind-deals-the-hand
:release/casino-holdem-polish
:fix/casino-holdem-phone-look
:fix/casino-holdem-sidebar-crowding
:fix/casino-holdem-contribution-rule
:fix/casino-holdem-one-stack-rule
:fix/casino-holdem-default-stack-buyin
:feat/casino-holdem-waiting-list
:feat/casino-holdem-misdeal
:feat/casino-holdem-cash-out
:feat/casino-holdem-clock
:feat/casino-holdem-rake
:fix/casino-holdem-stadium-ring
:fix/casino-holdem-phone-felt-shape
:fix/casino-holdem-audit-runs-everything
:feat/casino-holdem-straddle
:fix/casino-holdem-landscape-ring
:feat/casino-holdem-table-file
:fix/casino-holdem-touch-targets
:fix/casino-holdem-audit-modal-blindspot
:fix/casino-holdem-quicksplit-chop
:fix/casino-holdem-buildable-bet-sizes
:fix/casino-holdem-pot-sized-raise
:fix/casino-holdem-chips-to-count-out
:fix/casino-holdem-first-buy-in
:fix/casino-holdem-seating-a-table
:fix/casino-holdem-showdown-order
:fix/casino-holdem-hand-log-filter
:fix/casino-holdem-posting-in
:fix/casino-holdem-dead-button
:fix/casino-holdem-discarded-pot
:fix/casino-holdem-honest-tank-clock
:fix/casino-holdem-export-the-notes
:fix/casino-holdem-stacks-in-chips
:fix/casino-holdem-close-audit-blind-spots
:fix/casino-holdem-readable-dim-states
:fix/casino-holdem-drop-broken-watermark
:fix/casino-holdem-two-tabs
:fix/casino-holdem-unreadable-save
:fix/casino-holdem-say-when-not-saving
:fix/casino-holdem-shortcut-discovery
:fix/casino-holdem-rulings-index-compact
:fix/casino-holdem-rulings-index
:fix/casino-holdem-payout-in-chips
:fix/casino-holdem-move-seat-on-touch
:fix/casino-holdem-amount-fields-select
:fix/casino-holdem-touch-targets-by-pointer
:fix/casino-holdem-button-box-model
:fix/casino-holdem-blind-badge-placement
:fix/casino-holdem-buyin-deals-in
:fix/casino-holdem-bet-vs-raise
:fix/casino-holdem-deal-around-broke
:fix/casino-holdem-settle-up
:fix/casino-holdem-allin-and-bar
:fix/casino-holdem-one-dealer-button
:fix/casino-holdem-manual-deal
:fix/casino-holdem-less-guessing
:feature/casino-holdem-seat-editor
:fix/casino-holdem-landscape-table
:feature/casino-holdem-acting-seat
:feature/casino-holdem-raise-guard
:feature/casino-holdem-first-run
:feature/casino-holdem-contrast-audit
:feature/casino-holdem-layout-audit
:feature/casino-holdem-blind-fairness
:feature/casino-holdem-rulings-depth
:feature/casino-holdem-bank-audit
:feature/casino-holdem-fewer-taps
:feature/casino-holdem-render-perf
:feature/casino-holdem-keyboard-focus
:feature/casino-holdem-resilience
:feature/casino-holdem-messy-tables
:feature/casino-holdem-touch-mobile
:chore/casino-holdem-tech-debt
:feature/casino-holdem-dealer-batch
:feature/casino-holdem-seat-count-safety
:feature/casino-holdem-odd-chip
:feature/casino-holdem-button-moves
:feature/casino-holdem-allin-runout
:feature/casino-holdem-heads-up
:feature/casino-holdem-contrast
:feature/casino-holdem-touch-audit
:feature/casino-holdem-wizard-polish
:feature/casino-quicksplit-side-pots
:feature/casino-holdem-rebuys
:feature/casino-holdem-rulings
:feature/casino-holdem-sidebar-polish
:feature/casino-holdem-keyboard
:feature/casino-holdem-action-undo
:feature/casino-holdem-pace
:feature/casino-holdem-side-pot-breakdown
:feature/casino-holdem-gestures
:feature/casino-holdem-card-picker
:feature/casino-holdem-live-betting
:feature/casino-holdem-bet-chips
:feature/casino-holdem-seat-legibility
:feature/casino-holdem-undo-toasts
:feature/casino-holdem-quick-split
:feature/casino-holdem-mobile-table
:feature/casino-holdem-hand-history
:feature/casino-texas-holdem
:feature/casino-holdem-dealer-mode-polish
:feature/fractional-learned-weights
:fix/stockfish-dispose-hang
:fix/blog-cache-staleness
:fix/workflows
:gitea/workflows
:echo-acoustic-ranging
:chess-ui-overhaul
:feature/customChessEngine
:feature/blog
:AddProject
:feature/generalUpdate
:tech-debt/chess-cleanup
:tests/CreatePlaywrightTests
:UpdateParticleSimulatorButton
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The most ordinary thing that happens in a home game: somebody stacks off, and they don't buy back in that second. The table dealt them in anyway, and the result was a hand nobody could finish. Stacked on #64.
Three players, two of them busted:
Every line of that is wrong. It announced a board being run out over a felt with no cards on it, promised a small blind from a seat that couldn't post one, took it from nobody, and then sat on a hand with no way forward.
Dealt around instead
A seat with no chips and nothing in the pot is dealt around. Seat, name and buy-in record untouched — sat out, not folded, because they didn't muck anything — and adding chips puts them straight back in the next hand.
Said before it happens, for the same reason the button move is: a dealer shouldn't find out from the felt. And the preview computes it on a view of the table rather than by changing it, so the promise and the deal ask the same question — the exact fault these two lines exist to prevent.
When it can't be dealt at all, it says who has to buy in rather than pretending it's a seating problem:
Two smaller things fall out
Broke is deliberately not the same as all-in, and the code says so: an all-in player has money riding on the hand. A seat with no stack recorded isn't broke either — those fall back to the table's starting stack.
Validation
13 tests (198 total), and 5 of them fail with the sit-out and the run-out guard taken back out.
Driven through Playwright at seven viewports in both states (dealt-around and blocked): layout and contrast clean everywhere except the landscape phone already documented in #63, and no console errors. Verified the buy-back-in path puts them in the next hand.
Left alone deliberately: a sat-out seat shows dimmed with a blank stack line rather than a "no chips" label. The dimming already reads as out-of-hand and the deal prompt gives the reason; labelling it would change how every manually sat-out seat draws, which is a bigger change than this fix needs.
The most ordinary thing that happens in a home game: somebody stacks off, and they don't buy back in that second. The table dealt them in anyway, and the result was a hand nobody could finish. Three players, two of them busted: bar before dealing: "Pot $0 | 3 players | All-in - running out the board (3 players) | Cal posts $1, Ann posts $2 | Post blinds & deal" after dealing: Cal posted nothing -- no chips to post with Ann posted $2 and was asked to check or bet against her own money liveSeats 3, isStreetComplete false, isHandOver false Every line of that is wrong. It announced a board being run out over a felt with no cards on it, promised a small blind from a seat that couldn't post one, took it from nobody, and then sat on a hand with no way forward. So a seat with no chips and nothing in the pot is dealt around. Their seat, name and buy-in record are untouched -- sat out, not folded, because they didn't muck anything -- and adding chips puts them straight back in the next hand. four players, Ben busted, button on Ann: "3 players | Cal posts $1, Dee posts $2 | Ben has no chips - sitting out this hand. | Post blinds & deal" -> Ben inHand false, folded false; blinds exactly as promised; Ann to act Said before it happens, for the same reason the button move is: a dealer shouldn't find out from the felt. And the preview computes it on a view of the table rather than by changing it, so the promise and the deal ask the same question -- the fault these two lines exist to prevent. When it can't be dealt at all, it says who has to buy in rather than pretending it's a seating problem: "Only Ann has chips - Ben and Cal need to buy in." "Nobody at the table has chips left. Add a buy-in to deal." Two smaller things fall out. The run-out banner is now gated on the betting actually being open -- before the deal, a table of busted players is indistinguishable from a table of all-ins to that test. And the bar's player count reads the table as it will be dealt, so someone waiting on a rebuy isn't announced as one of the players. Not the same as all-in, and the code says so: an all-in player has money riding on the hand. A seat with no stack recorded isn't broke either -- those fall back to the table's starting stack. 13 tests (198 total), and 5 of them fail with the sit-out and the run-out guard taken back out. Driven through the UI at seven viewports in both states: layout and contrast clean everywhere but the landscape phone already known from #63, and no console errors. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgbPull request closed