Seats
A seat is a player’s place at the table. The layout
block lists one seat per player in layout.seats[], and each seat anchors the
player’s personal view — their hand, their tray, anything placed in
seatLocal space.
A seat carries just two fields:
| Field | Type | Meaning |
|---|---|---|
index | number | The seat’s stable id (0-based). setup placements and per-seat references target a seat by this index |
angle | number (degrees) | Where the seat sits around the table, clockwise. 0 = the far edge (across from the local player); 180 = the near edge (the local seat). In [0, 360) |
The angle convention
Angles run clockwise from the far edge. 0 is straight across the table
from you, 180 is your own near edge, and 90 / 270 are the right and
left sides. Think of it from the local player’s chair looking out across the
felt — 0 is the opponent opposite, 180 is right in front of you.
Seat count must match the player count
There must be exactly one seat per maximum player: layout.seats.length
must equal meta.playerCount.max. The pipeline checks this — a mismatch is a
validation error. Add or remove seats by changing the max player count and
re-placing them on the table.
How seatLocal placement uses seats
A zone placed in seatLocal space is instantiated
once per seat, each copy rotated to that seat’s angle. That’s how a hand
or a personal tray appears in front of every player, correctly oriented. The
matching idea on the zone side is scope: a perSeat zone
gives each seated player their own instance.
How to edit in the Studio
Open your game → Layout tab. Seats are drawn around the table edge; drag
one to change its angle. To change how many seats there are, adjust the
game’s max player count — the editor keeps seats.length aligned with
playerCount.max.
Related
- Layout — table space vs.
seatLocal - Zone scope —
sharedvs.perSeatzones - Setup placements — placing into one seat’s zone