Guide
The social feed
The Media screen's social feed is what the internet says about the player: fans, superfans, grumpy trolls, stats accounts, the local paper, the darts club, the form guide, parody accounts, podcasts and fellow pros. All of it is content. The core pack's is in StreamingAssets/core/data/social/. A mod can add accounts and posts, replace them by id, or patch them.
Two content types make up the feed:
| Type | Path | Editor schema |
|---|---|---|
| Accounts | data/social/accounts.json or data/social/accounts/*.json | the social accounts reference |
| Posts | data/social/posts/*.json | the social posts reference |
The named pundits and journalists from the press pack (see the press pack#the-press-pack)) still post too. Their lines are mediaLines in the social.* slots. After a match or a title, some of the posts go to them and the rest come from the social content.
Like story events and the press pack, the feed follows whatever packs are installed: an existing save picks up new or changed accounts and posts the next time it's opened.
Accounts#
{
"id": "acme.account.chalk-talk",
"handle": "@ChalkTalkDarts",
"name": "Chalk Talk",
"kind": "stats",
"weight": 1,
"voice": ["nerd"]
}| Field | Meaning |
|---|---|
handle | @ plus 2–24 letters, digits or underscores. Keep it fictional: no real people or brands. |
name | Display name shown beside the handle. |
kind | fan, superfan, troll, stats, local (a local paper), club, form (a form guide), parody, sponsor (a brand that isn't the player's), pro (a fellow player), podcast, pundit |
weight | How often they post compared with other accounts that could (default 1; 0 = never). |
nationality | Optional. The account only posts about players of this nationality (a local paper, a home-nation fan club). |
voice | Optional tone tags, e.g. banter, warm, grumpy, nerd, hype. Posts with voices need one of them. |
bio | Optional. |
avatar | Optional square picture beside their posts, e.g. "assets/social/darts-dad.png" (see Images). Without one, the feed shows their initials. |
Posts#
{
"id": "acme.post.ton-plus",
"trigger": "matchWin",
"kinds": ["stats"],
"text": "{name} averaged {average} against {opponent}. Ton-plus.",
"weight": 1,
"conditions": { "average": { "min": 100 } }
}| Field | Meaning |
|---|---|
trigger | When it can appear (below). One trigger, or a list: ["matchLoss", "eventExit"]. |
kinds | Account kinds that can post it. Empty or left out = any kind. |
account | Only this account (by id) posts it. Overrides kinds. |
voices | Only accounts with one of these voice tags post it. |
text | Up to 280 characters, with {placeholders}. Light emoji use is fine. |
weight | How often it's picked compared with other posts that fit (default 1; 0 switches it off). |
conditions | Optional. All the conditions given must hold (below). |
minAge | Optional. The post is not used while the player is younger than this (the core pack gives posts about drink 18). It does not make the post more likely for anyone else. |
Triggers#
| Trigger | When |
|---|---|
matchWin | After each match you win (two posts after a TV match, one otherwise) |
matchLoss | After each match you lose |
rivalMatch | After a match against a rival (most of the time), before the win/loss posts |
nineDarter | You threw a nine-darter in the match |
bigCheckout | Your highest checkout in the match was 120 or more (not every time) |
titleWin | You won an event (qualifiers don't count) |
eventExit | Your run at an event ended short of the title (not every time) |
eventPreview | An event you're entered in starts (almost always for majors and TV events) |
quietWeek | Any week, about one in three |
tourCard | You won a Tour Card (Trial Week or the season's rankings: won: true) or lost one (won: false) |
rankingMilestone | You broke into the top 128, 64, 32, 16, 8 or 4 on the Order of Merit, or reached number one, for the first time |
sponsorSigned | You signed a sponsorship deal |
staffHired | Someone joined your team (not every time) |
exhibitionNight | An exhibition night is over (not every time) |
injury | You picked up an injury |
loadHigh | Your workload climbed into overloaded or burnout |
retirementAnnounced | You announced a farewell season |
retirement | You retired |
The two retirement triggers also fill {age} {titles} {majors} {years} ("14 years") and {legacy} (the legacy tier, e.g. "Legend"); {titles} and {majors} are left out with none. See Retirement and legacy.
The living world's triggers are about another player (see The living world): {name} {first} {last} {nickname} {rank} {tour} are theirs, and nationality, rank, tier, form and followers are the conditions that know anything. Their posts go under that player on the feed. Keep them to fans, stats accounts, local papers and podcasts, and never put words in the player's mouth: the Real World Pack's players are real people.
| Trigger | When | Also filled |
|---|---|---|
worldSponsor | A computer player signs with, leaves or swaps a sponsor, or an agency | {sponsor} {oldSponsor} {agency} |
worldKit | New darts: another brand, weight or range, or a signature range | {brand} {item} {weight} |
worldRising | A youngster to watch, a first title, a Tour Card or a major at a young age | {age} {event} |
worldRetirement | A retirement announced, a tribute, a farewell, a comeback | {age} {titles} {event} |
worldRivalry | Two computer players who keep meeting: a rivalry born, a grudge match | {opponent} {event} |
worldForm | A hot streak, a slump, a new coach | {titles} {event} {coach} |
worldMilestone | A title milestone or a first major | {milestone} {titles} {event} {age} |
worldInjury | A generated player is out injured |
Conditions#
Every condition is optional. A condition about something the trigger doesn't know (a match average on a quiet week) never holds, so a post with one won't appear there. Ranges are { "min": …, "max": … }, both inclusive, either optional.
| Condition | Type | Known on |
|---|---|---|
won | true/false | match triggers, titleWin (true), eventExit (false), tourCard, exhibitionNight |
tv, major | true/false | match and event triggers |
stage | list of early, late (quarters, semis), final | match triggers, titleWin, eventExit (where the run ended) |
margin | list of whitewash, decider, close, comfortable | match triggers (decider: won by one; close: by two) |
average | range | match triggers: your three-dart average |
n180 | range | match triggers: your 180s |
checkout | range | match triggers: your highest checkout |
upset | true/false | match triggers: you beat a player from a higher tier or far above you in the rankings, or lost to one far below |
rival | true/false | match triggers: the opponent is a rival |
homeNation | true/false | match and event triggers: the venue is in your country |
events | list of event template ids | match and event triggers: the event is one of these (["showcase.event.coastal-finals"]) |
tours | list of tour ids | match and event triggers: the event is on one of these tours (["core.tour.pro-tour"]) |
tags | list of event tags | match and event triggers: the event has one of these tags (["worldChampionship"]), as for cards |
opponentNationality | list of codes | match triggers |
nationality | list of codes | always: yours |
followers | range | always |
image | range, −100 … 100 | always: your public image |
form | range, −1 … 1 | always |
tier | range, 1 (Elite Series) … 5 (County) | always |
rank | range | always, when you're on the Order of Merit |
load | list of fresh, busy, tired, overloaded, burnout | always: your workload band (see Travel load) |
winStreak | number | always: at least this many wins in a row |
lossStreak | number | always: at least this many losses in a row |
injured | true/false | always |
hasSponsor | true/false | always |
Posts with more conditions are picked more often when they fit, so a specific post ("ton-plus average in a last-leg decider on TV") beats a generic one when it applies.
Placeholders#
A post is skipped when one of its placeholders has nothing to fill it, so {sponsor} posts only appear when the player has a sponsor and {n180} posts only after a match with a 180. An unknown placeholder (a typo) drops the post with a warning on the Mods screen.
| Placeholder | Value | Filled on |
|---|---|---|
{name} {first} {last} {nickname} | You | always |
{followers} | Your followers, e.g. "12,400" | always |
{rank} | Your Order of Merit position, e.g. "14" | when ranked |
{sponsor} | Your biggest sponsor, or the one just signed | with a sponsor |
{streak} | Wins or losses in a row | two or more |
{tour} | The event's tour, or your tier's tour | always |
{opponent} {oppFirst} {oppNick} | The opponent | match triggers |
{score} | Your score first, e.g. "6–4" | match triggers |
{average} {n180} {checkout} | Your match numbers | match triggers (when non-zero) |
{event} {venue} {city} | The event and where it is | match and event triggers; {event} is "Trial Week" for a Trial Week card |
{crowd} | The venue's crowd by its people, "the Dutch crowd" (texts social.crowd.*); "the home crowd" for a country with no demonym | match and event triggers |
{round} | Lower case: "last 32", "quarter-final", "final", "group stage" | match triggers, titleWin, eventExit |
{milestone} | "top 32", "number one" | rankingMilestone |
{staff} {role} | Who joined, and as what ("darts coach") | staffHired |
{exhibition} | The night's name | exhibitionNight (with {venue} {city}) |
Write posts so they read well for any player: use the name, not "he" or "she". A few tips from the core pack:
{round}is lower case, so use it mid-sentence: "Out in the {round}".- "the {event}" is safe even for an event called "The Midwinter Crown".
{nickname}usually starts with "The", so it works as a subject ("{nickname} on the charge") rather than a greeting.
Variety#
The feed doesn't repeat a post (by id or by text) that appeared in the last 20 social posts, and accounts that posted lately are picked less often. More posts for a trigger means more variety; posts with conditions add flavour where they fit.
With no social content at all (a mod that strips it), the feed falls back to the press pack's pundits after matches and titles, and is otherwise quiet.
Extending and patching#
Add your own posts in a new file, with ids in your mod's namespace:
[
{
"id": "acme.post.derby-win",
"trigger": ["matchWin", "rivalMatch"],
"kinds": ["local", "club"],
"text": "Derby day belongs to {first}! {score} against {opponent} 🍻",
"conditions": { "won": true, "rival": true, "homeNation": true }
}
]Replace a core post or account by reusing its id, or change a few fields with a patch in data/patches/:
[
{ "target": "socialPost:core.social.loss-010", "patch": { "weight": 0 } },
{ "target": "socialAccount:core.account.oche-oracle", "patch": { "nationality": "NED" } },
{
"target": "socialPost:core.social.win-001",
"patch": { "conditions": { "tv": true } }
}
]A patch merges into the record (null deletes a field), so conditions above adds tv to whatever conditions the post already has.