Dicey Table

TableObjectAction (engine)

TableObjectAction is the action field of an object-action intent — the complete set of things the runtime knows how to do to one entity. 23 values, declared as ObjectActionIntent["action"] in packages/shared/src/tableObjects/intents.ts and aliased as TableObjectAction.

This is the widest of three vocabularies. A table script may request 13 of them and a mod may request 10; Action vocabularies owns the comparison and the reasons for each narrowing, and Object actions owns the full 9-kind × 23-action participant matrix. This page is the value list with the surface column.

Two rules sit above every row: a locked entity refuses every action except unlock and press (a button ships locked on purpose, so locking it must not disable it), and an action aimed at an entity that does not exist does nothing.

The values#

The Players may send it for column is the per-kind participant gate. It does not apply to the host, so a table script or a host-side mod can address any action to any entity.

Value What the host does Players may send it for Table script Mod
lift Teleports the entity 0.75 ft straight up. every kind
flip Toggles faceDown and rotates 180° about local X. On a deck it also flips every card entry. card, deck
rotate Rotates 90° about local Y. every kind
lock Marks the entity locked and switches its rigidbody to static. every kind, while unlocked
unlock Clears the lock and restores the authored body type. every kind, while locked
tap Sets tapped to true. no kind ✓ (no handle method)
untap Sets tapped to false. no kind ✓ (no handle method)
shuffle Shuffles a deck's contents and starts the shuffle spin. Refused outright on any other kind, host-side as well as through the gate. deck
draw Draws the first item off the container. deck, bag
deal Deals from the container to the seated players. deck, bag
split Splits a stacked deck into two. deck, with more than one card ✓ (no handle method)
combine Merges the entity into a stack. card, deck ✓ (no handle method)
roll Throws a die with a randomized impulse and lets physics settle it. die
press Dips a button's cap, plays its sound and raises onPressed. Refused outright on any other kind, host-side as well as through the gate. Exempt from the locked rule — a locked button is still pressable. button ✗ (observe only)
flick Flicks the entity across the surface. every kind except board
reveal-all Clears the reveal team and, unless the entity is seat-owned, turns it face up. card, deck
reveal-team-a Reveals the entity to team A only. card, deck
reveal-team-b Reveals the entity to team B only. card, deck
peek Privately reveals the container's top N cards to the peeking player alone, and logs one public, identity-free line naming the count and the pile. Carries a count. deck, bag ✗ (observe only)
search Opens a private search: reveals the pile's whole contents to the searching player alone, subject to the authored audience, and logs one identity-free line. deck, bag ✗ (observe only)
search-pull Takes one named item out of a pile the actor is currently searching. Carries a cardId the host validates against that actor's live reveal. The public line never names it. deck, bag ✗ (observe only)
search-close Ends the session: applies the pile's authored order policy and revokes the reveal. deck, bag ✗ (observe only)
delete Destroys the entity, re-parents its children to its own ancestor, and removes its joints. every kind ✓ (as destroy())

Totals: 23 engine · 13 table script · 10 mod.

The four hidden-information rows — peek and the three search* actions — are host-authoritative private reveals. A table script may observe them; no surface may request one, because a script that could would manufacture a reveal for itself. What a search event does and does not carry is on DeckObject.onSearched, and who may open one is authored in Deck and Bag Search.

press is engine-and-observe only: it has no place in the table-script or mod request vocabularies, but a table script can watch it — ButtonObject.onPressed fires, and press is a member of ObservedObjectAction. A player presses a button and the host raises the action; a script reacts.

Two things the table column does not say#

tap and untap are on the table-script allowlist and are refused for every kind on the participant path, so no player or spectator can ever send them. See Known limitations.

Four of the thirteen a table script may request — tap, untap, split, combine — have no ObjectHandle method, so the typed API cannot call them even though the allowlist would pass them. A mod can call split and combine, because mod scripting passes the action name as a string. See Known limitations.

See also#