# Campaign

> Kinbarrow modding reference — content tree `b2f73c2ab65ff925`, version `0.2.0+main.a22009f4c`.

`campaign.ron` — the manifest. `id` equals the campaign folder name.

**Note on syntax:** these files are RON, not JSON. The shapes below are exact,
but punctuation follows RON — read a real `data/*.ron` file alongside.

## Fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `chronicle` | `Note[]` | required | Backdated chronicle entries the world opens with. |
| `death_day` | `uint64` | required | The day the campaign's founding death fell (the ducal assassination). |
| `default_seed` | `uint64` | required | Root of every deterministic roll when no seed is supplied. |
| `description` | `string` | required | A one-line blurb for the realm (flavour, not resolved). |
| `id` | `string` | required |  |
| `name` | `string` | required | The realm-scale region the towns sit in ("Thornwood Vale"). |
| `player_start` | `PlayerStart` | optional | Where an admitted player character comes ashore — the creator's data. Additive: a campaign without it can still be played through the seeded pregen fast lane. |
| `roads` | `Road[]` | required | Roads laid AFTER the towns are built, resolved by node name. |
| `slots` | `Slot[]` | required | Procedural town slots (worldgen) — what makes the realm the realm: an authored coast plus a generated vale. |
| `source` | `Source` | required |  |
| `start_day` | `uint64` | required | When the campaign opens (day, and the hour the world boots at). |
| `start_hour` | `uint64` | required | The hour of `start_day` the world boots at (0-23). |
| `towns` | `string[]` | required | Authored towns, by file id (`towns/<id>.ron`). Sorted at load, so the interpret order never depends on filesystem iteration order. |

## Nested shapes

<a id="note"></a>

### Note

A backdated chronicle note (`record_at`).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `day` | `uint64` | required | The day the note is backdated to. |
| `hour` | `uint64` | required | The hour of that day (0-23). |
| `text` | `string` | required | The chronicle line's text. |

<a id="player-start"></a>

### PlayerStart

Where the character creator's minted PC ENTERS the world: the settlement it comes ashore in, the venue/ward it is placed `LocatedIn`, a starting purse, and an optional ward membership. Resolved BY NODE NAME at admit time (the interpreter has already minted these), so it reads like the campaign's roads (also name-resolved). Validated by the one campaign validator (`campaign/validate.rs`): the settlement, venue, and ward must name real nodes the town declares.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `level` | `uint32` | default `1` | Starting character level for chairs that come ashore in this campaign. Absent/default 1. Capped at the creator's current maximum (Battle's picker uses the same door). A campaign that wants to skip the dull rungs sets 3. |
| `purse` | `integer` | optional | A starting purse in the coin good's minor units (silver), if any. |
| `settlement` | `string` | required | The settlement the PC enters (a town's display name — "Greyharbor"). |
| `venue` | `string` | required | The venue OR ward the PC is placed `LocatedIn` — "The Brined Gull". |
| `ward` | `string` | optional | A ward the PC joins on arrival (`MemberOf`), by name, if any. |

<a id="road"></a>

### Road

A road between two named nodes, carrying the ride's length in days. Resolved by node NAME after the towns exist.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `days` | `int64` | required | The ride's length in days. |
| `from` | `string` | required | The node the road runs FROM, by name (a settlement). |
| `route` | `string` | required | The route's display name ("the Coast Road"). |
| `to` | `string` | required | The node the road runs TO, by name (a settlement). |

<a id="slot"></a>

### Slot

A procedural town slot: worldgen builds it, and a road binds it to a settlement that already stands (authored, or rolled by an earlier slot).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `days` | `int64` | required | The road's length in days. |
| `kind` | `SlotKind` | required | What procedural fill this slot requests. |
| `road_from` | `SlotRoad` | required | The settlement this slot's road runs from. |
| `route` | `string` | required | The road's display name. |

<a id="slot-kind"></a>

### SlotKind

The kind of procedural fill a slot requests.

<a id="slot-kind--worldgen"></a>

#### SlotKind::Worldgen

A full worldgen town, landlocked farm-and-forge by default.

<a id="slot-kind--mountain"></a>

#### SlotKind::Mountain

The far mine-and-mithral peaks: a mountain town whose data `mine` instantiates the rare-regional mithral deposit — the first world where mithral flows. Booted only at three towns (RPGPT_TOWNS=3).

<a id="slot-road"></a>

### SlotRoad

Where a slot's road runs FROM — the settlement at the road's other end. Two forms, because a realm's towns are not all named at the same time. An AUTHORED town has its name in the campaign's own files, so a slot can just say it. A ROLLED town's name is drawn from the realm seed at compose time and does not exist while the manifest is being read — so a road that runs from one must reference the SLOT that rolls it, by index. That second form is what lets a wide realm CHAIN (the river town off the vale, the high pass off the river, the forest past the pass) rather than starring every road off the authored coast — which piled every route posting and traded store onto one hub and grew its menu enumeration superlinearly in town count.

<a id="slot-road--town"></a>

#### SlotRoad::Town

An authored settlement, by name: `Town("Greyharbor")`.

Carries `string`.

<a id="slot-road--slot"></a>

#### SlotRoad::Slot

A town of the COMPOSED realm, by index: this campaign's root town is `Slot(0)` and slot `n` is `Slot(n + 1)`. It must already stand — a slot cannot road from a town placed after it.

Carries `uint`.

<a id="source"></a>

### Source

Every file's top-level value carries `source`.

<a id="source--srd51"></a>

#### Source::Srd51

SRD 5.1 — retained nonconflicting catalogue material.

<a id="source--srd52"></a>

#### Source::Srd52

SRD 5.2.1 — the 2024-revision System Reference Document, the same CC-BY-4.0 grant as 5.1 and the current rules chassis. Its files carry the `.srd52.ron` suffix so provenance reads off the path; see `data/README.md` for which document rules a given value.

<a id="source--original"></a>

#### Source::Original

Original content authored for this game (not from the SRD).

<a id="source--phb2024"></a>

#### Source::Phb2024

Material transcribed from the 2024 Player's Handbook. This source is not redistributable by this project and belongs in a `phb2024` mod.

<a id="source--dmg2024"></a>

#### Source::Dmg2024

Material transcribed from the 2024 Dungeon Master's Guide. This source is not redistributable by this project and belongs in a `dmg2024` mod.

<a id="source--mm2024"></a>

#### Source::Mm2024

Material transcribed from the 2024 Monster Manual. This source is not redistributable by this project and belongs in an `mm2024` mod.

<a id="source--tce"></a>

#### Source::Tce

Material transcribed from Tasha's Cauldron of Everything. This source is not redistributable by this project and belongs in a `tce` mod.

<a id="source--xge"></a>

#### Source::Xge

Material transcribed from Xanathar's Guide to Everything. This source is not redistributable by this project and belongs in an `xge` mod.


