Public Warhammer 40K rules, datasheets, points and missions; sign in to manage rosters and battles.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Creates a battle with named player seats, using the same rules as the site. Requires mcp:write.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Creates a battle with named player seats, using the same rules as the site. Requires mcp:write.
| Argument | Type | Description |
|---|---|---|
| limit | any | |
| allyId | string | |
| casual | boolean | |
| manual | boolean | |
| guestNames | array | |
| opponentId | string | |
| opponentIds | array | |
| missionPackId | any |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
},
"allyId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"casual": {
"type": "boolean",
"default": false
},
"manual": {
"type": "boolean",
"default": false
},
"guestNames": {
"type": "array",
"items": {
"type": "string",
"maxLength": 48,
"minLength": 1
},
"maxItems": 2,
"minItems": 1
},
"opponentId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"opponentIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"maxItems": 2,
"minItems": 1
},
"missionPackId": {
"anyOf": [
{
"type": "string",
"maxLength": 64,
"minLength": 1
},
{
"type": "null"
}
],
"default": null
}
}
}Returns the current seated view of a battle for the signed-in player. Requires mcp:read.
| Argument | Type | Description |
|---|---|---|
| token* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"token"
],
"properties": {
"token": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
}Returns the saved choices for one roster owned by the signed-in player. Requires mcp:read.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
}Reads the complete bounded document returned by search_reference, with its revisions and attribution. A section that withholds rules text lists textSources: the pinned upstream file and record id to fetch if you need the wording.
| Argument | Type | Description |
|---|---|---|
| id* | string | The stable result id returned by search_reference. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "The stable result id returned by search_reference."
}
}
}Returns the structured record behind a search result, including mission cards, deployments, terrain geometry, detachments, and datasheets. Records that withhold rules text carry textSources pointing at the pinned upstream file and record id.
| Argument | Type | Description |
|---|---|---|
| id* | string | The stable id returned by search_reference or list_reference. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "The stable id returned by search_reference or list_reference."
}
}
}Lists the factions that can be used to narrow reference searches.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Lists up to 25 battles with a cursor for the next page. Requires mcp:read.
| Argument | Type | Description |
|---|---|---|
| before | any |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"before": {
"anyOf": [
{
"type": "object",
"required": [
"at",
"id"
],
"properties": {
"at": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "null"
}
],
"default": null
}
}
}Lists the rosters saved to the signed-in Praetorium account. Requires mcp:read.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Discovers available factions, mission packs, rule documents, reference kinds, and active source revisions.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Returns every pickable unit in one bounded response with unit-size costs, composition, attachment relationships, roster limits, roles, keywords, and links. Include a detachment to receive its rules, enhancements, upgrades, and stratagems by name, cost, and timing without opening every unit page. Their rules text is at each record’s textSources.
| Argument | Type | Description |
|---|---|---|
| faction* | string | Faction id, URL slug, or display name from list_reference. |
| battleSize | integer | Battle size in points for size-dependent limits. |
| detachment | string | Detachment id, slug, or display name. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"faction"
],
"properties": {
"faction": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Faction id, URL slug, or display name from list_reference."
},
"battleSize": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Battle size in points for size-dependent limits."
},
"detachment": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Detachment id, slug, or display name."
}
}
}Saves a complete roster. Pass its id to edit an owned roster; omit id to create one. limit is the battle size (1000, 2000 or 3000 points, or 600 for King of the Colosseum), which sets detachment points, enhancement and unit limits. pointsBudget optionally replaces only its points total (500 to 10000, not King of the Colosseum); omit it to keep a saved budget, or send null for the standard total. Requires mcp:write.
| Argument | Type | Description |
|---|---|---|
| id | string | |
| name* | string | |
| prep* | any | |
| limit* | integer | |
| picks* | array | |
| source | string | |
| visibility | string | |
| catalogueId* | string | |
| disposition* | any |
Searches Praetorium’s missions, rules, detachments, and datasheets by name, number, keyword, and value. Returns bounded excerpts with canonical URLs, source revisions, and attribution. Rules text is not included; records point to it upstream.
| Argument | Type | Description |
|---|---|---|
| pack | string | |
| kinds | array | |
| limit | integer | |
| query* | string | A name, a printed rule number, an ability, a weapon, or a keyword. |
| cursor | string | |
| faction | string | |
| document | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"pack": {
"type": "string",
"maxLength": 160,
"minLength": 1
},
"kinds": {
"type": "array",
"items": {
"enum": [
"datasheet",
"deployment",
"detachment",
"mission",
"rule",
"terrain"
],
"type": "string"
},
"maxItems": 6
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 120,
"minLength": 2,
"description": "A name, a printed rule number, an ability, a weapon, or a keyword."
},
"cursor": {
"type": "string"
},
"faction": {
"type": "string",
"maxLength": 160,
"minLength": 1
},
"document": {
"type": "string",
"maxLength": 160,
"minLength": 1
}
}
}Changes the visibility of an owned roster. Requires mcp:write.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| visibility* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"visibility"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"visibility": {
"enum": [
"private",
"unlisted",
"public"
],
"type": "string"
}
}
}Runs Praetorium's exact combat simulator for one attacking unit, with any attached leaders, against one defending unit at full strength: shooting, melee, and shooting followed by melee. Returns expected models destroyed, expected wounds lost, the chance to destroy the unit, cumulative odds, weapons used, the rule and weapon-mode choices each side can change, datasheet citations, and a simulator link. Passive datasheet rules apply by default; stratagems and conditional rules stay off until chosen. Unsupported mechanics are refused or listed under notCalculated rather than approximated. Like the standalone simulator page, it uses default loadouts and no detachment; unit sizes and attachments must be legal.
| Argument | Type | Description |
|---|---|---|
| attacker* | object | |
| defender* | object | |
| modifiers | object | Situational modifiers the simulator page offers, such as { "all": { "cover": true, "hitModifier": -1 } }, { "melee": { "charged": true } }, or { "target": { "invulnerable": 4 } }. |
| weaponModes | object | Weapon mode choices by key from a previous result, such as a frag or krak profile. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"attacker",
"defender"
],
"properties": {
"attacker": {
"type": "object",
"required": [
"faction",
"unit"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "Unit id, slug, name, or referenceId from list_units."
},
"rules": {
"type": "object",
"description": "Rule choices by rule id from a previous result: 0 turns a rule off and n selects its nth option.",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "integer",
"maximum": 20,
"minimum": 0
}
},
"models": {
"type": "integer",
"maximum": 60,
"minimum": 1,
"description": "Model count; must be a legal unit size. Defaults to the minimum size."
},
"faction": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Faction id, URL slug, or display name from list_reference or list_units."
},
"attached": {
"type": "array",
"items": {
"type": "object",
"required": [
"unit"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "Unit id, slug, name, or referenceId from list_units."
},
"models": {
"type": "integer",
"maximum": 60,
"minimum": 1,
"description": "Model count; must be a legal unit size. Defaults to the minimum size."
},
"faction": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Defaults to the unit's faction."
}
}
},
"maxItems": 2,
"description": "Leaders or support units joined to the unit, from its canBeLedBy and canBeSupportedBy."
}
}
},
"defender": {
"type": "object",
"required": [
"faction",
"unit"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "Unit id, slug, name, or referenceId from list_units."
},
"rules": {
"type": "object",
"description": "Rule choices by rule id from a previous result: 0 turns a rule off and n selects its nth option.",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "integer",
"maximum": 20,
"minimum": 0
}
},
"models": {
"type": "integer",
"maximum": 60,
"minimum": 1,
"description": "Model count; must be a legal unit size. Defaults to the minimum size."
},
"faction": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Faction id, URL slug, or display name from list_reference or list_units."
},
"attached": {
"type": "array",
"items": {
"type": "object",
"required": [
"unit"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "Unit id, slug, name, or referenceId from list_units."
},
"models": {
"type": "integer",
"maximum": 60,
"minimum": 1,
"description": "Model count; must be a legal unit size. Defaults to the minimum size."
},
"faction": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Defaults to the unit's faction."
}
}
},
"maxItems": 2,
"description": "Leaders or support units joined to the unit, from its canBeLedBy and canBeSupportedBy."
}
}
},
"modifiers": {
"type": "object",
"properties": {
"all": {
"type": "object",
"properties": {
"cover": {
"type": "boolean"
},
"heavy": {
"type": "boolean"
},
"lethal": {
"type": "boolean"
},
"charged": {
"type": "boolean"
},
"halfRange": {
"type": "boolean"
},
"hitReroll": {
"enum": [
"none",
"ones",
"failed"
],
"type": "string"
},
"hitModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
},
"woundReroll": {
"enum": [
"none",
"ones",
"failed"
],
"type": "string"
},
"indirectFire": {
"enum": [
"direct",
"unobserved",
"spotted"
],
"type": "string"
},
"woundModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
},
"psychicHitModifier": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"positiveWoundModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
}
}
},
"melee": {
"type": "object",
"properties": {
"cover": {
"type": "boolean"
},
"heavy": {
"type": "boolean"
},
"lethal": {
"type": "boolean"
},
"charged": {
"type": "boolean"
},
"halfRange": {
"type": "boolean"
},
"hitReroll": {
"enum": [
"none",
"ones",
"failed"
],
"type": "string"
},
"hitModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
},
"woundReroll": {
"enum": [
"none",
"ones",
"failed"
],
"type": "string"
},
"indirectFire": {
"enum": [
"direct",
"unobserved",
"spotted"
],
"type": "string"
},
"woundModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
},
"psychicHitModifier": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"positiveWoundModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
}
}
},
"ranged": {
"type": "object",
"properties": {
"cover": {
"type": "boolean"
},
"heavy": {
"type": "boolean"
},
"lethal": {
"type": "boolean"
},
"charged": {
"type": "boolean"
},
"halfRange": {
"type": "boolean"
},
"hitReroll": {
"enum": [
"none",
"ones",
"failed"
],
"type": "string"
},
"hitModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
},
"woundReroll": {
"enum": [
"none",
"ones",
"failed"
],
"type": "string"
},
"indirectFire": {
"enum": [
"direct",
"unobserved",
"spotted"
],
"type": "string"
},
"woundModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
},
"psychicHitModifier": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"positiveWoundModifier": {
"type": "integer",
"maximum": 100,
"minimum": -100
}
}
},
"target": {
"type": "object",
"properties": {
"save": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"toughness": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"saveReroll": {
"enum": [
"ones",
"failed"
],
"type": "string"
},
"halveDamage": {
"type": "boolean"
},
"invulnerable": {
"anyOf": [
{
"type": "integer",
"maximum": 6,
"minimum": 2
},
{
"type": "null"
}
]
},
"damageReduction": {
"type": "boolean"
}
}
},
"weapons": {
"type": "object",
"properties": {
"all": {
"type": "object",
"properties": {
"ap": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"skill": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"damage": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"lethal": {
"type": "boolean"
},
"attacks": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"strength": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"sustained": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"dice",
"sides",
"bonus"
],
"properties": {
"dice": {
"type": "integer",
"maximum": 10,
"minimum": 0
},
"bonus": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"sides": {
"anyOf": [
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 6
}
]
}
}
}
]
},
"criticalHit": {
"type": "integer",
"maximum": 6,
"minimum": 2
},
"devastating": {
"type": "boolean"
},
"damageReroll": {
"type": "boolean"
},
"criticalWound": {
"type": "integer",
"maximum": 6,
"minimum": 2
}
}
},
"melee": {
"type": "object",
"properties": {
"ap": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"skill": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"damage": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"lethal": {
"type": "boolean"
},
"attacks": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"strength": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"sustained": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"dice",
"sides",
"bonus"
],
"properties": {
"dice": {
"type": "integer",
"maximum": 10,
"minimum": 0
},
"bonus": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"sides": {
"anyOf": [
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 6
}
]
}
}
}
]
},
"criticalHit": {
"type": "integer",
"maximum": 6,
"minimum": 2
},
"devastating": {
"type": "boolean"
},
"damageReroll": {
"type": "boolean"
},
"criticalWound": {
"type": "integer",
"maximum": 6,
"minimum": 2
}
}
},
"ranged": {
"type": "object",
"properties": {
"ap": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"skill": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"damage": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"lethal": {
"type": "boolean"
},
"attacks": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"strength": {
"type": "integer",
"maximum": 10,
"minimum": -10
},
"sustained": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"dice",
"sides",
"bonus"
],
"properties": {
"dice": {
"type": "integer",
"maximum": 10,
"minimum": 0
},
"bonus": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"sides": {
"anyOf": [
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 6
}
]
}
}
}
]
},
"criticalHit": {
"type": "integer",
"maximum": 6,
"minimum": 2
},
"devastating": {
"type": "boolean"
},
"damageReroll": {
"type": "boolean"
},
"criticalWound": {
"type": "integer",
"maximum": 6,
"minimum": 2
}
}
}
}
},
"feelNoPain": {
"anyOf": [
{
"type": "integer",
"maximum": 6,
"minimum": 2
},
{
"type": "null"
}
]
}
},
"description": "Situational modifiers the simulator page offers, such as { \"all\": { \"cover\": true, \"hitModifier\": -1 } }, { \"melee\": { \"charged\": true } }, or { \"target\": { \"invulnerable\": 4 } }."
},
"weaponModes": {
"type": "object",
"description": "Weapon mode choices by key from a previous result, such as a frag or krak profile.",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "string",
"maxLength": 200
}
}
}
}Appends a legal battle command only when expectedSeq matches the current log. Requires mcp:write.
| Argument | Type | Description |
|---|---|---|
| token* | string | |
| command* | any | |
| expectedSeq* | integer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"token",
"expectedSeq",
"command"
],
"properties": {
"token": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"command": {
"anyOf": [
{
"oneOf": [
{
"type": "object",
"required": [
"kind",
"cardKey",
"occurrence",
"selection"
],
"properties": {
"kind": {
"type": "string",
"const": "select-mission"
},
"cardKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"selection": {
"oneOf": [
{
"type": "object",
"required": [
"kind",
"units",
"fallback",
"qualified"
],
"properties": {
"kind": {
"type": "string",
"const": "punishment"
},
"units": {
"type": "array",
"items": {
"type": "object",
"required": [
"playerId",
"unitKey",
"rosterSeq"
],
"properties": {
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"rosterSeq": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
}
},
"maxItems": 3
},
"fallback": {
"type": "boolean"
},
"qualified": {
"type": "boolean"
},
"unavailable": {
"type": "boolean",
"const": true
}
}
},
{
"type": "object",
"required": [
"kind",
"guards"
],
"properties": {
"kind": {
"type": "string",
"const": "guards"
},
"guards": {
"type": "array",
"items": {
"type": "object",
"required": [
"objective",
"unit"
],
"properties": {
"unit": {
"type": "object",
"required": [
"playerId",
"unitKey",
"rosterSeq"
],
"properties": {
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"rosterSeq": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
}
},
"objective": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
}
}
}
},
"maxItems": 20
}
}
},
{
"type": "object",
"required": [
"kind",
"objective",
"notHome",
"noMansLand"
],
"properties": {
"kind": {
"type": "string",
"const": "tempting-target"
},
"notHome": {
"type": "boolean"
},
"objective": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
}
},
"noMansLand": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"kind",
"unit",
"note"
],
"properties": {
"kind": {
"type": "string",
"const": "beacon"
},
"note": {
"type": "string",
"maxLength": 200
},
"unit": {
"anyOf": [
{
"type": "object",
"required": [
"playerId",
"unitKey",
"rosterSeq"
],
"properties": {
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"rosterSeq": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
}
},
{
"type": "null"
}
]
}
}
},
{
"type": "object",
"required": [
"kind",
"areas",
"outsideZone",
"allEligible"
],
"properties": {
"kind": {
"type": "string",
"const": "locate-and-deny"
},
"areas": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
}
},
"maxItems": 5
},
"allEligible": {
"type": "boolean"
},
"outsideZone": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"kind",
"marker",
"controlled"
],
"properties": {
"kind": {
"type": "string",
"const": "sensor-sweep"
},
"marker": {
"type": "object",
"required": [
"key",
"name",
"playerId"
],
"properties": {
"key": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
"controlled": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"kind",
"consecrations",
"qualified",
"notHome"
],
"properties": {
"kind": {
"type": "string",
"const": "consecrate"
},
"notHome": {
"type": "boolean"
},
"qualified": {
"type": "boolean"
},
"consecrations": {
"type": "array",
"items": {
"type": "object",
"required": [
"objective",
"unit"
],
"properties": {
"unit": {
"type": "object",
"required": [
"playerId",
"unitKey",
"rosterSeq"
],
"properties": {
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"rosterSeq": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
}
},
"objective": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
}
}
}
},
"maxItems": 20
}
}
}
]
},
"occurrence": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
}
},
{
"type": "object",
"required": [
"kind",
"limit",
"missionPackId",
"terrainLayoutId",
"twistId",
"clockLimitMinutes"
],
"properties": {
"kind": {
"type": "string",
"const": "configure-battle"
},
"limit": {
"anyOf": [
{
"type": "integer",
"maximum": 10000,
"minimum": 0
},
{
"type": "null"
}
]
},
"manual": {
"type": "boolean"
},
"twistId": {
"anyOf": [
{
"type": "string",
"maxLength": 64,
"minLength": 1
},
{
"type": "null"
}
]
},
"teamBattle": {
"type": "boolean"
},
"playerCount": {
"anyOf": [
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 4
}
]
},
"missionPackId": {
"anyOf": [
{
"type": "string",
"maxLength": 64,
"minLength": 1
},
{
"type": "null"
}
]
},
"terrainLayoutId": {
"anyOf": [
{
"type": "string",
"maxLength": 64,
"minLength": 1
},
{
"type": "null"
}
]
},
"clockLimitMinutes": {
"anyOf": [
{
"type": "integer",
"maximum": 300,
"minimum": 5
},
{
"type": "null"
}
]
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "reset-setup"
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "detach-roster"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"leagueToken"
],
"properties": {
"kind": {
"type": "string",
"const": "lock-league-rosters"
},
"eventToken": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"leagueToken": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"dispositions": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"disposition"
],
"properties": {
"side": {
"type": "integer",
"maximum": 1,
"minimum": 0
},
"disposition": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
"maxItems": 2
}
}
},
{
"type": "object",
"required": [
"kind",
"step"
],
"properties": {
"kind": {
"type": "string",
"const": "set-setup-step"
},
"step": {
"type": "integer",
"maximum": 9,
"minimum": 0
}
}
},
{
"type": "object",
"required": [
"kind",
"attackerId"
],
"properties": {
"kind": {
"type": "string",
"const": "set-attacker"
},
"attackerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"firstPlayerId"
],
"properties": {
"kind": {
"type": "string",
"const": "set-first-turn"
},
"firstPlayerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"side",
"disposition"
],
"properties": {
"kind": {
"type": "string",
"const": "set-side-disposition"
},
"side": {
"type": "integer",
"maximum": 1,
"minimum": 0
},
"disposition": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"roster"
],
"properties": {
"kind": {
"type": "string",
"const": "attach-roster"
},
"prep": {
"anyOf": [
{
"type": "object",
"required": [
"stratagems",
"secondaries",
"primary",
"secondaryMode"
],
"properties": {
"primary": {
"anyOf": [
{
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
},
{
"type": "null"
}
]
},
"stratagems": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name",
"cp",
"limit"
],
"properties": {
"cp": {
"type": "integer",
"maximum": 6,
"minimum": 0
},
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"limit": {
"enum": [
"phase",
"turn",
"battle-round",
"battle",
"unlimited"
],
"type": "string"
},
"phases": {
"type": "array",
"items": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"end"
],
"type": "string"
},
"maxItems": 6
},
"detachment": {
"type": "string",
"maxLength": 249,
"minLength": 1
}
}
},
"maxItems": 48
},
"secondaries": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
},
"maxItems": 6
},
"secondaryDeck": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
},
"maxItems": 60
},
"secondaryMode": {
"enum": [
"tactical",
"fixed"
],
"type": "string"
}
}
},
{
"type": "null"
}
]
},
"roster": {
"type": "object",
"required": [
"name",
"text"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80
},
"text": {
"type": "string",
"maxLength": 20000
},
"built": {
"type": "object",
"required": [
"catalogueId",
"revision",
"limit",
"detachment",
"disposition",
"units"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 10000,
"minimum": 0
},
"picks": {
"type": "array",
"items": {
"type": "object",
"required": [
"entryId"
],
"properties": {
"note": {
"type": "string",
"maxLength": 500
},
"models": {
"type": "integer",
"maximum": 60,
"minimum": 1
},
"choices": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"entryId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"spreads": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 64
},
"additionalProperties": {
"type": "integer",
"maximum": 60,
"minimum": 0
}
}
},
"toggles": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "integer",
"maximum": 1,
"minimum": 0
}
},
"attachedTo": {
"type": "integer",
"maximum": 99,
"minimum": 0
},
"catalogueId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
"maxItems": 100
},
"units": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name",
"points",
"models"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 500
},
"group": {
"enum": [
"epic-hero",
"character",
"battleline",
"infantry",
"swarm",
"mounted",
"beast",
"monster",
"vehicle",
"drone",
"transport",
"fortification",
"other"
],
"type": "string"
},
"joined": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"label": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
}
},
"maxItems": 20
},
"models": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"points": {
"type": "integer",
"maximum": 10000,
"minimum": 0
},
"wounds": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"entryId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"wargear": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"count"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"count": {
"type": "integer",
"maximum": 100,
"minimum": 1
}
}
},
"maxItems": 200
},
"warlord": {
"type": "boolean"
},
"keywords": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxItems": 60
},
"upgrades": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"maxItems": 20
},
"transport": {
"type": "boolean"
},
"attachedTo": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"enhancements": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"maxItems": 20
},
"transportRule": {
"type": "string",
"maxLength": 4000
},
"prebattleRules": {
"type": "array",
"items": {
"enum": [
"infiltrators",
"scouts"
],
"type": "string"
},
"maxItems": 2
},
"warlordEligible": {
"type": "boolean"
},
"formationOptions": {
"type": "array",
"items": {
"enum": [
"battlefield",
"strategic-reserves",
"deep-strike",
"embarked"
],
"type": "string"
},
"maxItems": 4
},
"transportCapacity": {
"type": "object",
"required": [
"main",
"instead",
"conditions",
"pools",
"alternatives",
"excluded",
"space"
],
"properties": {
"main": {
"type": "object",
"required": [
"capacity",
"carries"
],
"properties": {
"carries": {
"type": "string",
"maxLength": 200
},
"capacity": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
},
"maxWounds": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
}
}
},
"pools": {
"type": "array",
"items": {
"type": "object",
"required": [
"capacity",
"carries"
],
"properties": {
"carries": {
"type": "string",
"maxLength": 200
},
"capacity": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
},
"maxWounds": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
}
}
},
"maxItems": 20
},
"space": {
"type": "array",
"items": {
"type": "object",
"required": [
"size"
],
"properties": {
"size": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
},
"keywords": {
"type": "string",
"maxLength": 200
},
"moreWoundsThan": {
"type": "integer",
"maximum": 1000,
"minimum": 0
}
}
},
"maxItems": 20
},
"instead": {
"anyOf": [
{
"type": "object",
"required": [
"capacity",
"carries"
],
"properties": {
"carries": {
"type": "string",
"maxLength": 200
},
"capacity": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
},
"maxWounds": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
}
}
},
{
"type": "null"
}
]
},
"excluded": {
"type": "array",
"items": {
"type": "object",
"required": [
"keywords"
],
"properties": {
"except": {
"type": "string",
"maxLength": 200
},
"keywords": {
"type": "string",
"maxLength": 200
}
}
},
"maxItems": 20
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"required": [
"capacity",
"carries",
"wargear"
],
"properties": {
"carries": {
"type": "string",
"maxLength": 200
},
"wargear": {
"type": "string",
"maxLength": 200
},
"capacity": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
},
"maxWounds": {
"type": "integer",
"maximum": 1000,
"exclusiveMinimum": 0
}
}
},
"maxItems": 20
},
"alternatives": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 20
}
}
},
"strategicReserveExempt": {
"type": "boolean"
}
}
},
"maxItems": 200
},
"edition": {
"type": "object",
"required": [
"id",
"name",
"status"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,19}$"
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"maxLength": 80,
"minLength": 1
},
"status": {
"enum": [
"preview",
"released",
"retired"
],
"type": "string"
},
"description": {
"type": "string",
"maxLength": 240,
"minLength": 1
}
}
},
"revision": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"detachment": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"catalogueId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"detachments": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"points"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80
},
"points": {
"anyOf": [
{
"type": "integer",
"maximum": 3,
"minimum": 1
},
{
"type": "null"
}
]
}
}
},
"maxItems": 3
},
"disposition": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
]
},
"waivedRules": {
"type": "array",
"items": {
"enum": [
"points-limit",
"detachments",
"detachment-points",
"kotc-infantry",
"kotc-warlord",
"kotc-epic-heroes",
"kotc-toughness",
"kotc-datasheet-copies"
],
"type": "string"
},
"maxItems": 8
},
"dispositions": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 16
},
"pointsBudget": {
"type": "integer",
"maximum": 10000,
"minimum": 500
},
"detachmentIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"maxItems": 3
},
"detachmentPointBudget": {
"anyOf": [
{
"type": "integer",
"maximum": 3,
"minimum": 0
},
{
"type": "null"
}
]
},
"strategicReserveLimit": {
"type": "integer",
"maximum": 5000,
"minimum": 0
}
}
},
"lentBy": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 48
}
}
},
"reminders": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"ability",
"description",
"timings"
],
"properties": {
"key": {
"type": "string",
"maxLength": 240,
"minLength": 1
},
"unit": {
"type": "object",
"required": [
"index",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"index": {
"type": "integer",
"maximum": 99,
"minimum": 0
}
}
},
"ability": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"timings": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"phase": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"any"
],
"type": "string"
},
"moment": {
"enum": [
"phase-start",
"phase-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"phase": {
"type": "null"
},
"moment": {
"enum": [
"turn-start",
"turn-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"type": "string",
"const": "either"
},
"phase": {
"type": "null"
},
"moment": {
"enum": [
"round-start",
"round-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
}
]
},
"maxItems": 10,
"minItems": 1
},
"description": {
"type": "string",
"maxLength": 10000
},
"whileDestroyed": {
"type": "boolean"
}
}
},
"maxItems": 100
},
"remindersEnabled": {
"type": "boolean"
}
}
},
"painted": {
"type": "boolean"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"unitKey",
"destroyed"
],
"properties": {
"kind": {
"type": "string",
"const": "set-unit"
},
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"destroyed": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"kind",
"stratagems",
"secondaries",
"primary",
"secondaryMode"
],
"properties": {
"kind": {
"type": "string",
"const": "set-prep"
},
"primary": {
"anyOf": [
{
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
},
{
"type": "null"
}
]
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"stratagems": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name",
"cp",
"limit"
],
"properties": {
"cp": {
"type": "integer",
"maximum": 6,
"minimum": 0
},
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"limit": {
"enum": [
"phase",
"turn",
"battle-round",
"battle",
"unlimited"
],
"type": "string"
},
"phases": {
"type": "array",
"items": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"end"
],
"type": "string"
},
"maxItems": 6
},
"detachment": {
"type": "string",
"maxLength": 249,
"minLength": 1
}
}
},
"maxItems": 48
},
"secondaries": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
},
"maxItems": 6
},
"secondaryDeck": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
},
"maxItems": 60
},
"secondaryMode": {
"enum": [
"tactical",
"fixed"
],
"type": "string"
}
}
},
{
"type": "object",
"required": [
"kind",
"unitKey",
"deployed"
],
"properties": {
"kind": {
"type": "string",
"const": "deploy-unit"
},
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"deployed": {
"type": "boolean"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"unitKey",
"formation"
],
"properties": {
"kind": {
"type": "string",
"const": "set-unit-formation"
},
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"formation": {
"enum": [
"battlefield",
"strategic-reserves",
"deep-strike",
"embarked"
],
"type": "string"
},
"transportKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"painted"
],
"properties": {
"kind": {
"type": "string",
"const": "set-painted"
},
"painted": {
"type": "boolean"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"unitKey",
"delta"
],
"properties": {
"kind": {
"type": "string",
"const": "wound-unit"
},
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"unitKey",
"delta"
],
"properties": {
"kind": {
"type": "string",
"const": "damage-unit"
},
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"unitKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"patternId"
],
"properties": {
"kind": {
"type": "string",
"const": "set-deployment"
},
"patternId": {
"anyOf": [
{
"type": "string",
"maxLength": 64,
"minLength": 1
},
{
"type": "null"
}
]
}
}
},
{
"type": "object",
"required": [
"kind",
"patternId",
"terrainLayoutId"
],
"properties": {
"kind": {
"type": "string",
"const": "set-battlefield"
},
"patternId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"terrainLayoutId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"key"
],
"properties": {
"cp": {
"type": "integer",
"maximum": 6,
"minimum": 0
},
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"kind": {
"type": "string",
"const": "use-stratagem"
},
"missed": {
"type": "object",
"required": [
"round",
"phase",
"turn"
],
"properties": {
"turn": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"phase": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"end"
],
"type": "string"
},
"round": {
"type": "integer",
"maximum": 5,
"minimum": 1
}
}
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"stratagemKey",
"secondaryKey",
"secondary"
],
"properties": {
"cp": {
"type": "integer",
"maximum": 6,
"minimum": 0
},
"kind": {
"type": "string",
"const": "use-new-orders"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"secondary": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
},
"secondaryKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"stratagemKey": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"key",
"delta"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"kind": {
"type": "string",
"const": "score-secondary"
},
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"scores"
],
"properties": {
"kind": {
"type": "string",
"const": "score-settlement"
},
"round": {
"type": "integer",
"maximum": 5,
"minimum": 1
},
"missed": {
"type": "object",
"required": [
"round",
"phase",
"turn"
],
"properties": {
"turn": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"phase": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"end"
],
"type": "string"
},
"round": {
"type": "integer",
"maximum": 5,
"minimum": 1
}
}
},
"scores": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"category",
"delta"
],
"properties": {
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"final": {
"type": "object",
"required": [
"claims",
"delta"
],
"properties": {
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"claims": {
"type": "array",
"items": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"maxItems": 20
}
}
},
"category": {
"type": "string",
"const": "primary"
}
}
},
{
"type": "object",
"required": [
"category",
"key",
"delta"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"status": {
"type": "string",
"const": "achieved"
},
"category": {
"type": "string",
"const": "secondary"
}
}
}
]
},
"maxItems": 31,
"minItems": 1
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"key",
"status"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"kind": {
"type": "string",
"const": "set-secondary-status"
},
"status": {
"enum": [
"active",
"achieved",
"discarded",
"returned"
],
"type": "string"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"secondary"
],
"properties": {
"kind": {
"type": "string",
"const": "draw-secondary"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"secondary": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
}
}
},
{
"type": "object",
"required": [
"kind",
"secondaries"
],
"properties": {
"kind": {
"type": "string",
"const": "draw-secondaries"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"selected": {
"type": "boolean",
"const": true
},
"secondaries": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
},
"maxItems": 2,
"minItems": 1
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "acknowledge-draw"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "acknowledge-scoring"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"secondary"
],
"properties": {
"kind": {
"type": "string",
"const": "select-secret"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"secondary": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"awards": {
"type": "array",
"items": {
"type": "object",
"required": [
"vp",
"per",
"mode",
"max",
"group",
"cumulative",
"criteria",
"trigger"
],
"properties": {
"vp": {
"type": "integer",
"maximum": 100,
"minimum": 0
},
"max": {
"anyOf": [
{
"type": "integer",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"mode": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
]
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"trigger": {
"type": "object",
"required": [
"timing",
"phase",
"playerTurn",
"roundMin",
"roundMax"
],
"properties": {
"phase": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"timing": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
},
"roundMax": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"roundMin": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
]
},
"playerTurn": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
}
},
"criteria": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"cumulative": {
"type": "boolean"
}
}
},
"maxItems": 20
},
"selection": {
"enum": [
"punishment",
"guards",
"tempting-target",
"beacon",
"locate-and-deny",
"sensor-sweep",
"consecrate"
],
"type": "string"
}
}
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "reveal-secret"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"firstPlayerId"
],
"properties": {
"kind": {
"type": "string",
"const": "begin-battle"
},
"attackerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"firstPlayerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"delta"
],
"properties": {
"kind": {
"type": "string",
"const": "adjust-cp"
},
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"missed": {
"type": "object",
"required": [
"round",
"phase",
"turn"
],
"properties": {
"turn": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"phase": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"end"
],
"type": "string"
},
"round": {
"type": "integer",
"maximum": 5,
"minimum": 1
}
}
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"keys": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"kind": {
"type": "string",
"const": "resolve-tactical-hand"
},
"gainCp": {
"type": "boolean"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"category",
"delta"
],
"properties": {
"kind": {
"type": "string",
"const": "score"
},
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"category": {
"enum": [
"primary",
"secondary"
],
"type": "string"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind",
"playerId",
"resource",
"delta"
],
"properties": {
"kind": {
"type": "string",
"const": "correct-player"
},
"delta": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"resource": {
"enum": [
"cp",
"primary",
"secondary"
],
"type": "string"
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "settle-opponent-turn"
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "request-advance"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "cancel-advance"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "advance"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "pause-clock"
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "resume-clock"
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "end-battle"
},
"reason": {
"enum": [
"completed",
"finished-early",
"conceded"
],
"type": "string"
},
"concededBy": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "reopen-battle"
}
}
},
{
"type": "object",
"required": [
"kind",
"text"
],
"properties": {
"kind": {
"type": "string",
"const": "add-note"
},
"text": {
"type": "string",
"maxLength": 500
}
}
},
{
"type": "object",
"required": [
"kind",
"target"
],
"properties": {
"kind": {
"type": "string",
"const": "undo"
},
"target": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
}
}
]
},
{
"type": "object",
"required": [
"kind",
"rosterId"
],
"properties": {
"kind": {
"type": "string",
"const": "attach-saved-roster"
},
"playerId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"rosterId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"kind",
"draft"
],
"properties": {
"kind": {
"type": "string",
"const": "attach-draft-roster"
},
"draft": {
"type": "object",
"required": [
"name",
"catalogueId",
"detachmentIds",
"disposition",
"limit",
"picks",
"prep"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80
},
"prep": {
"anyOf": [
{
"type": "object",
"required": [
"stratagems",
"secondaries"
],
"properties": {
"reminders": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"ability",
"description",
"timings"
],
"properties": {
"key": {
"type": "string",
"maxLength": 240,
"minLength": 1
},
"unit": {
"type": "object",
"required": [
"index",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"index": {
"type": "integer",
"maximum": 99,
"minimum": 0
}
}
},
"ability": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"timings": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"phase": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"any"
],
"type": "string"
},
"moment": {
"enum": [
"phase-start",
"phase-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"phase": {
"type": "null"
},
"moment": {
"enum": [
"turn-start",
"turn-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"type": "string",
"const": "either"
},
"phase": {
"type": "null"
},
"moment": {
"enum": [
"round-start",
"round-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
}
]
},
"maxItems": 10,
"minItems": 1
},
"description": {
"type": "string",
"maxLength": 10000
},
"whileDestroyed": {
"type": "boolean"
}
}
},
"default": [],
"maxItems": 100
},
"stratagems": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name",
"cp",
"limit"
],
"properties": {
"cp": {
"type": "integer",
"maximum": 6,
"minimum": 0
},
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"limit": {
"enum": [
"phase",
"turn",
"battle-round",
"battle",
"unlimited"
],
"type": "string"
},
"phases": {
"type": "array",
"items": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"end"
],
"type": "string"
},
"maxItems": 6
}
}
},
"maxItems": 48
},
"secondaries": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
}
},
"maxItems": 6
},
"remindersEnabled": {
"type": "boolean",
"default": true
}
}
},
{
"type": "null"
}
]
},
"limit": {
"type": "integer",
"maximum": 10000,
"minimum": 0
},
"picks": {
"type": "array",
"items": {
"type": "object",
"required": [
"entryId"
],
"properties": {
"note": {
"type": "string",
"maxLength": 500
},
"models": {
"type": "integer",
"maximum": 60,
"minimum": 1
},
"choices": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"entryId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"spreads": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 64
},
"additionalProperties": {
"type": "integer",
"maximum": 60,
"minimum": 0
}
}
},
"toggles": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "integer",
"maximum": 1,
"minimum": 0
}
},
"attachedTo": {
"type": "integer",
"maximum": 99,
"minimum": 0
},
"catalogueId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
"maxItems": 100
},
"source": {
"enum": [
"legacy",
"editable",
"praetorium",
"battlebase",
"newrecruit",
"roster-file"
],
"type": "string",
"default": "editable"
},
"visibility": {
"enum": [
"private",
"unlisted",
"public"
],
"type": "string",
"default": "private"
},
"catalogueId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"disposition": {
"anyOf": [
{
"type": "string",
"maxLength": 64,
"minLength": 1
},
{
"type": "null"
}
]
},
"waivedRules": {
"type": "array",
"items": {
"enum": [
"points-limit",
"detachments",
"detachment-points",
"kotc-infantry",
"kotc-warlord",
"kotc-epic-heroes",
"kotc-toughness",
"kotc-datasheet-copies"
],
"type": "string"
},
"maxItems": 8
},
"pointsBudget": {
"anyOf": [
{
"type": "integer",
"maximum": 10000,
"minimum": 500
},
{
"type": "null"
}
]
},
"detachmentIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"maxItems": 3
},
"optionalRules": {
"type": "array",
"items": {
"enum": [
"kotc-borrowed-disposition"
],
"type": "string"
},
"maxItems": 1
},
"borrowedDetachmentId": {
"anyOf": [
{
"type": "string",
"maxLength": 128,
"minLength": 1
},
{
"type": "null"
}
],
"default": null
}
}
}
},
"additionalProperties": false
}
]
},
"expectedSeq": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
}
}
}| waivedRules | array |
| pointsBudget | any |
| detachmentIds* | array |
| optionalRules | array |
| borrowedDetachmentId | any |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"catalogueId",
"detachmentIds",
"disposition",
"limit",
"picks",
"prep"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80
},
"prep": {
"anyOf": [
{
"type": "object",
"required": [
"stratagems",
"secondaries"
],
"properties": {
"reminders": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"ability",
"description",
"timings"
],
"properties": {
"key": {
"type": "string",
"maxLength": 240,
"minLength": 1
},
"unit": {
"type": "object",
"required": [
"index",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"index": {
"type": "integer",
"maximum": 99,
"minimum": 0
}
}
},
"ability": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"timings": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"phase": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"any"
],
"type": "string"
},
"moment": {
"enum": [
"phase-start",
"phase-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"phase": {
"type": "null"
},
"moment": {
"enum": [
"turn-start",
"turn-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
},
{
"type": "object",
"required": [
"moment",
"phase",
"turn"
],
"properties": {
"turn": {
"type": "string",
"const": "either"
},
"phase": {
"type": "null"
},
"moment": {
"enum": [
"round-start",
"round-end"
],
"type": "string"
},
"firstRoundOnly": {
"type": "boolean"
}
}
}
]
},
"maxItems": 10,
"minItems": 1
},
"description": {
"type": "string",
"maxLength": 10000
},
"whileDestroyed": {
"type": "boolean"
}
}
},
"default": [],
"maxItems": 100
},
"stratagems": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name",
"cp",
"limit"
],
"properties": {
"cp": {
"type": "integer",
"maximum": 6,
"minimum": 0
},
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"turn": {
"enum": [
"your-turn",
"opponent-turn",
"either"
],
"type": "string"
},
"limit": {
"enum": [
"phase",
"turn",
"battle-round",
"battle",
"unlimited"
],
"type": "string"
},
"phases": {
"type": "array",
"items": {
"enum": [
"command",
"movement",
"shooting",
"charge",
"fight",
"end"
],
"type": "string"
},
"maxItems": 6
}
}
},
"maxItems": 48
},
"secondaries": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
}
},
"maxItems": 6
},
"remindersEnabled": {
"type": "boolean",
"default": true
}
}
},
{
"type": "null"
}
]
},
"limit": {
"type": "integer",
"maximum": 10000,
"minimum": 0
},
"picks": {
"type": "array",
"items": {
"type": "object",
"required": [
"entryId"
],
"properties": {
"note": {
"type": "string",
"maxLength": 500
},
"models": {
"type": "integer",
"maximum": 60,
"minimum": 1
},
"choices": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"entryId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"spreads": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 64
},
"additionalProperties": {
"type": "integer",
"maximum": 60,
"minimum": 0
}
}
},
"toggles": {
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 400
},
"additionalProperties": {
"type": "integer",
"maximum": 1,
"minimum": 0
}
},
"attachedTo": {
"type": "integer",
"maximum": 99,
"minimum": 0
},
"catalogueId": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
},
"maxItems": 100
},
"source": {
"enum": [
"legacy",
"editable",
"praetorium",
"battlebase",
"newrecruit",
"roster-file"
],
"type": "string",
"default": "editable"
},
"visibility": {
"enum": [
"private",
"unlisted",
"public"
],
"type": "string",
"default": "private"
},
"catalogueId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"disposition": {
"anyOf": [
{
"type": "string",
"maxLength": 64,
"minLength": 1
},
{
"type": "null"
}
]
},
"waivedRules": {
"type": "array",
"items": {
"enum": [
"points-limit",
"detachments",
"detachment-points",
"kotc-infantry",
"kotc-warlord",
"kotc-epic-heroes",
"kotc-toughness",
"kotc-datasheet-copies"
],
"type": "string"
},
"maxItems": 8
},
"pointsBudget": {
"anyOf": [
{
"type": "integer",
"maximum": 10000,
"minimum": 500
},
{
"type": "null"
}
]
},
"detachmentIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"maxItems": 3
},
"optionalRules": {
"type": "array",
"items": {
"enum": [
"kotc-borrowed-disposition"
],
"type": "string"
},
"maxItems": 1
},
"borrowedDetachmentId": {
"anyOf": [
{
"type": "string",
"maxLength": 128,
"minLength": 1
},
{
"type": "null"
}
],
"default": null
}
}
}