Somebody rebuying is the most common interruption in a cash game, and the only way to record it was to open the seat editor and retype a stack from memory. Press and hold a seat and there's now "Add chips…": quick amounts off the table's starting stack — half a buy-in, a buy-in, two — with a keypad for the times it isn't one of those. It's undoable like every other seat action, and it records cash handed over as well as chips added, because those answer different questions. The stack moves every hand; what a player has paid in only moves when they buy. The export gains bought in, chips now, and up/down, so settling up at the end of the night is reading a row rather than reconstructing it. Getting that last column right needed care. Chips in front of a player disagree with the hand log for as long as a hand is open — and since blinds post the instant the previous hand settles, that window is almost always. Counting what a player already has in the current pot as still theirs makes the cash position agree with the hand log at any moment, including across a rebuy. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgb
82 lines
3.1 KiB
JavaScript
82 lines
3.1 KiB
JavaScript
// The long-press menu on a seat. Everything a dealer does to one player mid-hand,
|
|
// one press and one tap away, without opening the full editor and without hunting
|
|
// for whose turn it is in the action bar.
|
|
const SeatMenu = {
|
|
state: null,
|
|
hooks: null,
|
|
seatIndex: null,
|
|
|
|
open(state, hooks, seatIndex) {
|
|
this.state = state;
|
|
this.hooks = hooks;
|
|
this.seatIndex = seatIndex;
|
|
this.render();
|
|
document.getElementById("seatMenuOverlay").hidden = false;
|
|
},
|
|
|
|
close() {
|
|
document.getElementById("seatMenuOverlay").hidden = true;
|
|
},
|
|
|
|
// Only the actions that make sense for this seat right now — a folded player has
|
|
// nothing to go all-in with, and an empty chair has nothing to fold.
|
|
actionsFor(player, index) {
|
|
const actions = [];
|
|
const dealtIn = player.inHand;
|
|
const live = dealtIn && !player.folded;
|
|
|
|
if (live) {
|
|
actions.push({ label: "Fold", className: "menuDanger", run: () => this.hooks.fold(index) });
|
|
actions.push({ label: "All-in", className: "menuAccent", run: () => this.hooks.allIn(index) });
|
|
} else if (dealtIn && player.folded) {
|
|
actions.push({ label: "Un-fold", run: () => this.hooks.unfold(index) });
|
|
}
|
|
|
|
// The most common interruption in a cash game, and until now it meant opening
|
|
// the editor and retyping a stack from memory.
|
|
actions.push({ label: "Add chips…", run: () => this.hooks.addChips(index) });
|
|
|
|
actions.push({
|
|
label: dealtIn ? "Sit out" : "Deal in",
|
|
run: () => this.hooks.toggleDealtIn(index),
|
|
});
|
|
|
|
if (!this.state.dedicatedDealer && index !== this.state.dealerSeatIndex) {
|
|
actions.push({ label: "Give the button", run: () => this.hooks.makeDealer(index) });
|
|
}
|
|
|
|
actions.push({ label: "Edit seat…", run: () => this.hooks.editSeat(index) });
|
|
return actions;
|
|
},
|
|
|
|
render() {
|
|
const player = this.state.seats[this.seatIndex];
|
|
document.getElementById("seatMenuTitle").textContent = HoldemState.displayName(player, this.seatIndex);
|
|
|
|
const stack = Betting.stackOf(this.state, player);
|
|
const owed = Betting.toCall(this.state, player);
|
|
const bits = [];
|
|
if (stack > 0) bits.push(`${Money.format(stack)} behind`);
|
|
if (owed > 0) bits.push(`${Money.format(owed)} to call`);
|
|
document.getElementById("seatMenuSubtitle").textContent = bits.join(" · ");
|
|
|
|
const list = document.getElementById("seatMenuActions");
|
|
list.innerHTML = "";
|
|
this.actionsFor(player, this.seatIndex).forEach(action => {
|
|
const btn = document.createElement("button");
|
|
btn.type = "button";
|
|
btn.className = `seatMenuBtn ${action.className || ""}`;
|
|
btn.textContent = action.label;
|
|
btn.addEventListener("click", () => {
|
|
this.close();
|
|
action.run();
|
|
});
|
|
list.appendChild(btn);
|
|
});
|
|
},
|
|
};
|
|
|
|
if (typeof module !== "undefined" && module.exports) {
|
|
module.exports = SeatMenu;
|
|
}
|