Reference

Stories

Content type
narrative
Files
data/events/narrative/
Shape
A list of records, each with its own id
Patch target
narrative:<id>, for example narrative:core.narrative.exhibition-no-show-promoter
In the base game
473 records
Guide
Population, Travel load and burnout, Equipment, kit and signature development, Stories, Scripts

Fields#

Indented fields belong to the field above them. [] marks the items of a list. A field that is not required may be left out; the default is used.

FieldTypeRequiredDefaultNotes
ididYesNamespaced id, e.g. "core.player.rory-calder"
triggerone of the optionsYesfollowUp stories never fire on their own: another story's followUp schedules them. Options: weekTick, matchEnd, eventEnd, exhibitionEnd, seasonStart, seasonEnd, followUp.
conditionobject{}When a story event can fire, checked against the human player. All listed conditions must hold. chance is the probability per check once eligible.
condition.tierMinwhole number, 1 to 5Best tier (1 = World Series) the player may be in
condition.tierMaxwhole number, 1 to 5Lowest tier the player may be in
condition.followersMinwhole number, at least 0
condition.followersMaxwhole number, at least 0
condition.confidenceMinnumber, 0 to 100
condition.confidenceMaxnumber, 0 to 100
condition.formMinnumber, -1 to 1
condition.formMaxnumber, -1 to 1
condition.moraleMinnumber, 0 to 100
condition.moraleMaxnumber, 0 to 100
condition.fatigueMinnumber, 0 to 1
condition.fatigueMaxnumber, 0 to 1
condition.cashMinwhole number
condition.cashMaxwhole number
condition.ageMinwhole number, at least 8
condition.ageMaxwhole number, at most 80
condition.tourCardtrue or falsetrue = must hold a Tour Card, false = must not
condition.rankMaxwhole number, at least 1Order of Merit rank at least this good
condition.monthslistOnly in these months
condition.dateFromtextOnly on or after this day of the year ("MM-DD", e.g. "10-30"); with dateTo, a window of days such as the week up to Fireworks Night Pattern: ^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
condition.dateTotextOnly on or before this day of the year ("MM-DD", e.g. "11-05"); a dateFrom later in the year than it makes the window run over the new year Pattern: ^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
condition.seasonPhaseone of the optionsearly = Jan–Apr, mid = May–Aug, late = Sep–Dec Options: early, mid, late.
condition.nationalitylist, at least 1 itemOnly for players from these countries
condition.livesInlist, at least 1 itemOnly while the player lives in one of these countries
condition.notLivesInlist, at least 1 itemNever while the player lives in one of these countries
condition.scenelist, at least 1 itemOnly while the player lives in one of these darts scenes (scene record ids; a country with no scene of its own is in the fallback record's)
condition.genderone of the optionsOptions: m, f.
condition.wontrue or falsematchEnd / eventEnd triggers: the result that just happened.
condition.tvtrue or false
condition.majortrue or false
condition.crowdMinnumber, 0 to 1
condition.againstRivaltrue or false
condition.vsGraduatetrue or false
condition.positionMaxwhole number, at least 0eventEnd: finishing position at most this (0 = winner, 1 = final, 2 = semi…).
condition.positionMinwhole number, at least 0eventEnd: finishing position at least this (0 = winner, 1 = final, 2 = semi…); with positionMax, the players out in one round.
condition.prizeMinwhole number, at least 0
condition.lastResultPositionMaxwhole number, at least 0Your most recent completed event: finishing position at most this.
condition.losingStreakMinwhole number, at least 1Consecutive match losses at least this many.
condition.winningStreakMinwhole number, at least 1
condition.minTitleswhole number, at least 0Career titles (events won) at least / at most this many.
condition.maxTitleswhole number, at least 0
condition.hasWalkontrue or false
condition.dayJobtrue or falsetrue: only while you keep a day job; false: only once you're full-time.
condition.hasCoachtrue or false
condition.hasStaffone of several shapesYou employ someone in this staff role (a role id like "core.staff.physio" or just "physio"); a list means any of them
Shape 1: text
Shape 2: list, at least 1 item
condition.lacksStaffone of several shapesYou employ nobody in this staff role (a role id or just "accountant"); a list means none of them
Shape 1: text
Shape 2: list, at least 1 item
condition.staffQualityMinwhole number, 1 to 5A staff member rated at least this many stars (in the hasStaff role, if given; otherwise anyone)
condition.staffQualityMaxwhole number, 1 to 5A staff member rated at most this many stars (in the hasStaff role, if given; otherwise anyone)
condition.negotiatedone of the optionsSomething that happened in a sponsor negotiation in the last 4 weeks: a sponsor walked away, two sponsors bid against each other, your agent closed a deal, or you signed one Options: walkedAway, biddingWar, agentDeal, signed.
condition.hasRivaltrue or falseA rivalry of real intensity (≥ 0.3) with someone
condition.rivalEdgeone of the optionsWho has the edge in your record against the story's rival: yours (you lead by the pack's edgeLead), theirs, or level Options: yours, theirs, level.
condition.rivalryMinMeetingswhole number, at least 1You and the story's rival have met at least this many times
condition.rivalLastResultone of the optionsThe last meeting with the story's rival: you won it, or lost it (never met: neither) Options: won, lost.
condition.flagone of several shapesEvery one of these story flags is set (a setFlag action set it); text variables such as {rival} are filled in the name
Shape 1: text
Shape 2: list, at least 1 item
condition.notFlagone of several shapesNone of these story flags is set
Shape 1: text
Shape 2: list, at least 1 item
condition.hasSponsortrue or falseAny active sponsorship contract
condition.sponsorCategoryone of the optionsAn active sponsor in this category Options: darts, apparel, drinks, boards, energy, travel, tech, local.
condition.injuredtrue or falseCarrying an injury from a story
condition.imageMinnumber, -100 to 100Public image (−100 … 100) at least this
condition.imageMaxnumber, -100 to 100
condition.hasEventWithinDayswhole number, 0 to 60You are entered in (or automatically in) an event starting within this many days
condition.noEventWithinDayswhole number, 0 to 60Nothing on your calendar for this many days
condition.nextTriplist, at least 1 itemThe journey to your next event is one of these travel steps (ids from the travel settings)
condition.triplist, at least 1 itemAfter a match or an event: the journey to it was one of these travel steps (ids from the travel settings)
condition.seasonMonthslist, at least 1 itemOnly in these months of the weather's year, as a northern-hemisphere year has them (shifted for a southern scene)
condition.exhibitionKindlist, at least 1 itemexhibitionEnd only: the night was one of these kinds (clubNight, holidayPark, charity…)
condition.hasBookingtrue or falsetrue: you have an exhibition booked in the next 4 weeks; false: nothing booked
condition.loadMinnumber, 0 to 100Your workload (0–100, see Travel load and burnout) at least this: 60 tired, 75 overloaded, 90 burnout
condition.loadMaxnumber, 0 to 100Your workload (0–100) at most this
condition.hasKittextYou have something equipped in this kit slot ("darts", "charm"…) Pattern: ^[a-z][a-z0-9-]*$
condition.kitNewMaxnumber, 0 to 1Your darts are this familiar at most (0–1): e.g. 0.5 = still new in the hand
condition.developingtrue or falsetrue: a signature item is in development in your workshop; false: none is
condition.hasSignaturetrue or falseYou have launched a signature item
condition.kitProtectMaxnumber, 0 to 100Your travel case protects your kit by at most this % (0 without one)
condition.chancenumber, 0 to 1Probability of firing per check once the conditions hold
condition.seasonsMinwhole number, at least 1Seasons of your career, counting the one in progress, at least this many
condition.seasonsMaxwhole number, at least 1Seasons of your career, counting the one in progress, at most this many
condition.squadobjectYour standing in a squads league you play for (the county league, a youth league): every listed check must hold, and you must be in one of its squads
condition.squad.tourtextYesThe tour of the league: its squads events count (core.tour.county for the county league) Pattern: ^[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$
condition.squad.capsMinwhole number, at least 0Days the league has picked you for, at least this many
condition.squad.capsMaxwhole number, at least 0Days the league has picked you for, at most this many (0: never picked yet)
condition.squad.seasonsMinwhole number, at least 1League seasons you have been picked in, at least this many
condition.squad.rankMaxwhole number, at least 1Your place on your squad's own average table this season at least this good (1 = its best), last season's until you have played
condition.squad.averageMinlist, at least 1 itemYour three-dart average in the league's games this season at least this; a list gives one bar a division (top division first, the last one for any lower)
condition.squad.firstSidetrue or falsetrue: your last pick was for your squad's first side (its A team); false: for another side
condition.squad.pickedtrue or falsetrue: the last day your squad played picked you; false: it left you out
condition.squad.droppedtrue or falsetrue: the last day your squad played left you out after the one before picked you
titletextYesPlaceholders: {name} {first} {nickname} {money} {event} {opponent} {rival} {nextEvent} {venue} {city} {sponsor} {coach} {staff:<role>} {exhibition} {town}
bodytextYes
imagefile pathA picture for the story in the inbox (asset path, relative to the mod; about 2:1 looks best).
choiceslist, 1 to 4 itemsYes
choices[].idtextYes
choices[].labeltextYes
choices[].effectsobject{}Always applied.
choices[].effects.confidencenumber, -40 to 40
choices[].effects.formnumber, -0.5 to 0.5
choices[].effects.moralenumber, -40 to 40
choices[].effects.fatiguenumber, -0.5 to 0.5
choices[].effects.followerswhole number, -100,000 to 100,000
choices[].effects.reputationnumber, -20 to 20
choices[].effects.moneywhole number, -500,000 to 500,000
choices[].effects.imagenumber, -20 to 20Public image, −100 … 100 overall (sponsors notice it).
choices[].effects.pressurenumber, -0.3 to 0.3Media pressure carried into your next matches (0 … 0.3 overall).
choices[].effects.loadnumber, -50 to 50Workload (0–100 overall): + a draining trip, − a proper rest.
choices[].effects.scoringnumber, -5 to 5
choices[].effects.finishingnumber, -5 to 5
choices[].effects.checkoutKnowledgenumber, -5 to 5
choices[].effects.consistencynumber, -5 to 5
choices[].effects.tempoControlnumber, -5 to 5
choices[].effects.bullAccuracynumber, -5 to 5
choices[].effects.composurenumber, -5 to 5
choices[].effects.resiliencenumber, -5 to 5
choices[].effects.crowdHandlingnumber, -5 to 5
choices[].effects.concentrationnumber, -5 to 5
choices[].effects.staminanumber, -5 to 5
choices[].effects.fitnessnumber, -5 to 5
choices[].effects.eyesightnumber, -5 to 5
choices[].actionslist, up to 6 items[]
choices[].actions[]one of several shapesYesThings a story can do to the world beyond stat tweaks.
When type is "withdraw"
choices[].actions[].typeexactly "withdraw"Yes
choices[].actions[].refundtrue or falsefalse: a missed registration; out of the event with the entry fee kept.
When type is "sitOut"
choices[].actions[].typeexactly "sitOut"Yes
choices[].actions[].weeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].actions[].reasontext
When type is "injury"
choices[].actions[].typeexactly "injury"Yes
choices[].actions[].labeltext"Injury"
choices[].actions[].weeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].actions[].severityone of the options"minor"Options: minor, moderate, serious.
choices[].actions[].sitOuttrue or falseMiss events while it lasts (default: only serious injuries).
choices[].actions[].partone of the optionsWhere it hurts (default: worked out from the label, else the throwing shoulder). Options: shoulder, elbow, wrist, back, knee, foot, eyes.
choices[].actions[].injuryidAn injury type from medical.json: its name, part and effects (weeks and severity still come from here).
When type is "modifier"
choices[].actions[].typeexactly "modifier"Yes
choices[].actions[].labeltextYes
choices[].actions[].weeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].actions[].accuracynumber, -0.1 to 0.1+ tightens your throwing by this fraction, − loosens it (0.03 = 3%).
choices[].actions[].trainingnumber, -1 to 1Training gains × (1 + training).
choices[].actions[].fatigueFloornumber, 0 to 1
choices[].actions[].confidenceFloornumber, 0 to 100
choices[].actions[].composurenumber, -20 to 20Composure points on the oche while it lasts (− nerves, + calm).
When type is "sponsorOffer"
choices[].actions[].typeexactly "sponsorOffer"Yes
choices[].actions[].categoryone of the optionsOptions: darts, apparel, drinks, boards, energy, travel, tech, local.
choices[].actions[].sponsoridNamespaced id, e.g. "core.player.rory-calder" Names a sponsor record.
When type is "rivalry"
choices[].actions[].typeexactly "rivalry"Yes
choices[].actions[].withtext"rival""rival" (your top rival), "opponent" (from the match) or a player id
choices[].actions[].bynumber, -1 to 1Yes
When type is "news"
choices[].actions[].typeexactly "news"Yes
choices[].actions[].headlinetextYes
choices[].actions[].bodytextYes
When type is "setFlag"
choices[].actions[].typeexactly "setFlag"Yes
choices[].actions[].flagtext, up to 80 charactersYes
choices[].actions[].valuetrue or falsetrue
When type is "charge"
choices[].actions[].typeexactly "charge"Yes
choices[].actions[].offenceidYesThe offence (by id, in the regulator's rule book).
choices[].actions[].chancenumber, 0 to 11The chance it ever comes out.
choices[].actions[].afterWeeksone of several shapesWhen it comes out (none: at once).
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
When type is "catchOther"
choices[].actions[].typeexactly "catchOther"Yes
choices[].actions[].chancenumber, 0 to 11The chance the investigation catches someone.
When type is "social"
choices[].actions[].typeexactly "social"Yes
choices[].actions[].handletext
choices[].actions[].texttextYes
When type is "followerSurge"
choices[].actions[].typeexactly "followerSurge"Yes
choices[].actions[].percentnumber, 0 to 1Yes
choices[].actions[].minwhole number, 0 to 100,000
When type is "staffLeaves"
choices[].actions[].typeexactly "staffLeaves"Yes
choices[].actions[].roletextStaff role id or its short name ("physio"). Omit for whoever is least settled Names a staff role record.
choices[].actions[].kindone of the optionsOlder stories: "coach", "mentalCoach" or "fitnessCoach". Options: coach, mentalCoach, fitnessCoach.
When type is "staffMorale"
choices[].actions[].typeexactly "staffMorale"Yes
choices[].actions[].roletextStaff role id or short name. Omit for the whole team Names a staff role record.
choices[].actions[].bynumber, -50 to 50Yes
choices[].actions[].relationshipnumber, -50 to 50Also changes their relationship with you by this much.
When type is "holiday"
choices[].actions[].typeexactly "holiday"Yes
choices[].actions[].weeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].actions[].labeltext
When type is "kit"
choices[].actions[].typeexactly "kit"Yes
choices[].actions[].slottextYesKit slot id, e.g. "darts", "flights", "footwear" Names a kit slot record. Pattern: ^[a-z][a-z0-9-]*$
choices[].actions[].wearnumber, -1 to 1Condition change (−1 … 1): − damage, + a service.
choices[].actions[].familiaritynumber, -1 to 1Familiarity change (−1 … 1).
choices[].actions[].losetrue or falseThe item is gone for good (lost, stolen, broken).
When type is "workshop"
choices[].actions[].typeexactly "workshop"Yes
choices[].actions[].delayone of several shapesDelay the current stage by this many weeks.
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].actions[].costwhole number, 0 to 100,000An extra cost (paid now).
choices[].actions[].qualitynumber, -1 to 1Quality change for the finished item (−1 … 1 stars).
choices[].outcometextShown after choosing.
choices[].outcomeslist, 1 to 6 itemsOne is rolled (by weight, among those whose condition holds) on top of effects.
choices[].outcomes[].weightnumber, at least 01
choices[].outcomes[].conditionobjectOnly in the running if this holds when you choose (its chance is ignored).
choices[].outcomes[].condition.tierMinwhole number, 1 to 5Best tier (1 = World Series) the player may be in
choices[].outcomes[].condition.tierMaxwhole number, 1 to 5Lowest tier the player may be in
choices[].outcomes[].condition.followersMinwhole number, at least 0
choices[].outcomes[].condition.followersMaxwhole number, at least 0
choices[].outcomes[].condition.confidenceMinnumber, 0 to 100
choices[].outcomes[].condition.confidenceMaxnumber, 0 to 100
choices[].outcomes[].condition.formMinnumber, -1 to 1
choices[].outcomes[].condition.formMaxnumber, -1 to 1
choices[].outcomes[].condition.moraleMinnumber, 0 to 100
choices[].outcomes[].condition.moraleMaxnumber, 0 to 100
choices[].outcomes[].condition.fatigueMinnumber, 0 to 1
choices[].outcomes[].condition.fatigueMaxnumber, 0 to 1
choices[].outcomes[].condition.cashMinwhole number
choices[].outcomes[].condition.cashMaxwhole number
choices[].outcomes[].condition.ageMinwhole number, at least 8
choices[].outcomes[].condition.ageMaxwhole number, at most 80
choices[].outcomes[].condition.tourCardtrue or falsetrue = must hold a Tour Card, false = must not
choices[].outcomes[].condition.rankMaxwhole number, at least 1Order of Merit rank at least this good
choices[].outcomes[].condition.monthslistOnly in these months
choices[].outcomes[].condition.dateFromtextOnly on or after this day of the year ("MM-DD", e.g. "10-30"); with dateTo, a window of days such as the week up to Fireworks Night Pattern: ^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
choices[].outcomes[].condition.dateTotextOnly on or before this day of the year ("MM-DD", e.g. "11-05"); a dateFrom later in the year than it makes the window run over the new year Pattern: ^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
choices[].outcomes[].condition.seasonPhaseone of the optionsearly = Jan–Apr, mid = May–Aug, late = Sep–Dec Options: early, mid, late.
choices[].outcomes[].condition.nationalitylist, at least 1 itemOnly for players from these countries
choices[].outcomes[].condition.livesInlist, at least 1 itemOnly while the player lives in one of these countries
choices[].outcomes[].condition.notLivesInlist, at least 1 itemNever while the player lives in one of these countries
choices[].outcomes[].condition.scenelist, at least 1 itemOnly while the player lives in one of these darts scenes (scene record ids; a country with no scene of its own is in the fallback record's)
choices[].outcomes[].condition.genderone of the optionsOptions: m, f.
choices[].outcomes[].condition.wontrue or falsematchEnd / eventEnd triggers: the result that just happened.
choices[].outcomes[].condition.tvtrue or false
choices[].outcomes[].condition.majortrue or false
choices[].outcomes[].condition.crowdMinnumber, 0 to 1
choices[].outcomes[].condition.againstRivaltrue or false
choices[].outcomes[].condition.vsGraduatetrue or false
choices[].outcomes[].condition.positionMaxwhole number, at least 0eventEnd: finishing position at most this (0 = winner, 1 = final, 2 = semi…).
choices[].outcomes[].condition.positionMinwhole number, at least 0eventEnd: finishing position at least this (0 = winner, 1 = final, 2 = semi…); with positionMax, the players out in one round.
choices[].outcomes[].condition.prizeMinwhole number, at least 0
choices[].outcomes[].condition.lastResultPositionMaxwhole number, at least 0Your most recent completed event: finishing position at most this.
choices[].outcomes[].condition.losingStreakMinwhole number, at least 1Consecutive match losses at least this many.
choices[].outcomes[].condition.winningStreakMinwhole number, at least 1
choices[].outcomes[].condition.minTitleswhole number, at least 0Career titles (events won) at least / at most this many.
choices[].outcomes[].condition.maxTitleswhole number, at least 0
choices[].outcomes[].condition.hasWalkontrue or false
choices[].outcomes[].condition.dayJobtrue or falsetrue: only while you keep a day job; false: only once you're full-time.
choices[].outcomes[].condition.hasCoachtrue or false
choices[].outcomes[].condition.hasStaffone of several shapesYou employ someone in this staff role (a role id like "core.staff.physio" or just "physio"); a list means any of them
Shape 1: text
Shape 2: list, at least 1 item
choices[].outcomes[].condition.lacksStaffone of several shapesYou employ nobody in this staff role (a role id or just "accountant"); a list means none of them
Shape 1: text
Shape 2: list, at least 1 item
choices[].outcomes[].condition.staffQualityMinwhole number, 1 to 5A staff member rated at least this many stars (in the hasStaff role, if given; otherwise anyone)
choices[].outcomes[].condition.staffQualityMaxwhole number, 1 to 5A staff member rated at most this many stars (in the hasStaff role, if given; otherwise anyone)
choices[].outcomes[].condition.negotiatedone of the optionsSomething that happened in a sponsor negotiation in the last 4 weeks: a sponsor walked away, two sponsors bid against each other, your agent closed a deal, or you signed one Options: walkedAway, biddingWar, agentDeal, signed.
choices[].outcomes[].condition.hasRivaltrue or falseA rivalry of real intensity (≥ 0.3) with someone
choices[].outcomes[].condition.rivalEdgeone of the optionsWho has the edge in your record against the story's rival: yours (you lead by the pack's edgeLead), theirs, or level Options: yours, theirs, level.
choices[].outcomes[].condition.rivalryMinMeetingswhole number, at least 1You and the story's rival have met at least this many times
choices[].outcomes[].condition.rivalLastResultone of the optionsThe last meeting with the story's rival: you won it, or lost it (never met: neither) Options: won, lost.
choices[].outcomes[].condition.flagone of several shapesEvery one of these story flags is set (a setFlag action set it); text variables such as {rival} are filled in the name
Shape 1: text
Shape 2: list, at least 1 item
choices[].outcomes[].condition.notFlagone of several shapesNone of these story flags is set
Shape 1: text
Shape 2: list, at least 1 item
choices[].outcomes[].condition.hasSponsortrue or falseAny active sponsorship contract
choices[].outcomes[].condition.sponsorCategoryone of the optionsAn active sponsor in this category Options: darts, apparel, drinks, boards, energy, travel, tech, local.
choices[].outcomes[].condition.injuredtrue or falseCarrying an injury from a story
choices[].outcomes[].condition.imageMinnumber, -100 to 100Public image (−100 … 100) at least this
choices[].outcomes[].condition.imageMaxnumber, -100 to 100
choices[].outcomes[].condition.hasEventWithinDayswhole number, 0 to 60You are entered in (or automatically in) an event starting within this many days
choices[].outcomes[].condition.noEventWithinDayswhole number, 0 to 60Nothing on your calendar for this many days
choices[].outcomes[].condition.nextTriplist, at least 1 itemThe journey to your next event is one of these travel steps (ids from the travel settings)
choices[].outcomes[].condition.triplist, at least 1 itemAfter a match or an event: the journey to it was one of these travel steps (ids from the travel settings)
choices[].outcomes[].condition.seasonMonthslist, at least 1 itemOnly in these months of the weather's year, as a northern-hemisphere year has them (shifted for a southern scene)
choices[].outcomes[].condition.exhibitionKindlist, at least 1 itemexhibitionEnd only: the night was one of these kinds (clubNight, holidayPark, charity…)
choices[].outcomes[].condition.hasBookingtrue or falsetrue: you have an exhibition booked in the next 4 weeks; false: nothing booked
choices[].outcomes[].condition.loadMinnumber, 0 to 100Your workload (0–100, see Travel load and burnout) at least this: 60 tired, 75 overloaded, 90 burnout
choices[].outcomes[].condition.loadMaxnumber, 0 to 100Your workload (0–100) at most this
choices[].outcomes[].condition.hasKittextYou have something equipped in this kit slot ("darts", "charm"…) Pattern: ^[a-z][a-z0-9-]*$
choices[].outcomes[].condition.kitNewMaxnumber, 0 to 1Your darts are this familiar at most (0–1): e.g. 0.5 = still new in the hand
choices[].outcomes[].condition.developingtrue or falsetrue: a signature item is in development in your workshop; false: none is
choices[].outcomes[].condition.hasSignaturetrue or falseYou have launched a signature item
choices[].outcomes[].condition.kitProtectMaxnumber, 0 to 100Your travel case protects your kit by at most this % (0 without one)
choices[].outcomes[].condition.chancenumber, 0 to 1Probability of firing per check once the conditions hold
choices[].outcomes[].condition.seasonsMinwhole number, at least 1Seasons of your career, counting the one in progress, at least this many
choices[].outcomes[].condition.seasonsMaxwhole number, at least 1Seasons of your career, counting the one in progress, at most this many
choices[].outcomes[].condition.squadobjectYour standing in a squads league you play for (the county league, a youth league): every listed check must hold, and you must be in one of its squads
choices[].outcomes[].condition.squad.tourtextYesThe tour of the league: its squads events count (core.tour.county for the county league) Pattern: ^[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$
choices[].outcomes[].condition.squad.capsMinwhole number, at least 0Days the league has picked you for, at least this many
choices[].outcomes[].condition.squad.capsMaxwhole number, at least 0Days the league has picked you for, at most this many (0: never picked yet)
choices[].outcomes[].condition.squad.seasonsMinwhole number, at least 1League seasons you have been picked in, at least this many
choices[].outcomes[].condition.squad.rankMaxwhole number, at least 1Your place on your squad's own average table this season at least this good (1 = its best), last season's until you have played
choices[].outcomes[].condition.squad.averageMinlist, at least 1 itemYour three-dart average in the league's games this season at least this; a list gives one bar a division (top division first, the last one for any lower)
choices[].outcomes[].condition.squad.firstSidetrue or falsetrue: your last pick was for your squad's first side (its A team); false: for another side
choices[].outcomes[].condition.squad.pickedtrue or falsetrue: the last day your squad played picked you; false: it left you out
choices[].outcomes[].condition.squad.droppedtrue or falsetrue: the last day your squad played left you out after the one before picked you
choices[].outcomes[].effectsobject{}What a choice does. Numbers are deltas; attribute keys add to that attribute (small values, e.g. 1–3).
choices[].outcomes[].effects.confidencenumber, -40 to 40
choices[].outcomes[].effects.formnumber, -0.5 to 0.5
choices[].outcomes[].effects.moralenumber, -40 to 40
choices[].outcomes[].effects.fatiguenumber, -0.5 to 0.5
choices[].outcomes[].effects.followerswhole number, -100,000 to 100,000
choices[].outcomes[].effects.reputationnumber, -20 to 20
choices[].outcomes[].effects.moneywhole number, -500,000 to 500,000
choices[].outcomes[].effects.imagenumber, -20 to 20Public image, −100 … 100 overall (sponsors notice it).
choices[].outcomes[].effects.pressurenumber, -0.3 to 0.3Media pressure carried into your next matches (0 … 0.3 overall).
choices[].outcomes[].effects.loadnumber, -50 to 50Workload (0–100 overall): + a draining trip, − a proper rest.
choices[].outcomes[].effects.scoringnumber, -5 to 5
choices[].outcomes[].effects.finishingnumber, -5 to 5
choices[].outcomes[].effects.checkoutKnowledgenumber, -5 to 5
choices[].outcomes[].effects.consistencynumber, -5 to 5
choices[].outcomes[].effects.tempoControlnumber, -5 to 5
choices[].outcomes[].effects.bullAccuracynumber, -5 to 5
choices[].outcomes[].effects.composurenumber, -5 to 5
choices[].outcomes[].effects.resiliencenumber, -5 to 5
choices[].outcomes[].effects.crowdHandlingnumber, -5 to 5
choices[].outcomes[].effects.concentrationnumber, -5 to 5
choices[].outcomes[].effects.staminanumber, -5 to 5
choices[].outcomes[].effects.fitnessnumber, -5 to 5
choices[].outcomes[].effects.eyesightnumber, -5 to 5
choices[].outcomes[].actionslist, up to 6 items[]
choices[].outcomes[].actions[]one of several shapesYesThings a story can do to the world beyond stat tweaks.
When type is "withdraw"
choices[].outcomes[].actions[].typeexactly "withdraw"Yes
choices[].outcomes[].actions[].refundtrue or falsefalse: a missed registration; out of the event with the entry fee kept.
When type is "sitOut"
choices[].outcomes[].actions[].typeexactly "sitOut"Yes
choices[].outcomes[].actions[].weeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].outcomes[].actions[].reasontext
When type is "injury"
choices[].outcomes[].actions[].typeexactly "injury"Yes
choices[].outcomes[].actions[].labeltext"Injury"
choices[].outcomes[].actions[].weeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].outcomes[].actions[].severityone of the options"minor"Options: minor, moderate, serious.
choices[].outcomes[].actions[].sitOuttrue or falseMiss events while it lasts (default: only serious injuries).
choices[].outcomes[].actions[].partone of the optionsWhere it hurts (default: worked out from the label, else the throwing shoulder). Options: shoulder, elbow, wrist, back, knee, foot, eyes.
choices[].outcomes[].actions[].injuryidAn injury type from medical.json: its name, part and effects (weeks and severity still come from here).
When type is "modifier"
choices[].outcomes[].actions[].typeexactly "modifier"Yes
choices[].outcomes[].actions[].labeltextYes
choices[].outcomes[].actions[].weeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].outcomes[].actions[].accuracynumber, -0.1 to 0.1+ tightens your throwing by this fraction, − loosens it (0.03 = 3%).
choices[].outcomes[].actions[].trainingnumber, -1 to 1Training gains × (1 + training).
choices[].outcomes[].actions[].fatigueFloornumber, 0 to 1
choices[].outcomes[].actions[].confidenceFloornumber, 0 to 100
choices[].outcomes[].actions[].composurenumber, -20 to 20Composure points on the oche while it lasts (− nerves, + calm).
When type is "sponsorOffer"
choices[].outcomes[].actions[].typeexactly "sponsorOffer"Yes
choices[].outcomes[].actions[].categoryone of the optionsOptions: darts, apparel, drinks, boards, energy, travel, tech, local.
choices[].outcomes[].actions[].sponsoridNamespaced id, e.g. "core.player.rory-calder" Names a sponsor record.
When type is "rivalry"
choices[].outcomes[].actions[].typeexactly "rivalry"Yes
choices[].outcomes[].actions[].withtext"rival""rival" (your top rival), "opponent" (from the match) or a player id
choices[].outcomes[].actions[].bynumber, -1 to 1Yes
When type is "news"
choices[].outcomes[].actions[].typeexactly "news"Yes
choices[].outcomes[].actions[].headlinetextYes
choices[].outcomes[].actions[].bodytextYes
When type is "setFlag"
choices[].outcomes[].actions[].typeexactly "setFlag"Yes
choices[].outcomes[].actions[].flagtext, up to 80 charactersYes
choices[].outcomes[].actions[].valuetrue or falsetrue
When type is "charge"
choices[].outcomes[].actions[].typeexactly "charge"Yes
choices[].outcomes[].actions[].offenceidYesThe offence (by id, in the regulator's rule book).
choices[].outcomes[].actions[].chancenumber, 0 to 11The chance it ever comes out.
choices[].outcomes[].actions[].afterWeeksone of several shapesWhen it comes out (none: at once).
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
When type is "catchOther"
choices[].outcomes[].actions[].typeexactly "catchOther"Yes
choices[].outcomes[].actions[].chancenumber, 0 to 11The chance the investigation catches someone.
When type is "social"
choices[].outcomes[].actions[].typeexactly "social"Yes
choices[].outcomes[].actions[].handletext
choices[].outcomes[].actions[].texttextYes
When type is "followerSurge"
choices[].outcomes[].actions[].typeexactly "followerSurge"Yes
choices[].outcomes[].actions[].percentnumber, 0 to 1Yes
choices[].outcomes[].actions[].minwhole number, 0 to 100,000
When type is "staffLeaves"
choices[].outcomes[].actions[].typeexactly "staffLeaves"Yes
choices[].outcomes[].actions[].roletextStaff role id or its short name ("physio"). Omit for whoever is least settled Names a staff role record.
choices[].outcomes[].actions[].kindone of the optionsOlder stories: "coach", "mentalCoach" or "fitnessCoach". Options: coach, mentalCoach, fitnessCoach.
When type is "staffMorale"
choices[].outcomes[].actions[].typeexactly "staffMorale"Yes
choices[].outcomes[].actions[].roletextStaff role id or short name. Omit for the whole team Names a staff role record.
choices[].outcomes[].actions[].bynumber, -50 to 50Yes
choices[].outcomes[].actions[].relationshipnumber, -50 to 50Also changes their relationship with you by this much.
When type is "holiday"
choices[].outcomes[].actions[].typeexactly "holiday"Yes
choices[].outcomes[].actions[].weeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].outcomes[].actions[].labeltext
When type is "kit"
choices[].outcomes[].actions[].typeexactly "kit"Yes
choices[].outcomes[].actions[].slottextYesKit slot id, e.g. "darts", "flights", "footwear" Names a kit slot record. Pattern: ^[a-z][a-z0-9-]*$
choices[].outcomes[].actions[].wearnumber, -1 to 1Condition change (−1 … 1): − damage, + a service.
choices[].outcomes[].actions[].familiaritynumber, -1 to 1Familiarity change (−1 … 1).
choices[].outcomes[].actions[].losetrue or falseThe item is gone for good (lost, stolen, broken).
When type is "workshop"
choices[].outcomes[].actions[].typeexactly "workshop"Yes
choices[].outcomes[].actions[].delayone of several shapesDelay the current stage by this many weeks.
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].outcomes[].actions[].costwhole number, 0 to 100,000An extra cost (paid now).
choices[].outcomes[].actions[].qualitynumber, -1 to 1Quality change for the finished item (−1 … 1 stars).
choices[].outcomes[].texttextShown after choosing, after the choice's own outcome.
choices[].outcomes[].followUpobjectSchedule another story to fire later.
choices[].outcomes[].followUp.storytextYesThe narrative id to fire Pattern: ^[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$
choices[].outcomes[].followUp.afterWeeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].outcomes[].followUp.chancenumber, 0 to 1Probability the follow-up happens at all (default 1)
choices[].outcomes[].hinttext, up to 40 charactersA neutral hint chip on the choice, e.g. "Might meet a sponsor".
choices[].followUpobjectSchedule another story to fire later.
choices[].followUp.storytextYesThe narrative id to fire Pattern: ^[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$
choices[].followUp.afterWeeksone of several shapesYes
Shape 1: whole number, 1 to 52
Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52]
choices[].followUp.chancenumber, 0 to 1Probability the follow-up happens at all (default 1)
weightnumber, at least 01
oncetrue or falsefalseOnly ever fires once per career.
cooldownWeekswhole number, at least 026Weeks before it can fire again.
maxTimeswhole number, 1 to 1000Fires at most this many times per career (no cap when absent). once is the same as 1.
grouptext, up to 60 charactersStories in the same group never come round close together: none fires again until the group's cooldown has passed
groupCooldownWeekswhole number, 0 to 520
varsmap (key: value)The story's own words: each key fills {key} in the title, body, choices and outcomes (a variant's own vars take over, so a variant about someone else changes the shared choices too)
variantslist, up to 20 itemsOther ways to tell the same story: each time it fires, the title and body come from one of these or the main ones, at random (a variant without a title keeps the main title).
variants[].titletext
variants[].bodytextYes
variants[].varsmap (key: value)

