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:

TypePathEditor schema
Accountsdata/social/accounts.json or data/social/accounts/*.jsonthe social accounts reference
Postsdata/social/posts/*.jsonthe 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"]
}
FieldMeaning
handle@ plus 2–24 letters, digits or underscores. Keep it fictional: no real people or brands.
nameDisplay name shown beside the handle.
kindfan, 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
weightHow often they post compared with other accounts that could (default 1; 0 = never).
nationalityOptional. The account only posts about players of this nationality (a local paper, a home-nation fan club).
voiceOptional tone tags, e.g. banter, warm, grumpy, nerd, hype. Posts with voices need one of them.
bioOptional.
avatarOptional 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 } }
}
FieldMeaning
triggerWhen it can appear (below). One trigger, or a list: ["matchLoss", "eventExit"].
kindsAccount kinds that can post it. Empty or left out = any kind.
accountOnly this account (by id) posts it. Overrides kinds.
voicesOnly accounts with one of these voice tags post it.
textUp to 280 characters, with {placeholders}. Light emoji use is fine.
weightHow often it's picked compared with other posts that fit (default 1; 0 switches it off).
conditionsOptional. All the conditions given must hold (below).
minAgeOptional. 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#

TriggerWhen
matchWinAfter each match you win (two posts after a TV match, one otherwise)
matchLossAfter each match you lose
rivalMatchAfter a match against a rival (most of the time), before the win/loss posts
nineDarterYou threw a nine-darter in the match
bigCheckoutYour highest checkout in the match was 120 or more (not every time)
titleWinYou won an event (qualifiers don't count)
eventExitYour run at an event ended short of the title (not every time)
eventPreviewAn event you're entered in starts (almost always for majors and TV events)
quietWeekAny week, about one in three
tourCardYou won a Tour Card (Trial Week or the season's rankings: won: true) or lost one (won: false)
rankingMilestoneYou broke into the top 128, 64, 32, 16, 8 or 4 on the Order of Merit, or reached number one, for the first time
sponsorSignedYou signed a sponsorship deal
staffHiredSomeone joined your team (not every time)
exhibitionNightAn exhibition night is over (not every time)
injuryYou picked up an injury
loadHighYour workload climbed into overloaded or burnout
retirementAnnouncedYou announced a farewell season
retirementYou 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.

TriggerWhenAlso filled
worldSponsorA computer player signs with, leaves or swaps a sponsor, or an agency{sponsor} {oldSponsor} {agency}
worldKitNew darts: another brand, weight or range, or a signature range{brand} {item} {weight}
worldRisingA youngster to watch, a first title, a Tour Card or a major at a young age{age} {event}
worldRetirementA retirement announced, a tribute, a farewell, a comeback{age} {titles} {event}
worldRivalryTwo computer players who keep meeting: a rivalry born, a grudge match{opponent} {event}
worldFormA hot streak, a slump, a new coach{titles} {event} {coach}
worldMilestoneA title milestone or a first major{milestone} {titles} {event} {age}
worldInjuryA 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.

ConditionTypeKnown on
wontrue/falsematch triggers, titleWin (true), eventExit (false), tourCard, exhibitionNight
tv, majortrue/falsematch and event triggers
stagelist of early, late (quarters, semis), finalmatch triggers, titleWin, eventExit (where the run ended)
marginlist of whitewash, decider, close, comfortablematch triggers (decider: won by one; close: by two)
averagerangematch triggers: your three-dart average
n180rangematch triggers: your 180s
checkoutrangematch triggers: your highest checkout
upsettrue/falsematch triggers: you beat a player from a higher tier or far above you in the rankings, or lost to one far below
rivaltrue/falsematch triggers: the opponent is a rival
homeNationtrue/falsematch and event triggers: the venue is in your country
eventslist of event template idsmatch and event triggers: the event is one of these (["showcase.event.coastal-finals"])
tourslist of tour idsmatch and event triggers: the event is on one of these tours (["core.tour.pro-tour"])
tagslist of event tagsmatch and event triggers: the event has one of these tags (["worldChampionship"]), as for cards
opponentNationalitylist of codesmatch triggers
nationalitylist of codesalways: yours
followersrangealways
imagerange, −100 … 100always: your public image
formrange, −1 … 1always
tierrange, 1 (Elite Series) … 5 (County)always
rankrangealways, when you're on the Order of Merit
loadlist of fresh, busy, tired, overloaded, burnoutalways: your workload band (see Travel load)
winStreaknumberalways: at least this many wins in a row
lossStreaknumberalways: at least this many losses in a row
injuredtrue/falsealways
hasSponsortrue/falsealways

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.

PlaceholderValueFilled on
{name} {first} {last} {nickname}Youalways
{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 signedwith a sponsor
{streak}Wins or losses in a rowtwo or more
{tour}The event's tour, or your tier's touralways
{opponent} {oppFirst} {oppNick}The opponentmatch triggers
{score}Your score first, e.g. "6–4"match triggers
{average} {n180} {checkout}Your match numbersmatch triggers (when non-zero)
{event} {venue} {city}The event and where it ismatch 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 demonymmatch 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 nameexhibitionNight (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.

Written for Darts Player Simulator 0.50.32. Built from the game's own schemas and its base pack.