{"tab":"mechanics","section":"relationshipStages","title":"Relationship Stages","summary":"Optional labels for the relationship-score bands the engine tracks on every NPC. Rename the stages and set their score ranges; players see these labels and the AI uses them as context. Define none and Voyage falls back to its default stages.","kind":"schema","uiLocation":"Files → Mechanics → Relationship Stages","uiSubtitle":"\"Relationship Stages\"","editor":"Edit in Studio + View JSON","related":[{"section":"triggers","note":"npc-relationship / npc-relationship-stage read and change the score these stages label"},{"section":"generateNPCUpdates","note":"relationship_change_updates sets how fast the score moves"},{"section":"npcs","note":"the relationship score is tracked per NPC"}],"wikiUrl":"/mechanics/relationshipStages","schema":{"_type":"array","of":{"_type":"intersection","parts":[{"_type":"partial","fields":{"name":"string","minScore":"number","maxScore":"number"}}]}},"sizeLimits":[],"blocks":[{"type":"example","lang":"json","caption":"Example: the default relationship stages (used when a world defines none)","code":"{\n  \"relationshipStages\": [\n    {\n      \"name\": \"Nemesis\",\n      \"minScore\": -100,\n      \"maxScore\": -81\n    },\n    {\n      \"name\": \"Antagonist\",\n      \"minScore\": -80,\n      \"maxScore\": -61\n    },\n    {\n      \"name\": \"Hostile\",\n      \"minScore\": -60,\n      \"maxScore\": -41\n    },\n    {\n      \"name\": \"Unfriendly\",\n      \"minScore\": -40,\n      \"maxScore\": -21\n    },\n    {\n      \"name\": \"Cold\",\n      \"minScore\": -20,\n      \"maxScore\": -1\n    },\n    {\n      \"name\": \"Neutral\",\n      \"minScore\": 0,\n      \"maxScore\": 0\n    },\n    {\n      \"name\": \"Warm\",\n      \"minScore\": 1,\n      \"maxScore\": 20\n    },\n    {\n      \"name\": \"Friendly\",\n      \"minScore\": 21,\n      \"maxScore\": 40\n    },\n    {\n      \"name\": \"Confidant\",\n      \"minScore\": 41,\n      \"maxScore\": 60\n    },\n    {\n      \"name\": \"Ally\",\n      \"minScore\": 61,\n      \"maxScore\": 80\n    },\n    {\n      \"name\": \"Devoted\",\n      \"minScore\": 81,\n      \"maxScore\": 100\n    }\n  ]\n}"},{"type":"prose","md":"## How it works\n\nEvery NPC carries a relationship score from -100 to 100 that reflects how they feel about the player. Negative scores mean dislike, distrust, or opposition; positive scores mean warmth, trust, or attachment. `relationshipStages` maps score ranges to the labels shown to players and handed to the AI as context, so NPC behavior can reflect your world's own terminology (a romance world's `Fond` or `Soulbound`, a rivalry world's `Threatened` or `Sworn Nemesis`).\n\n- Each stage is a `{ name, minScore, maxScore }` object with a unique `name` and whole-number scores. If you define this section, the stages **must cover every score from -100 to 100** with no gaps and no overlaps, so any score resolves to exactly one stage.\n- Omit the section entirely to use the default set shown above; a present-but-empty `[]` is rejected, so cover the full range or leave the section out.\n- This section only names the bands. How fast scores move is plain-language pacing you write in the `relationship_change_updates` block of [NPC Updates](/ai/generateNPCUpdates), not a field here.\n- Triggers read a score with the `npc-relationship` condition and a stage name with `npc-relationship-stage`, and change a score with the `npc-relationship` effect (see [Triggers](/mechanics/triggers)). A changed score stays clamped to -100..100."},{"type":"fields","fields":[{"name":"name","required":true,"tooltip":"Label shown for this score band.","md":"The label shown for this score band, in the player-facing UI and in AI context. Rename it to your world's terminology."},{"name":"minScore","required":true,"tooltip":"Lowest score this stage covers (inclusive).","md":"Lowest score this stage covers, inclusive. Keep it within -100 to 100 and at or below `maxScore`."},{"name":"maxScore","required":true,"tooltip":"Highest score this stage covers (inclusive).","md":"Highest score this stage covers, inclusive. Keep it within -100 to 100 and at or above `minScore`."}]}],"body":"## Example: the default relationship stages (used when a world defines none)\n\n```json\n{\n  \"relationshipStages\": [\n    {\n      \"name\": \"Nemesis\",\n      \"minScore\": -100,\n      \"maxScore\": -81\n    },\n    {\n      \"name\": \"Antagonist\",\n      \"minScore\": -80,\n      \"maxScore\": -61\n    },\n    {\n      \"name\": \"Hostile\",\n      \"minScore\": -60,\n      \"maxScore\": -41\n    },\n    {\n      \"name\": \"Unfriendly\",\n      \"minScore\": -40,\n      \"maxScore\": -21\n    },\n    {\n      \"name\": \"Cold\",\n      \"minScore\": -20,\n      \"maxScore\": -1\n    },\n    {\n      \"name\": \"Neutral\",\n      \"minScore\": 0,\n      \"maxScore\": 0\n    },\n    {\n      \"name\": \"Warm\",\n      \"minScore\": 1,\n      \"maxScore\": 20\n    },\n    {\n      \"name\": \"Friendly\",\n      \"minScore\": 21,\n      \"maxScore\": 40\n    },\n    {\n      \"name\": \"Confidant\",\n      \"minScore\": 41,\n      \"maxScore\": 60\n    },\n    {\n      \"name\": \"Ally\",\n      \"minScore\": 61,\n      \"maxScore\": 80\n    },\n    {\n      \"name\": \"Devoted\",\n      \"minScore\": 81,\n      \"maxScore\": 100\n    }\n  ]\n}\n```\n\n## How it works\n\nEvery NPC carries a relationship score from -100 to 100 that reflects how they feel about the player. Negative scores mean dislike, distrust, or opposition; positive scores mean warmth, trust, or attachment. `relationshipStages` maps score ranges to the labels shown to players and handed to the AI as context, so NPC behavior can reflect your world's own terminology (a romance world's `Fond` or `Soulbound`, a rivalry world's `Threatened` or `Sworn Nemesis`).\n\n- Each stage is a `{ name, minScore, maxScore }` object with a unique `name` and whole-number scores. If you define this section, the stages **must cover every score from -100 to 100** with no gaps and no overlaps, so any score resolves to exactly one stage.\n- Omit the section entirely to use the default set shown above; a present-but-empty `[]` is rejected, so cover the full range or leave the section out.\n- This section only names the bands. How fast scores move is plain-language pacing you write in the `relationship_change_updates` block of [NPC Updates](/ai/generateNPCUpdates), not a field here.\n- Triggers read a score with the `npc-relationship` condition and a stage name with `npc-relationship-stage`, and change a score with the `npc-relationship` effect (see [Triggers](/mechanics/triggers)). A changed score stays clamped to -100..100.\n\n## Fields\n\n### name\n\nThe label shown for this score band, in the player-facing UI and in AI context. Rename it to your world's terminology.\n\n### minScore\n\nLowest score this stage covers, inclusive. Keep it within -100 to 100 and at or below `maxScore`.\n\n### maxScore\n\nHighest score this stage covers, inclusive. Keep it within -100 to 100 and at or above `minScore`."}