Exchanges
Exchanges are the dialogue pools used by DialogueNode, ExecutePrisonerNode, StripAndExecutePrisonerNode, ReleasePrisonerNode, StripPrisonerNode, and StripAndDismissPrisonerNode. The game picks one exchange at random each time that node is reached.
Format
exchanges is an array of arrays. Each inner array is one possible exchange. The game picks one inner array per event and plays its lines in order.
"exchanges": [
[ "line 0", "line 1", "line 2" ],
[ "line 0", "line 1" ],
[ "line 0", "line 1", "line 2", "line 3", "line 4" ]
]Speaker order
Lines within each inner array alternate speakers:
| Index | Speaker (headsmanFirst: false) |
|---|---|
| 0 | Prisoner |
| 1 | Headsman |
| 2 | Prisoner |
| 3 | Headsman |
| … | … |
When headsmanFirst is set to true on the node, the order flips:
| Index | Speaker (headsmanFirst: true) |
|---|---|
| 0 | Headsman |
| 1 | Prisoner |
| 2 | Headsman |
| 3 | Prisoner |
| … | … |
headsmanFirst defaults to false on all nodes, so the prisoner speaks first unless overridden. Set headsmanFirst: true to make the Headsman open instead. Any node’s headsmanFirst can be overridden in your mod JSON.
{prisonerName} placeholder
Any line may contain {prisonerName}. The game replaces it at runtime with the prisoner’s generated name.
"I know who you are, {prisonerName}. Word travels.","Then you know what I've done. Headsman.",StripPrisonerNode exchanges
StripPrisonerNode uses the same string[][] format as other nodes. The game picks one inner array at random and shows its first line as the prisoner’s reaction.
"exchanges": [
["You have no right."],
["Don't touch me."],
["Stop. Just stop."],
["Is this what you call justice?"]
]fullyNakedExchanges
StripPrisonerNode supports a second pool called fullyNakedExchanges. This pool is used instead of exchanges once the prisoner has no clothing left to remove. It uses the same format.
If fullyNakedExchanges is omitted or empty, the node falls back to exchanges.
{
"$type": "Scripts.DataComponents.NodeDataObject, Assembly-CSharp",
"id": "strip_prisoner",
"nodeType": "StripPrisonerNode",
"exchanges": [
["My mother will hear of this."],
["Everyone will know. You've made sure of that."]
],
"fullyNakedExchanges": [
["I have nothing left. Not even the right to be ashamed in private."],
["My mother used to say dignity was the one thing they couldn't take. She was wrong."]
]
}Examples
Opening interrogation exchange
"exchanges": [
[
"You don't look like you've held a weapon before. What's your name?",
"{prisonerName}. And I hadn't. Not until six months ago.",
"What happened six months ago?",
"The tax collectors came through. My brother argued with them. They beat him to death in the street while the rest of us watched.",
"And no one intervened.",
"We were afraid. I'm still ashamed of that. So when the rebels came through and asked who wanted to do something about it, I said yes.",
"You've been doing something about it for six months, {prisonerName}. Two of my soldiers are dead.",
"I know. I was there for one of them. I don't sleep well.",
"Neither do I. That doesn't change what happens next."
]
]Last-words exchanges (ExecutePrisonerNode, headsmanFirst: false)
"exchanges": [
[
"Please. My brother is at home alone. He'll have nothing without me.",
"I know."
],
[
"Do it then. I'm not afraid of you.",
"Good."
],
[
"Tell my family I didn't break.",
"I won't be your messenger. Kneel."
]
]Release exchanges (ReleasePrisonerNode)
"exchanges": [
[
"I can go? Just like that?",
"Just like that. Don't make me regret it."
],
[
"Why are you letting me go?",
"Because it suits me. Walk."
],
[
"You're going to let me tell people you spared me.",
"Smart. Now leave before I change my mind."
]
]Strip reaction exchanges (StripPrisonerNode)
The game picks one inner array at random and displays the first line as the prisoner’s reaction.
"exchanges": [
["You have no right."],
["Don't touch me."],
["Stop. Just stop."],
["Is this what you call justice?"],
["I complied. Was that not enough?"]
]Patching exchanges into an existing node
You do not need to replace an entire node to add exchanges. Because the merge is shallow, you can patch only the exchanges field:
{
"$type": "Scripts.DataComponents.NodeDataObject, Assembly-CSharp",
"id": "execute_prisoner",
"exchanges": [
[
"I want to pray first.",
"Make it quick."
],
[
"Is there nothing I can say?",
"Not today."
]
]
}This replaces the entire exchange pool for execute_prisoner with your two exchanges. The nodeType, headsmanFirst, and all other fields remain as the defaults.