# Room and Pack Fields for AI Agents

> Room and pack field ids for AI agents: room decor, lights, sounds and openings, table pack values, pack assignment and the environment in DiceyTable.

- Question: Which room and table pack fields can an agent set?
- Source: https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs
- Last verified: 2026-10-09

These are the fields of a room and a table pack. A room has decor, lights, sounds and openings. A table has its play surface and seat ring. You also set which packs a project uses, and the environment.

## Panels in this group

18 panels, with the id prefixes `room`, `table-pack`, `pack`, `environment`. The [field catalogue](https://diceytable.com/docs/ai-agents/reference/fields) lists every group.

| Panel | Label | Tab | Fields | Actions |
|---|---|---|---|---|
| [`room.settings`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomsettings) | Game and room settings | `editor` | 6 | 0 |
| [`room.exterior`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomexterior) | Outside the room | `editor` | 2 | 0 |
| [`room.surfaces`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomsurfaces) | Room surfaces | `editor` | 5 | 2 |
| [`room.posters`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomposters) | Posters | `editor` | 7 | 1 |
| [`room.openings`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomopenings) | Openings | `editor` | 7 | 11 |
| [`room.decor`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomdecor) | Room decor | `editor` | 15 | 2 |
| [`room.scenery-lights`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomscenery-lights) | Scenery lights | `editor` | 5 | 1 |
| [`room.lights`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomlights) | Room lights | `editor` | 0 | 1 |
| [`room.light`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomlight) | Room light | `editor` | 33 | 1 |
| [`environment`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#environment) | Environment | `editor` | 7 | 1 |
| [`table-pack`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#table-pack) | Table pack | `editor` | 8 | 5 |
| [`table-pack.collider`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#table-packcollider) | Table collider | `editor` | 4 | 3 |
| [`table-pack.play-surface`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#table-packplay-surface) | Play surface | `editor` | 4 | 0 |
| [`table-pack.seat-ring`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#table-packseat-ring) | Seat ring | `editor` | 3 | 2 |
| [`pack.assign`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#packassign) | Pack assignment | `editor` | 0 | 8 |
| [`room.shell`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomshell) | Room shell | `editor` | 3 | 2 |
| [`room.sounds`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomsounds) | Room sounds | `editor` | 0 | 1 |
| [`room.sound`](https://diceytable.com/docs/ai-agents/reference/fields/rooms-and-packs#roomsound) | Sound emitter | `editor` | 16 | 2 |

## `room.settings`

**Game and room settings** · surface `editor` · singleton (no target)

How it opens: Select the Room row in the Hierarchy; the settings block.

**Fields** (6)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.settings.debug-rigidBodies` | Rigid Bodies | `boolean` | — | — | W | — | Editor overlay: draw rigid-body wireframes. |
| `room.settings.debug-triggers` | Triggers | `boolean` | — | — | W | — | Editor overlay: draw trigger volumes. |
| `room.settings.debug-playerZones` | Player Zones | `boolean` | — | — | W | — | Editor overlay: draw player zones. |
| `room.settings.min-players` | Min Players | `integer` | — | — | W | ≥ 1, step 1 | Fewest players the game supports (raises Max to match). |
| `room.settings.max-players` | Max Players | `integer` | — | — | W | ≥ 1, step 1 | Most players the game supports (never below Min). |
| `room.settings.player-counts` | Supported Player Counts | `text` | — | — | W | — | Comma-separated exact player counts (e.g. `2, 3, 4`); blank allows any count from Min to Max. |

## `room.exterior`

**Outside the room** · surface `editor` · singleton (no target)

How it opens: Select the Room row; the exterior block (shown once the room has an opening).

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.exterior.ground` | Outside the room | `select` | — | — | W | `plane`, `none` | What shows below the horizon through an opening: a ground plane (recommended) or sky all the way down. |
| `room.exterior.color` | Ground colour | `text` | — | — | W | — | The exterior ground colour as #rrggbb. |

## `room.surfaces`

**Room surfaces** · surface `editor` · target `room`

How it opens: Select Floor, Ceiling or a wall under Room ▸ Walls.

**Fields** (5)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.surfaces.hidden` | Hide this surface | `boolean` | — | `room` | W | — | Hide the surface (visual only; its collider stays). Target id: one of ceiling, floor, north, east, south, west. |
| `room.surfaces.color` | Color | `color` | — | `room` | W | — | Surface colour as [r, g, b] in 0..1. Target id: the surface id. |
| `room.surfaces.tiling` | Tiling | `number` | — | `room` | W | ≥ 0.1, ≤ 16, step 0.1 | Texture repeats across the surface. Target id: the surface id. |
| `room.surfaces.texture` | Texture | `asset-ref` | — | `room` | W | — | Surface texture (a project image path; null clears). Target id: the surface id. |
| `room.surfaces.material` | Material | `asset-ref` | — | `room` | W | — | The surface's scene material (a material id; null clears). Target id: the surface id. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.surfaces.openings` | Openings | R | `room` | Select this surface's Openings folder. |
| `room.surfaces.add-poster` | Add Poster | W | `room` | Add a poster to this wall. |

## `room.posters`

**Posters** · surface `editor` · target `room`

How it opens: Select a poster under its wall.

**Fields** (7)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.posters.label` | Label | `text` | — | `room` | W | — | The poster's name. |
| `room.posters.u` | Horizontal (U) | `number` | — | `room` | W | ≥ -1, ≤ 1, step 0.05 | Horizontal position across the wall, -1 (left edge) … 1 (right edge). |
| `room.posters.v` | Vertical (V) | `number` | — | `room` | W | ≥ -1, ≤ 1, step 0.05 | Vertical position up the wall, -1 … 1. |
| `room.posters.width` | Width | `length` | `length` | `room` | W | ≥ 0.1, ≤ 8, step 0.1 | Poster width in feet. |
| `room.posters.height` | Height | `length` | `length` | `room` | W | ≥ 0.1, ≤ 6, step 0.1 | Poster height in feet. |
| `room.posters.rotation` | Rotation (deg) | `angle` | `degrees` | `room` | W | step 1 | Poster rotation in degrees. |
| `room.posters.image` | Image | `asset-ref` | — | `room` | W | — | The poster's image (a project image path; null clears). |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.posters.delete` | Delete Poster | D | `room` | Delete this poster. Undoable. |

## `room.openings`

**Openings** · surface `editor` · target `room`

How it opens: Select an opening under its wall.

**Fields** (7)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.openings.label` | Label | `text` | — | `room` | W | — | The opening's name. |
| `room.openings.surface` | Surface | `select` | — | `room` | W | `ceiling`, `floor`, `north`, `east`, `south`, `west` | Which surface the opening is cut in. |
| `room.openings.u` | Across (-1…1) | `number` | — | `room` | W | ≥ -1, ≤ 1, step 0.05 | Centre across the surface, -1 … 1 (±1 is flush with the edge). |
| `room.openings.v` | Up (-1…1) | `number` | — | `room` | W | ≥ -1, ≤ 1, step 0.05 | Centre up (or along) the surface, -1 … 1. |
| `room.openings.width` | Width | `length` | `length` | `room` | W | ≥ 0.1, ≤ 64, step 0.5 | Opening width in feet (clipped to the surface). |
| `room.openings.height` | Height | `length` | `length` | `room` | W | ≥ 0.1, ≤ 64, step 0.5 | Opening height in feet. |
| `room.openings.open` | Open (no glass) | `boolean` | — | `room` | W | — | On: no collider across the opening, so pieces can leave the room. Off (glazed): an invisible collider still holds them in. |

**Actions** (11)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.openings.add-window` | Add window | W | `room` | Cut a window-shaped opening in this surface (target id: the surface id). |
| `room.openings.add-door` | Add door | W | `room` | Cut a door-shaped opening in this surface. |
| `room.openings.add-wide` | Add wide opening | W | `room` | Cut a wide opening in this surface. |
| `room.openings.add-whole` | Remove whole surface | W | `room` | An opening the size of the surface (a missing wall). |
| `room.openings.select` | Select opening | R | `room` | Select this opening in the Hierarchy (target id: the opening id). |
| `room.openings.reshape-window` | Re-shape: window | W | `room` | Re-shape this opening to the window preset. |
| `room.openings.reshape-door` | Re-shape: door | W | `room` | Re-shape this opening to the door preset. |
| `room.openings.reshape-wide` | Re-shape: wide | W | `room` | Re-shape this opening to the wide preset. |
| `room.openings.reshape-whole` | Re-shape: whole surface | W | `room` | Re-shape this opening to cover the whole surface. |
| `room.openings.duplicate` | Duplicate | W | `room` | Duplicate this opening. |
| `room.openings.delete` | Delete Opening | D | `room` | Delete this opening. Undoable. |

## `room.decor`

**Room decor** · surface `editor` · target `room`

How it opens: Select a decor item under Room.

**Fields** (15)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.decor.add-model` | Add from model | `select` | — | `room` | W | — | Place a project model (repo-relative path). Target id `decor` adds a prop, `environment` adds scenery. Each set adds one placement. |
| `room.decor.label` | Label | `text` | — | `room` | W | — | The placement's name. |
| `room.decor.scope` | Scope | `select` | — | `room` | W | `decor`, `environment` | Decor: a prop inside the play box, kept within the room's bounds. Environment: the building/terrain around the box, no collision. |
| `room.decor.position-x` | Position X | `length` | `length` | `room` | W | step 0.1 | X in feet (the live control carries the scope's bounds). |
| `room.decor.position-y` | Position Y | `length` | `length` | `room` | W | step 0.1 | Y in feet. |
| `room.decor.position-z` | Position Z | `length` | `length` | `room` | W | step 0.1 | Z in feet. |
| `room.decor.rotation-x` | Rotation X | `angle` | `degrees` | `room` | W | step 5 | Rotation about X in degrees. |
| `room.decor.rotation-y` | Rotation Y | `angle` | `degrees` | `room` | W | step 5 | Rotation about Y in degrees. |
| `room.decor.rotation-z` | Rotation Z | `angle` | `degrees` | `room` | W | step 5 | Rotation about Z in degrees. |
| `room.decor.uniform-scale` | Lock scale to uniform | `boolean` | — | — | W | — | While on, editing one Scale axis writes all three. Editor view state; nothing is saved. |
| `room.decor.scale-x` | Scale X | `number` | — | `room` | W | ≥ 0.01, step 0.1 | Scale along X. |
| `room.decor.scale-y` | Scale Y | `number` | — | `room` | W | ≥ 0.01, step 0.1 | Scale along Y. |
| `room.decor.scale-z` | Scale Z | `number` | — | `room` | W | ≥ 0.01, step 0.1 | Scale along Z. |
| `room.decor.cast-shadows` | Cast shadows | `boolean` | — | `room` | W | — | Adds a shadow caster (off by default; shadow views can refuse a publish). |
| `room.decor.locked` | Lock placement | `boolean` | — | `room` | W | — | Not clickable in the viewport (still selectable in the Hierarchy). |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.decor.align-floor` | Align floor to room floor | W | `room` | Move this environment scenery up or down so its floor lands on the room floor. Undoable. |
| `room.decor.delete` | Delete Placement | D | `room` | Delete this decor / scenery placement. Undoable. |

## `room.scenery-lights`

**Scenery lights** · surface `editor` · target `light`

How it opens: Select a scenery light under Environment Scenery.

**Fields** (5)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.scenery-light.enabled` | Light is on | `boolean` | — | `light` | W | — | Stored as an override on the placement; the model is untouched. |
| `room.scenery-light.color` | Colour | `color` | — | `light` | W | — | Light colour override. |
| `room.scenery-light.intensity` | Intensity | `number` | — | `light` | W | ≥ 0, ≤ 8, step 0.1 | Intensity override. |
| `room.scenery-light.range` | Range | `length` | `length` | `light` | W | ≥ 0.1, ≤ 120, step 0.5 | Range override in feet (point/spot). |
| `room.scenery-light.cast-shadows` | Cast shadows | `boolean` | — | `light` | W | — | Opt this scenery light into shadows (off by default whatever the model says). |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.scenery-light.reset` | Reset to the model's values | W | `light` | Drop this scenery light's overrides. |

## `room.lights`

**Room lights** · surface `editor` · singleton (no target)

How it opens: Select Room ▸ Lights in the Hierarchy (Add Light, the room budget).

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.light.add` | Add Light | W | — | Add a room light (open the room.lights panel first: the button lives on the Lights folder). The new light is selected, so its room.light fields are on screen next. |

## `room.light`

**Room light** · surface `editor` · target `light`

How it opens: Select the light under Room ▸ Lights.

**Fields** (8)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.light.label` | Label | `text` | — | `light` | W | — | The light's name in the Hierarchy. |
| `room.light.type` | Type | `select` | — | `light` | W | `point`, `spot`, `directional` | Room lights spell the omni type `point` (the engine and the light component say `omni`). |
| `room.light.color` | Color | `color` | — | `light` | W | — | Light colour as [r, g, b] in 0..1 (stored as #rrggbb). |
| `room.light.intensity` | Intensity | `number` | — | `light` | W | ≥ 0, ≤ 8, step 0.1 | Brightness, 0..8. |
| `room.light.position` | Position | `length-vec3` | `length` | `light` | W | — | World position [x, y, z] in feet. |
| `room.light.rotation` | Rotation | `vec3` | `degrees` | `light` | W | — | Euler rotation [x, y, z] in degrees. Meaningful for directional and spot lights. |
| `room.light.followSkyRotation` | Follow sky | `boolean` | — | `light` | W | — | Turn this light with the sky (the "sun" flag). Costs a shadow-map rebuild while the sky spins. |
| `room.light.range` | Range | `length` | `length` | `light` | W | ≥ 0.1, ≤ 60, step 0.1 | Falloff distance in feet (point and spot lights). |

**Derived field families** (1)

| Id pattern | Family | Fields | Keys | Target |
|---|---|---|---|---|
| `room.light.<key>` | room light — shadow, bake and layer block | 25 | `falloffMode`, `innerConeAngle`, `outerConeAngle`, `isStatic`, `bake`, `bakeDir`, `bakeNumSamples`, `bakeArea`, `affectLightmapped`, `affectDynamic`, `affectSpecularity`, `castShadows`, `shadowUpdateMode`, `shadowResolution`, `numCascades`, `shadowDistance`, `shadowIntensity`, `shadowType`, `shadowSamples`, `shadowBlockerSamples`, `penumbraSize`, `penumbraFalloff`, `shadowBias`, `normalOffsetBias`, `layers` | `light` |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.light.delete` | Delete Light | D | `light` | Delete this room light. Undoable. |

## `environment`

**Environment** · surface `editor` · singleton (no target)

How it opens: Select the Room row; the Environment block (ambient, fog, sky).

**Fields** (7)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `environment.ambient` | Ambient | `color` | — | — | W | — | Ambient light colour as [r, g, b] in 0..1. |
| `environment.fog` | Fog | `boolean` | — | — | W | — | Enable scene fog. |
| `environment.fog-color` | Fog color | `color` | — | — | W | — | Fog colour as [r, g, b] in 0..1. |
| `environment.fog-density` | Fog density | `number` | — | — | W | ≥ 0, step 0.01 | Exponential fog density (>= 0). |
| `environment.skybox` | Skybox | `asset-ref` | — | — | W | — | Sky texture asset (panorama), or null for none. The sky also lights the room. |
| `environment.sky-rotation` | Sky rotation | `vec3` | `degrees` | — | W | — | Sky orientation [x, y, z] in degrees. Rotates what the sky lights the room with, too. Only shown with a skybox assigned. |
| `environment.sky-spin` | Sky spin (°/sec) | `vec3` | `degrees` | — | W | ≥ -360, ≤ 360, step 0.01 | Continuous sky rotation per axis in degrees per second. Every peer derives the angle from the clock; nothing replicates per frame. Only shown with a skybox assigned. |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `environment.bake` | Bake | W | — | Bake static lighting for the room and any model flagged Static scenery. Freezes the viewport while it runs; local to this tab, nothing replicates. |

## `table-pack`

**Table pack** · surface `editor` · singleton (no target)

How it opens: Select the Table row in the Hierarchy.

**Fields** (8)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table-pack.model-path` | Model | `select` | — | — | W | — | The table's GLB as a repo-relative path from this project ("" for no model). The fit below is data, never measured from the mesh. |
| `table-pack.model-scale` | Scale | `vec3` | — | — | W | — | Model scale [x, y, z]. Zero is treated as 1. |
| `table-pack.model-offset` | Offset | `length-vec3` | `length` | — | W | — | Model offset [x, y, z] in feet. |
| `table-pack.model-yaw` | Yaw (deg) | `angle` | `degrees` | — | W | ≥ -360, ≤ 360, step 5 | Model yaw in degrees. |
| `table-pack.model-cast-shadows` | Cast shadows | `boolean` | — | — | W | — | Whether the table model casts shadows. |
| `table-pack.model-receive-shadows` | Receive shadows | `boolean` | — | — | W | — | Whether the table model receives shadows. |
| `environment.table-surface-color` | Surface color | `color` | — | — | W | — | Pre-mode editor only (the Table row without a table pack): the built-in table's top colour as [r, g, b] in 0..1. |
| `environment.table-surface-texture` | Surface texture | `asset-ref` | — | — | W | — | Pre-mode editor only: the built-in table top's texture (a project image path; null clears it). |

**Actions** (5)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table-pack.fit-model` | Fit to play surface | W | — | Scale and place the model so its top sits on the play surface, its base on the room floor, and its footprint matches the authored footprint. Undoable. |
| `table-pack.rest-on-floor` | Rest on floor | W | — | Adjust Scale Y and Offset Y so the base sits on the room floor and the top stays on the play surface. Undoable. |
| `table-pack.edit-model` | Edit model | R | — | Open the table's model in the Model tab (tree, colliders, trigger volumes). |
| `table-pack.edit-triggers` | Edit in model editor | R | — | Trigger volumes live on the model asset: open it in the model editor. |
| `table-pack.surface-rebase.apply` | Move objects / Use this table | W | — | Apply the staged table switch and move the listed objects and seat layouts onto the new play-surface height. Undoable. |

## `table-pack.collider`

**Table collider** · surface `editor` · singleton (no target)

How it opens: Select the Table row; the collider panel.

**Fields** (4)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table-pack.collider.mode` | Collider | `select` | — | — | W | `primitive:box`, `primitive:cylinder`, `visible-geometry` | The table's collider: a box or cylinder primitive (recommended), or the visible geometry as a static triangle mesh. Switching to visible geometry clears the under-table-gaps acknowledgement. |
| `table-pack.collider.extend-to-floor` | Extend to floor | `boolean` | — | — | W | — | Primitive collider only: solid from the play surface down to the room floor, so nothing can rest under the table. |
| `table-pack.collider.half-height` | Half-height | `length` | `length` | — | W | — | Primitive collider with Extend to floor off: half the slab's thickness in feet. Thinner than 0.03 ft is refused (pieces tunnel through it). |
| `table-pack.collider.acknowledge-gaps` | I accept under-table gaps | `boolean` | — | — | W | — | Visible-geometry collider only: records that pieces may end up under the table, out of reach. |

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table-pack.collider.edit-model` | Edit in model editor | R | — | Open the model editor for a collider authored on the model asset. |
| `table-pack.collider.use-suggestion` | Use this | W | — | Adopt the detected collider shape shown above the Collider select (only offered once a detection has run). |
| `table-pack.collider.detect` | Detect shape | R | — | Measure the table model and show a suggested collider shape with its reason. Suggests only; applies nothing. |

## `table-pack.play-surface`

**Play surface** · surface `editor` · singleton (no target)

How it opens: Select the Table row; the play-surface panel.

**Fields** (4)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table-pack.play-surface.surface-y` | Surface Y | `length` | `length` | — | W | ≥ -8, ≤ 8, step 0.01 | World height of the play surface in feet. The table is its only owner (O-30); changing it offers to re-derive the seat ring. |
| `table-pack.play-surface.half-x` | Half X | `length` | `length` | — | W | ≥ 0.1, ≤ 9, step 0.05 | Half the surface's X extent, in feet. |
| `table-pack.play-surface.half-z` | Half Z | `length` | `length` | — | W | ≥ 0.1, ≤ 9, step 0.05 | Half the surface's Z extent, in feet. |
| `table-pack.play-surface.material` | Material | `select` | — | — | W | `wood`, `cardboard`, `metal`, `plastic`, `card`, `tile`, `felt`, `cloth`, `glass`, `stone` | What the top is covered with; every piece landing on it is heard through it (felt and cloth muffle, glass and stone ring). |

## `table-pack.seat-ring`

**Seat ring** · surface `editor` · singleton (no target)

How it opens: Select the Table row; the seat-ring panel.

**Fields** (3)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table-pack.seat-ring.seats` | Seats | `integer` | — | — | W | ≥ 1, ≤ 10, step 1 | How many seats the table lays out. |
| `table-pack.seat-ring.layout` | Layout | `select` | — | — | W | `edge`, `radial` | Edge walks the rectangle; Radial spaces seats evenly in a circle (round or oval tables). |
| `table-pack.seat-ring.radius` | Distance from centre | `length` | `length` | — | W | ≥ 0, ≤ 50, step 0.05 | Radial layout only: the ring's radius override in feet (Fit to table clears it). |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table-pack.seat-ring.fit-radius` | Fit to table | W | — | Clear the radial ring's radius override so it tracks the table footprint again. |
| `table-pack.seat-ring.rederive` | Re-derive seat ring | W | — | Move seats onto the table's current seat ring (keeps everything else authored). Undoable. |

## `pack.assign`

**Pack assignment** · surface `editor` · singleton (no target)

How it opens: Open the Pack tab, or the pack block on the Room/Table row.

**Actions** (8)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `pack.assign.retry` | Try again | R | `room` | Re-read the pack registry after a failed fetch. |
| `pack.assign.bump` | Update pin | W | `room` | Re-pin the assigned pack to the newer published version offered. Undoable. |
| `pack.assign.change` | Change / Choose… | R | `room` | Open the room / table picker (dialog.pack-picker). Nothing changes until the picker applies. |
| `pack.assign.remove` | Remove | W | `room` | Remove the pack assignment and go back to the built-in room / table. Undoable. |
| `pack.assign.open-tab` | Open pack tab | R | `room` | Open (or focus) the in-app Pack tab. |
| `pack.assign.extract` | Extract to a pack… | R | `room` | Review extracting this game's room / table into its own pack (dialog.pack-move). Nothing moves until that dialog confirms. |
| `pack.assign.detach` | Detach & vendor… | R | `room` | Review copying the pack's content into this game and dropping the pin (dialog.pack-move). |
| `pack.assign.lift-out` | Lift out… | R | `room` | Open the picker to lift a room / table out of any published pack. |

## `room.shell`

**Room shell** · surface `editor` · singleton (no target)

How it opens: Select the Room group row in the Hierarchy (floor, walls, ceiling switches).

**Fields** (3)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.shell.floor` | Floor | `boolean` | — | — | W | — | Show the built-in floor. Hiding is visual only: the collider stays. |
| `room.shell.walls` | Walls | `boolean` | — | — | W | — | Show all four built-in walls. Hiding is visual only: the colliders stay. |
| `room.shell.ceiling` | Ceiling | `boolean` | — | — | W | — | Show the built-in ceiling. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.shell.hide-all` | Hide all | W | — | Hide the built-in floor, walls and ceiling (visual only; colliders stay). |
| `room.shell.show-all` | Show all | W | — | Show the built-in floor, walls and ceiling. |

## `room.sounds`

**Room sounds** · surface `editor` · singleton (no target)

How it opens: Select Room ▸ Sounds in the Hierarchy (Room Editor).

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.sound.add` | Add Sound Emitter | W | — | Add an ambient sound emitter to the room (silent until a Sound is picked). |

## `room.sound`

**Sound emitter** · surface `editor` · target `room`

How it opens: Select the emitter under Room ▸ Sounds.

**Fields** (16)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `room.sound.label` | Label | `text` | — | `room` | W | — | The emitter's name in the Hierarchy. |
| `room.sound.sound` | Sound | `asset-ref` | — | `room` | W | — | The audio file this emitter plays: a project path such as `sounds/rain.mp3` (list them with asset_list). null = silent until one is picked. |
| `room.sound.enabled` | Enabled | `boolean` | — | `room` | W | — | Off = placed but silent, settings kept. |
| `room.sound.position` | Position | `length-vec3` | `length` | `room` | W | — | World position [x, y, z] in feet — where the sound comes from. |
| `room.sound.volume` | Volume | `slider` | `percent` | `room` | W | ≥ 0, ≤ 1, step 0.01 | 0..1. Each listener also applies their own Environment and Master volume. |
| `room.sound.playback` | Playback | `select` | — | `room` | W | `loop`, `delay`, `random-delay` | loop = continuous seamless loop; delay = wait Delay seconds, play once, repeat; random-delay = the same with each wait drawn between Min and Max delay. The wait also happens before the FIRST play. |
| `room.sound.delay` | Delay | `number` | — | `room` | W | ≥ 0, ≤ 3600, step 0.5 | Seconds before the first play and after each play (Playback = delay). |
| `room.sound.min-delay` | Min delay | `number` | — | `room` | W | ≥ 0, ≤ 3600, step 0.5 | Shortest random wait, in seconds (Playback = random-delay). |
| `room.sound.max-delay` | Max delay | `number` | — | `room` | W | ≥ 0, ≤ 3600, step 0.5 | Longest random wait, in seconds (Playback = random-delay). A max below the min is treated as the pair swapped. |
| `room.sound.pitch` | Pitch | `number` | — | `room` | W | ≥ 0.25, ≤ 4, step 0.05 | Playback rate; 1 = as recorded. |
| `room.sound.pitch-variation` | Pitch variation | `number` | — | `room` | W | ≥ 0, ≤ 0.5, step 0.01 | ± random pitch per play (0..0.5). Delayed modes only; keeps a repeated one-shot from sounding mechanical. |
| `room.sound.positional` | 3D positional | `boolean` | — | `room` | W | — | On = heard from its position and fades with distance; off = the same level everywhere (a room tone). |
| `room.sound.distance-model` | Distance model | `select` | — | `room` | W | `linear`, `inverse`, `exponential` | How volume falls off between Ref distance and Max distance (PlayCanvas's linear / inverse / exponential). |
| `room.sound.ref-distance` | Ref distance | `length` | `length` | `room` | W | — | Within this distance (feet) the sound plays at full volume. |
| `room.sound.max-distance` | Max distance | `length` | `length` | `room` | W | — | Beyond this distance (feet) it stops attenuating — with Linear, it is silent. |
| `room.sound.rolloff` | Roll-off | `number` | — | `room` | W | ≥ 0, ≤ 10, step 0.1 | How quickly the volume falls between the two distances (0..10). |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `room.sound.delete` | Delete Emitter | D | `room` | Delete this sound emitter. Undoable. |
| `room.sound.preview` | Restart | R | `room` | Restart this emitter's schedule now, so its sound plays (after its first delay) without reloading the room. |
