> For the complete documentation index, see [llms.txt](https://docs.cuxial.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cuxial.com/scripts/leisure/cuxial-domino/configuration.md).

# Configuration

Every option of Cuxial Domino explained: tables, match rules, bets, cameras and tile placement.

Everything you can adjust lives in `shared/config.lua`. Restart the resource after any change.

Each table also carries its own settings, chosen when it is created in the admin tablet: style, number of players, game type, name and bet limits. Those are not in the config file.

## Interface · `ui`

| Option   | Type         | Default      | What it does                    |
| -------- | ------------ | ------------ | ------------------------------- |
| `accent` | string (hex) | configurable | Accent colour of the interface. |

## Staff · `admin`

| Option    | Type   | Default          | What it does                                                                                                |
| --------- | ------ | ---------------- | ----------------------------------------------------------------------------------------------------------- |
| `command` | string | `'domino_admin'` | Name of the command that opens the admin tablet. The permission checked is always `command.<this name>`.    |
| `ace`     | string | `'group.admin'`  | Principal that receives the permission automatically when the resource starts. Use the full principal name. |

See [Commands & permissions](/scripts/leisure/cuxial-domino/commands.md) for how the permission is checked.

## Tables · `table`

| Option               | Type          | Default      | What it does                                                                                                                 |
| -------------------- | ------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| `joinDistance`       | number        | `2.0`        | Metres from a chair at which the "Sit down" interaction is available. Measured to the chair, not to the centre of the table. |
| `deleteDistance`     | number        | `6.0`        | Metres from the centre of the table within which staff can delete it from the tablet.                                        |
| `spawnForward`       | number        | `1.7`        | Metres in front of the staff member where a new table is placed.                                                             |
| `minDistanceBetween` | number        | `8.0`        | Minimum metres between two tables. A new table closer than this is rejected.                                                 |
| `sitUiDelayMs`       | number        | `3500`       | Milliseconds between sitting down and the table menu opening. Matches the sit animation.                                     |
| `surfaceOffset`      | number \| nil | `nil`        | Height of the playing surface above the origin of the table model, in metres. `nil` measures it automatically.               |
| `models`             | table         | three styles | Table models per style: `luxury`, `wood` and `classic`. Each style lists four models, in order: 1, 2, 3 and 4 players.       |

{% hint style="warning" %}
A replacement table model must be streamed by the server and carry the bones `Chair_Base_01` to `Chair_Base_04`. Without them players cannot sit.
{% endhint %}

## Match · `match`

| Option              | Type   | Default | What it does                                                                  |
| ------------------- | ------ | ------- | ----------------------------------------------------------------------------- |
| `targetPoints`      | number | `101`   | Points that win a classic match.                                              |
| `fivesTargetPoints` | number | `150`   | Points that win an All Fives match.                                           |
| `roundHoldMs`       | number | `3500`  | Milliseconds the round summary stays before the next round starts on its own. |
| `finishHoldMs`      | number | `3500`  | Milliseconds the match winner is shown before returning to the table menu.    |

### Bonuses · `match.dominican`

Extra points for classic matches. They never apply to All Fives.

| Option        | Type    | Default | What it does                                                                                                                                                                |
| ------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `enabled`     | boolean | `true`  | `true` enables the three bonuses below and `winnerOpens`. `false` disables them all.                                                                                        |
| `roundPass`   | number  | `25`    | Points when you play, every other player passes and the turn comes back to you. `0` removes this bonus.                                                                     |
| `openingPass` | number  | `25`    | Points when you open the round and the next player cannot play. `0` removes this bonus.                                                                                     |
| `capicua`     | number  | `25`    | Points when you go out with a tile that fitted both ends and is not a double. `0` removes this bonus.                                                                       |
| `winnerOpens` | boolean | `true`  | `true`: the winner of a round always opens the next one. `false`: the winner opens too, except after a blocked round, which is opened by the last player who placed a tile. |

## Turn · `turn`

| Option       | Type   | Default | What it does                                                                                                                                      |
| ------------ | ------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `seconds`    | number | `20`    | Seconds per turn. When they run out a tile is played for the player; with nothing to play, tiles are drawn until one fits, or the turn is passed. |
| `afkStrikes` | number | `3`     | Turns in a row that run out before the player is removed from the table. Playing or drawing resets the count.                                     |

## AI · `ai`

The AI only plays on 1 player tables.

| Option       | Type   | Default | What it does                                         |
| ------------ | ------ | ------- | ---------------------------------------------------- |
| `thinkMinMs` | number | `3000`  | Shortest time the AI takes to move, in milliseconds. |
| `thinkMaxMs` | number | `7000`  | Longest time the AI takes to move, in milliseconds.  |

## Bets · `betting`

| Option          | Type    | Default  | What it does                                                                                                                     |
| --------------- | ------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `enabled`       | boolean | `true`   | `true`: every match on a table of 2 or more players is played for a bet. `false`: matches start with a ready check and no money. |
| `account`       | string  | `'bank'` | Account the bet is charged to and paid from. `'cash'` uses cash; any other value uses the bank.                                  |
| `min`           | number  | `100`    | Lowest bet allowed on any table.                                                                                                 |
| `max`           | number  | `100000` | Highest bet allowed on any table.                                                                                                |
| `acceptSeconds` | number  | `15`     | Seconds the other players have to accept a proposed bet. Whoever does not accept in time is removed from the table.              |

How a bet works:

1. With every seat taken, one player enters an amount and starts. That player is the host of the bet.
2. The others accept within `acceptSeconds`.
3. Everyone is charged the same amount. The winner of the match takes the whole pot; in team tables each winner gets half.
4. The pot is returned to every player when the table is deleted, when a player leaves and two or more remain, or when the server restarts with a match in progress. If only one player remains, that player wins the pot.

{% hint style="info" %}
The bet limits of a table can only narrow the global ones. A table with a minimum below `min` or a maximum above `max` uses the global value. 1 player tables never have bets.
{% endhint %}

## Player hand · `hand`

Where your own tiles sit on the table in front of your seat. Calibrate these values in game with `/domino_tune` (see [Commands & permissions](/scripts/leisure/cuxial-domino/commands.md)).

| Option       | Type    | Default | What it does                                                                     |
| ------------ | ------- | ------- | -------------------------------------------------------------------------------- |
| `distance`   | number  | `0.68`  | Metres from the centre of the table towards your chair.                          |
| `spacing`    | number  | `0.04`  | Metres between tiles.                                                            |
| `flat`       | boolean | `true`  | `true` lays the tiles face up. `false` stands them up facing you.                |
| `lift`       | number  | `0.22`  | Height of standing tiles.                                                        |
| `pitch`      | number  | `90.0`  | Pitch of standing tiles, in degrees.                                             |
| `roll`       | number  | `-90.0` | Roll of standing tiles, in degrees.                                              |
| `yawOffset`  | number  | `0.0`   | Extra turn for standing tiles. Change it if the face does not look at you.       |
| `flatLift`   | number  | `0.066` | Height of flat tiles.                                                            |
| `flatPitch`  | number  | `-45.0` | Tilt of flat tiles, in degrees. A positive value raises the far side.            |
| `flatRoll`   | number  | `-5.0`  | Roll of flat tiles, in degrees.                                                  |
| `flatYaw`    | number  | `90.0`  | Turn of flat tiles, in degrees.                                                  |
| `hoverLift`  | number  | `-0.02` | Height change of the tile under the cursor.                                      |
| `pickRadius` | number  | `0.04`  | How close the cursor must be to pick a tile, as a fraction of the screen height. |

## Sounds · `sfx`

| Option        | Type      | Default      | What it does                                                          |
| ------------- | --------- | ------------ | --------------------------------------------------------------------- |
| `enabled`     | boolean   | `true`       | `true` plays a sound each time a tile is placed. `false` mutes it.    |
| `sounds`      | string\[] | three sounds | Names of the sounds, picked at random without repeating the last one. |
| `maxDistance` | number    | `10.0`       | Metres from the table at which the sound is heard.                    |
| `baseVolume`  | number    | `0.55`       | Volume at the table. It fades with distance.                          |

## Camera · `camera`

| Option         | Type   | Default   | What it does                                                                                                                                         |
| -------------- | ------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `default`      | string | `'board'` | Camera used when a player sits down. `'board'` = from above, `'first'` = first person, `'third'` = third person. Players can switch during the game. |
| `switchMs`     | number | `550`     | Milliseconds of the transition between cameras.                                                                                                      |
| `zoomSpeed`    | number | `9.0`     | Speed of the zoom. Higher is faster.                                                                                                                 |
| `firstZoomFov` | number | `55.0`    | Field of view in first person while the right mouse button is held.                                                                                  |

### Board view · `camera.board`

The camera from above is shifted towards your seat, so your side of the table is at the bottom of the screen.

| Option         | Type   | Default | What it does                                                               |
| -------------- | ------ | ------- | -------------------------------------------------------------------------- |
| `height`       | number | `1.5`   | Metres above the table.                                                    |
| `back`         | number | `1.35`  | Metres towards your chair.                                                 |
| `fov`          | number | `48.0`  | Field of view. Raise it if the table does not fit; lower it to get closer. |
| `lookZ`        | number | `-0.02` | Height of the point the camera looks at, relative to the table surface.    |
| `zoomFov`      | number | `26.0`  | Field of view while the right mouse button is held.                        |
| `transitionMs` | number | `600`   | Milliseconds of the transition when the camera is first set.               |

## Board layout · `layout`

Geometry of the line of tiles on the table.

| Option         | Type    | Default | What it does                                                                                         |
| -------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------- |
| `tileStep`     | number  | `0.055` | Metres between the centres of two regular tiles.                                                     |
| `doubleStep`   | number  | `0.025` | Extra metres taken by a double, which is placed crosswise.                                           |
| `zOffset`      | number  | `0.02`  | Height of the tiles above the surface.                                                               |
| `branchGap`    | number  | `0.006` | Gap between branches.                                                                                |
| `segmentMin`   | number  | `2`     | Tiles in a row before the line may turn.                                                             |
| `segmentMax`   | number  | `5`     | Most tiles in a row in one straight stretch.                                                         |
| `maxTurns`     | number  | `1`     | Turns allowed per branch.                                                                            |
| `cornerFactor` | number  | `0.25`  | Spacing factor applied at the corners.                                                               |
| `propInverted` | boolean | `false` | Set it to `true` if regular tiles show their pips the wrong way round. They are turned 180°.         |
| `snapRadius`   | number  | `0.14`  | Metres from an open end within which a dragged tile is accepted. Outside it the tile is not dropped. |
| `dragLift`     | number  | `0.03`  | Height of a tile while it is dragged.                                                                |

## Flat board · `dui`

Draws the board as a flat texture on the table instead of 3D tiles.

| Option           | Type    | Default | What it does                                                                                        |
| ---------------- | ------- | ------- | --------------------------------------------------------------------------------------------------- |
| `enabled`        | boolean | `false` | `true` draws the board as a texture and turns the 3D tiles on the board off. `false` uses 3D tiles. |
| `size`           | number  | `1.3`   | Side of the square, in metres.                                                                      |
| `resolution`     | number  | `1024`  | Resolution of the texture, in pixels.                                                               |
| `zOffset`        | number  | `0.012` | Height above the surface.                                                                           |
| `rotation`       | number  | `0.0`   | Degrees to turn the texture if it does not line up with the table.                                  |
| `mirror`         | boolean | `false` | `true` mirrors the texture.                                                                         |
| `renderDistance` | number  | `18.0`  | Metres within which the texture is drawn.                                                           |

Calibrate it in game with `/domino_dui` (see [Commands & permissions](/scripts/leisure/cuxial-domino/commands.md)).

## Common changes

### Play without money

{% code title="shared/config.lua" %}

```lua
betting = {
    enabled = false,
    -- ...
},
```

{% endcode %}

### Bet with cash and lower limits

{% code title="shared/config.lua" %}

```lua
betting = {
    enabled = true,
    account = "cash",
    min = 50,
    max = 5000,
    acceptSeconds = 15,
},
```

{% endcode %}

### Shorter matches without bonuses

{% code title="shared/config.lua" %}

```lua
match = {
    targetPoints = 50,
    fivesTargetPoints = 100,
    dominican = {
        enabled = false,
        -- ...
    },
    -- ...
},
```

{% endcode %}

### Let another group open the tablet

{% code title="shared/config.lua" %}

```lua
admin = {
    ace = "group.moderator",
    command = "domino_admin",
},
```

{% endcode %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.cuxial.com/scripts/leisure/cuxial-domino/configuration.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
