Builder's Manual · Chapter 4

Writing Classes & Tables

These two types carry the most design weight, and both have conventions worth following.

Classes

A class is abilityModifiers, a hitPointDie, a devilsLuckDie, and two feature arrays.

The feature/advancement split is not the same for every class, and the schema supports that through featureLabel, featureRule, advancementLabel, and advancementRule rather than hard-coding a structure:

  • The Brute and Swashbuckler have a distinct starting table and a separate advancement table. Both arrays are populated.
  • The Rapscallion and Buccaneer roll on the same table at creation and on advancement. Their features array is populated, advancementFeatures is empty, and advancementRule explains the reroll.
  • The Zealot and Sorcerer draw from separate prayer and spell file types entirely, so both arrays are near-empty and the rules text points at the compendium.

When you add a class, pick whichever of those three shapes fits and say so in advancementRule. Do not invent a fourth structure.

Ability modifiers should total roughly zero. Every class in the book trades: +2 in one thing costs two -1s, and +1/+1 costs two -1s.

The improved field on a feature is for "if taken again" text. Use it rather than writing two near-identical features.

Tables

The table type is the workhorse — sixty-one files and counting — and it is intentionally dumb: a die string, an entries array of {roll, result}, and a usage field.

Conventions that keep them usable:

  • roll is a string, so ranges work: "1-2", "4-5", "11-12".
  • usage is the instruction, not flavor. "Roll in each new port, or each day" belongs in usage; "the market swings hard and fast" belongs in description.
  • A table with no die uses "-". Several reference tables — Crew Actions, Rest & Recovery, Crew Skill Modifiers — are lookups, not rolls, and that is fine.
  • Multi-column generators become one table per column, cross-referenced in usage. The ship generator is five separate tables rather than one wide one, because each column gets rolled independently.

entryCount and rows are computed. Never write them.

The tables are the system's voice as much as the rules are. When you add one, make the entries specific and consequential — "a coffin, nailed shut" is a table entry; "some flotsam" is not.

Manual updated Aug 1, 2026.