# Workflow: Making a Variant of Your Game

> Add a second set-up to a game (a smaller board, a bigger table, play by hand, a ranked version), then switch variants, preview each and publish.

- Source: https://diceytable.com/docs/editor/workflows/make-a-variant
- Last verified: 2026-10-04

A **variant** is the same game, set up differently, and the room's owner picks one in the lobby.
This page builds one end to end: a Go game that has a 19×19 board gets a 9×9 variant. Three shorter
cases follow — [a bigger table with the same entities](https://diceytable.com/docs/editor/workflows/make-a-variant#a-bigger-table-same-entities),
[the same game played by hand](https://diceytable.com/docs/editor/workflows/make-a-variant#the-same-game-by-hand) and
[a ranked version](https://diceytable.com/docs/editor/workflows/make-a-variant#a-ranked-version).

Variants are for **game packs**, in the Game Editor or the Full Editor. For what they are and when
to use a setup option instead, see [Game variants](https://diceytable.com/docs/mods/manifest/variants).

## The one idea to hold

**You edit one variant at a time, and the top bar says where each edit goes.**

- With **Changes apply to: Only _variant_**, an edit becomes that variant's own difference.
- With **Changes apply to: All variants**, an edit goes to the base and reaches every variant that
  has not changed that same thing itself.

Nothing has to be planned in advance. There are no "shared" or "separate" switches to set before
you start: a variant owns part of the scene because you changed that part while editing it.

## Steps: Go, 19×19 and 9×9

You start with a working game: a 19×19 board, a 19×19 snap grid over it, and two bowls of stones.

1. **Open the Variants dialog.** Click **Variants** on the logo bar, or **Mod ▸ Variants…**. It
   reads *"This game has one way to play."*
2. **Create the variant.** Type `9×9` in the name field and click **Create a variant**. Two things
   happen at once, and the status line says so: *Created 9×9. Your scene so far is now the base
   variant, "Standard".* The scene you had is now a variant called **Standard**; **9×9** starts as
   a copy of it; and the editor has switched to 9×9.
3. **Name what players will see.** Still in the dialog, choose **Standard** in the **Variant**
   dropdown and change its **Name** to `19×19`. Give both variants a one-line **Description** if
   the names do not say enough. Close the dialog.
4. **Read the top bar before you touch anything.** It should say **Variant: 9×9** and **Changes
   apply to: Only 9×9**. That second control is what makes the next steps safe.
5. **Delete the big board.** Select the 19×19 board in the Hierarchy and delete it. It is removed
   **from this variant only**. If you want to see that for yourself, switch **Variant** to
   `19×19 (base)` — the board is there — and switch back.
6. **Delete the big snap grid.** In the `Snap Points` folder, delete the 19×19 grid's row. From
   this edit on, 9×9 has its own **Snap points**.
7. **Add the small board.** Place it the way you placed the first one — see
   [Making a board from an image](https://diceytable.com/docs/editor/workflows/board-from-image). Its row in the
   Hierarchy is marked `only here`.
8. **Add the small snap grid.** With the Snap tool's
   [Grid sub-tool](https://diceytable.com/docs/editor/interface/transform-rail#the-grid-sub-tool), lay a 9 × 9 grid over
   the new board.
9. **Leave the bowls and stones alone.** You did not change them, so both variants share them. If
   you later fix a stone's material while editing 19×19, 9×9 gets the fix.
10. **Check what you made.** Open **Variants** again and choose **9×9**. Under **What 9×9
    changes** it should read **Entities:** `1 added · 1 removed` and **Snap points:** `Its own`,
    with everything else `Same as 19×19`. If a row says `Its own` that you did not intend, **Use
    19×19's** hands it back.
11. **Preview each variant.** Click **Preview** — it opens the variant on screen, so this is the
    9×9 game. Then switch **Variant** to `19×19 (base)` and click **Preview** again to confirm the
    original is exactly as it was.
12. **Decide the lobby's default.** In the dialog, **Lobby order** moves a variant up or down. The
    first one is what a lobby starts on.
13. **Save Draft**, then **Publish** as usual. If the game is already published, bump its version
    first — a published version cannot be republished with different contents.

## Definition of done

- The top bar's **Variant** dropdown lists both variants, and switching between them swaps the
  board and the grid and nothing else.
- In 9×9, the small board's Hierarchy row is marked `only here`, and the big board is absent.
- The Variants dialog's summary for 9×9 lists only the differences you meant to make.
- **Preview** from each variant opens that variant, at the right size, with stones that snap to
  its own grid.
- After publishing, a lobby for the game shows every variant as a card under **How do you want to
  play?**, at the top of the lobby, badged with what it offers (rules enforced, AI opponents,
  Ranked). The room's owner picks one; everyone sees which is chosen.

## A bigger table, same entities

*Six seats and ten seats, same cards.* Create a variant called `Ten players`, and while editing it
with **Only Ten players** selected:

- Change what has to grow. Assign the larger table to the `Table` row
  ([Assigning a room or table](https://diceytable.com/docs/editor/workflows/assign-a-room-or-table)) — the variant now has
  its own **Table & room**. Raise the seat count and arrange the seats
  ([Player Zones and seat templates](https://diceytable.com/docs/editor/working/zones-and-seats)) — it now has its own
  **Seats & zones**.
- In the Variants dialog, turn on **Own player range** for the variant and set **Max** to `10`.
  This is what lets a room's owner raise the seat cap that far for this variant, and the lobby
  prints the range beside the variant's name.

The deck, the dice and everything else on the table stay shared. Do both halves: a player range
without the seats offers ten people a table laid out for six, and seats without the range leave
the lobby's seat cap at the game's own maximum.

## The same game, by hand

*A scripted game, and the same entities with nothing automated.* Create a variant called `By hand`,
and while editing it with **Only By hand** selected, take its scripts off:

- **Scene scripts.** Detach each script from the scene. The variant now has its own **Scene scripts**
  (an empty list), and the scripted variant keeps its own.
- **Entity scripts.** Remove the script from each entity that has one. Those entities are marked
  `changed` in this variant only.

Then check the two scripts a variant cannot detach:

- **The entry script** runs in every variant. If your game has one and it should do nothing by hand,
  have it read `api.getVariant()` and return when `id` is `"by-hand"`
  ([example](https://diceytable.com/docs/scripting-api/api#apigetvariant)).
- **Prefab scripts** are shared by every variant, so a piece spawned from a scripted prefab still runs
  its script.

If your scripts set the table (deal the opening hands, spawn the pieces), the by-hand table starts
without them, so place those entities yourself while editing **By hand**. They are marked `only here`
and the scripted variant never sees them.

A bot whose handler no remaining script registers cannot sit down in this variant; the lobby says so.
**Preview** from the by-hand variant runs exactly the scripts it attaches, so it shows what players get.

> Projects made before 2026-10 may have a **Run scripts** switch turned off on a variant. Opening such
> a project converts it once: that variant's scene and entity scripts are detached in its own scene,
> as above, and the status line reminds you about the entry script. Save to keep the change.

## A ranked version

*The same rules, enforced by the script, with a result that counts.* Your scene script must already
enforce the rules and report the result with `match.end`; see
[Matches and Variants](https://diceytable.com/docs/scripting-api/matches).

1. Open **Variants**, choose the variant, and switch **Fully scripted** on. A **Ranked play** section
   appears with every setting at its default.
2. Read its checklist. **Match end** must be ticked: a script attached to this variant calls
   `match.end`. If your game has a rules kernel, **Rules kernel** should be ticked too.
3. Change only the settings your game needs: **Offer draw button** for a game where draws by agreement
   make sense, **Allow takebacks** off for a game with irreversible hidden draws, a higher
   **Placement games** for a game with a lot of luck.
4. Publish. The lobby shows **Fully scripted** and **Ranked available** beside the variant, and the
   room's owner can switch **Ranked** on.

Leave **Rank** on **Seats**: ranking teams cannot be published yet. What players can expect from a
ranked match is on [Ranked games, Rankings and Player Trust](https://diceytable.com/docs/mods/concepts/ranked-games).

## Fixing things afterwards

| You want to | Do this |
|---|---|
| Undo one variant's change to one entity | Select the entity while editing that variant, then **Revert** in the Inspector's [Variant row](https://diceytable.com/docs/editor/inspector/entity#the-variant-row) |
| Give one variant's version of an entity to all of them | **Apply to all** in the same row |
| Take an entity out of one variant | **Remove here** in the same row, or delete it with **Only _variant_** selected |
| Bring back an entity a variant removed | Variants dialog ▸ **Removed from _variant_** ▸ **Restore** |
| Make a variant follow the base's seats, snap points, table or scene scripts again | Variants dialog ▸ **Use _base_'s** on that group's row |
| Change something in every variant at once | Edit it in the base variant, or set **Changes apply to: All variants** |
| Change which variant is stored whole | Variants dialog ▸ **Make this the base** — nothing a player sees changes |

## If it fails

- **An edit showed up in every variant.** **Changes apply to** was on **All variants**, or you
  were editing the base. Undo (`Ctrl+Z`), switch the control to **Only _variant_**, and redo the
  edit.
- **A fix made in the base did not reach a variant.** That variant has its own version of the
  thing you fixed — the entity is marked `changed`, or the dialog shows the group as `Its own`.
  **Revert** the entity, or **Use _base_'s** on the group, to make it follow the base again. For a
  group this is all-or-nothing: a variant with its own snap points has its own *list* of snap
  points, so a point added to the base afterwards is not in it.
- **Deleting an entity removed it everywhere.** It was deleted with **All variants** selected,
  which deletes it from the base and therefore from every variant, including any that had its own
  version. Undo, then use **Remove here**.
- **The Variants button is missing.** The project is not a game pack, or it is open in the Room,
  Table or Asset Editor. Variants belong to games.
- **The lobby shows no Variant dropdown.** A game needs at least two variants for there to be a
  choice. Deleting down to one removes the list — and check the room is running the version you
  published.
- **A script needs to know which variant is being played.** Table scripts call
  `world.getVariant()`, the entry script `api.getVariant()` — see
  [What a script can see](https://diceytable.com/docs/mods/manifest/variants#what-a-script-can-see).
- **Publishing was refused with a `ranked-variant-…` code.** Usually no script attached to the
  ranked variant calls `match.end`, or **Rank** is set to **Teams**. See
  [the ranked-variant rules](https://diceytable.com/docs/mods/scanner/what-gets-rejected#ranked-variant-rules-4).
- **Publishing was refused with a `variant-…` code.** The manifest and `setup.json` name different
  variant ids, which only happens after editing one of them by hand. See
  [Variant rules](https://diceytable.com/docs/mods/scanner/what-gets-rejected#variant-rules-4).

## See also

- [The variant controls](https://diceytable.com/docs/editor/interface/topbar#the-variant-controls) and
  [the Variants dialog](https://diceytable.com/docs/editor/interface/topbar#the-variants-dialog) — every control, in full.
- [Variant marks](https://diceytable.com/docs/editor/interface/hierarchy#variant-marks) — `only here` and `changed` in the Hierarchy.
- [The Variant row](https://diceytable.com/docs/editor/inspector/entity#the-variant-row) — Revert, Apply to all, Remove here.
- [Game variants](https://diceytable.com/docs/mods/manifest/variants) — what is written to the manifest and to `setup.json`.
- [Previewing a draft](https://diceytable.com/docs/editor/workflows/preview-and-photo-mode) — what the preview tab loads.
- [The publish flow](https://diceytable.com/docs/mods/publishing/publish-flow) — getting the variants to players.