Example#

A record from the base game’s data/events/narrative/bookings.json.

{
  "id": "core.narrative.exhibition-no-show-promoter",
  "trigger": "exhibitionEnd",
  "condition": {
    "ageMin": 16,
    "chance": 0.08
  },
  "title": "Where's the Promoter?",
  "body": "Your fee cleared, but the promoter of {exhibition} has vanished before settling up with the {town} venue, and the steward is looking at you as if it's your fault. So have the prizes for the kids' competition.",
  "choices": [
    {
      "id": "chase",
      "label": "Get on the phone and chase him",
      "effects": {
        "morale": -2,
        "fatigue": 0.02
      },
      "outcomes": [
        {
          "weight": 2,
          "effects": {
            "image": 2
          },
          "text": "He turns up the next day with a story about a flat tyre and an envelope of cash. The club thanks you for sorting it."
        },
        {
          "weight": 1,
          "effects": {
            "image": -1,
            "morale": -2
          },
          "text": "His phone is dead. So is his website. The club says it won't be booking through him again, and it's not sure about you either."
        }
      ]
    },
    {
      "id": "cover",
      "label": "Cover the kids' prizes out of your own pocket",
      "effects": {
        "money": -150,
        "image": 3
      },
      "outcome": "The steward shakes your hand. Word gets round the clubs that you're one of the good ones."
    },
    {
      "id": "leave",
      "label": "Not your problem",
      "effects": {
        "image": -2
      },
      "outcome": "You leave them to it. It was not your problem. It still doesn't feel great."
    }
  ],
  "cooldownWeeks": 40,
  "maxTimes": 2,
  "variants": [
    {
      "body": "The promoter of {exhibition} has done a runner with the door money, and the {town} venue manager wants to know who's paying for the buffet. Everyone is looking at the name on the poster: yours."
    }
  ]
}

In your pack the record’s id starts with your pack’s id instead of core, unless you mean to replace this one.

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