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#
- Action vocabularies — the three lists side by side, and why each narrowing exists.
- ObjectAction (table script) — the 13 a table script may request.
- Sandbox-safe object actions — the 10 a mod may request.
- Object actions — the full kind-by-action participant matrix.
api.objectAction— how a mod requests one.
