Guide
Training and development
How players get better and worse: the hours you put in on the practice board, how the computer players grow and fade between seasons, and how form, confidence and fatigue drift week to week. It's all in the training settings.
data/training.json holds one object (an array of them also works). Every field except id is optional: a field left out keeps the game's number. The editor schema is the training settings reference, and the Mod Studio edits it under Career rules → Training & development.
{
"id": "acme.training",
"rate": 0.036,
"hours": { "fullTime": 36 },
"areas": { "bull": { "bullAccuracy": 0.6, "finishing": 0.25, "composure": 0.15 } },
"decline": { "eyesight": { "from": 38, "rate": 0.3 } }
}The training areas are fixed: scoring, doubles, bull, fitness, mental and rest (the Training screen has a slider for each). What each one trains is yours to change.
Your training#
Each week, the hours on your plan (fitted to the hours you have) turn into attribute gains:
gain = effective hours × share × rate × age factor × professionalism × coaching × development speed × (gap / span) ^ curve × a random factor in spread
- effective hours: an area's hours, but past
diminishing.fromhours a week each extra hour countsdiminishing.rate. - share: the attribute's share of the area (
areas). - age factor: from
age.bands(see below). - professionalism:
professionalism.base+professionalism.range× the player's professionalism / 100. - coaching: your staff's training bonus for the area (see Staff roles).
- development speed: the player's hidden development rate.
- gap: how far the attribute is below its ceiling (the player's potential, a little higher for their strengths). Gains taper as it closes, from
spanpoints out.
| Field | Default | Meaning |
|---|---|---|
hours.dayJob | 16 | Training hours a week with the day job |
hours.fullTime | 32 | …and full-time |
plan | scoring 5, doubles 4, bull 1, fitness 2, mental 2, rest 2 | The plan a new career starts with (all six areas) |
areas | see below | What each area trains, e.g. "bull": { "bullAccuracy": 0.75, "finishing": 0.25 }. An area given replaces the game's list for it |
rate | 0.03 | Attribute points per effective hour, before the multipliers |
span | 50 | Gains start to taper within this many points of the ceiling… |
curve | 0.5 | …as (gap / span) ^ curve |
spread | [0.8, 1.2] | The week's random factor |
diminishing | from 8, rate 0.5 | Hours in one area past from count at rate |
professionalism | base 0.6, range 0.8 | Professionalism's multiplier (also for the computer players' development) |
age | see below | Growth by age (also for the computer players) |
fatigue | freeHours 14, perHour 0.008, restRelief 0.02 | A week's fatigue: (hours worked − freeHours) × perHour, less rest hours × restRelief |
morale | restHours 2, rest 1, overworkHours 24, overwork −1.5 | Morale +rest with at least restHours of rest; +overwork (a negative number) past overworkHours worked |
The core areas:
| Area | Trains |
|---|---|
scoring | scoring 0.6, consistency 0.25, tempo control 0.15 |
doubles | finishing 0.6, checkout knowledge 0.4 |
bull | bull accuracy 0.75, finishing 0.25 |
fitness | stamina 0.5, fitness 0.4, concentration 0.1 |
mental | composure 0.35, resilience 0.25, concentration 0.2, crowd handling 0.2 |
Attribute names: scoring, finishing, checkoutKnowledge, consistency, tempoControl, bullAccuracy, composure, resilience, crowdHandling, concentration, stamina, fitness, eyesight. Eyesight can't be trained.
Age#
"age": {
"bands": [
{ "under": 20, "factor": 1.35 },
{ "under": 24, "factor": 1.2 },
{ "under": 28, "factor": 1 },
{ "under": 32, "factor": 0.8 },
{ "under": 36, "factor": 0.6 },
{ "under": 40, "factor": 0.4 }
],
"after": 0.25
}The first band whose under is above the player's age applies; after beyond the last. Bands go from youngest to oldest. bands given replaces the whole list.
Between seasons#
At each season's end the computer players develop: towards their ceiling, and away from it with age. You don't (you train week by week instead), but age catches up with you too.
| Field | Default | Meaning |
|---|---|---|
offseason.gain | 9 | A season's growth: gain × age factor × professionalism × development speed × (gap / span) ^ curve × a random factor |
offseason.span | 30 | |
offseason.curve | 0.8 | |
offseason.spread | [0.6, 1.3] | The random factor |
offseason.noise | 0.6 | Plus N(0, noise) on every attribute |
offseason.declineSpread | [0.6, 1.4] | The random factor on age decline (yours too) |
offseason.erodeFrom | 34 | Past this age, potential erodes… |
offseason.erosion | 0.8 | …this much a season |
decline | see below | Age decline per attribute: rate points a season for every year past from |
The core decline:
| Attributes | from | rate |
|---|---|---|
eyesight | 36 | 0.35 |
stamina, fitness | 34 | 0.3 |
scoring, finishing, bullAccuracy | 40 | 0.25 |
consistency, tempoControl | 42 | 0.2 |
default (every other attribute) | 48 | 0.15 |
decline merges per attribute: { "eyesight": { "from": 38, "rate": 0.3 } } changes eyesight only.
Week to week#
Every player's form, confidence, morale and fatigue settle a little each week.
| Field | Default | Meaning |
|---|---|---|
drift.form | keep 0.88, noise 0.07 | form × keep + N(0, noise) |
drift.confidence | target 60, pull 0.06, noise 1.2 | Moves pull of the way to target, + N(0, noise) |
drift.morale | target 65, pull 0.05 | Moves pull of the way to target ( the human's target is their own baseline from their motivation, tuning morale.baseline) |
drift.fatigue | keep 0.55, recover 0.03 | fatigue × keep − recover (less with rest on your plan) |
Morale and motivation#
The human's training gains are also scaled by their morale and motivation: the professionalism factor is multiplied by 1 + morale.trainingLow × (low ramp) or 1 + morale.trainingHigh × (high ramp), and by 1 + range × (motivation − 50) / 50, the range being motivation.trainingRangeHigh above 50 and motivation.trainingRange below. The ramps, the motivation model and every number are tuning values (Tuning, Morale and Motivation). Computer players train as before.
Practice games (the advanced plan)#
The Training page's advanced plan fills the same weekly hours with practice games instead of hours per area. Each game is a practiceGames record, one per game, in data/training-games.json or data/training-games/. Every game in the week is simulated with the player's own throw unless they play it on the phone; the score against par scales what the game's hours train (the same curve, coaching and age as the areas above), and a game played yourself trains a little more.
| Field | Meaning |
|---|---|
id | The game's id, for example core.practice.bobs-27 |
name | Its name |
rule | One line saying how it is played |
icon | The phone's picture for it (clock, target, stats, trophy, calendar, money); none: training |
kind | The rules: aroundTheClock, bobs27, shanghai, checkout, halveIt, catch, scoring, bull |
targets | The beds in play order: "20" (the number), "D16", "T20", "25" or "Bull" |
start | bobs27 and halveIt: the starting score; checkout: the score to check out; catch: the first |
count | checkout: tries; catch: how many scores |
darts | aroundTheClock, scoring, bull: darts in all; checkout, catch: darts a try |
points | catch: the points for a checkout by darts used, the first for one dart |
par | The score at which the game trains as its hours of the basic plan do |
hours | What it takes from the week |
fatigue | Fatigue an hour of it costs, as a share of a basic-plan hour (default 1) |
area | The basic plan's area whose coaching helps it: scoring, doubles, bull, fitness, mental |
boosts | What it trains, each attribute's share, for example { "bullAccuracy": 0.7, "concentration": 0.3 } |
The kinds: aroundTheClock clears each target in turn with any part of the number, a point a target and, with all of them cleared, a point for every dart to spare. bobs27 throws three darts at each double: a hit adds it, a visit without one takes it off, and the game ends at zero. shanghai scores what lands in each round's number. checkout counts the tries checked out (double out, a bust goes back to the visit's start). halveIt scores what lands in each target, and a visit without a hit halves the total. catch checks out each score from start up and scores points. scoring counts every point of its darts; bull scores the bull's 25s and 50s.
The tuning values practice.minBoost and practice.maxBoost hold the score's effect (default 0.5 to 1.5 of par's), practice.curve shapes it ((score / par) ^ curve, default 1), and practice.playBonus is the extra for a game played yourself (default 1.2).
Conditions: Long session and Crowd on#
A game can be added to the week under conditions, chosen with toggles beside Add. A condition is a record in the same files, of kind longSession or crowd; the player can turn on any of them, together if they like. Its fields mean:
| Field | For a condition |
|---|---|
name | The toggle's and the chip's words |
rule | One line saying what it does |
hours | Multiplies the game's hours (2 for a long session) |
par | Multiplies the game's par (2.1: a long session's par is a little more than twice the game's) |
fatigue | Multiplies the fatigue an hour of the game costs |
area | Required by the record's shape; the game's own area's coaching is the one that applies |
boosts | Stats it trains on top of the game's own, for example { "stamina": 0.3, "fitness": 0.25 } |
longSession plays the game twice through in one go. The second half is thrown tired (tuning practice.long.fatigue, which Stamina eases), and its stats scale with how the second half held up against the first: second / first, held to practice.long.holdMin .. practice.long.holdMax. crowd plays it on the stage: each dart under a little pressure (practice.crowd.pressure), more after a shout (practice.crowd.shoutPressure), and a shout comes before a dart at practice.crowd.shoutChance. Its stats scale by 1 + practice.crowd.hitAfterMiss × the share of darts that hit after a miss − practice.crowd.missAfterShout × the share that missed after a shout, held to practice.crowd.min .. practice.crowd.max. The shouts draw from a stream of their own, so a game without the crowd lands its darts as before.
Several mods#
Records apply in load order: fields from later mods win, per area for areas and per attribute for decline. Reusing another mod's id replaces its record. You can also patch the core record, training:core.training:
{ "target": "training:core.training", "patch": { "rate": 0.04 } }Saves#
Training settings are copied into a career's save. A career you load picks up the installed packs' settings; saves from before them play by the game's numbers, which the core pack's data/training.json holds.
The example-rules mod trains 20% faster and adds composure to bull practice.