53 lines
2.0 KiB
JSON
53 lines
2.0 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://neon-sprawl.local/schemas/contract-template.json",
|
|
"title": "ContractTemplate",
|
|
"description": "Single contract template row for catalogs (e.g. content/contracts/*_contract_templates.json). Repeatable mission skeleton keyed by zone difficulty band. See docs/decomposition/modules/E7_M4_ContractMissionGenerator.md.",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"id",
|
|
"displayName",
|
|
"zoneDifficultyBand",
|
|
"objectiveKind",
|
|
"encounterTemplateId",
|
|
"minFactionStanding",
|
|
"completionRewardBundle"
|
|
],
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"pattern": "^[a-z][a-z0-9_]*$",
|
|
"description": "Immutable template key for issuance APIs and telemetry."
|
|
},
|
|
"displayName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "Player-facing label; safe to change without migrating instance data."
|
|
},
|
|
"zoneDifficultyBand": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"description": "Difficulty band used to filter eligible templates at issue time (E4.M1 live zone deferred in Slice 4 v1)."
|
|
},
|
|
"objectiveKind": {
|
|
"type": "string",
|
|
"enum": ["encounter_clear"],
|
|
"description": "Objective discriminator; Slice 4 v1 binds encounterTemplateId only."
|
|
},
|
|
"encounterTemplateId": {
|
|
"type": "string",
|
|
"pattern": "^[a-z][a-z0-9_]*$",
|
|
"description": "Encounter template id from content/encounters (E5.M3)."
|
|
},
|
|
"minFactionStanding": {
|
|
"$ref": "https://neon-sprawl.local/schemas/faction-gate-rule.json",
|
|
"description": "Minimum faction standing required to issue this template."
|
|
},
|
|
"completionRewardBundle": {
|
|
"$ref": "https://neon-sprawl.local/schemas/quest-reward-bundle.json",
|
|
"description": "Repeat completion payout delivered via RewardRouterOperations (E7.M2); separate idempotency from quest and first-time encounter loot."
|
|
}
|
|
}
|
|
}
|