Guide
Post-match interviews
After a TV match, and after quarter-finals, semis and finals anywhere, a reporter, pundit or presenter from the press pack puts a question to the player. The questions, their answers and what each answer does are all content. The core pack's are in StreamingAssets/core/data/media/interviews/, and a mod can add questions, add answers to other packs' questions, change or switch off either, and translate them.
| Type | Path | Editor schema |
|---|---|---|
| Questions | data/media/interviews.json or data/media/interviews/*.json | the interview questions reference |
| Answers for questions | data/media/interview-answers.json or data/media/interview-answers/*.json | the interview answers reference |
Interviews are flavour, like stories and the press pack: an existing save picks up new or changed questions the next time it's opened. The example-interviews mod uses every feature on this page.
A question#
{
"id": "acme.interview.derby-win",
"text": "Local bragging rights are yours. How long have you waited to beat {opponent}?",
"conditions": { "won": true, "rival": true, "crowd": ["home"] },
"weight": 2,
"cooldownDays": 90,
"answers": [
{
"id": "humble",
"tone": "humble",
"text": "It’s just one win. {oppFirst} has had the better of me for years."
},
{
"id": "cocky",
"tone": "arrogant",
"text": "Too long. And I’ll do it again next time.",
"claim": "beat"
},
{
"id": "joke",
"tone": "humorous",
"text": "Since the under-12s. Not that I’m counting.",
"effects": { "followers": 80 }
},
{
"id": "fiery",
"tone": "fiery",
"text": "Every day. Every single day.",
"effects": { "rivalry": 0.3 }
}
]
}| Field | Meaning |
|---|---|
id | A new question's id starts with your mod id. Reuse a core id to replace that question. |
text | The question, up to 280 characters, with {placeholders} (below). |
conditions | When it can be asked. All the conditions given must hold (below). Leave won out for a question that works after a win or a loss. |
weight | How often it's picked compared with other questions that fit (default 1; 0 switches it off). |
disabled | true switches it off. It's the easy way to turn off a core question with a patch. |
cooldownDays | The number of days before it can be asked again (default 60). Use short cooldowns (10–20) for everyday questions and long ones for special moments. |
once | true: asked at most once in a career (the first title). |
styles | Only interviewers with one of these styles ask it: tabloid, analyst, local, veteran, cheerleader, contrarian, establishment. Leave it out for anyone. |
voiced | true: the interviewer may put it in their own words (their question.postWin / question.postLoss media lines#the-press-pack)). The answers stay as written, so only mark a question voiced when every answer fits any of those lines (they ask about the trophy, the doubles, the folks back home…). The core pack voices none of its questions. |
answers | 2–16 answers (below). Up to five are offered, as many different tones as possible. |
Answers#
| Field | Meaning |
|---|---|
id | Unique within the question: lowercase letters, digits, dots and dashes. Patches and translations find the answer by it. |
tone | How it comes across (below). It sets the default effect and how each journalist feels about it. |
text | Up to 240 characters, with {placeholders}. |
effects | Optional changes to the tone's default effect. List only what you change (below). |
claim | Optional: something the press will hold the player to. winEvent, goDeep (quarter-finals or better) or beat (the opponent, next time). |
conditions | Optional: the answer is only offered when these hold too ({ "stage": ["early", "late"] }, { "hasSponsor": true }). |
weight | How likely it is to be offered when there are more answers than room (default 1; 0 = never). |
A claim is settled when the result is in. If the player keeps it, the papers say so and the player gains followers. If they break it, they're left eating their words, and the reporter they said it to may bring it back up at a later interview. An event claim (winEvent, goDeep) made after the event is already over is settled at once, so give claim answers a condition like "stage": ["early", "late"] when the question can also come up after a final.
Tones#
| Tone | Shown as | Default effect (after a win) |
|---|---|---|
humble | Humble | A little confidence and morale, and good for the player's image. Cools a rivalry slightly. |
confident | Confident | Confidence, and some followers. A touch of pressure. |
arrogant | Cocky | Big on followers and confidence. Costs image, fuels the rivalry, and raises the pressure next match. |
deflect | Deflect | Next to nothing either way. After a loss, it protects morale. |
gracious | Gracious | Praise for the opponent: the best for the player's image, and it cools a rivalry. Few followers. |
fiery | Fiery | Passion: confidence and followers, but it costs a little image and stokes the rivalry. |
humorous | Humorous | A joke: morale, followers and a little image, and it takes the pressure off. |
Losses change the defaults: a cocky answer after a defeat costs morale and more image.
Each journalist has likes for the tones. A person without gracious, fiery or humorous in their likes treats gracious as they treat humble. They put fiery halfway between confident and arrogant, and humorous halfway between humble and confident.
Effects#
effects changes the tone's defaults, value by value:
| Effect | Range | Meaning |
|---|---|---|
confidence | −10 … 10 | The player's confidence. |
morale | −10 … 10 | The player's morale. |
followers | −500 … 1000 | Before the multiplier: ×1.6 on TV, and more for players with a big following (the defaults are 4–80). |
image | −15 … 15 | Public image (−100 … 100); sponsors care about it. |
rivalry | −0.5 … 0.5 | The rivalry with the opponent (a rival is 0.3 or more). |
pressure | −0.1 … 0.15 | Extra pressure carried into the next match. |
Keep answers balanced against the defaults. No answer should be better on every count, and a big gain in one place should cost something in another. A player with a PR officer takes less of the negative effects.
Conditions#
A question's and an answer's conditions take everything a social post's conditions take, plus these, which only interviews know about:
| Condition | Type | Meaning |
|---|---|---|
comeback | true/false | Won after trailing by 3 or more legs (2 or more sets in a set match). |
blewLead | true/false | Lost after leading by 3 or more legs (2 or more sets). |
nineDarter | true/false | The player threw a nine-darter in the match. |
missedMatchDarts | range | Match darts the player missed. |
oppAverage | range | The opponent's three-dart average. |
oppRank | range | The opponent's Order of Merit rank (unranked never matches). |
titles | range | Titles won before this event. |
firstTitle | true/false | The player just won the first title of their career. |
defending | true/false | The player won this event last year. |
returning | true/false | Back from an injury in the last six weeks. |
farewell | true/false | The player has announced this season is their last. |
newDarts | true/false | Still getting used to their darts (familiarity below 60%). |
crowd | list of home, away, neutral | The venue is in the player's country (home), the opponent's (away), or neither. |
age | range | The player's age. |
The social conditions interviews use most are won, stage (early, late for quarters and semis, final), margin (whitewash, decider, close, comfortable), average, n180, checkout, upset, rival, tv, major, rank, winStreak, lossStreak, injured, image, load, hasSponsor and followers.
Questions and answers can also be tied to the event, as cards can: events (event template ids), tours (tour ids) and tags (event tags). Each is a list and holds when the match's event matches any of it:
{
"id": "acme.interview.sea-window",
"text": "The sea's right outside the window at {venue}. Does this series feel different?",
"conditions": { "tours": ["acme.tour.coastal"] },
"answers": [ … ]
}Placeholders#
| Placeholder | Value |
|---|---|
{name} {first} {last} {nickname} | The player |
{opponent} {oppFirst} {oppNick} | The opponent |
{score} | The player's score first, e.g. "6–4" |
{event} {venue} {city} {tour} | The event and where it is |
{round} | Lower case: "last 32", "quarter-final", "final" |
{average} {n180} {checkout} | The player's match numbers (when not zero) |
{oppAverage} {oppRank} | The opponent's average and rank |
{rank} {followers} {sponsor} | The player's rank, followers and biggest sponsor |
{streak} | Wins or losses in a row (two or more) |
{titles} | Titles won before this event (one or more) |
{age} | The player's age |
{deficit} | How far behind the player was, after a comeback |
{missed} | Match darts missed (one or more) |
A question or answer is skipped when one of its placeholders has nothing to fill it. So a {sponsor} answer is only offered to a player with a sponsor, and a question needs at least two answers left to be asked. An unknown placeholder (a typo) drops the question or answer, with a warning on the Mods screen. "the {event}" is safe even for an event called "The Midwinter Crown".
How a question is picked#
- Fit. A question is considered when all of these hold:
- It's switched on.
- Its conditions hold.
- Its
stylesinclude the interviewer's style, or it has none. - Its text fills in.
- At least two of its answers can be offered.
- Freshness. A question that fits waits while anything else fits if any of these holds:
- It was asked in the last eight interviews.
- It's inside its
cooldownDays. - It's a
oncequestion that has already been asked.
If everything that fits is waiting, the one asked longest ago is used (never a once question twice).
- Weight. Each question's weight goes up by 60% for every condition other than
won, so specific questions beat generic ones when they apply. It goes down a little each time the question has been asked in the career. - Answers. Up to five answers are offered:
- Different tones come first; a tone appears twice only when there's room.
- Among answers of the same kind,
weightdecides. - The answers are shown in tone order.
Before any of that, a journalist who remembers something the player said may throw it back at them instead (see the press pack#the-press-pack)). With no interview content installed at all, the game falls back on one plain question.
For variety over a long career, write several generic questions for wins and losses with short cooldowns, and plenty of specific ones for the moments you care about.
Adding to, changing and switching off other packs' questions#
To add answers to a question another pack owns, or to change one of its answers, use an answer file, without copying the question:
[
{
"id": "acme.answer.sponsor-plug",
"question": ["core.interview.win-feel", "core.interview.title-won"],
"tone": "gracious",
"text": "Thanks to {sponsor}, as ever.",
"conditions": { "hasSponsor": true }
},
{
"id": "acme.answer.softer",
"question": "core.interview.loss-too-good",
"replaces": "cocky",
"text": "Too good tonight, maybe. Next time’s another day."
},
{
"id": "acme.answer.no-joke",
"question": "core.interview.title-celebrate",
"replaces": "humorous",
"weight": 0
}
]questionis one question id or a list of them.- Without
replaces, the record is a new answer (itsidis the answer's id). It needs atoneandtext, and takeseffects,claim,conditionsandweight. - With
replaces, only the fields you give change on that answer."weight": 0switches it off. If the answer isn't there, the Mods screen lists the answers the question does have.
To replace a whole question, reuse its id in a question file. To change a few of its fields, or switch it off, use a patch in data/patches/:
[
{ "target": "interview:core.interview.win-tabloid", "patch": { "disabled": true } },
{ "target": "interview:core.interview.win-feel", "patch": { "cooldownDays": 30 } }
]A patch replaces a list whole, so patch answers only when you mean to restate them all. The answer file above is the better way to change a single answer.
Translating#
Interview text is content, so it's translated with patches in locale/<lang>/patches/ (see Localisation). Answers are matched by id, so a translation only restates text:
[
{
"target": "interview:core.interview.win-feel",
"patch": {
"text": "Ein {score}-Sieg gegen {opponent}. Wie fühlt sich das an?",
"answers": [{ "id": "humble", "text": "{opponent} ist ein Klassespieler." }]
}
},
{
"target": "interviewAnswer:acme.answer.sponsor-plug",
"patch": { "text": "Danke an {sponsor}, wie immer." }
}
]Keep the placeholders. {event} and {round} stay in English, so phrase around them. Translated answers keep their tone, effects and claims.
Scripts#
A script can still add answers at beforeInterview with ctx.addChoice({ tone, text }). They take the tone's default effect, and tone can be any of the seven tones.
Checks#
The loader checks interview files like every other file, and the Mods screen shows each problem with its file, line and field.
Errors disable the mod:
- invalid JSON
- an unknown field
- a tone that doesn't exist
- an effect out of range
- fewer than two answers
- an answer id used twice in a question
- a new answer without a tone or text
- a new id outside your namespace
Warnings don't disable the mod, but they drop what's broken:
- an unknown placeholder: the question or answer is dropped
- an answer for a question that doesn't exist
- a
replacesthat matches no answer - a question left with fewer than two answers that can be offered: it's never asked