Reference
Stories
- Content type
narrative- Files
data/events/narrative/- Shape
- A list of records, each with its own
id - Patch target
narrative:<id>, for examplenarrative: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.
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
id | id | Yes | Namespaced id, e.g. "core.player.rory-calder" | |
trigger | one of the options | Yes | followUp stories never fire on their own: another story's followUp schedules them. Options: weekTick, matchEnd, eventEnd, exhibitionEnd, seasonStart, seasonEnd, followUp. | |
condition | object | {} | 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.tierMin | whole number, 1 to 5 | Best tier (1 = World Series) the player may be in | ||
condition.tierMax | whole number, 1 to 5 | Lowest tier the player may be in | ||
condition.followersMin | whole number, at least 0 | |||
condition.followersMax | whole number, at least 0 | |||
condition.confidenceMin | number, 0 to 100 | |||
condition.confidenceMax | number, 0 to 100 | |||
condition.formMin | number, -1 to 1 | |||
condition.formMax | number, -1 to 1 | |||
condition.moraleMin | number, 0 to 100 | |||
condition.moraleMax | number, 0 to 100 | |||
condition.fatigueMin | number, 0 to 1 | |||
condition.fatigueMax | number, 0 to 1 | |||
condition.cashMin | whole number | |||
condition.cashMax | whole number | |||
condition.ageMin | whole number, at least 8 | |||
condition.ageMax | whole number, at most 80 | |||
condition.tourCard | true or false | true = must hold a Tour Card, false = must not | ||
condition.rankMax | whole number, at least 1 | Order of Merit rank at least this good | ||
condition.months | list | Only in these months | ||
condition.dateFrom | text | Only 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.dateTo | text | Only 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.seasonPhase | one of the options | early = Jan–Apr, mid = May–Aug, late = Sep–Dec Options: early, mid, late. | ||
condition.nationality | list, at least 1 item | Only for players from these countries | ||
condition.livesIn | list, at least 1 item | Only while the player lives in one of these countries | ||
condition.notLivesIn | list, at least 1 item | Never while the player lives in one of these countries | ||
condition.scene | list, at least 1 item | Only 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.gender | one of the options | Options: m, f. | ||
condition.won | true or false | matchEnd / eventEnd triggers: the result that just happened. | ||
condition.tv | true or false | |||
condition.major | true or false | |||
condition.crowdMin | number, 0 to 1 | |||
condition.againstRival | true or false | |||
condition.vsGraduate | true or false | |||
condition.positionMax | whole number, at least 0 | eventEnd: finishing position at most this (0 = winner, 1 = final, 2 = semi…). | ||
condition.positionMin | whole number, at least 0 | eventEnd: finishing position at least this (0 = winner, 1 = final, 2 = semi…); with positionMax, the players out in one round. | ||
condition.prizeMin | whole number, at least 0 | |||
condition.lastResultPositionMax | whole number, at least 0 | Your most recent completed event: finishing position at most this. | ||
condition.losingStreakMin | whole number, at least 1 | Consecutive match losses at least this many. | ||
condition.winningStreakMin | whole number, at least 1 | |||
condition.minTitles | whole number, at least 0 | Career titles (events won) at least / at most this many. | ||
condition.maxTitles | whole number, at least 0 | |||
condition.hasWalkon | true or false | |||
condition.dayJob | true or false | true: only while you keep a day job; false: only once you're full-time. | ||
condition.hasCoach | true or false | |||
condition.hasStaff | one of several shapes | You 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.lacksStaff | one of several shapes | You 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.staffQualityMin | whole number, 1 to 5 | A staff member rated at least this many stars (in the hasStaff role, if given; otherwise anyone) | ||
condition.staffQualityMax | whole number, 1 to 5 | A staff member rated at most this many stars (in the hasStaff role, if given; otherwise anyone) | ||
condition.negotiated | one of the options | Something 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.hasRival | true or false | A rivalry of real intensity (≥ 0.3) with someone | ||
condition.rivalEdge | one of the options | Who 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.rivalryMinMeetings | whole number, at least 1 | You and the story's rival have met at least this many times | ||
condition.rivalLastResult | one of the options | The last meeting with the story's rival: you won it, or lost it (never met: neither) Options: won, lost. | ||
condition.flag | one of several shapes | Every 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.notFlag | one of several shapes | None of these story flags is set | ||
| Shape 1: text | ||||
| Shape 2: list, at least 1 item | ||||
condition.hasSponsor | true or false | Any active sponsorship contract | ||
condition.sponsorCategory | one of the options | An active sponsor in this category Options: darts, apparel, drinks, boards, energy, travel, tech, local. | ||
condition.injured | true or false | Carrying an injury from a story | ||
condition.imageMin | number, -100 to 100 | Public image (−100 … 100) at least this | ||
condition.imageMax | number, -100 to 100 | |||
condition.hasEventWithinDays | whole number, 0 to 60 | You are entered in (or automatically in) an event starting within this many days | ||
condition.noEventWithinDays | whole number, 0 to 60 | Nothing on your calendar for this many days | ||
condition.nextTrip | list, at least 1 item | The journey to your next event is one of these travel steps (ids from the travel settings) | ||
condition.trip | list, at least 1 item | After a match or an event: the journey to it was one of these travel steps (ids from the travel settings) | ||
condition.seasonMonths | list, at least 1 item | Only in these months of the weather's year, as a northern-hemisphere year has them (shifted for a southern scene) | ||
condition.exhibitionKind | list, at least 1 item | exhibitionEnd only: the night was one of these kinds (clubNight, holidayPark, charity…) | ||
condition.hasBooking | true or false | true: you have an exhibition booked in the next 4 weeks; false: nothing booked | ||
condition.loadMin | number, 0 to 100 | Your workload (0–100, see Travel load and burnout) at least this: 60 tired, 75 overloaded, 90 burnout | ||
condition.loadMax | number, 0 to 100 | Your workload (0–100) at most this | ||
condition.hasKit | text | You have something equipped in this kit slot ("darts", "charm"…) Pattern: ^[a-z][a-z0-9-]*$ | ||
condition.kitNewMax | number, 0 to 1 | Your darts are this familiar at most (0–1): e.g. 0.5 = still new in the hand | ||
condition.developing | true or false | true: a signature item is in development in your workshop; false: none is | ||
condition.hasSignature | true or false | You have launched a signature item | ||
condition.kitProtectMax | number, 0 to 100 | Your travel case protects your kit by at most this % (0 without one) | ||
condition.chance | number, 0 to 1 | Probability of firing per check once the conditions hold | ||
condition.seasonsMin | whole number, at least 1 | Seasons of your career, counting the one in progress, at least this many | ||
condition.seasonsMax | whole number, at least 1 | Seasons of your career, counting the one in progress, at most this many | ||
condition.squad | object | Your 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.tour | text | Yes | The 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.capsMin | whole number, at least 0 | Days the league has picked you for, at least this many | ||
condition.squad.capsMax | whole number, at least 0 | Days the league has picked you for, at most this many (0: never picked yet) | ||
condition.squad.seasonsMin | whole number, at least 1 | League seasons you have been picked in, at least this many | ||
condition.squad.rankMax | whole number, at least 1 | Your 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.averageMin | list, at least 1 item | Your 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.firstSide | true or false | true: your last pick was for your squad's first side (its A team); false: for another side | ||
condition.squad.picked | true or false | true: the last day your squad played picked you; false: it left you out | ||
condition.squad.dropped | true or false | true: the last day your squad played left you out after the one before picked you | ||
title | text | Yes | Placeholders: {name} {first} {nickname} {money} {event} {opponent} {rival} {nextEvent} {venue} {city} {sponsor} {coach} {staff:<role>} {exhibition} {town} | |
body | text | Yes | ||
image | file path | A picture for the story in the inbox (asset path, relative to the mod; about 2:1 looks best). | ||
choices | list, 1 to 4 items | Yes | ||
choices[].id | text | Yes | ||
choices[].label | text | Yes | ||
choices[].effects | object | {} | Always applied. | |
choices[].effects.confidence | number, -40 to 40 | |||
choices[].effects.form | number, -0.5 to 0.5 | |||
choices[].effects.morale | number, -40 to 40 | |||
choices[].effects.fatigue | number, -0.5 to 0.5 | |||
choices[].effects.followers | whole number, -100,000 to 100,000 | |||
choices[].effects.reputation | number, -20 to 20 | |||
choices[].effects.money | whole number, -500,000 to 500,000 | |||
choices[].effects.image | number, -20 to 20 | Public image, −100 … 100 overall (sponsors notice it). | ||
choices[].effects.pressure | number, -0.3 to 0.3 | Media pressure carried into your next matches (0 … 0.3 overall). | ||
choices[].effects.load | number, -50 to 50 | Workload (0–100 overall): + a draining trip, − a proper rest. | ||
choices[].effects.scoring | number, -5 to 5 | |||
choices[].effects.finishing | number, -5 to 5 | |||
choices[].effects.checkoutKnowledge | number, -5 to 5 | |||
choices[].effects.consistency | number, -5 to 5 | |||
choices[].effects.tempoControl | number, -5 to 5 | |||
choices[].effects.bullAccuracy | number, -5 to 5 | |||
choices[].effects.composure | number, -5 to 5 | |||
choices[].effects.resilience | number, -5 to 5 | |||
choices[].effects.crowdHandling | number, -5 to 5 | |||
choices[].effects.concentration | number, -5 to 5 | |||
choices[].effects.stamina | number, -5 to 5 | |||
choices[].effects.fitness | number, -5 to 5 | |||
choices[].effects.eyesight | number, -5 to 5 | |||
choices[].actions | list, up to 6 items | [] | ||
choices[].actions[] | one of several shapes | Yes | Things a story can do to the world beyond stat tweaks. | |
When type is "withdraw" | ||||
choices[].actions[].type | exactly "withdraw" | Yes | ||
choices[].actions[].refund | true or false | false: a missed registration; out of the event with the entry fee kept. | ||
When type is "sitOut" | ||||
choices[].actions[].type | exactly "sitOut" | Yes | ||
choices[].actions[].weeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].actions[].reason | text | |||
When type is "injury" | ||||
choices[].actions[].type | exactly "injury" | Yes | ||
choices[].actions[].label | text | "Injury" | ||
choices[].actions[].weeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].actions[].severity | one of the options | "minor" | Options: minor, moderate, serious. | |
choices[].actions[].sitOut | true or false | Miss events while it lasts (default: only serious injuries). | ||
choices[].actions[].part | one of the options | Where it hurts (default: worked out from the label, else the throwing shoulder). Options: shoulder, elbow, wrist, back, knee, foot, eyes. | ||
choices[].actions[].injury | id | An injury type from medical.json: its name, part and effects (weeks and severity still come from here). | ||
When type is "modifier" | ||||
choices[].actions[].type | exactly "modifier" | Yes | ||
choices[].actions[].label | text | Yes | ||
choices[].actions[].weeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].actions[].accuracy | number, -0.1 to 0.1 | + tightens your throwing by this fraction, − loosens it (0.03 = 3%). | ||
choices[].actions[].training | number, -1 to 1 | Training gains × (1 + training). | ||
choices[].actions[].fatigueFloor | number, 0 to 1 | |||
choices[].actions[].confidenceFloor | number, 0 to 100 | |||
choices[].actions[].composure | number, -20 to 20 | Composure points on the oche while it lasts (− nerves, + calm). | ||
When type is "sponsorOffer" | ||||
choices[].actions[].type | exactly "sponsorOffer" | Yes | ||
choices[].actions[].category | one of the options | Options: darts, apparel, drinks, boards, energy, travel, tech, local. | ||
choices[].actions[].sponsor | id | Namespaced id, e.g. "core.player.rory-calder" Names a sponsor record. | ||
When type is "rivalry" | ||||
choices[].actions[].type | exactly "rivalry" | Yes | ||
choices[].actions[].with | text | "rival" | "rival" (your top rival), "opponent" (from the match) or a player id | |
choices[].actions[].by | number, -1 to 1 | Yes | ||
When type is "news" | ||||
choices[].actions[].type | exactly "news" | Yes | ||
choices[].actions[].headline | text | Yes | ||
choices[].actions[].body | text | Yes | ||
When type is "setFlag" | ||||
choices[].actions[].type | exactly "setFlag" | Yes | ||
choices[].actions[].flag | text, up to 80 characters | Yes | ||
choices[].actions[].value | true or false | true | ||
When type is "charge" | ||||
choices[].actions[].type | exactly "charge" | Yes | ||
choices[].actions[].offence | id | Yes | The offence (by id, in the regulator's rule book). | |
choices[].actions[].chance | number, 0 to 1 | 1 | The chance it ever comes out. | |
choices[].actions[].afterWeeks | one of several shapes | When 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[].type | exactly "catchOther" | Yes | ||
choices[].actions[].chance | number, 0 to 1 | 1 | The chance the investigation catches someone. | |
When type is "social" | ||||
choices[].actions[].type | exactly "social" | Yes | ||
choices[].actions[].handle | text | |||
choices[].actions[].text | text | Yes | ||
When type is "followerSurge" | ||||
choices[].actions[].type | exactly "followerSurge" | Yes | ||
choices[].actions[].percent | number, 0 to 1 | Yes | ||
choices[].actions[].min | whole number, 0 to 100,000 | |||
When type is "staffLeaves" | ||||
choices[].actions[].type | exactly "staffLeaves" | Yes | ||
choices[].actions[].role | text | Staff role id or its short name ("physio"). Omit for whoever is least settled Names a staff role record. | ||
choices[].actions[].kind | one of the options | Older stories: "coach", "mentalCoach" or "fitnessCoach". Options: coach, mentalCoach, fitnessCoach. | ||
When type is "staffMorale" | ||||
choices[].actions[].type | exactly "staffMorale" | Yes | ||
choices[].actions[].role | text | Staff role id or short name. Omit for the whole team Names a staff role record. | ||
choices[].actions[].by | number, -50 to 50 | Yes | ||
choices[].actions[].relationship | number, -50 to 50 | Also changes their relationship with you by this much. | ||
When type is "holiday" | ||||
choices[].actions[].type | exactly "holiday" | Yes | ||
choices[].actions[].weeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].actions[].label | text | |||
When type is "kit" | ||||
choices[].actions[].type | exactly "kit" | Yes | ||
choices[].actions[].slot | text | Yes | Kit slot id, e.g. "darts", "flights", "footwear" Names a kit slot record. Pattern: ^[a-z][a-z0-9-]*$ | |
choices[].actions[].wear | number, -1 to 1 | Condition change (−1 … 1): − damage, + a service. | ||
choices[].actions[].familiarity | number, -1 to 1 | Familiarity change (−1 … 1). | ||
choices[].actions[].lose | true or false | The item is gone for good (lost, stolen, broken). | ||
When type is "workshop" | ||||
choices[].actions[].type | exactly "workshop" | Yes | ||
choices[].actions[].delay | one of several shapes | Delay 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[].cost | whole number, 0 to 100,000 | An extra cost (paid now). | ||
choices[].actions[].quality | number, -1 to 1 | Quality change for the finished item (−1 … 1 stars). | ||
choices[].outcome | text | Shown after choosing. | ||
choices[].outcomes | list, 1 to 6 items | One is rolled (by weight, among those whose condition holds) on top of effects. | ||
choices[].outcomes[].weight | number, at least 0 | 1 | ||
choices[].outcomes[].condition | object | Only in the running if this holds when you choose (its chance is ignored). | ||
choices[].outcomes[].condition.tierMin | whole number, 1 to 5 | Best tier (1 = World Series) the player may be in | ||
choices[].outcomes[].condition.tierMax | whole number, 1 to 5 | Lowest tier the player may be in | ||
choices[].outcomes[].condition.followersMin | whole number, at least 0 | |||
choices[].outcomes[].condition.followersMax | whole number, at least 0 | |||
choices[].outcomes[].condition.confidenceMin | number, 0 to 100 | |||
choices[].outcomes[].condition.confidenceMax | number, 0 to 100 | |||
choices[].outcomes[].condition.formMin | number, -1 to 1 | |||
choices[].outcomes[].condition.formMax | number, -1 to 1 | |||
choices[].outcomes[].condition.moraleMin | number, 0 to 100 | |||
choices[].outcomes[].condition.moraleMax | number, 0 to 100 | |||
choices[].outcomes[].condition.fatigueMin | number, 0 to 1 | |||
choices[].outcomes[].condition.fatigueMax | number, 0 to 1 | |||
choices[].outcomes[].condition.cashMin | whole number | |||
choices[].outcomes[].condition.cashMax | whole number | |||
choices[].outcomes[].condition.ageMin | whole number, at least 8 | |||
choices[].outcomes[].condition.ageMax | whole number, at most 80 | |||
choices[].outcomes[].condition.tourCard | true or false | true = must hold a Tour Card, false = must not | ||
choices[].outcomes[].condition.rankMax | whole number, at least 1 | Order of Merit rank at least this good | ||
choices[].outcomes[].condition.months | list | Only in these months | ||
choices[].outcomes[].condition.dateFrom | text | Only 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.dateTo | text | Only 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.seasonPhase | one of the options | early = Jan–Apr, mid = May–Aug, late = Sep–Dec Options: early, mid, late. | ||
choices[].outcomes[].condition.nationality | list, at least 1 item | Only for players from these countries | ||
choices[].outcomes[].condition.livesIn | list, at least 1 item | Only while the player lives in one of these countries | ||
choices[].outcomes[].condition.notLivesIn | list, at least 1 item | Never while the player lives in one of these countries | ||
choices[].outcomes[].condition.scene | list, at least 1 item | Only 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.gender | one of the options | Options: m, f. | ||
choices[].outcomes[].condition.won | true or false | matchEnd / eventEnd triggers: the result that just happened. | ||
choices[].outcomes[].condition.tv | true or false | |||
choices[].outcomes[].condition.major | true or false | |||
choices[].outcomes[].condition.crowdMin | number, 0 to 1 | |||
choices[].outcomes[].condition.againstRival | true or false | |||
choices[].outcomes[].condition.vsGraduate | true or false | |||
choices[].outcomes[].condition.positionMax | whole number, at least 0 | eventEnd: finishing position at most this (0 = winner, 1 = final, 2 = semi…). | ||
choices[].outcomes[].condition.positionMin | whole number, at least 0 | eventEnd: finishing position at least this (0 = winner, 1 = final, 2 = semi…); with positionMax, the players out in one round. | ||
choices[].outcomes[].condition.prizeMin | whole number, at least 0 | |||
choices[].outcomes[].condition.lastResultPositionMax | whole number, at least 0 | Your most recent completed event: finishing position at most this. | ||
choices[].outcomes[].condition.losingStreakMin | whole number, at least 1 | Consecutive match losses at least this many. | ||
choices[].outcomes[].condition.winningStreakMin | whole number, at least 1 | |||
choices[].outcomes[].condition.minTitles | whole number, at least 0 | Career titles (events won) at least / at most this many. | ||
choices[].outcomes[].condition.maxTitles | whole number, at least 0 | |||
choices[].outcomes[].condition.hasWalkon | true or false | |||
choices[].outcomes[].condition.dayJob | true or false | true: only while you keep a day job; false: only once you're full-time. | ||
choices[].outcomes[].condition.hasCoach | true or false | |||
choices[].outcomes[].condition.hasStaff | one of several shapes | You 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.lacksStaff | one of several shapes | You 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.staffQualityMin | whole number, 1 to 5 | A staff member rated at least this many stars (in the hasStaff role, if given; otherwise anyone) | ||
choices[].outcomes[].condition.staffQualityMax | whole number, 1 to 5 | A staff member rated at most this many stars (in the hasStaff role, if given; otherwise anyone) | ||
choices[].outcomes[].condition.negotiated | one of the options | Something 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.hasRival | true or false | A rivalry of real intensity (≥ 0.3) with someone | ||
choices[].outcomes[].condition.rivalEdge | one of the options | Who 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.rivalryMinMeetings | whole number, at least 1 | You and the story's rival have met at least this many times | ||
choices[].outcomes[].condition.rivalLastResult | one of the options | The last meeting with the story's rival: you won it, or lost it (never met: neither) Options: won, lost. | ||
choices[].outcomes[].condition.flag | one of several shapes | Every 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.notFlag | one of several shapes | None of these story flags is set | ||
| Shape 1: text | ||||
| Shape 2: list, at least 1 item | ||||
choices[].outcomes[].condition.hasSponsor | true or false | Any active sponsorship contract | ||
choices[].outcomes[].condition.sponsorCategory | one of the options | An active sponsor in this category Options: darts, apparel, drinks, boards, energy, travel, tech, local. | ||
choices[].outcomes[].condition.injured | true or false | Carrying an injury from a story | ||
choices[].outcomes[].condition.imageMin | number, -100 to 100 | Public image (−100 … 100) at least this | ||
choices[].outcomes[].condition.imageMax | number, -100 to 100 | |||
choices[].outcomes[].condition.hasEventWithinDays | whole number, 0 to 60 | You are entered in (or automatically in) an event starting within this many days | ||
choices[].outcomes[].condition.noEventWithinDays | whole number, 0 to 60 | Nothing on your calendar for this many days | ||
choices[].outcomes[].condition.nextTrip | list, at least 1 item | The journey to your next event is one of these travel steps (ids from the travel settings) | ||
choices[].outcomes[].condition.trip | list, at least 1 item | After a match or an event: the journey to it was one of these travel steps (ids from the travel settings) | ||
choices[].outcomes[].condition.seasonMonths | list, at least 1 item | Only in these months of the weather's year, as a northern-hemisphere year has them (shifted for a southern scene) | ||
choices[].outcomes[].condition.exhibitionKind | list, at least 1 item | exhibitionEnd only: the night was one of these kinds (clubNight, holidayPark, charity…) | ||
choices[].outcomes[].condition.hasBooking | true or false | true: you have an exhibition booked in the next 4 weeks; false: nothing booked | ||
choices[].outcomes[].condition.loadMin | number, 0 to 100 | Your workload (0–100, see Travel load and burnout) at least this: 60 tired, 75 overloaded, 90 burnout | ||
choices[].outcomes[].condition.loadMax | number, 0 to 100 | Your workload (0–100) at most this | ||
choices[].outcomes[].condition.hasKit | text | You have something equipped in this kit slot ("darts", "charm"…) Pattern: ^[a-z][a-z0-9-]*$ | ||
choices[].outcomes[].condition.kitNewMax | number, 0 to 1 | Your darts are this familiar at most (0–1): e.g. 0.5 = still new in the hand | ||
choices[].outcomes[].condition.developing | true or false | true: a signature item is in development in your workshop; false: none is | ||
choices[].outcomes[].condition.hasSignature | true or false | You have launched a signature item | ||
choices[].outcomes[].condition.kitProtectMax | number, 0 to 100 | Your travel case protects your kit by at most this % (0 without one) | ||
choices[].outcomes[].condition.chance | number, 0 to 1 | Probability of firing per check once the conditions hold | ||
choices[].outcomes[].condition.seasonsMin | whole number, at least 1 | Seasons of your career, counting the one in progress, at least this many | ||
choices[].outcomes[].condition.seasonsMax | whole number, at least 1 | Seasons of your career, counting the one in progress, at most this many | ||
choices[].outcomes[].condition.squad | object | Your 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.tour | text | Yes | The 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.capsMin | whole number, at least 0 | Days the league has picked you for, at least this many | ||
choices[].outcomes[].condition.squad.capsMax | whole number, at least 0 | Days the league has picked you for, at most this many (0: never picked yet) | ||
choices[].outcomes[].condition.squad.seasonsMin | whole number, at least 1 | League seasons you have been picked in, at least this many | ||
choices[].outcomes[].condition.squad.rankMax | whole number, at least 1 | Your 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.averageMin | list, at least 1 item | Your 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.firstSide | true or false | true: your last pick was for your squad's first side (its A team); false: for another side | ||
choices[].outcomes[].condition.squad.picked | true or false | true: the last day your squad played picked you; false: it left you out | ||
choices[].outcomes[].condition.squad.dropped | true or false | true: the last day your squad played left you out after the one before picked you | ||
choices[].outcomes[].effects | object | {} | What a choice does. Numbers are deltas; attribute keys add to that attribute (small values, e.g. 1–3). | |
choices[].outcomes[].effects.confidence | number, -40 to 40 | |||
choices[].outcomes[].effects.form | number, -0.5 to 0.5 | |||
choices[].outcomes[].effects.morale | number, -40 to 40 | |||
choices[].outcomes[].effects.fatigue | number, -0.5 to 0.5 | |||
choices[].outcomes[].effects.followers | whole number, -100,000 to 100,000 | |||
choices[].outcomes[].effects.reputation | number, -20 to 20 | |||
choices[].outcomes[].effects.money | whole number, -500,000 to 500,000 | |||
choices[].outcomes[].effects.image | number, -20 to 20 | Public image, −100 … 100 overall (sponsors notice it). | ||
choices[].outcomes[].effects.pressure | number, -0.3 to 0.3 | Media pressure carried into your next matches (0 … 0.3 overall). | ||
choices[].outcomes[].effects.load | number, -50 to 50 | Workload (0–100 overall): + a draining trip, − a proper rest. | ||
choices[].outcomes[].effects.scoring | number, -5 to 5 | |||
choices[].outcomes[].effects.finishing | number, -5 to 5 | |||
choices[].outcomes[].effects.checkoutKnowledge | number, -5 to 5 | |||
choices[].outcomes[].effects.consistency | number, -5 to 5 | |||
choices[].outcomes[].effects.tempoControl | number, -5 to 5 | |||
choices[].outcomes[].effects.bullAccuracy | number, -5 to 5 | |||
choices[].outcomes[].effects.composure | number, -5 to 5 | |||
choices[].outcomes[].effects.resilience | number, -5 to 5 | |||
choices[].outcomes[].effects.crowdHandling | number, -5 to 5 | |||
choices[].outcomes[].effects.concentration | number, -5 to 5 | |||
choices[].outcomes[].effects.stamina | number, -5 to 5 | |||
choices[].outcomes[].effects.fitness | number, -5 to 5 | |||
choices[].outcomes[].effects.eyesight | number, -5 to 5 | |||
choices[].outcomes[].actions | list, up to 6 items | [] | ||
choices[].outcomes[].actions[] | one of several shapes | Yes | Things a story can do to the world beyond stat tweaks. | |
When type is "withdraw" | ||||
choices[].outcomes[].actions[].type | exactly "withdraw" | Yes | ||
choices[].outcomes[].actions[].refund | true or false | false: a missed registration; out of the event with the entry fee kept. | ||
When type is "sitOut" | ||||
choices[].outcomes[].actions[].type | exactly "sitOut" | Yes | ||
choices[].outcomes[].actions[].weeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].outcomes[].actions[].reason | text | |||
When type is "injury" | ||||
choices[].outcomes[].actions[].type | exactly "injury" | Yes | ||
choices[].outcomes[].actions[].label | text | "Injury" | ||
choices[].outcomes[].actions[].weeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].outcomes[].actions[].severity | one of the options | "minor" | Options: minor, moderate, serious. | |
choices[].outcomes[].actions[].sitOut | true or false | Miss events while it lasts (default: only serious injuries). | ||
choices[].outcomes[].actions[].part | one of the options | Where it hurts (default: worked out from the label, else the throwing shoulder). Options: shoulder, elbow, wrist, back, knee, foot, eyes. | ||
choices[].outcomes[].actions[].injury | id | An injury type from medical.json: its name, part and effects (weeks and severity still come from here). | ||
When type is "modifier" | ||||
choices[].outcomes[].actions[].type | exactly "modifier" | Yes | ||
choices[].outcomes[].actions[].label | text | Yes | ||
choices[].outcomes[].actions[].weeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].outcomes[].actions[].accuracy | number, -0.1 to 0.1 | + tightens your throwing by this fraction, − loosens it (0.03 = 3%). | ||
choices[].outcomes[].actions[].training | number, -1 to 1 | Training gains × (1 + training). | ||
choices[].outcomes[].actions[].fatigueFloor | number, 0 to 1 | |||
choices[].outcomes[].actions[].confidenceFloor | number, 0 to 100 | |||
choices[].outcomes[].actions[].composure | number, -20 to 20 | Composure points on the oche while it lasts (− nerves, + calm). | ||
When type is "sponsorOffer" | ||||
choices[].outcomes[].actions[].type | exactly "sponsorOffer" | Yes | ||
choices[].outcomes[].actions[].category | one of the options | Options: darts, apparel, drinks, boards, energy, travel, tech, local. | ||
choices[].outcomes[].actions[].sponsor | id | Namespaced id, e.g. "core.player.rory-calder" Names a sponsor record. | ||
When type is "rivalry" | ||||
choices[].outcomes[].actions[].type | exactly "rivalry" | Yes | ||
choices[].outcomes[].actions[].with | text | "rival" | "rival" (your top rival), "opponent" (from the match) or a player id | |
choices[].outcomes[].actions[].by | number, -1 to 1 | Yes | ||
When type is "news" | ||||
choices[].outcomes[].actions[].type | exactly "news" | Yes | ||
choices[].outcomes[].actions[].headline | text | Yes | ||
choices[].outcomes[].actions[].body | text | Yes | ||
When type is "setFlag" | ||||
choices[].outcomes[].actions[].type | exactly "setFlag" | Yes | ||
choices[].outcomes[].actions[].flag | text, up to 80 characters | Yes | ||
choices[].outcomes[].actions[].value | true or false | true | ||
When type is "charge" | ||||
choices[].outcomes[].actions[].type | exactly "charge" | Yes | ||
choices[].outcomes[].actions[].offence | id | Yes | The offence (by id, in the regulator's rule book). | |
choices[].outcomes[].actions[].chance | number, 0 to 1 | 1 | The chance it ever comes out. | |
choices[].outcomes[].actions[].afterWeeks | one of several shapes | When 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[].type | exactly "catchOther" | Yes | ||
choices[].outcomes[].actions[].chance | number, 0 to 1 | 1 | The chance the investigation catches someone. | |
When type is "social" | ||||
choices[].outcomes[].actions[].type | exactly "social" | Yes | ||
choices[].outcomes[].actions[].handle | text | |||
choices[].outcomes[].actions[].text | text | Yes | ||
When type is "followerSurge" | ||||
choices[].outcomes[].actions[].type | exactly "followerSurge" | Yes | ||
choices[].outcomes[].actions[].percent | number, 0 to 1 | Yes | ||
choices[].outcomes[].actions[].min | whole number, 0 to 100,000 | |||
When type is "staffLeaves" | ||||
choices[].outcomes[].actions[].type | exactly "staffLeaves" | Yes | ||
choices[].outcomes[].actions[].role | text | Staff role id or its short name ("physio"). Omit for whoever is least settled Names a staff role record. | ||
choices[].outcomes[].actions[].kind | one of the options | Older stories: "coach", "mentalCoach" or "fitnessCoach". Options: coach, mentalCoach, fitnessCoach. | ||
When type is "staffMorale" | ||||
choices[].outcomes[].actions[].type | exactly "staffMorale" | Yes | ||
choices[].outcomes[].actions[].role | text | Staff role id or short name. Omit for the whole team Names a staff role record. | ||
choices[].outcomes[].actions[].by | number, -50 to 50 | Yes | ||
choices[].outcomes[].actions[].relationship | number, -50 to 50 | Also changes their relationship with you by this much. | ||
When type is "holiday" | ||||
choices[].outcomes[].actions[].type | exactly "holiday" | Yes | ||
choices[].outcomes[].actions[].weeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].outcomes[].actions[].label | text | |||
When type is "kit" | ||||
choices[].outcomes[].actions[].type | exactly "kit" | Yes | ||
choices[].outcomes[].actions[].slot | text | Yes | Kit slot id, e.g. "darts", "flights", "footwear" Names a kit slot record. Pattern: ^[a-z][a-z0-9-]*$ | |
choices[].outcomes[].actions[].wear | number, -1 to 1 | Condition change (−1 … 1): − damage, + a service. | ||
choices[].outcomes[].actions[].familiarity | number, -1 to 1 | Familiarity change (−1 … 1). | ||
choices[].outcomes[].actions[].lose | true or false | The item is gone for good (lost, stolen, broken). | ||
When type is "workshop" | ||||
choices[].outcomes[].actions[].type | exactly "workshop" | Yes | ||
choices[].outcomes[].actions[].delay | one of several shapes | Delay 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[].cost | whole number, 0 to 100,000 | An extra cost (paid now). | ||
choices[].outcomes[].actions[].quality | number, -1 to 1 | Quality change for the finished item (−1 … 1 stars). | ||
choices[].outcomes[].text | text | Shown after choosing, after the choice's own outcome. | ||
choices[].outcomes[].followUp | object | Schedule another story to fire later. | ||
choices[].outcomes[].followUp.story | text | Yes | The narrative id to fire Pattern: ^[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$ | |
choices[].outcomes[].followUp.afterWeeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].outcomes[].followUp.chance | number, 0 to 1 | Probability the follow-up happens at all (default 1) | ||
choices[].outcomes[].hint | text, up to 40 characters | A neutral hint chip on the choice, e.g. "Might meet a sponsor". | ||
choices[].followUp | object | Schedule another story to fire later. | ||
choices[].followUp.story | text | Yes | The narrative id to fire Pattern: ^[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$ | |
choices[].followUp.afterWeeks | one of several shapes | Yes | ||
| Shape 1: whole number, 1 to 52 | ||||
| Shape 2: pair [whole number, 1 to 52, whole number, 1 to 52] | ||||
choices[].followUp.chance | number, 0 to 1 | Probability the follow-up happens at all (default 1) | ||
weight | number, at least 0 | 1 | ||
once | true or false | false | Only ever fires once per career. | |
cooldownWeeks | whole number, at least 0 | 26 | Weeks before it can fire again. | |
maxTimes | whole number, 1 to 1000 | Fires at most this many times per career (no cap when absent). once is the same as 1. | ||
group | text, up to 60 characters | Stories in the same group never come round close together: none fires again until the group's cooldown has passed | ||
groupCooldownWeeks | whole number, 0 to 520 | |||
vars | map (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) | ||
variants | list, up to 20 items | Other 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[].title | text | |||
variants[].body | text | Yes | ||
variants[].vars | map (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.