Start here

The Mod Studio

The Mod Studio is the game’s own editor for data packs, on Windows: Mods → Mod Studio. Its forms are built from the same schemas the game checks packs with, so what it lets you write is what the game accepts.

It writes ordinary pack folders, so you can switch between the Studio and a text editor whenever you like.

The Mod Studio is the in-game editor for content packs. Open it from Mods → Mod Studio. It writes ordinary mod folders (mod.json, data/**.json, assets/**), so anything it makes can also be edited by hand, and the reverse.

The studio edits only packs in your mods folder. The base game (core) is read-only, but you can change any of its records from your own pack (see Changing the base game).

Packs##

The home screen lists your packs with their load status (loaded, switched off, or with errors).

  • New pack asks for the mod.json fields: id, name, version, game version, authors, description, and optionally dependencies, load-after, provides and tags. The id names the folder (mods/<id>/) and prefixes every new record id (acme.legends.player.big-dave). It must be lowercase, with dots and dashes.
  • Edit opens the pack in the editor.
  • Export zips the pack folder (data and assets) to a file you choose. Unsaved changes aren't included, so save first.
  • Import .zip installs a pack someone shared. The zip is checked before anything is unpacked: it needs a mod.json at its root or in one top folder, and only JSON, text, images, audio, fonts and the pack's script (its entry, or scripts/main.js) are extracted. Other code and anything else are skipped and listed. Paths that climb out of the folder, absolute paths, oversized files and zip bombs are refused. If a pack with the same id is installed, the studio asks before replacing it.
  • Folder opens the pack folder in Explorer. Delete removes the folder after you type its name to confirm.

Packs never run code. The manifest's entry field isn't offered.

The editor##

The editor has three panes:

  1. Content types, grouped: Calendar, People, Kit, Business, Media, Stories and cards, Game. Each shows yours / total. Pack settings at the top edits mod.json and lists the pack's files and assets.
  2. Records of the chosen type from every installed mod. Search by name or id, and filter by: All, This pack, Unsaved, Problems, Base game, Other mods. Badges show where each record comes from:
    • This pack: your record.
    • Base game or a mod name: someone else's record.
    • Overrides / Overridden: the same id comes from more than one mod, and the later one in load order wins.
    • Patched: a patch changes it.
  3. The record, as a form built from the game's own schema, with a live preview where one helps.

Forms##

Every field comes from the content schema, so the form always matches what the game accepts:

  • Text, numbers (bounded ranges get a slider), on/off toggles and colour pickers.
  • Choices from a fixed list. Short lists show as buttons; long ones as a searchable list.
  • References to other content, such as venueId, tourId, brandId, kit slots, card parallels, shirt patterns and staff roles. These are search boxes that suggest records from every installed mod and your pack, and show whether the id exists.
  • Lists: add, remove, reorder and duplicate items. A list of choices (such as news beats) shows as toggle buttons.
  • Maps (such as card parallels by key, or a pack's dependencies): add, rename and remove keys.
  • Variants (a round played in legs or in sets, an event entry route, a story action): pick the kind, then fill in its fields.
  • Assets (logos, backdrops, portraits, story pictures, social avatars, item art, shirt bases, textures, walk-on audio): Choose image… copies a file into the pack's assets/<type>/ folder and stores the relative path. Only real images (PNG, JPEG, WebP, GIF, AVIF, and SVG that only draws), audio (MP3, OGG, WAV, M4A, FLAC, Opus) and fonts are accepted, and the file's contents are checked, not just its name. See Images in mods.
  • Pack settings takes the pack's icon, banner and screenshots the same way (copied into assets/mod/), with a preview of the pack's card as the Mods screen shows it.

Optional fields you haven't set are listed under Add at the bottom of each group, with their defaults. Remove takes a field out again, and the game uses its default. The i next to a field shows its documentation, which comes from the schema.

JSON switches a record to its raw JSON. You can edit it there too; it's parsed and validated as you type.

The root id can't be typed over. Rename id changes it and updates every reference to it in your pack, including other records and patch targets. If other installed packs refer to the old id, the rename dialog warns you; they aren't changed.

Previews##

  • Equipment: the item's picture, or a shop shirt with a design drawn by the shirt renderer, front and back, with the brand's logo on the chest.
  • Sponsors, tours and media outlets: the logo on the brand colour.
  • Venues and menu backgrounds: the backdrop.
  • Players and media people: the portrait.
  • Calendar events: a summary with the tour, venue, date, field, round formats and prize money.
  • Cards: the card itself, drawn by the card renderer with a sample player and sample numbers in place of the placeholders. Show back flips it.
  • Shirt patterns: the pattern on a shirt. Shirt cuts: the front and back base images.

Changing the base game##

Pick any record that isn't yours and choose:

  • Duplicate as override: copies the record into your pack with the same id, so your copy replaces the original. Its asset paths are pointed back at the original mod (dtj-asset://core/…), so logos and pictures keep working. The loader notes each replacement as a warning.
  • Patch: keeps the original and stores only what you change, as a JSON merge patch in data/patches/<type>.patch.json. You edit the whole record as a form. Changed fields are marked, showing the original value, and only the differences are saved. Patches apply after every mod's records, so a patch still works if another mod replaces the record. Make override turns a patch into a full copy.
  • Copy as new: a new record in your pack's namespace, starting from this one.

Saving##

  • A dot marks unsaved records and types. The toolbar shows how many files have changes.
  • Save file writes the record's file. Save all (Ctrl+S) writes every changed file. Revert (or Discard for a new record) drops a record's changes, and Revert all drops everything since the last save.
  • Records are written to the paths the loader reads for their type. The default is one file per type (for example data/equipment.json or data/players/players.json). The File box moves a record to another of the type's files, and New file… creates one in the type's folder (for example data/equipment/shirts.json).
  • Saving rewrites only the files that changed. Other records in the file keep their order and fields, and the file keeps its indentation. A settings file with a single object (such as data/load.json) stays a single object.
  • Reload mods makes the game load what you saved. New careers use it, and the Mods screen shows the pack's status.

Leaving the editor with unsaved changes asks first.

Validation##

As you type, each record is checked against its schema, and problems show under the fields. About half a second after you stop, the studio runs the game's own mod loader over every installed mod, with your unsaved files in place of the saved ones. The status button in the toolbar shows the result: Loads cleanly, Loads · N warnings, or N errors. Click it for the issues panel. Each issue shows its file and line, record and field path. Clicking an issue opens the record and jumps to the field.

An error stops the whole pack from loading. The loader's cross-reference checks (unknown venues, brands, kit slots, entry routes, league series and so on) run once the schema errors are fixed, and they report records the game will drop.

Many events at once##

A country's calendar is sixty to a hundred events, most of them the same night on another date. Make one event by hand, select it in Calendar events, and press Copy to dates. Type the dates as month.week, parted by spaces:

You typeYou get
2-12every month from February to December, in the event's own week
9-5September round to May
3.1the first week of March
6.1-3the first three weeks of June
9-5.*every week (1 to 4) of each month from September to May
2.2 4.2 6.2 9.2those four dates

The line under the box says how many events that makes and what they will be called before you confirm. Each copy is the event again with its month, its week, its name and its id changed: "Corner Board Knockout 1" gives "Corner Board Knockout 2", "3" and so on, and acme.event.ned-local-1 gives -2, -3. The event's own date is left out. The copies go after the event in its file, and each is an ordinary record: open one to change its venue, its prizes or its field. The most in one go is the tuning value studio.eventRun.max (52: a year of weekly nights).

Written for Darts Player Simulator 0.50.32. Built from the game's own schemas and its base pack.