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.from hours a week each extra hour counts diminishing.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 span points out.
FieldDefaultMeaning
hours.dayJob16Training hours a week with the day job
hours.fullTime32…and full-time
planscoring 5, doubles 4, bull 1, fitness 2, mental 2, rest 2The plan a new career starts with (all six areas)
areassee belowWhat each area trains, e.g. "bull": { "bullAccuracy": 0.75, "finishing": 0.25 }. An area given replaces the game's list for it
rate0.03Attribute points per effective hour, before the multipliers
span50Gains start to taper within this many points of the ceiling…
curve0.5…as (gap / span) ^ curve
spread[0.8, 1.2]The week's random factor
diminishingfrom 8, rate 0.5Hours in one area past from count at rate
professionalismbase 0.6, range 0.8Professionalism's multiplier (also for the computer players' development)
agesee belowGrowth by age (also for the computer players)
fatiguefreeHours 14, perHour 0.008, restRelief 0.02A week's fatigue: (hours worked − freeHours) × perHour, less rest hours × restRelief
moralerestHours 2, rest 1, overworkHours 24, overwork −1.5Morale +rest with at least restHours of rest; +overwork (a negative number) past overworkHours worked

The core areas:

AreaTrains
scoringscoring 0.6, consistency 0.25, tempo control 0.15
doublesfinishing 0.6, checkout knowledge 0.4
bullbull accuracy 0.75, finishing 0.25
fitnessstamina 0.5, fitness 0.4, concentration 0.1
mentalcomposure 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.

FieldDefaultMeaning
offseason.gain9A season's growth: gain × age factor × professionalism × development speed × (gap / span) ^ curve × a random factor
offseason.span30
offseason.curve0.8
offseason.spread[0.6, 1.3]The random factor
offseason.noise0.6Plus N(0, noise) on every attribute
offseason.declineSpread[0.6, 1.4]The random factor on age decline (yours too)
offseason.erodeFrom34Past this age, potential erodes…
offseason.erosion0.8…this much a season
declinesee belowAge decline per attribute: rate points a season for every year past from

The core decline:

Attributesfromrate
eyesight360.35
stamina, fitness340.3
scoring, finishing, bullAccuracy400.25
consistency, tempoControl420.2
default (every other attribute)480.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.

FieldDefaultMeaning
drift.formkeep 0.88, noise 0.07form × keep + N(0, noise)
drift.confidencetarget 60, pull 0.06, noise 1.2Moves pull of the way to target, + N(0, noise)
drift.moraletarget 65, pull 0.05Moves pull of the way to target ( the human's target is their own baseline from their motivation, tuning morale.baseline)
drift.fatiguekeep 0.55, recover 0.03fatigue × 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.

FieldMeaning
idThe game's id, for example core.practice.bobs-27
nameIts name
ruleOne line saying how it is played
iconThe phone's picture for it (clock, target, stats, trophy, calendar, money); none: training
kindThe rules: aroundTheClock, bobs27, shanghai, checkout, halveIt, catch, scoring, bull
targetsThe beds in play order: "20" (the number), "D16", "T20", "25" or "Bull"
startbobs27 and halveIt: the starting score; checkout: the score to check out; catch: the first
countcheckout: tries; catch: how many scores
dartsaroundTheClock, scoring, bull: darts in all; checkout, catch: darts a try
pointscatch: the points for a checkout by darts used, the first for one dart
parThe score at which the game trains as its hours of the basic plan do
hoursWhat it takes from the week
fatigueFatigue an hour of it costs, as a share of a basic-plan hour (default 1)
areaThe basic plan's area whose coaching helps it: scoring, doubles, bull, fitness, mental
boostsWhat 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:

FieldFor a condition
nameThe toggle's and the chip's words
ruleOne line saying what it does
hoursMultiplies the game's hours (2 for a long session)
parMultiplies the game's par (2.1: a long session's par is a little more than twice the game's)
fatigueMultiplies the fatigue an hour of the game costs
areaRequired by the record's shape; the game's own area's coaching is the one that applies
boostsStats 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.

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