@tungstenstudio/outschart-generator 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +184 -0
- package/dist/index.cjs +1194 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +107 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.js +1155 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
- package/src/dartboard.ts +122 -0
- package/src/data/dartboard-dimensions.json +77 -0
- package/src/data/dartboard-layout.json +66 -0
- package/src/data/double-out-checkouts.ts +168 -0
- package/src/data/single-out-checkouts.ts +177 -0
- package/src/filter.ts +35 -0
- package/src/generate.ts +91 -0
- package/src/index.ts +37 -0
- package/src/lookup.ts +47 -0
- package/src/miss-analysis.ts +90 -0
- package/src/notation.ts +69 -0
- package/src/recommend.ts +434 -0
- package/src/types.ts +141 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/data/dartboard-layout.json","../src/dartboard.ts","../src/data/double-out-checkouts.ts","../src/data/single-out-checkouts.ts","../src/lookup.ts","../src/generate.ts","../src/data/dartboard-dimensions.json","../src/recommend.ts","../src/filter.ts","../src/notation.ts"],"sourcesContent":["// === Out Modes ===\n\nexport type OutMode = 'double' | 'single';\n\n// === Dartboard Types ===\n\nexport type BedType =\n | 'treble'\n | 'double'\n | 'smallSingle'\n | 'largeSingle'\n | 'Bull'\n | '25'\n | 'off'\n | null; // bare single (e.g. \"20\")\n\nexport type MissType = 'radialIn' | 'radialOut' | 'lateralCW' | 'lateralCCW';\n\nexport interface ParsedTarget {\n bed: BedType;\n number: number | null;\n value: number;\n}\n\nexport interface FormattedTarget {\n label: string;\n value: number;\n}\n\nexport interface MissTarget extends FormattedTarget {\n missType: MissType;\n}\n\nexport interface ThrowEvaluation {\n target: string;\n targetValue: number;\n remaining: number;\n misses: EvaluatedMiss[];\n bustCount: number;\n totalMisses: number;\n}\n\nexport interface EvaluatedMiss extends MissTarget {\n newRemaining: number;\n busts: boolean;\n}\n\n// === Checkout Types ===\n\nexport interface CheckoutEntry {\n darts: string[];\n numDarts: number;\n alternates?: string[][];\n}\n\nexport type CheckoutChart = Record<number, CheckoutEntry>;\n\n// === Enumeration Types ===\n\nexport interface EnumeratedEntry {\n options: string[][];\n count: number;\n}\n\nexport type EnumeratedCheckoutMap = Record<number, EnumeratedEntry>;\n\nexport interface EnumeratedResult {\n checkouts: EnumeratedCheckoutMap;\n bogeyNumbers: number[];\n totalOptions: number;\n}\n\n// === Generation Options ===\n\nexport interface GenerateOptions {\n outMode: OutMode;\n min?: number;\n max?: number;\n}\n\nexport interface RecommendOptions extends GenerateOptions {\n includeAlternates?: boolean;\n altThreshold?: number;\n overrides?: Record<number, { darts: string[] }>;\n}\n\nexport interface CheckoutResult {\n checkouts: CheckoutChart;\n bogeyNumbers: number[];\n}\n\n// === Miss Analysis Types ===\n\nexport interface DartAnnotation {\n dart: number;\n target: string;\n missRelevant: boolean;\n missResult?: string;\n missRemaining?: number;\n stillCheckable?: boolean;\n remainderCheckout?: string[] | null;\n}\n\nexport interface MissAnalysisResult {\n score: number;\n path: string[];\n annotations: DartAnnotation[];\n missResiliency: string;\n}\n\n// === Dartboard Layout Types ===\n\nexport interface DartboardNeighbor {\n clockwise: number;\n counterClockwise: number;\n}\n\nexport interface DartboardLayout {\n boardOrder: number[];\n neighbors: Record<string, DartboardNeighbor>;\n}\n\n// === Error Handling ===\n\nexport type OutsChartErrorCode =\n | 'INVALID_TARGET'\n | 'INVALID_SCORE'\n | 'INVALID_OUT_MODE'\n | 'INVALID_RANGE'\n | 'SCORE_NOT_CHECKABLE'\n | 'INVALID_OVERRIDE';\n\nexport class OutsChartError extends Error {\n code: OutsChartErrorCode;\n\n constructor(code: OutsChartErrorCode, message: string) {\n super(message);\n this.name = 'OutsChartError';\n this.code = code;\n }\n}\n","{\n \"meta\": {\n \"description\": \"Physical dartboard layout: number order, neighbors, and miss targets for each bed\",\n \"notes\": \"Board order is clockwise starting from the top. Each number has two lateral neighbors (clockwise/counterclockwise) and each bed has radial neighbors (closer to or farther from the center).\"\n },\n \"boardOrder\": [20, 1, 18, 4, 13, 6, 10, 15, 2, 17, 3, 19, 7, 16, 8, 11, 14, 9, 12, 5],\n \"neighbors\": {\n \"1\": { \"clockwise\": 18, \"counterClockwise\": 20 },\n \"2\": { \"clockwise\": 17, \"counterClockwise\": 15 },\n \"3\": { \"clockwise\": 19, \"counterClockwise\": 17 },\n \"4\": { \"clockwise\": 13, \"counterClockwise\": 18 },\n \"5\": { \"clockwise\": 20, \"counterClockwise\": 12 },\n \"6\": { \"clockwise\": 10, \"counterClockwise\": 13 },\n \"7\": { \"clockwise\": 16, \"counterClockwise\": 19 },\n \"8\": { \"clockwise\": 11, \"counterClockwise\": 16 },\n \"9\": { \"clockwise\": 12, \"counterClockwise\": 14 },\n \"10\": { \"clockwise\": 15, \"counterClockwise\": 6 },\n \"11\": { \"clockwise\": 14, \"counterClockwise\": 8 },\n \"12\": { \"clockwise\": 5, \"counterClockwise\": 9 },\n \"13\": { \"clockwise\": 6, \"counterClockwise\": 4 },\n \"14\": { \"clockwise\": 9, \"counterClockwise\": 11 },\n \"15\": { \"clockwise\": 2, \"counterClockwise\": 10 },\n \"16\": { \"clockwise\": 8, \"counterClockwise\": 7 },\n \"17\": { \"clockwise\": 3, \"counterClockwise\": 2 },\n \"18\": { \"clockwise\": 4, \"counterClockwise\": 1 },\n \"19\": { \"clockwise\": 7, \"counterClockwise\": 3 },\n \"20\": { \"clockwise\": 5, \"counterClockwise\": 1 }\n },\n \"radialBeds\": {\n \"description\": \"From center outward: Bull, 25, smallSingle, treble, largeSingle, double, off-board\",\n \"order\": [\"Bull\", \"25\", \"smallSingle\", \"treble\", \"largeSingle\", \"double\", \"off\"]\n },\n \"missTargets\": {\n \"description\": \"For each bed type, the possible miss results: radial (in/out from center) and lateral (adjacent numbers). 'off' means off the board (no score).\",\n \"Bull\": {\n \"radialOut\": \"25\",\n \"radialIn\": null,\n \"lateralMiss\": false\n },\n \"25\": {\n \"radialOut\": \"smallSingle\",\n \"radialIn\": \"Bull\",\n \"lateralMiss\": false\n },\n \"smallSingle\": {\n \"radialOut\": \"treble\",\n \"radialIn\": \"25\",\n \"lateralMiss\": true\n },\n \"treble\": {\n \"radialOut\": \"largeSingle\",\n \"radialIn\": \"smallSingle\",\n \"lateralMiss\": true\n },\n \"largeSingle\": {\n \"radialOut\": \"double\",\n \"radialIn\": \"treble\",\n \"lateralMiss\": true\n },\n \"double\": {\n \"radialOut\": \"off\",\n \"radialIn\": \"largeSingle\",\n \"lateralMiss\": true\n }\n }\n}\n","import layout from './data/dartboard-layout.json' with { type: 'json' };\nimport type {\n ParsedTarget,\n FormattedTarget,\n MissTarget,\n MissType,\n ThrowEvaluation,\n EvaluatedMiss,\n DartboardLayout,\n} from './types.js';\n\nconst boardLayout = layout as unknown as DartboardLayout;\n\nexport const BOARD_ORDER: number[] = boardLayout.boardOrder;\n\nexport function getNeighbors(num: number): { cw: number; ccw: number } {\n const n = boardLayout.neighbors[String(num)];\n return { cw: n.clockwise, ccw: n.counterClockwise };\n}\n\nexport function parseTarget(target: string): ParsedTarget | null {\n if (target === 'Bull') return { bed: 'Bull', number: null, value: 50 };\n if (target === '25') return { bed: '25', number: null, value: 25 };\n const m = target.match(/^([TD]?)(\\d+)$/);\n if (!m) return null;\n const num = parseInt(m[2]);\n if (num < 1 || num > 20) return null;\n const prefix = m[1];\n if (prefix === 'T') return { bed: 'treble', number: num, value: num * 3 };\n if (prefix === 'D') return { bed: 'double', number: num, value: num * 2 };\n return { bed: null, number: num, value: num };\n}\n\nexport function formatTarget(bed: string, number: number | null): FormattedTarget {\n if (bed === 'Bull') return { label: 'Bull', value: 50 };\n if (bed === '25') return { label: '25', value: 25 };\n if (bed === 'off') return { label: 'off', value: 0 };\n if (bed === 'treble') return { label: `T${number}`, value: number! * 3 };\n if (bed === 'double') return { label: `D${number}`, value: number! * 2 };\n return { label: `${number}`, value: number! };\n}\n\nexport function getMissTargets(target: string): MissTarget[] {\n const parsed = parseTarget(target);\n if (!parsed) return [];\n\n const misses: MissTarget[] = [];\n const missInfo = getMissInfo(parsed);\n\n if (missInfo.radialIn) {\n misses.push({ ...missInfo.radialIn, missType: 'radialIn' as MissType });\n }\n if (missInfo.radialOut) {\n misses.push({ ...missInfo.radialOut, missType: 'radialOut' as MissType });\n }\n\n if (parsed.number) {\n const { cw, ccw } = getNeighbors(parsed.number);\n\n if (parsed.bed === 'treble') {\n misses.push({ label: `T${cw}`, value: cw * 3, missType: 'lateralCW' });\n misses.push({ label: `T${ccw}`, value: ccw * 3, missType: 'lateralCCW' });\n } else if (parsed.bed === 'double') {\n misses.push({ label: `D${cw}`, value: cw * 2, missType: 'lateralCW' });\n misses.push({ label: `D${ccw}`, value: ccw * 2, missType: 'lateralCCW' });\n } else {\n misses.push({ label: `${cw}`, value: cw, missType: 'lateralCW' });\n misses.push({ label: `${ccw}`, value: ccw, missType: 'lateralCCW' });\n }\n }\n\n return misses;\n}\n\nfunction getMissInfo(parsed: ParsedTarget): { radialIn: FormattedTarget | null; radialOut: FormattedTarget | null } {\n const result: { radialIn: FormattedTarget | null; radialOut: FormattedTarget | null } = {\n radialIn: null,\n radialOut: null,\n };\n\n if (parsed.bed === 'Bull') {\n result.radialOut = formatTarget('25', null);\n } else if (parsed.bed === '25') {\n result.radialIn = formatTarget('Bull', null);\n } else if (parsed.bed === 'treble') {\n result.radialIn = formatTarget('smallSingle', parsed.number);\n result.radialOut = formatTarget('largeSingle', parsed.number);\n } else if (parsed.bed === 'double') {\n result.radialIn = formatTarget('largeSingle', parsed.number);\n result.radialOut = formatTarget('off', null);\n } else {\n result.radialIn = formatTarget('treble', parsed.number);\n result.radialOut = formatTarget('double', parsed.number);\n }\n\n return result;\n}\n\nexport function evaluateThrow(target: string, remaining: number): ThrowEvaluation | null {\n const parsed = parseTarget(target);\n if (!parsed) return null;\n\n const misses = getMissTargets(target);\n\n const evaluatedMisses: EvaluatedMiss[] = misses.map((miss) => {\n const newRemaining = remaining - miss.value;\n return {\n ...miss,\n newRemaining,\n busts: newRemaining < 0,\n };\n });\n\n return {\n target,\n targetValue: parsed.value,\n remaining,\n misses: evaluatedMisses,\n bustCount: evaluatedMisses.filter((m) => m.busts).length,\n totalMisses: evaluatedMisses.length,\n };\n}\n","import type { CheckoutChart } from \"../types.js\";\n\nexport const DOUBLE_OUT_BOGEY_NUMBERS: number[] = [159,162,163,165,166,168,169];\n\nexport const DOUBLE_OUT_CHECKOUTS: CheckoutChart = {\n 2: { darts: ['D1'], numDarts: 1 },\n 3: { darts: ['1', 'D1'], numDarts: 2 },\n 4: { darts: ['D2'], numDarts: 1 },\n 5: { darts: ['1', 'D2'], numDarts: 2 },\n 6: { darts: ['D3'], numDarts: 1 },\n 7: { darts: ['3', 'D2'], numDarts: 2 },\n 8: { darts: ['D4'], numDarts: 1 },\n 9: { darts: ['1', 'D4'], numDarts: 2 },\n 10: { darts: ['D5'], numDarts: 1 },\n 11: { darts: ['3', 'D4'], numDarts: 2 },\n 12: { darts: ['D6'], numDarts: 1 },\n 13: { darts: ['5', 'D4'], numDarts: 2 },\n 14: { darts: ['D7'], numDarts: 1 },\n 15: { darts: ['7', 'D4'], numDarts: 2 },\n 16: { darts: ['D8'], numDarts: 1 },\n 17: { darts: ['1', 'D8'], numDarts: 2 },\n 18: { darts: ['D9'], numDarts: 1 },\n 19: { darts: ['3', 'D8'], numDarts: 2 },\n 20: { darts: ['D10'], numDarts: 1 },\n 21: { darts: ['5', 'D8'], numDarts: 2 },\n 22: { darts: ['D11'], numDarts: 1 },\n 23: { darts: ['7', 'D8'], numDarts: 2 },\n 24: { darts: ['D12'], numDarts: 1 },\n 25: { darts: ['9', 'D8'], numDarts: 2 },\n 26: { darts: ['D13'], numDarts: 1 },\n 27: { darts: ['3', 'D12'], numDarts: 2 },\n 28: { darts: ['D14'], numDarts: 1 },\n 29: { darts: ['5', 'D12'], numDarts: 2 },\n 30: { darts: ['D15'], numDarts: 1 },\n 31: { darts: ['7', 'D12'], numDarts: 2 },\n 32: { darts: ['D16'], numDarts: 1 },\n 33: { darts: ['1', 'D16'], numDarts: 2 },\n 34: { darts: ['D17'], numDarts: 1 },\n 35: { darts: ['3', 'D16'], numDarts: 2 },\n 36: { darts: ['D18'], numDarts: 1 },\n 37: { darts: ['5', 'D16'], numDarts: 2 },\n 38: { darts: ['D19'], numDarts: 1 },\n 39: { darts: ['7', 'D16'], numDarts: 2 },\n 40: { darts: ['D20'], numDarts: 1 },\n 41: { darts: ['9', 'D16'], numDarts: 2 },\n 42: { darts: ['10', 'D16'], numDarts: 2 },\n 43: { darts: ['11', 'D16'], numDarts: 2 },\n 44: { darts: ['12', 'D16'], numDarts: 2 },\n 45: { darts: ['13', 'D16'], numDarts: 2 },\n 46: { darts: ['14', 'D16'], numDarts: 2 },\n 47: { darts: ['15', 'D16'], numDarts: 2 },\n 48: { darts: ['16', 'D16'], numDarts: 2 },\n 49: { darts: ['9', 'D20'], numDarts: 2 },\n 50: { darts: ['Bull'], numDarts: 1 },\n 51: { darts: ['11', 'D20'], numDarts: 2 },\n 52: { darts: ['12', 'D20'], numDarts: 2 },\n 53: { darts: ['13', 'D20'], numDarts: 2 },\n 54: { darts: ['14', 'D20'], numDarts: 2 },\n 55: { darts: ['15', 'D20'], numDarts: 2 },\n 56: { darts: ['16', 'D20'], numDarts: 2 },\n 57: { darts: ['17', 'D20'], numDarts: 2 },\n 58: { darts: ['18', 'D20'], numDarts: 2 },\n 59: { darts: ['19', 'D20'], numDarts: 2 },\n 60: { darts: ['20', 'D20'], numDarts: 2 },\n 61: { darts: ['T15', 'D8'], numDarts: 2 },\n 62: { darts: ['T10', 'D16'], numDarts: 2 },\n 63: { darts: ['T13', 'D12'], numDarts: 2 },\n 64: { darts: ['T16', 'D8'], numDarts: 2 },\n 65: { darts: ['T19', 'D4'], numDarts: 2 },\n 66: { darts: ['T10', 'D18'], numDarts: 2 },\n 67: { darts: ['T17', 'D8'], numDarts: 2 },\n 68: { darts: ['T20', 'D4'], numDarts: 2 },\n 69: { darts: ['T15', 'D12'], numDarts: 2 },\n 70: { darts: ['T10', 'D20'], numDarts: 2 },\n 71: { darts: ['T13', 'D16'], numDarts: 2 },\n 72: { darts: ['T16', 'D12'], numDarts: 2 },\n 73: { darts: ['T19', 'D8'], numDarts: 2 },\n 74: { darts: ['T14', 'D16'], numDarts: 2 },\n 75: { darts: ['T17', 'D12'], numDarts: 2 },\n 76: { darts: ['T20', 'D8'], numDarts: 2 },\n 77: { darts: ['T19', 'D10'], numDarts: 2 },\n 78: { darts: ['T18', 'D12'], numDarts: 2 },\n 79: { darts: ['T13', 'D20'], numDarts: 2 },\n 80: { darts: ['T20', 'D10'], numDarts: 2 },\n 81: { darts: ['T19', 'D12'], numDarts: 2 },\n 82: { darts: ['T14', 'D20'], numDarts: 2 },\n 83: { darts: ['T17', 'D16'], numDarts: 2 },\n 84: { darts: ['T20', 'D12'], numDarts: 2 },\n 85: { darts: ['T15', 'D20'], numDarts: 2 },\n 86: { darts: ['T18', 'D16'], numDarts: 2 },\n 87: { darts: ['T17', 'D18'], numDarts: 2 },\n 88: { darts: ['T16', 'D20'], numDarts: 2 },\n 89: { darts: ['T19', 'D16'], numDarts: 2 },\n 90: { darts: ['T20', 'D15'], numDarts: 2 },\n 91: { darts: ['T17', 'D20'], numDarts: 2 },\n 92: { darts: ['T20', 'D16'], numDarts: 2 },\n 93: { darts: ['T19', 'D18'], numDarts: 2 },\n 94: { darts: ['T18', 'D20'], numDarts: 2 },\n 95: { darts: ['T19', 'D19'], numDarts: 2 },\n 96: { darts: ['T20', 'D18'], numDarts: 2 },\n 97: { darts: ['T19', 'D20'], numDarts: 2 },\n 98: { darts: ['T20', 'D19'], numDarts: 2 },\n 99: { darts: ['T19', '10', 'D16'], numDarts: 3 },\n 100: { darts: ['T20', 'D20'], numDarts: 2 },\n 101: { darts: ['T17', 'Bull'], numDarts: 2 },\n 102: { darts: ['T20', '10', 'D16'], numDarts: 3 },\n 103: { darts: ['T19', '10', 'D18'], numDarts: 3 },\n 104: { darts: ['T18', 'Bull'], numDarts: 2 },\n 105: { darts: ['T20', '13', 'D16'], numDarts: 3 },\n 106: { darts: ['T20', '14', 'D16'], numDarts: 3 },\n 107: { darts: ['T19', 'Bull'], numDarts: 2 },\n 108: { darts: ['T20', '16', 'D16'], numDarts: 3 },\n 109: { darts: ['T20', '17', 'D16'], numDarts: 3 },\n 110: { darts: ['T20', 'Bull'], numDarts: 2 },\n 111: { darts: ['T20', '19', 'D16'], numDarts: 3 },\n 112: { darts: ['T20', '12', 'D20'], numDarts: 3 },\n 113: { darts: ['T20', '13', 'D20'], numDarts: 3 },\n 114: { darts: ['T20', '14', 'D20'], numDarts: 3 },\n 115: { darts: ['T20', '15', 'D20'], numDarts: 3 },\n 116: { darts: ['T20', '16', 'D20'], numDarts: 3 },\n 117: { darts: ['T20', '17', 'D20'], numDarts: 3 },\n 118: { darts: ['T20', '18', 'D20'], numDarts: 3 },\n 119: { darts: ['T19', 'T10', 'D16'], numDarts: 3 },\n 120: { darts: ['T20', '20', 'D20'], numDarts: 3 },\n 121: { darts: ['T17', 'T10', 'D20'], numDarts: 3 },\n 122: { darts: ['T18', 'T20', 'D4'], numDarts: 3 },\n 123: { darts: ['T19', 'T16', 'D9'], numDarts: 3 },\n 124: { darts: ['T20', 'T14', 'D11'], numDarts: 3 },\n 125: { darts: ['25', 'T20', 'D20'], numDarts: 3 },\n 126: { darts: ['T19', 'T19', 'D6'], numDarts: 3 },\n 127: { darts: ['T20', 'T17', 'D8'], numDarts: 3 },\n 128: { darts: ['T18', 'T14', 'D16'], numDarts: 3 },\n 129: { darts: ['T19', 'T16', 'D12'], numDarts: 3 },\n 130: { darts: ['T20', '20', 'Bull'], numDarts: 3 },\n 131: { darts: ['T20', 'T13', 'D16'], numDarts: 3 },\n 132: { darts: ['Bull', 'T14', 'D20'], numDarts: 3 },\n 133: { darts: ['T20', 'T19', 'D8'], numDarts: 3 },\n 134: { darts: ['T20', 'T14', 'D16'], numDarts: 3 },\n 135: { darts: ['Bull', 'T15', 'D20'], numDarts: 3 },\n 136: { darts: ['T20', 'T20', 'D8'], numDarts: 3 },\n 137: { darts: ['T20', 'T19', 'D10'], numDarts: 3 },\n 138: { darts: ['T20', 'T18', 'D12'], numDarts: 3 },\n 139: { darts: ['T19', 'T14', 'D20'], numDarts: 3 },\n 140: { darts: ['T20', 'T20', 'D10'], numDarts: 3 },\n 141: { darts: ['T20', 'T19', 'D12'], numDarts: 3 },\n 142: { darts: ['T20', 'T14', 'D20'], numDarts: 3 },\n 143: { darts: ['T20', 'T17', 'D16'], numDarts: 3 },\n 144: { darts: ['T20', 'T20', 'D12'], numDarts: 3 },\n 145: { darts: ['T20', 'T15', 'D20'], numDarts: 3 },\n 146: { darts: ['T20', 'T18', 'D16'], numDarts: 3 },\n 147: { darts: ['T20', 'T17', 'D18'], numDarts: 3 },\n 148: { darts: ['T20', 'T16', 'D20'], numDarts: 3 },\n 149: { darts: ['T20', 'T19', 'D16'], numDarts: 3 },\n 150: { darts: ['T20', 'T18', 'D18'], numDarts: 3 },\n 151: { darts: ['T20', 'T17', 'D20'], numDarts: 3 },\n 152: { darts: ['T20', 'T20', 'D16'], numDarts: 3 },\n 153: { darts: ['T20', 'T19', 'D18'], numDarts: 3 },\n 154: { darts: ['T20', 'T18', 'D20'], numDarts: 3 },\n 155: { darts: ['T20', 'T19', 'D19'], numDarts: 3 },\n 156: { darts: ['T20', 'T20', 'D18'], numDarts: 3 },\n 157: { darts: ['T20', 'T19', 'D20'], numDarts: 3 },\n 158: { darts: ['T20', 'T20', 'D19'], numDarts: 3 },\n 160: { darts: ['T20', 'T20', 'D20'], numDarts: 3 },\n 161: { darts: ['T20', 'T17', 'Bull'], numDarts: 3 },\n 164: { darts: ['T20', 'T18', 'Bull'], numDarts: 3 },\n 167: { darts: ['T20', 'T19', 'Bull'], numDarts: 3 },\n 170: { darts: ['T20', 'T20', 'Bull'], numDarts: 3 },\n};\n","import type { CheckoutChart } from \"../types.js\";\n\nexport const SINGLE_OUT_BOGEY_NUMBERS: number[] = [163,166,169,172,173,175,176,178,179];\n\nexport const SINGLE_OUT_CHECKOUTS: CheckoutChart = {\n 1: { darts: ['1'], numDarts: 1 },\n 2: { darts: ['2'], numDarts: 1 },\n 3: { darts: ['3'], numDarts: 1 },\n 4: { darts: ['4'], numDarts: 1 },\n 5: { darts: ['5'], numDarts: 1 },\n 6: { darts: ['6'], numDarts: 1 },\n 7: { darts: ['7'], numDarts: 1 },\n 8: { darts: ['8'], numDarts: 1 },\n 9: { darts: ['9'], numDarts: 1 },\n 10: { darts: ['10'], numDarts: 1 },\n 11: { darts: ['11'], numDarts: 1 },\n 12: { darts: ['12'], numDarts: 1 },\n 13: { darts: ['13'], numDarts: 1 },\n 14: { darts: ['14'], numDarts: 1 },\n 15: { darts: ['15'], numDarts: 1 },\n 16: { darts: ['16'], numDarts: 1 },\n 17: { darts: ['17'], numDarts: 1 },\n 18: { darts: ['18'], numDarts: 1 },\n 19: { darts: ['19'], numDarts: 1 },\n 20: { darts: ['20'], numDarts: 1 },\n 21: { darts: ['7', '14'], numDarts: 2, alternates: [['1', '20'], ['2', '19'], ['3', '18'], ['4', '17'], ['5', '16']] },\n 22: { darts: ['D11'], numDarts: 1, alternates: [['2', '20'], ['3', '19'], ['4', '18'], ['5', '17'], ['6', '16']] },\n 23: { darts: ['3', '20'], numDarts: 2, alternates: [['4', '19'], ['5', '18'], ['6', '17'], ['7', '16'], ['8', '15']] },\n 24: { darts: ['D12'], numDarts: 1, alternates: [['8', '16'], ['4', '20'], ['5', '19'], ['6', '18'], ['7', '17']] },\n 25: { darts: ['9', '16'], numDarts: 2, alternates: [['25'], ['5', '20'], ['6', '19'], ['7', '18'], ['8', '17']] },\n 26: { darts: ['D13'], numDarts: 1, alternates: [['6', '20'], ['7', '19'], ['8', '18'], ['13', '13'], ['2', 'D12']] },\n 27: { darts: ['9', '18'], numDarts: 2, alternates: [['7', '20'], ['8', '19'], ['3', 'D12'], ['10', '17'], ['11', '16']] },\n 28: { darts: ['D14'], numDarts: 1, alternates: [['8', '20'], ['9', '19'], ['14', '14'], ['4', 'D12'], ['10', '18']] },\n 29: { darts: ['9', '20'], numDarts: 2, alternates: [['5', 'D12'], ['11', '18'], ['12', '17'], ['14', '15']] },\n 30: { darts: ['D15'], numDarts: 1, alternates: [['10', '20'], ['15', '15'], ['6', 'D12'], ['11', '19'], ['12', '18']] },\n 31: { darts: ['12', '19'], numDarts: 2, alternates: [['7', 'D12'], ['13', '18'], ['14', '17'], ['3', 'D14'], ['11', '20']] },\n 32: { darts: ['D16'], numDarts: 1, alternates: [['16', '16'], ['8', 'D12'], ['13', '19'], ['15', '17'], ['4', 'D14']] },\n 33: { darts: ['14', '19'], numDarts: 2, alternates: [['1', 'D16'], ['9', 'D12'], ['16', '17'], ['5', 'D14'], ['13', '20']] },\n 34: { darts: ['D17'], numDarts: 1, alternates: [['2', 'D16'], ['10', 'D12'], ['15', '19'], ['16', '18'], ['6', 'D14']] },\n 35: { darts: ['15', '20'], numDarts: 2, alternates: [['3', 'D16'], ['11', 'D12'], ['16', '19'], ['17', '18'], ['7', 'D14']] },\n 36: { darts: ['D18'], numDarts: 1, alternates: [['4', 'D16'], ['17', '19'], ['8', 'D14'], ['12', 'D12'], ['18', '18']] },\n 37: { darts: ['18', '19'], numDarts: 2, alternates: [['5', 'D16'], ['1', 'D18'], ['17', '20'], ['3', 'D17'], ['7', 'D15']] },\n 38: { darts: ['D19'], numDarts: 1, alternates: [['6', 'D16'], ['18', '20'], ['4', 'D17'], ['8', 'D15'], ['2', 'D18']] },\n 39: { darts: ['19', '20'], numDarts: 2, alternates: [['7', 'D16'], ['3', 'D18'], ['9', 'D15'], ['1', 'D19'], ['5', 'D17']] },\n 40: { darts: ['D20'], numDarts: 1, alternates: [['8', 'D16'], ['4', 'D18'], ['20', '20'], ['6', 'D17'], ['10', 'D15']] },\n 41: { darts: ['9', 'D16'], numDarts: 2, alternates: [['1', 'D20'], ['7', 'D17'], ['11', 'D15'], ['3', 'D19'], ['5', 'D18']] },\n 42: { darts: ['T14'], numDarts: 1, alternates: [['10', 'D16'], ['2', 'D20'], ['14', 'D14'], ['6', 'D18'], ['4', 'D19']] },\n 43: { darts: ['3', 'D20'], numDarts: 2, alternates: [['11', 'D16'], ['7', 'D18'], ['13', 'D15'], ['19', 'D12'], ['5', 'D19']] },\n 44: { darts: ['12', 'D16'], numDarts: 2, alternates: [['8', 'D18'], ['4', 'D20'], ['6', 'D19'], ['10', 'D17'], ['14', 'D15']] },\n 45: { darts: ['T15'], numDarts: 1, alternates: [['13', 'D16'], ['5', 'D20'], ['9', 'D18'], ['7', 'D19'], ['15', 'D15']] },\n 46: { darts: ['6', 'D20'], numDarts: 2, alternates: [['14', 'D16'], ['10', 'D18'], ['8', 'D19']] },\n 47: { darts: ['15', 'D16'], numDarts: 2, alternates: [['11', 'D18'], ['7', 'D20'], ['9', 'D19']] },\n 48: { darts: ['T16'], numDarts: 1, alternates: [['16', 'D16'], ['8', 'D20'], ['10', 'D19'], ['12', 'D18'], ['14', 'D17']] },\n 49: { darts: ['13', 'D18'], numDarts: 2, alternates: [['15', 'D17'], ['9', 'D20'], ['11', 'D19'], ['17', 'D16'], ['19', 'D15']] },\n 50: { darts: ['10', 'D20'], numDarts: 2, alternates: [['Bull'], ['14', 'D18'], ['12', 'D19'], ['16', 'D17'], ['D16', '18']] },\n 51: { darts: ['T17'], numDarts: 1, alternates: [['17', 'D17'], ['13', 'D19'], ['11', 'D20'], ['19', 'D16'], ['15', 'D18']] },\n 52: { darts: ['16', 'D18'], numDarts: 2, alternates: [['12', 'D20'], ['20', 'D16'], ['14', 'D19'], ['18', 'D17']] },\n 53: { darts: ['17', 'D18'], numDarts: 2, alternates: [['13', 'D20'], ['15', 'D19']] },\n 54: { darts: ['T18'], numDarts: 1, alternates: [['14', 'D20'], ['18', 'D18'], ['16', 'D19'], ['20', 'D17']] },\n 55: { darts: ['15', 'D20'], numDarts: 2, alternates: [['17', 'D19']] },\n 56: { darts: ['16', 'D20'], numDarts: 2, alternates: [['18', 'D19']] },\n 57: { darts: ['T19'], numDarts: 1, alternates: [['19', 'D19'], ['17', 'D20']] },\n 58: { darts: ['18', 'D20'], numDarts: 2 },\n 59: { darts: ['19', 'D20'], numDarts: 2 },\n 60: { darts: ['T20'], numDarts: 1, alternates: [['20', 'D20']] },\n 61: { darts: ['T16', '13'], numDarts: 2, alternates: [['T7', 'D20'], ['T14', '19']] },\n 62: { darts: ['T14', '20'], numDarts: 2, alternates: [['D11', 'D20'], ['D15', 'D16'], ['T15', '17'], ['T16', '14'], ['D13', 'D18']] },\n 63: { darts: ['T15', '18'], numDarts: 2, alternates: [['T13', 'D12'], ['T16', '15'], ['T17', '12']] },\n 64: { darts: ['T16', '16'], numDarts: 2, alternates: [['D16', 'D16']] },\n 65: { darts: ['T15', '20'], numDarts: 2, alternates: [['T17', '14'], ['T11', 'D16'], ['25', 'D20'], ['T16', '17']] },\n 66: { darts: ['T16', '18'], numDarts: 2, alternates: [['T18', '12'], ['T17', '15']] },\n 67: { darts: ['T16', '19'], numDarts: 2, alternates: [['T17', '16'], ['T18', '13']] },\n 68: { darts: ['T17', '17'], numDarts: 2, alternates: [['T18', '14'], ['D18', 'D16'], ['D14', 'D20'], ['T16', '20']] },\n 69: { darts: ['T19', '12'], numDarts: 2, alternates: [['T18', '15']] },\n 70: { darts: ['T19', '13'], numDarts: 2, alternates: [['T10', 'D20'], ['D16', 'D19'], ['D20', 'D15'], ['T17', '19'], ['T18', '16']] },\n 71: { darts: ['T17', '20'], numDarts: 2, alternates: [['T19', '14'], ['T18', '17']] },\n 72: { darts: ['T18', '18'], numDarts: 2, alternates: [['T12', 'D18']] },\n 73: { darts: ['T19', '16'], numDarts: 2, alternates: [['T18', '19'], ['T20', '13']] },\n 74: { darts: ['T20', '14'], numDarts: 2, alternates: [['T14', 'D16'], ['D17', 'D20'], ['T18', '20'], ['T19', '17']] },\n 75: { darts: ['T19', '18'], numDarts: 2, alternates: [['T20', '15'], ['T15', 'D15']] },\n 76: { darts: ['T19', '19'], numDarts: 2, alternates: [['T20', '16']] },\n 77: { darts: ['T20', '17'], numDarts: 2, alternates: [['T19', '20']] },\n 78: { darts: ['T18', 'D12'], numDarts: 2, alternates: [['T14', 'D18'], ['D19', 'D20'], ['T16', 'D15'], ['18', 'T20']] },\n 79: { darts: ['T20', '19'], numDarts: 2, alternates: [['T13', 'D20']] },\n 80: { darts: ['T20', '20'], numDarts: 2, alternates: [['D20', 'D20']] },\n 81: { darts: ['T19', 'D12'], numDarts: 2, alternates: [['T15', 'D18'], ['T20', 'T7'], ['T19', 'T8'], ['T18', 'T9'], ['T16', 'T11']] },\n 82: { darts: ['T14', 'D20'], numDarts: 2, alternates: [['Bull', 'D16'], ['T18', 'D14'], ['T16', 'D17']] },\n 83: { darts: ['T17', 'D16'], numDarts: 2, alternates: [['T15', 'D19'], ['T19', 'D13']] },\n 84: { darts: ['T16', 'D18'], numDarts: 2, alternates: [['T20', 'D12'], ['T20', 'T8'], ['T19', 'T9'], ['T17', 'T11'], ['T14', 'T14']] },\n 85: { darts: ['T15', 'D20'], numDarts: 2, alternates: [['T19', 'D14'], ['T17', 'D17']] },\n 86: { darts: ['T18', 'D16'], numDarts: 2, alternates: [['T16', 'D19'], ['T20', 'D13']] },\n 87: { darts: ['T20', 'T9'], numDarts: 2, alternates: [['T15', 'T14'], ['T17', 'D18'], ['T19', 'D15'], ['T19', 'T10'], ['T18', 'T11']] },\n 88: { darts: ['T16', 'D20'], numDarts: 2, alternates: [['T20', 'D14'], ['T18', 'D17'], ['Bull', 'D19']] },\n 89: { darts: ['T19', 'D16'], numDarts: 2, alternates: [['T17', 'D19']] },\n 90: { darts: ['T18', 'D18'], numDarts: 2, alternates: [['T20', 'D15'], ['Bull', 'D20'], ['T20', 'T10'], ['T19', 'T11'], ['T16', 'T14']] },\n 91: { darts: ['T17', 'D20'], numDarts: 2, alternates: [['T19', 'D17']] },\n 92: { darts: ['T20', 'D16'], numDarts: 2, alternates: [['T18', 'D19']] },\n 93: { darts: ['T19', 'D18'], numDarts: 2, alternates: [['T20', 'T11'], ['T17', 'T14'], ['T19', 'T12'], ['T18', 'T13'], ['T16', 'T15']] },\n 94: { darts: ['T18', 'D20'], numDarts: 2, alternates: [['T20', 'D17']] },\n 95: { darts: ['T19', 'D19'], numDarts: 2 },\n 96: { darts: ['T20', 'D18'], numDarts: 2, alternates: [['T20', 'T12'], ['T19', 'T13'], ['T18', 'T14'], ['T17', 'T15'], ['T16', 'T16']] },\n 97: { darts: ['T19', 'D20'], numDarts: 2 },\n 98: { darts: ['T20', 'D19'], numDarts: 2 },\n 99: { darts: ['T20', 'T13'], numDarts: 2, alternates: [['T19', 'T14'], ['T18', 'T15'], ['T17', 'T16']] },\n 100: { darts: ['T20', 'D20'], numDarts: 2 },\n 101: { darts: ['T17', 'Bull'], numDarts: 2 },\n 102: { darts: ['T20', 'T14'], numDarts: 2, alternates: [['T19', 'T15'], ['T18', 'T16'], ['T17', 'T17']] },\n 103: { darts: ['T19', '6', 'D20'], numDarts: 3, alternates: [['T15', '18', 'D20'], ['T20', '3', 'D20'], ['T19', '14', 'D16'], ['T20', '11', 'D16'], ['T20', '7', 'D18']] },\n 104: { darts: ['T18', 'Bull'], numDarts: 2 },\n 105: { darts: ['T20', 'T15'], numDarts: 2, alternates: [['T19', 'T16'], ['T18', 'T17']] },\n 106: { darts: ['T16', '18', 'D20'], numDarts: 3, alternates: [['T20', '6', 'D20'], ['T20', '14', 'D16'], ['T17', '15', 'D20'], ['T18', '16', 'D18'], ['T20', '10', 'D18']] },\n 107: { darts: ['T19', 'Bull'], numDarts: 2 },\n 108: { darts: ['T20', 'T16'], numDarts: 2, alternates: [['T19', 'T17'], ['T18', 'T18']] },\n 109: { darts: ['T17', '18', 'D20'], numDarts: 3, alternates: [['T18', '15', 'D20'], ['T19', '16', 'D18'], ['T20', '13', 'D18'], ['T19', '12', 'D20'], ['T20', '15', 'D17']] },\n 110: { darts: ['T20', 'Bull'], numDarts: 2 },\n 111: { darts: ['T20', 'T17'], numDarts: 2, alternates: [['T19', 'T18']] },\n 112: { darts: ['T18', '18', 'D20'], numDarts: 3, alternates: [['T19', '15', 'D20'], ['T20', '16', 'D18'], ['T20', '12', 'D20'], ['T20', '20', 'D16']] },\n 113: { darts: ['T20', '17', 'D18'], numDarts: 3, alternates: [['T19', '16', 'D20'], ['T18', '19', 'D20'], ['T20', '13', 'D20'], ['T20', '15', 'D19'], ['T19', '18', 'D19']] },\n 114: { darts: ['T20', 'T18'], numDarts: 2, alternates: [['T19', 'T19']] },\n 115: { darts: ['T19', '18', 'D20'], numDarts: 3, alternates: [['T20', '15', 'D20']] },\n 116: { darts: ['T20', '16', 'D20'], numDarts: 3, alternates: [['T19', '19', 'D20'], ['T20', '18', 'D19']] },\n 117: { darts: ['T20', 'T19'], numDarts: 2 },\n 118: { darts: ['T20', '18', 'D20'], numDarts: 3 },\n 119: { darts: ['T20', '19', 'D20'], numDarts: 3 },\n 120: { darts: ['T20', 'T20'], numDarts: 2 },\n 121: { darts: ['T19', 'T16', '16'], numDarts: 3, alternates: [['T20', 'T16', '13'], ['T19', 'D16', 'D16'], ['T19', 'T15', '19'], ['T19', 'T17', '13'], ['T18', 'T16', '19']] },\n 122: { darts: ['T20', 'T14', '20'], numDarts: 3, alternates: [['T20', 'T15', '17'], ['T20', 'T16', '14'], ['T17', 'T17', '20'], ['T18', 'T18', '14'], ['T18', 'D18', 'D16']] },\n 123: { darts: ['T19', 'T18', '12'], numDarts: 3, alternates: [['T19', 'T16', '18'], ['T20', 'T15', '18'], ['T18', 'T17', '18'], ['T18', 'T18', '15'], ['T20', 'T13', 'D12']] },\n 124: { darts: ['T20', 'T16', '16'], numDarts: 3, alternates: [['T20', 'D16', 'D16'], ['T19', 'T16', '19'], ['T19', 'T17', '16'], ['T19', 'T18', '13'], ['T18', 'D19', 'D16']] },\n 125: { darts: ['T20', 'T15', '20'], numDarts: 3, alternates: [['T20', 'T16', '17'], ['T20', 'T17', '14'], ['T19', 'D18', 'D16'], ['T17', 'T14', 'D16'], ['T20', 'T11', 'D16']] },\n 126: { darts: ['T19', 'T19', '12'], numDarts: 3, alternates: [['T20', 'T16', '18'], ['T18', 'T18', '18'], ['T19', 'T18', '15'], ['T20', 'T18', '12']] },\n 127: { darts: ['T19', 'T17', '19'], numDarts: 3, alternates: [['T19', 'T18', '16'], ['T19', 'T19', '13'], ['T19', 'T10', 'D20'], ['T19', 'D16', 'D19'], ['T19', 'D20', 'D15']] },\n 128: { darts: ['T20', 'T16', '20'], numDarts: 3, alternates: [['T20', 'T17', '17'], ['T20', 'T18', '14'], ['T20', 'D18', 'D16'], ['T18', 'T14', 'D16'], ['T20', 'D14', 'D20']] },\n 129: { darts: ['T20', 'T19', '12'], numDarts: 3, alternates: [['T19', 'T18', '18'], ['T20', 'T18', '15']] },\n 130: { darts: ['T19', 'T18', '19'], numDarts: 3, alternates: [['T19', 'T19', '16'], ['T20', 'T10', 'D20'], ['T20', 'D16', 'D19'], ['T20', 'D20', 'D15'], ['T20', 'T17', '19']] },\n 131: { darts: ['T20', 'T17', '20'], numDarts: 3, alternates: [['T20', 'T18', '17'], ['T20', 'T19', '14'], ['T19', 'T14', 'D16'], ['T17', 'D20', 'D20'], ['T19', 'D17', 'D20']] },\n 132: { darts: ['T20', 'T18', '18'], numDarts: 3, alternates: [['T20', 'T12', 'D18'], ['T19', 'T19', '18'], ['T20', 'T19', '15'], ['T20', 'T20', '12']] },\n 133: { darts: ['T19', 'T19', '19'], numDarts: 3, alternates: [['T20', 'T18', '19'], ['T20', 'T19', '16'], ['T20', 'T20', '13']] },\n 134: { darts: ['T20', 'T18', '20'], numDarts: 3, alternates: [['T20', 'T19', '17'], ['T20', 'T20', '14'], ['T20', 'T14', 'D16'], ['T18', 'D20', 'D20'], ['T20', 'D17', 'D20']] },\n 135: { darts: ['T20', 'T19', '18'], numDarts: 3, alternates: [['T20', 'T20', '15'], ['T20', 'T15', 'D15'], ['T19', 'T14', 'D18'], ['T19', 'D19', 'D20'], ['T19', 'T18', 'D12']] },\n 136: { darts: ['T20', 'T19', '19'], numDarts: 3, alternates: [['T20', 'T20', '16']] },\n 137: { darts: ['T20', 'T19', '20'], numDarts: 3, alternates: [['T20', 'T20', '17'], ['T19', 'D20', 'D20']] },\n 138: { darts: ['T20', 'T18', 'D12'], numDarts: 3, alternates: [['T20', 'T14', 'D18'], ['T20', 'D19', 'D20'], ['T19', 'T19', 'D12'], ['T20', 'T16', 'D15'], ['T18', 'T16', 'D18']] },\n 139: { darts: ['T20', 'T20', '19'], numDarts: 3, alternates: [['T19', 'Bull', 'D16'], ['T20', 'T13', 'D20'], ['T19', 'T14', 'D20'], ['T18', 'T15', 'D20'], ['T17', 'T16', 'D20']] },\n 140: { darts: ['T20', 'T20', '20'], numDarts: 3, alternates: [['T20', 'D20', 'D20']] },\n 141: { darts: ['T20', 'T19', 'D12'], numDarts: 3, alternates: [['T18', 'T20', 'T9'], ['T18', 'T15', 'T14'], ['T19', 'T20', 'T8'], ['T19', 'T19', 'T9'], ['T19', 'T14', 'T14']] },\n 142: { darts: ['T20', 'Bull', 'D16'], numDarts: 3, alternates: [['T20', 'T14', 'D20'], ['T19', 'T15', 'D20'], ['T18', 'T16', 'D20'], ['T17', 'T17', 'D20'], ['T20', 'T18', 'D14']] },\n 143: { darts: ['T20', 'T17', 'D16'], numDarts: 3, alternates: [['T19', 'T18', 'D16'], ['T20', 'T15', 'D19'], ['T19', 'T16', 'D19'], ['T18', 'T17', 'D19'], ['T20', 'T19', 'D13']] },\n 144: { darts: ['T20', 'T16', 'D18'], numDarts: 3, alternates: [['T20', 'T20', 'D12'], ['T19', 'T17', 'D18'], ['T18', 'T18', 'D18'], ['T20', 'T18', 'D15'], ['T19', 'T19', 'D15']] },\n 145: { darts: ['T20', 'T15', 'D20'], numDarts: 3, alternates: [['T19', 'T16', 'D20'], ['T18', 'T17', 'D20'], ['T20', 'T19', 'D14'], ['T20', 'T17', 'D17'], ['T19', 'T18', 'D17']] },\n 146: { darts: ['T20', 'T18', 'D16'], numDarts: 3, alternates: [['T19', 'T19', 'D16'], ['T20', 'T16', 'D19'], ['T19', 'T17', 'D19'], ['T18', 'T18', 'D19'], ['T20', 'T20', 'D13']] },\n 147: { darts: ['T20', 'T17', 'D18'], numDarts: 3, alternates: [['T20', 'T20', 'T9'], ['T19', 'T18', 'D18'], ['T20', 'T19', 'D15'], ['T19', 'Bull', 'D20'], ['T19', 'T20', 'T10']] },\n 148: { darts: ['T20', 'T16', 'D20'], numDarts: 3, alternates: [['T19', 'T17', 'D20'], ['T18', 'T18', 'D20'], ['T20', 'T20', 'D14'], ['T20', 'T18', 'D17'], ['T19', 'T19', 'D17']] },\n 149: { darts: ['T20', 'T19', 'D16'], numDarts: 3, alternates: [['T20', 'T17', 'D19'], ['T19', 'T18', 'D19']] },\n 150: { darts: ['T20', 'T18', 'D18'], numDarts: 3, alternates: [['T19', 'T19', 'D18'], ['T20', 'T20', 'D15'], ['T20', 'Bull', 'D20'], ['T20', 'T20', 'T10'], ['T19', 'T20', 'T11']] },\n 151: { darts: ['T20', 'T17', 'D20'], numDarts: 3, alternates: [['T19', 'T18', 'D20'], ['T20', 'T19', 'D17']] },\n 152: { darts: ['T20', 'T20', 'D16'], numDarts: 3, alternates: [['T20', 'T18', 'D19'], ['T19', 'T19', 'D19']] },\n 153: { darts: ['T20', 'T19', 'D18'], numDarts: 3, alternates: [['T20', 'T20', 'T11'], ['T19', 'T20', 'T12'], ['T18', 'T20', 'T13'], ['T19', 'T19', 'T13'], ['T17', 'T20', 'T14']] },\n 154: { darts: ['T20', 'T18', 'D20'], numDarts: 3, alternates: [['T19', 'T19', 'D20'], ['T20', 'T20', 'D17']] },\n 155: { darts: ['T20', 'T19', 'D19'], numDarts: 3 },\n 156: { darts: ['T20', 'T20', 'D18'], numDarts: 3, alternates: [['T20', 'T20', 'T12'], ['T19', 'T20', 'T13'], ['T18', 'T20', 'T14'], ['T19', 'T19', 'T14'], ['T17', 'T20', 'T15']] },\n 157: { darts: ['T20', 'T19', 'D20'], numDarts: 3 },\n 158: { darts: ['T20', 'T20', 'D19'], numDarts: 3 },\n 159: { darts: ['T20', 'T20', 'T13'], numDarts: 3, alternates: [['T19', 'T20', 'T14'], ['T18', 'T20', 'T15'], ['T19', 'T19', 'T15'], ['T17', 'T20', 'T16'], ['T18', 'T19', 'T16']] },\n 160: { darts: ['T20', 'T20', 'D20'], numDarts: 3 },\n 161: { darts: ['T20', 'T17', 'Bull'], numDarts: 3, alternates: [['T19', 'T18', 'Bull']] },\n 162: { darts: ['T20', 'T20', 'T14'], numDarts: 3, alternates: [['T19', 'T20', 'T15'], ['T18', 'T20', 'T16'], ['T19', 'T19', 'T16'], ['T17', 'T20', 'T17'], ['T18', 'T19', 'T17']] },\n 164: { darts: ['T20', 'T18', 'Bull'], numDarts: 3, alternates: [['T19', 'T19', 'Bull']] },\n 165: { darts: ['T20', 'T20', 'T15'], numDarts: 3, alternates: [['T19', 'T20', 'T16'], ['T18', 'T20', 'T17'], ['T19', 'T19', 'T17'], ['T18', 'T19', 'T18']] },\n 167: { darts: ['T20', 'T19', 'Bull'], numDarts: 3 },\n 168: { darts: ['T20', 'T20', 'T16'], numDarts: 3, alternates: [['T19', 'T20', 'T17'], ['T18', 'T20', 'T18'], ['T19', 'T19', 'T18']] },\n 170: { darts: ['T20', 'T20', 'Bull'], numDarts: 3 },\n 171: { darts: ['T20', 'T20', 'T17'], numDarts: 3, alternates: [['T19', 'T20', 'T18'], ['T19', 'T19', 'T19']] },\n 174: { darts: ['T20', 'T20', 'T18'], numDarts: 3, alternates: [['T19', 'T20', 'T19']] },\n 177: { darts: ['T20', 'T20', 'T19'], numDarts: 3 },\n 180: { darts: ['T20', 'T20', 'T20'], numDarts: 3 },\n};\n","import { DOUBLE_OUT_CHECKOUTS, DOUBLE_OUT_BOGEY_NUMBERS } from './data/double-out-checkouts.js';\nimport { SINGLE_OUT_CHECKOUTS, SINGLE_OUT_BOGEY_NUMBERS } from './data/single-out-checkouts.js';\nimport type { OutMode, CheckoutEntry, CheckoutChart } from './types.js';\n\nfunction getChartForMode(outMode: OutMode): CheckoutChart {\n return outMode === 'double' ? DOUBLE_OUT_CHECKOUTS : SINGLE_OUT_CHECKOUTS;\n}\n\nfunction getBogeyNumbersForMode(outMode: OutMode): number[] {\n return outMode === 'double' ? DOUBLE_OUT_BOGEY_NUMBERS : SINGLE_OUT_BOGEY_NUMBERS;\n}\n\nexport function getCheckout(score: number, outMode: OutMode = 'double'): CheckoutEntry | null {\n const chart = getChartForMode(outMode);\n return chart[score] ?? null;\n}\n\nexport function getCheckoutChart(\n outMode: OutMode = 'double',\n range?: { min?: number; max?: number },\n): CheckoutChart {\n const chart = getChartForMode(outMode);\n\n if (!range) return { ...chart };\n\n const min = range.min ?? 0;\n const max = range.max ?? Infinity;\n const filtered: CheckoutChart = {};\n\n for (const [scoreStr, entry] of Object.entries(chart)) {\n const score = Number(scoreStr);\n if (score >= min && score <= max) {\n filtered[score] = entry;\n }\n }\n\n return filtered;\n}\n\nexport function getBogeyNumbers(outMode: OutMode = 'double'): number[] {\n return [...getBogeyNumbersForMode(outMode)];\n}\n\nexport function isCheckable(score: number, outMode: OutMode = 'double'): boolean {\n const chart = getChartForMode(outMode);\n return score in chart;\n}\n","import type { OutMode, EnumeratedCheckoutMap, EnumeratedResult } from './types.js';\n\ninterface Target {\n label: string;\n value: number;\n}\n\nfunction buildTargets(): Target[] {\n const targets: Target[] = [];\n for (let i = 1; i <= 20; i++) {\n targets.push({ label: `${i}`, value: i });\n targets.push({ label: `D${i}`, value: i * 2 });\n targets.push({ label: `T${i}`, value: i * 3 });\n }\n targets.push({ label: '25', value: 25 });\n targets.push({ label: 'Bull', value: 50 });\n return targets;\n}\n\nfunction buildFinishingDoubles(): Target[] {\n const doubles: Target[] = [];\n for (let i = 1; i <= 20; i++) {\n doubles.push({ label: `D${i}`, value: i * 2 });\n }\n doubles.push({ label: 'Bull', value: 50 });\n return doubles;\n}\n\nexport function generateAllCheckouts(options: {\n outMode: OutMode;\n min?: number;\n max?: number;\n}): EnumeratedResult {\n const { outMode } = options;\n const isDouble = outMode === 'double';\n const min = options.min ?? (isDouble ? 2 : 1);\n const max = options.max ?? 170;\n\n const allTargets = buildTargets();\n const finishingTargets = isDouble ? buildFinishingDoubles() : allTargets;\n const checkouts: EnumeratedCheckoutMap = {};\n const bogeyNumbers: number[] = [];\n let totalOptions = 0;\n\n for (let score = min; score <= max; score++) {\n const opts: string[][] = [];\n\n // 1-dart finishes\n for (const d of finishingTargets) {\n if (d.value === score) {\n opts.push([d.label]);\n }\n }\n\n // 2-dart finishes\n for (const d1 of allTargets) {\n if (d1.value >= score) continue;\n const remainder = score - d1.value;\n for (const d2 of finishingTargets) {\n if (d2.value === remainder) {\n opts.push([d1.label, d2.label]);\n }\n }\n }\n\n // 3-dart finishes\n if (score > (isDouble ? 2 : 1)) {\n for (const d1 of allTargets) {\n if (d1.value >= score) continue;\n for (const d2 of allTargets) {\n if (d1.value + d2.value >= score) continue;\n const remainder = score - d1.value - d2.value;\n for (const d3 of finishingTargets) {\n if (d3.value === remainder) {\n opts.push([d1.label, d2.label, d3.label]);\n }\n }\n }\n }\n }\n\n if (opts.length > 0) {\n checkouts[score] = { options: opts, count: opts.length };\n totalOptions += opts.length;\n } else {\n bogeyNumbers.push(score);\n }\n }\n\n return { checkouts, bogeyNumbers, totalOptions };\n}\n","{\n \"meta\": {\n \"description\": \"Standard steel-tip dartboard dimensions and segment areas\",\n \"units\": \"millimeters (mm) and square millimeters (sq mm)\",\n \"sources\": [\n \"dartbase.com/wwwboard/messages/1280.html\",\n \"dartsnutz.net/forum/thread-40058.html\",\n \"pages.cs.wisc.edu/~bolo/darts/dartboard.html\",\n \"dimensions.com/element/dartboard\",\n \"darting.com/Darts-Rules/General/\"\n ],\n \"notes\": \"Measurements reflect the official WDF/BDO standard board. Modern competition boards (Winmau Blade, Unicorn Eclipse) may have slightly wider beds due to thinner blade wire dividers.\"\n },\n \"board\": {\n \"overallDiameter\": 451,\n \"playableDiameter\": 340,\n \"typicalDepth\": 38.1,\n \"wireWidth\": 1.5,\n \"numberHeight\": 25.4\n },\n \"radialMeasurements\": {\n \"description\": \"Distance from board center to each ring boundary\",\n \"innerBullRadius\": 6.35,\n \"outerBullRadius\": 15.9,\n \"trebleRingInnerEdge\": 99,\n \"trebleRingOuterEdge\": 107,\n \"doubleRingInnerEdge\": 162,\n \"doubleRingOuterEdge\": 170\n },\n \"ringWidths\": {\n \"trebleRing\": 8,\n \"doubleRing\": 8,\n \"outerBull\": 9.55,\n \"smallSingleBed\": 83.1,\n \"largeSingleBed\": 55\n },\n \"segmentAreas\": {\n \"description\": \"Area of a single 1/20th segment of each ring, in sq mm\",\n \"doubleBull\": 126.45,\n \"singleBull\": 665.16,\n \"trebleBed\": 309.03,\n \"doubleBed\": 498.71,\n \"smallSingle\": 1481.93,\n \"largeSingle\": 2288.38\n },\n \"totalRingAreas\": {\n \"description\": \"Total area of each full ring (all 20 segments combined), in sq mm\",\n \"doubleBull\": 126.45,\n \"singleBull\": 665.16,\n \"trebleRing\": 5174.18,\n \"doubleRing\": 8341.92,\n \"smallSingleRing\": 29638.6,\n \"largeSingleRing\": 45767.6\n },\n \"segmentAreaRatios\": {\n \"description\": \"Size of each segment relative to other segments\",\n \"doubleBedVsTrebleBed\": 1.61,\n \"largeSingleVsTrebleBed\": 7.41,\n \"largeSingleVsDoubleBed\": 4.59,\n \"smallSingleVsTrebleBed\": 4.8,\n \"smallSingleVsDoubleBed\": 2.97,\n \"singleBullVsDoubleBull\": 5.26,\n \"doubleBedVsDoubleBull\": 3.94,\n \"trebleBedVsDoubleBull\": 2.44\n },\n \"boardVariation\": {\n \"description\": \"Measured treble/double widths across popular competition boards (mm). Variation comes from differing wire/blade thickness.\",\n \"boards\": {\n \"bullsAdvantage501\": { \"treble\": 9.9, \"double\": 9.65, \"bull\": 12.9 },\n \"unicornEclipseHD2\": { \"treble\": 9.68, \"double\": 9.53, \"bull\": 11.64 },\n \"winmauBlade5\": { \"treble\": 9.42, \"double\": 9.16, \"bull\": 12.33 },\n \"missionSamurai\": { \"treble\": 9.7 },\n \"one80Gladiator3\": { \"treble\": 9.22, \"double\": 9.26 },\n \"shotBanditPlus\": { \"treble\": 9.09, \"double\": 9.2 }\n }\n }\n}\n","import { parseTarget, evaluateThrow } from './dartboard.js';\nimport dimensions from './data/dartboard-dimensions.json' with { type: 'json' };\nimport type { OutMode, CheckoutChart, CheckoutResult } from './types.js';\nimport { OutsChartError } from './types.js';\n\ninterface Target {\n label: string;\n value: number;\n}\n\nfunction buildTargets(): Target[] {\n const targets: Target[] = [];\n for (let i = 1; i <= 20; i++) {\n targets.push({ label: `${i}`, value: i });\n targets.push({ label: `D${i}`, value: i * 2 });\n targets.push({ label: `T${i}`, value: i * 3 });\n }\n targets.push({ label: '25', value: 25 });\n targets.push({ label: 'Bull', value: 50 });\n return targets;\n}\n\nfunction buildFinishingDoubles(): Target[] {\n const doubles: Target[] = [];\n for (let i = 1; i <= 20; i++) {\n doubles.push({ label: `D${i}`, value: i * 2 });\n }\n doubles.push({ label: 'Bull', value: 50 });\n return doubles;\n}\n\nconst allTargets = buildTargets();\nconst finishingDoubles = buildFinishingDoubles();\n\nconst AREA = {\n treble: dimensions.segmentAreas.trebleBed,\n double: dimensions.segmentAreas.doubleBed,\n largeSingle: dimensions.segmentAreas.largeSingle,\n smallSingle: dimensions.segmentAreas.smallSingle,\n bull: dimensions.segmentAreas.doubleBull,\n outerBull: dimensions.segmentAreas.singleBull,\n};\n\n// All 1-dart checkable scores for single-out\nconst oneDartScores = new Set(allTargets.map((t) => t.value));\n\nfunction missWeight(target: string, missType: string): number {\n const parsed = parseTarget(target);\n if (!parsed) return 0.5;\n\n if (missType === 'radialIn') {\n if (!parsed.bed || parsed.bed === null) return AREA.treble / AREA.largeSingle;\n if (parsed.bed === 'double') return 1.0;\n if (parsed.bed === 'treble') return 1.0;\n return 0.5;\n }\n\n if (missType === 'radialOut') {\n if (!parsed.bed || parsed.bed === null) return AREA.double / AREA.largeSingle;\n if (parsed.bed === 'double') return 0.5;\n if (parsed.bed === 'treble') return 1.0;\n return 0.5;\n }\n\n return 0.7;\n}\n\nfunction evaluatePath(\n score: number,\n darts: string[],\n outMode: OutMode,\n checkableScores?: Set<number>,\n): number {\n let penalty = 0;\n let remaining = score;\n const isDoubleOut = outMode === 'double';\n\n for (let i = 0; i < darts.length; i++) {\n const dart = darts[i];\n const parsed = parseTarget(dart);\n if (!parsed) return Infinity;\n\n const evaluation = evaluateThrow(dart, remaining);\n if (!evaluation) return Infinity;\n\n for (const miss of evaluation.misses) {\n const weight = missWeight(dart, miss.missType);\n if (miss.busts) {\n penalty += 6 * weight;\n } else if (isDoubleOut) {\n // In double-out, bust also if remaining = 1 (can't finish on a double)\n const missRemaining = remaining - miss.value;\n if (missRemaining === 1) {\n penalty += 6 * weight;\n } else if (missRemaining === 0) {\n // Only counts as accidental checkout if last dart would be a valid finisher\n // In double-out, miss to a single doesn't count as checkout\n } else if (checkableScores && checkableScores.has(missRemaining)) {\n penalty -= 0.5 * weight;\n }\n } else {\n const missRemaining = remaining - miss.value;\n if (missRemaining === 0) {\n penalty -= 1 * weight;\n } else if (missRemaining > 0 && oneDartScores.has(missRemaining)) {\n penalty -= 0.5 * weight;\n }\n }\n }\n\n // Prefer larger targets\n let targetArea: number;\n if (parsed.bed === 'treble') targetArea = AREA.treble;\n else if (parsed.bed === 'double') targetArea = AREA.double;\n else if (dart === 'Bull') targetArea = AREA.bull;\n else if (dart === '25') targetArea = AREA.outerBull;\n else targetArea = AREA.largeSingle;\n penalty += (1 - targetArea / AREA.largeSingle) * 5.5;\n\n // Hard penalty: never use treble/double when a fat single scores the same\n if ((parsed.bed === 'treble' || parsed.bed === 'double') && parsed.value <= 20) {\n penalty += 5;\n }\n\n // Penalize harder darts following easier ones (throw hard darts first)\n if (i > 0) {\n const difficulty = (d: string) => {\n if (/^T\\d+$/.test(d)) return 3;\n if (d === 'Bull') return 2;\n if (/^D\\d+$/.test(d)) return 1.5;\n if (d === '25') return 1;\n return 0;\n };\n const prev = difficulty(darts[i - 1]);\n const curr = difficulty(dart);\n if (curr > prev && (parsed.bed === 'treble' || dart === 'Bull')) {\n penalty += 4.0;\n }\n }\n\n remaining -= parsed.value;\n }\n\n // Prefer finishing doubles with good halving chains\n const lastDart = darts[darts.length - 1];\n const lastMatch = lastDart.match(/^D(\\d+)$/);\n if (lastMatch) {\n let val = parseInt(lastMatch[1]);\n let chainLen = 0;\n while (val % 2 === 0) { val /= 2; chainLen++; }\n chainLen++;\n penalty -= chainLen * 0.2;\n }\n\n return penalty;\n}\n\nfunction sortTrebles(darts: string[]): string[] {\n const sorted = [...darts];\n for (let i = 0; i < sorted.length - 1; i++) {\n const m1 = sorted[i].match(/^T(\\d+)$/);\n const m2 = sorted[i + 1].match(/^T(\\d+)$/);\n if (m1 && m2 && parseInt(m1[1]) < parseInt(m2[1])) {\n [sorted[i], sorted[i + 1]] = [sorted[i + 1], sorted[i]];\n }\n }\n return sorted;\n}\n\nfunction pathKey(darts: string[]): string {\n return [...darts].sort().join(',');\n}\n\n// Single-out overrides\nconst SINGLE_OUT_OVERRIDES: Record<number, { darts: string[] }> = {\n 1: { darts: ['1'] }, 2: { darts: ['2'] }, 3: { darts: ['3'] }, 4: { darts: ['4'] },\n 5: { darts: ['5'] }, 6: { darts: ['6'] }, 7: { darts: ['7'] }, 8: { darts: ['8'] },\n 9: { darts: ['9'] }, 10: { darts: ['10'] }, 11: { darts: ['11'] }, 12: { darts: ['12'] },\n 13: { darts: ['13'] }, 14: { darts: ['14'] }, 15: { darts: ['15'] }, 16: { darts: ['16'] },\n 17: { darts: ['17'] }, 18: { darts: ['18'] }, 19: { darts: ['19'] }, 20: { darts: ['20'] },\n 21: { darts: ['7', '14'] }, 23: { darts: ['3', '20'] },\n 25: { darts: ['9', '16'] }, 27: { darts: ['9', '18'] },\n 29: { darts: ['9', '20'] }, 31: { darts: ['12', '19'] },\n 33: { darts: ['14', '19'] }, 35: { darts: ['15', '20'] },\n 37: { darts: ['18', '19'] }, 39: { darts: ['19', '20'] },\n 50: { darts: ['10', 'D20'] },\n 80: { darts: ['T20', '20'] },\n 82: { darts: ['T14', 'D20'] },\n 92: { darts: ['T20', 'D16'] },\n 100: { darts: ['T20', 'D20'] },\n 103: { darts: ['T19', '6', 'D20'] },\n 147: { darts: ['T20', 'T17', 'D18'] },\n};\n\nfunction findBestCheckout(\n score: number,\n outMode: OutMode,\n altThreshold: number,\n includeAlternates: boolean,\n overrides: Record<number, { darts: string[] }>,\n): { darts: string[]; numDarts: number; penalty: number; alternates: string[][] } | null {\n const isDoubleOut = outMode === 'double';\n const finishing = isDoubleOut ? finishingDoubles : allTargets;\n\n let best: string[] | null = null;\n let bestPenalty = Infinity;\n let bestNumDarts = Infinity;\n\n // 1-dart finishes\n for (const t of finishing) {\n if (t.value !== score) continue;\n const parsed = parseTarget(t.label);\n // In single-out, trebles for scores <=40 compete as priority 2\n const priority = (!isDoubleOut && parsed?.bed === 'treble' && score <= 40) ? 2 : 1;\n const penalty = evaluatePath(score, [t.label], outMode);\n if (priority < bestNumDarts || (priority === bestNumDarts && penalty < bestPenalty)) {\n best = [t.label];\n bestPenalty = penalty;\n bestNumDarts = priority;\n }\n }\n\n // 2-dart finishes\n for (const d1 of allTargets) {\n if (d1.value >= score) continue;\n const remainder = score - d1.value;\n for (const d2 of finishing) {\n if (d2.value !== remainder) continue;\n const path = [d1.label, d2.label];\n const penalty = evaluatePath(score, path, outMode);\n if (2 < bestNumDarts || (2 === bestNumDarts && penalty < bestPenalty)) {\n best = path;\n bestPenalty = penalty;\n bestNumDarts = 2;\n }\n }\n }\n\n // 3-dart finishes\n if (bestNumDarts > 2 || score > 110) {\n for (const d1 of allTargets) {\n if (d1.value >= score) continue;\n for (const d2 of allTargets) {\n if (d1.value + d2.value >= score) continue;\n const remainder = score - d1.value - d2.value;\n for (const d3 of finishing) {\n if (d3.value !== remainder) continue;\n const path = [d1.label, d2.label, d3.label];\n const penalty = evaluatePath(score, path, outMode);\n if (3 < bestNumDarts || (3 === bestNumDarts && penalty < bestPenalty)) {\n best = path;\n bestPenalty = penalty;\n bestNumDarts = 3;\n }\n }\n }\n }\n }\n\n if (!best) return null;\n\n best = sortTrebles(best);\n\n if (!includeAlternates) {\n return { darts: best, numDarts: best.length, penalty: bestPenalty, alternates: [] };\n }\n\n // Collect alternates within threshold\n const alternates: { darts: string[]; penalty: number }[] = [];\n const seen = new Set<string>();\n seen.add(pathKey(best));\n\n const collectAlt = (path: string[], penalty: number) => {\n if (penalty > bestPenalty + altThreshold) return;\n const key = pathKey(path);\n if (seen.has(key)) return;\n seen.add(key);\n alternates.push({ darts: sortTrebles(path), penalty });\n };\n\n if (bestNumDarts === 1) {\n for (const t of finishing) {\n if (t.value !== score) continue;\n collectAlt([t.label], evaluatePath(score, [t.label], outMode));\n }\n }\n\n if (bestNumDarts <= 2) {\n for (const d1 of allTargets) {\n if (d1.value >= score) continue;\n const remainder = score - d1.value;\n for (const d2 of finishing) {\n if (d2.value !== remainder) continue;\n collectAlt([d1.label, d2.label], evaluatePath(score, [d1.label, d2.label], outMode));\n }\n }\n }\n\n if (bestNumDarts === 3) {\n for (const d1 of allTargets) {\n if (d1.value >= score) continue;\n for (const d2 of allTargets) {\n if (d1.value + d2.value >= score) continue;\n const remainder = score - d1.value - d2.value;\n for (const d3 of finishing) {\n if (d3.value !== remainder) continue;\n collectAlt(\n [d1.label, d2.label, d3.label],\n evaluatePath(score, [d1.label, d2.label, d3.label], outMode),\n );\n }\n }\n }\n }\n\n alternates.sort((a, b) => a.penalty - b.penalty);\n\n return {\n darts: best,\n numDarts: best.length,\n penalty: bestPenalty,\n alternates: alternates.slice(0, 5).map((a) => a.darts),\n };\n}\n\nfunction validateOverrides(\n overrides: Record<number, { darts: string[] }>,\n outMode: OutMode,\n): void {\n const isDoubleOut = outMode === 'double';\n\n for (const [scoreStr, entry] of Object.entries(overrides)) {\n const score = Number(scoreStr);\n\n if (!Array.isArray(entry.darts) || entry.darts.length === 0 || entry.darts.length > 3) {\n throw new OutsChartError(\n 'INVALID_OVERRIDE',\n `Override for score ${score}: must have 1-3 darts`,\n );\n }\n\n let sum = 0;\n for (const dart of entry.darts) {\n const parsed = parseTarget(dart);\n if (!parsed) {\n throw new OutsChartError(\n 'INVALID_OVERRIDE',\n `Override for score ${score}: invalid dart notation '${dart}'`,\n );\n }\n sum += parsed.value;\n }\n\n if (sum !== score) {\n throw new OutsChartError(\n 'INVALID_OVERRIDE',\n `Override for score ${score}: darts sum to ${sum}, expected ${score}`,\n );\n }\n\n const lastDart = entry.darts[entry.darts.length - 1];\n const lastParsed = parseTarget(lastDart)!;\n if (isDoubleOut && lastParsed.bed !== 'double' && lastParsed.bed !== 'Bull') {\n throw new OutsChartError(\n 'INVALID_OVERRIDE',\n `Override for score ${score}: last dart '${lastDart}' is not a valid double-out finish`,\n );\n }\n }\n}\n\nexport function generateRecommended(options: {\n outMode: OutMode;\n min?: number;\n max?: number;\n includeAlternates?: boolean;\n altThreshold?: number;\n overrides?: Record<number, { darts: string[] }>;\n}): CheckoutResult {\n const { outMode } = options;\n const isDoubleOut = outMode === 'double';\n const min = options.min ?? (isDoubleOut ? 2 : 1);\n const max = options.max ?? (isDoubleOut ? 170 : 180);\n const includeAlternates = options.includeAlternates ?? (outMode === 'single');\n const altThreshold = options.altThreshold ?? 1.0;\n\n // Build overrides: start with defaults for single-out, merge user overrides\n const overrides: Record<number, { darts: string[] }> = {};\n if (!isDoubleOut) {\n Object.assign(overrides, SINGLE_OUT_OVERRIDES);\n }\n if (options.overrides) {\n validateOverrides(options.overrides, outMode);\n Object.assign(overrides, options.overrides);\n }\n\n const checkouts: CheckoutChart = {};\n const bogeyNumbers: number[] = [];\n\n for (let score = min; score <= max; score++) {\n const result = findBestCheckout(score, outMode, altThreshold, includeAlternates, overrides);\n\n if (overrides[score]) {\n const ov = overrides[score];\n checkouts[score] = {\n darts: ov.darts,\n numDarts: ov.darts.length,\n };\n if (includeAlternates && result && result.alternates.length > 0 && ov.darts.length > 1) {\n const overrideKey = pathKey(ov.darts);\n const alts = result.alternates.filter((a) => pathKey(a) !== overrideKey);\n if (pathKey(result.darts) !== overrideKey) {\n alts.unshift(result.darts);\n }\n if (alts.length > 0) checkouts[score].alternates = alts;\n }\n continue;\n }\n\n if (result) {\n checkouts[score] = {\n darts: result.darts,\n numDarts: result.numDarts,\n };\n if (includeAlternates && result.alternates.length > 0) {\n checkouts[score].alternates = result.alternates;\n }\n } else {\n bogeyNumbers.push(score);\n }\n }\n\n return { checkouts, bogeyNumbers };\n}\n","import type { EnumeratedCheckoutMap } from './types.js';\n\nfunction normalizeTargetLabel(str: string): string {\n if (str === 'Bull') return 'Bull';\n if (str === '25') return '25';\n const m = str.match(/^([SDT])(\\d+)$/);\n if (m) {\n return m[1] === 'S' ? m[2] : `${m[1]}${m[2]}`;\n }\n if (/^\\d+$/.test(str)) return str;\n return str;\n}\n\nexport function filterByPreferredTargets(\n checkouts: EnumeratedCheckoutMap,\n preferredTargets: string[],\n): EnumeratedCheckoutMap {\n const preferredLabels = new Set(preferredTargets.map(normalizeTargetLabel));\n const filtered: EnumeratedCheckoutMap = {};\n\n for (const [score, entry] of Object.entries(checkouts)) {\n const matching = entry.options.filter((darts) =>\n preferredLabels.has(darts[darts.length - 1]),\n );\n\n if (matching.length > 0) {\n filtered[Number(score)] = {\n options: matching,\n count: matching.length,\n };\n }\n }\n\n return filtered;\n}\n","import { parseTarget } from './dartboard.js';\nimport type { CheckoutChart, CheckoutEntry } from './types.js';\nimport { OutsChartError } from './types.js';\n\nexport interface NotationMap {\n treble: string;\n double: string;\n single: string;\n bull: string;\n outerBull: string;\n}\n\nexport const NOTATIONS: Record<string, NotationMap> = {\n default: { treble: 'T', double: 'D', single: '', bull: 'Bull', outerBull: '25' },\n british: { treble: 'T', double: 'D', single: 'S', bull: 'DB', outerBull: 'SB' },\n american: { treble: 'T', double: 'D', single: '', bull: 'DB', outerBull: 'SB' },\n explicit: { treble: 'T', double: 'D', single: 'S', bull: 'Bull', outerBull: '25' },\n};\n\nexport function formatDart(dart: string, notation: NotationMap): string {\n const parsed = parseTarget(dart);\n if (!parsed) {\n throw new OutsChartError('INVALID_TARGET', `Cannot format invalid dart notation '${dart}'`);\n }\n\n if (parsed.bed === 'Bull') return notation.bull;\n if (parsed.bed === '25') return notation.outerBull;\n if (parsed.bed === 'treble') return `${notation.treble}${parsed.number}`;\n if (parsed.bed === 'double') return `${notation.double}${parsed.number}`;\n return `${notation.single}${parsed.number}`;\n}\n\nexport function formatCheckoutChart(\n chart: CheckoutChart,\n notation: NotationMap | string,\n): CheckoutChart {\n const map = resolveNotation(notation);\n const result: CheckoutChart = {};\n\n for (const [scoreStr, entry] of Object.entries(chart)) {\n const score = Number(scoreStr);\n const formatted: CheckoutEntry = {\n darts: entry.darts.map((d) => formatDart(d, map)),\n numDarts: entry.numDarts,\n };\n if (entry.alternates) {\n formatted.alternates = entry.alternates.map((alt) =>\n alt.map((d) => formatDart(d, map)),\n );\n }\n result[score] = formatted;\n }\n\n return result;\n}\n\nfunction resolveNotation(notation: NotationMap | string): NotationMap {\n if (typeof notation === 'string') {\n const preset = NOTATIONS[notation];\n if (!preset) {\n throw new OutsChartError(\n 'INVALID_TARGET',\n `Unknown notation preset '${notation}'. Available: ${Object.keys(NOTATIONS).join(', ')}`,\n );\n }\n return preset;\n }\n return notation;\n}\n"],"mappings":"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","names":["allTargets","buildTargets","buildFinishingDoubles"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tungstenstudio/outschart-generator",
|
|
3
|
+
"version": "1.0.0-rc.0",
|
|
4
|
+
"description": "Darts outs/checkout chart generator with pre-computed lookups and a miss-aware recommendation engine",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"src",
|
|
24
|
+
"!src/**/*.test.ts"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"start": "npm run build:demo && npx --yes serve demo",
|
|
28
|
+
"build": "tsup src/index.ts --format cjs,esm --dts --clean --sourcemap",
|
|
29
|
+
"build:demo": "tsup src/index.ts --format iife --global-name OutsChart --outDir demo/dist",
|
|
30
|
+
"dev": "npm run build:demo && npx --yes serve demo",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest",
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"verify": "npm run test && npm run typecheck && npm run build && npm run build:demo"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"darts",
|
|
38
|
+
"checkout",
|
|
39
|
+
"outs",
|
|
40
|
+
"chart",
|
|
41
|
+
"double-out",
|
|
42
|
+
"single-out"
|
|
43
|
+
],
|
|
44
|
+
"author": "Tungsten Studio",
|
|
45
|
+
"license": "ISC",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://gitlab.com/tungstenstudio/libs/outschart-generator.git"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://gitlab.com/tungstenstudio/libs/outschart-generator#readme",
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://gitlab.com/tungstenstudio/libs/outschart-generator/-/issues"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
56
|
+
"tsup": "^8.5.1",
|
|
57
|
+
"typescript": "^5.9.3",
|
|
58
|
+
"vitest": "^4.0.18"
|
|
59
|
+
}
|
|
60
|
+
}
|
package/src/dartboard.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import layout from './data/dartboard-layout.json' with { type: 'json' };
|
|
2
|
+
import type {
|
|
3
|
+
ParsedTarget,
|
|
4
|
+
FormattedTarget,
|
|
5
|
+
MissTarget,
|
|
6
|
+
MissType,
|
|
7
|
+
ThrowEvaluation,
|
|
8
|
+
EvaluatedMiss,
|
|
9
|
+
DartboardLayout,
|
|
10
|
+
} from './types.js';
|
|
11
|
+
|
|
12
|
+
const boardLayout = layout as unknown as DartboardLayout;
|
|
13
|
+
|
|
14
|
+
export const BOARD_ORDER: number[] = boardLayout.boardOrder;
|
|
15
|
+
|
|
16
|
+
export function getNeighbors(num: number): { cw: number; ccw: number } {
|
|
17
|
+
const n = boardLayout.neighbors[String(num)];
|
|
18
|
+
return { cw: n.clockwise, ccw: n.counterClockwise };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function parseTarget(target: string): ParsedTarget | null {
|
|
22
|
+
if (target === 'Bull') return { bed: 'Bull', number: null, value: 50 };
|
|
23
|
+
if (target === '25') return { bed: '25', number: null, value: 25 };
|
|
24
|
+
const m = target.match(/^([TD]?)(\d+)$/);
|
|
25
|
+
if (!m) return null;
|
|
26
|
+
const num = parseInt(m[2]);
|
|
27
|
+
if (num < 1 || num > 20) return null;
|
|
28
|
+
const prefix = m[1];
|
|
29
|
+
if (prefix === 'T') return { bed: 'treble', number: num, value: num * 3 };
|
|
30
|
+
if (prefix === 'D') return { bed: 'double', number: num, value: num * 2 };
|
|
31
|
+
return { bed: null, number: num, value: num };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function formatTarget(bed: string, number: number | null): FormattedTarget {
|
|
35
|
+
if (bed === 'Bull') return { label: 'Bull', value: 50 };
|
|
36
|
+
if (bed === '25') return { label: '25', value: 25 };
|
|
37
|
+
if (bed === 'off') return { label: 'off', value: 0 };
|
|
38
|
+
if (bed === 'treble') return { label: `T${number}`, value: number! * 3 };
|
|
39
|
+
if (bed === 'double') return { label: `D${number}`, value: number! * 2 };
|
|
40
|
+
return { label: `${number}`, value: number! };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function getMissTargets(target: string): MissTarget[] {
|
|
44
|
+
const parsed = parseTarget(target);
|
|
45
|
+
if (!parsed) return [];
|
|
46
|
+
|
|
47
|
+
const misses: MissTarget[] = [];
|
|
48
|
+
const missInfo = getMissInfo(parsed);
|
|
49
|
+
|
|
50
|
+
if (missInfo.radialIn) {
|
|
51
|
+
misses.push({ ...missInfo.radialIn, missType: 'radialIn' as MissType });
|
|
52
|
+
}
|
|
53
|
+
if (missInfo.radialOut) {
|
|
54
|
+
misses.push({ ...missInfo.radialOut, missType: 'radialOut' as MissType });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (parsed.number) {
|
|
58
|
+
const { cw, ccw } = getNeighbors(parsed.number);
|
|
59
|
+
|
|
60
|
+
if (parsed.bed === 'treble') {
|
|
61
|
+
misses.push({ label: `T${cw}`, value: cw * 3, missType: 'lateralCW' });
|
|
62
|
+
misses.push({ label: `T${ccw}`, value: ccw * 3, missType: 'lateralCCW' });
|
|
63
|
+
} else if (parsed.bed === 'double') {
|
|
64
|
+
misses.push({ label: `D${cw}`, value: cw * 2, missType: 'lateralCW' });
|
|
65
|
+
misses.push({ label: `D${ccw}`, value: ccw * 2, missType: 'lateralCCW' });
|
|
66
|
+
} else {
|
|
67
|
+
misses.push({ label: `${cw}`, value: cw, missType: 'lateralCW' });
|
|
68
|
+
misses.push({ label: `${ccw}`, value: ccw, missType: 'lateralCCW' });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return misses;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function getMissInfo(parsed: ParsedTarget): { radialIn: FormattedTarget | null; radialOut: FormattedTarget | null } {
|
|
76
|
+
const result: { radialIn: FormattedTarget | null; radialOut: FormattedTarget | null } = {
|
|
77
|
+
radialIn: null,
|
|
78
|
+
radialOut: null,
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
if (parsed.bed === 'Bull') {
|
|
82
|
+
result.radialOut = formatTarget('25', null);
|
|
83
|
+
} else if (parsed.bed === '25') {
|
|
84
|
+
result.radialIn = formatTarget('Bull', null);
|
|
85
|
+
} else if (parsed.bed === 'treble') {
|
|
86
|
+
result.radialIn = formatTarget('smallSingle', parsed.number);
|
|
87
|
+
result.radialOut = formatTarget('largeSingle', parsed.number);
|
|
88
|
+
} else if (parsed.bed === 'double') {
|
|
89
|
+
result.radialIn = formatTarget('largeSingle', parsed.number);
|
|
90
|
+
result.radialOut = formatTarget('off', null);
|
|
91
|
+
} else {
|
|
92
|
+
result.radialIn = formatTarget('treble', parsed.number);
|
|
93
|
+
result.radialOut = formatTarget('double', parsed.number);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function evaluateThrow(target: string, remaining: number): ThrowEvaluation | null {
|
|
100
|
+
const parsed = parseTarget(target);
|
|
101
|
+
if (!parsed) return null;
|
|
102
|
+
|
|
103
|
+
const misses = getMissTargets(target);
|
|
104
|
+
|
|
105
|
+
const evaluatedMisses: EvaluatedMiss[] = misses.map((miss) => {
|
|
106
|
+
const newRemaining = remaining - miss.value;
|
|
107
|
+
return {
|
|
108
|
+
...miss,
|
|
109
|
+
newRemaining,
|
|
110
|
+
busts: newRemaining < 0,
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
target,
|
|
116
|
+
targetValue: parsed.value,
|
|
117
|
+
remaining,
|
|
118
|
+
misses: evaluatedMisses,
|
|
119
|
+
bustCount: evaluatedMisses.filter((m) => m.busts).length,
|
|
120
|
+
totalMisses: evaluatedMisses.length,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta": {
|
|
3
|
+
"description": "Standard steel-tip dartboard dimensions and segment areas",
|
|
4
|
+
"units": "millimeters (mm) and square millimeters (sq mm)",
|
|
5
|
+
"sources": [
|
|
6
|
+
"dartbase.com/wwwboard/messages/1280.html",
|
|
7
|
+
"dartsnutz.net/forum/thread-40058.html",
|
|
8
|
+
"pages.cs.wisc.edu/~bolo/darts/dartboard.html",
|
|
9
|
+
"dimensions.com/element/dartboard",
|
|
10
|
+
"darting.com/Darts-Rules/General/"
|
|
11
|
+
],
|
|
12
|
+
"notes": "Measurements reflect the official WDF/BDO standard board. Modern competition boards (Winmau Blade, Unicorn Eclipse) may have slightly wider beds due to thinner blade wire dividers."
|
|
13
|
+
},
|
|
14
|
+
"board": {
|
|
15
|
+
"overallDiameter": 451,
|
|
16
|
+
"playableDiameter": 340,
|
|
17
|
+
"typicalDepth": 38.1,
|
|
18
|
+
"wireWidth": 1.5,
|
|
19
|
+
"numberHeight": 25.4
|
|
20
|
+
},
|
|
21
|
+
"radialMeasurements": {
|
|
22
|
+
"description": "Distance from board center to each ring boundary",
|
|
23
|
+
"innerBullRadius": 6.35,
|
|
24
|
+
"outerBullRadius": 15.9,
|
|
25
|
+
"trebleRingInnerEdge": 99,
|
|
26
|
+
"trebleRingOuterEdge": 107,
|
|
27
|
+
"doubleRingInnerEdge": 162,
|
|
28
|
+
"doubleRingOuterEdge": 170
|
|
29
|
+
},
|
|
30
|
+
"ringWidths": {
|
|
31
|
+
"trebleRing": 8,
|
|
32
|
+
"doubleRing": 8,
|
|
33
|
+
"outerBull": 9.55,
|
|
34
|
+
"smallSingleBed": 83.1,
|
|
35
|
+
"largeSingleBed": 55
|
|
36
|
+
},
|
|
37
|
+
"segmentAreas": {
|
|
38
|
+
"description": "Area of a single 1/20th segment of each ring, in sq mm",
|
|
39
|
+
"doubleBull": 126.45,
|
|
40
|
+
"singleBull": 665.16,
|
|
41
|
+
"trebleBed": 309.03,
|
|
42
|
+
"doubleBed": 498.71,
|
|
43
|
+
"smallSingle": 1481.93,
|
|
44
|
+
"largeSingle": 2288.38
|
|
45
|
+
},
|
|
46
|
+
"totalRingAreas": {
|
|
47
|
+
"description": "Total area of each full ring (all 20 segments combined), in sq mm",
|
|
48
|
+
"doubleBull": 126.45,
|
|
49
|
+
"singleBull": 665.16,
|
|
50
|
+
"trebleRing": 5174.18,
|
|
51
|
+
"doubleRing": 8341.92,
|
|
52
|
+
"smallSingleRing": 29638.6,
|
|
53
|
+
"largeSingleRing": 45767.6
|
|
54
|
+
},
|
|
55
|
+
"segmentAreaRatios": {
|
|
56
|
+
"description": "Size of each segment relative to other segments",
|
|
57
|
+
"doubleBedVsTrebleBed": 1.61,
|
|
58
|
+
"largeSingleVsTrebleBed": 7.41,
|
|
59
|
+
"largeSingleVsDoubleBed": 4.59,
|
|
60
|
+
"smallSingleVsTrebleBed": 4.8,
|
|
61
|
+
"smallSingleVsDoubleBed": 2.97,
|
|
62
|
+
"singleBullVsDoubleBull": 5.26,
|
|
63
|
+
"doubleBedVsDoubleBull": 3.94,
|
|
64
|
+
"trebleBedVsDoubleBull": 2.44
|
|
65
|
+
},
|
|
66
|
+
"boardVariation": {
|
|
67
|
+
"description": "Measured treble/double widths across popular competition boards (mm). Variation comes from differing wire/blade thickness.",
|
|
68
|
+
"boards": {
|
|
69
|
+
"bullsAdvantage501": { "treble": 9.9, "double": 9.65, "bull": 12.9 },
|
|
70
|
+
"unicornEclipseHD2": { "treble": 9.68, "double": 9.53, "bull": 11.64 },
|
|
71
|
+
"winmauBlade5": { "treble": 9.42, "double": 9.16, "bull": 12.33 },
|
|
72
|
+
"missionSamurai": { "treble": 9.7 },
|
|
73
|
+
"one80Gladiator3": { "treble": 9.22, "double": 9.26 },
|
|
74
|
+
"shotBanditPlus": { "treble": 9.09, "double": 9.2 }
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|