Player
Seat navigation, table roles, rotation and partnerships.
Two ways in:
| Access | What you get |
|---|---|
import { … } from "@workspace/bridge/player" | Every function below. |
engine.player.* | A subset: getNextPlayer, getCurrentPlayer, getPlayersFromDealer, getPlayersInTrickOrder, rotatePlayerNTimes, getRotationCountToTarget, getPartnership, partnershipFromSide. |
engine.player takes no configuration; it is a convenience grouping. isPlayer, getPartner, getPlayerAtOffset, getLeadPlayer, getRoles and getOpposingPartnership are only in @workspace/bridge/player.
Player is "N" | "E" | "S" | "W", Partnership is "NS" | "EW", PlayerSide is "attack" | "defense". Clockwise order is N → E → S → W.
Navigation
| Function | Signature | Description |
|---|---|---|
isPlayer | (value: string) => value is Player | Case-insensitive guard. |
getNextPlayer | (player: Player) => Player | Left-hand opponent. |
getPartner | (player: Player) => Player | Opposite seat. |
getCurrentPlayer | (dealer: Player, sequenceLength: number) => Player | Whose turn after n calls from the dealer. |
getPlayerAtOffset | (start: Player, offset?: number) => Player | n seats clockwise from start. |
getPlayersFromDealer | (dealer: Player) => [Player, Player, Player, Player] | Clockwise from the dealer. |
getPlayersInTrickOrder | (lead: Player) => Player[] | Clockwise from the leader. |
isPlayer("n"); // => true (case-insensitive)
getNextPlayer("N"); // => "E"
getPartner("N"); // => "S"
getCurrentPlayer("N", 3); // => "W" (the seat that bids 4th after a North dealer)
getPlayerAtOffset("W", 2); // => "E"
getPlayersFromDealer("S"); // => ["S", "W", "N", "E"]
getPlayersInTrickOrder("E"); // => ["E", "S", "W", "N"]Table roles
| Function | Signature | Description |
|---|---|---|
getLeadPlayer | (declarer?: Player) => Player | Opening leader: left of declarer. Declarer defaults to South. |
getRoles | (declarer?: Player) => { lead: Player; dummy: Player } | Lead and dummy relative to the declarer. |
getLeadPlayer("S"); // => "W" (left of declarer)
getRoles("S"); // => { lead: "W", dummy: "N" }
getRoles(); // defaults to a South declarerRotation
| Function | Signature | Description |
|---|---|---|
rotatePlayerNTimes | (player: Player, count: number) => Player | count seats clockwise. |
getRotationCountToTarget | (from: Player, to: Player) => number | Clockwise steps from from to to (0–3). |
rotatePlayerNTimes("N", 2); // => "S"
getRotationCountToTarget("N", "W"); // => 3Partnerships and sides
N/S are the attacking (declaring) side by convention; E/W defend.
| Function | Signature | Description |
|---|---|---|
getPartnership | (player: Player) => Partnership | |
getOpposingPartnership | (partnership: Partnership) => Partnership | |
partnershipFromSide | (side: PlayerSide) => Partnership | attack → NS, defense → EW. |
getPartnership("N"); // => "NS"
getOpposingPartnership("NS"); // => "EW"
partnershipFromSide("attack"); // => "NS"Engine module
const engine = createBridgeEngine(createBridgeContext());
engine.player.getNextPlayer("W"); // => "N"
engine.player.getPartnership("S"); // => "NS"