diff --git a/zenno/src/lib/course.spec.ts b/zenno/src/lib/course.spec.ts index aea22e2..ed53d03 100644 --- a/zenno/src/lib/course.spec.ts +++ b/zenno/src/lib/course.spec.ts @@ -1,195 +1,1708 @@ -import { expect, test } from "vitest"; +import { expect, test } from 'vitest'; import * as course from './course'; -import { Phase } from "./race"; +import { Phase } from './race'; -test.for<{raceLen: number, slopes: course.Slope[], want: course.SectionSlopeSegment[]}>([ - { - raceLen: 1200, - slopes: [], - want: [ - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 0, endDist: 50, slope: 0}, - {section: 2, phase: Phase.EarlyRace, endRate: 2/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 50, endDist: 100, slope: 0}, - {section: 3, phase: Phase.EarlyRace, endRate: 3/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 100, endDist: 150, slope: 0}, - {section: 4, phase: Phase.EarlyRace, endRate: 4/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 150, endDist: 200, slope: 0}, - {section: 5, phase: Phase.MidRace, endRate: 5/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 200, endDist: 250, slope: 0}, - {section: 6, phase: Phase.MidRace, endRate: 6/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 250, endDist: 300, slope: 0}, - {section: 7, phase: Phase.MidRace, endRate: 7/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 300, endDist: 350, slope: 0}, - {section: 8, phase: Phase.MidRace, endRate: 8/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 350, endDist: 400, slope: 0}, - {section: 9, phase: Phase.MidRace, endRate: 9/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 400, endDist: 450, slope: 0}, - {section: 10, phase: Phase.MidRace, endRate: 10/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 450, endDist: 500, slope: 0}, - {section: 11, phase: Phase.MidRace, endRate: 11/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 500, endDist: 550, slope: 0}, - {section: 12, phase: Phase.MidRace, endRate: 12/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 550, endDist: 600, slope: 0}, - {section: 13, phase: Phase.MidRace, endRate: 13/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 600, endDist: 650, slope: 0}, - {section: 14, phase: Phase.MidRace, endRate: 14/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 650, endDist: 700, slope: 0}, - {section: 15, phase: Phase.MidRace, endRate: 15/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 700, endDist: 750, slope: 0}, - {section: 16, phase: Phase.MidRace, endRate: 16/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 750, endDist: 800, slope: 0}, - {section: 17, phase: Phase.LateRace, endRate: 17/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 800, endDist: 850, slope: 0}, - {section: 18, phase: Phase.LateRace, endRate: 18/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 850, endDist: 900, slope: 0}, - {section: 19, phase: Phase.LateRace, endRate: 19/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 900, endDist: 950, slope: 0}, - {section: 20, phase: Phase.LateRace, endRate: 20/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 950, endDist: 1000, slope: 0}, - {section: 21, phase: Phase.LateRace, endRate: 21/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1000, endDist: 1050, slope: 0}, - {section: 22, phase: Phase.LateRace, endRate: 22/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1050, endDist: 1100, slope: 0}, - {section: 23, phase: Phase.LateRace, endRate: 23/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1100, endDist: 1150, slope: 0}, - {section: 24, phase: Phase.LateRace, endRate: 24/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1150, endDist: 1200, slope: 0}, - ], - }, - { - raceLen: 1200, - slopes: [{per: 1, span: [0, 25]}], - want: [ - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 0, endDist: 25, slope: 1}, - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 25, endDist: 50, slope: 0}, - {section: 2, phase: Phase.EarlyRace, endRate: 2/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 50, endDist: 100, slope: 0}, - {section: 3, phase: Phase.EarlyRace, endRate: 3/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 100, endDist: 150, slope: 0}, - {section: 4, phase: Phase.EarlyRace, endRate: 4/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 150, endDist: 200, slope: 0}, - {section: 5, phase: Phase.MidRace, endRate: 5/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 200, endDist: 250, slope: 0}, - {section: 6, phase: Phase.MidRace, endRate: 6/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 250, endDist: 300, slope: 0}, - {section: 7, phase: Phase.MidRace, endRate: 7/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 300, endDist: 350, slope: 0}, - {section: 8, phase: Phase.MidRace, endRate: 8/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 350, endDist: 400, slope: 0}, - {section: 9, phase: Phase.MidRace, endRate: 9/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 400, endDist: 450, slope: 0}, - {section: 10, phase: Phase.MidRace, endRate: 10/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 450, endDist: 500, slope: 0}, - {section: 11, phase: Phase.MidRace, endRate: 11/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 500, endDist: 550, slope: 0}, - {section: 12, phase: Phase.MidRace, endRate: 12/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 550, endDist: 600, slope: 0}, - {section: 13, phase: Phase.MidRace, endRate: 13/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 600, endDist: 650, slope: 0}, - {section: 14, phase: Phase.MidRace, endRate: 14/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 650, endDist: 700, slope: 0}, - {section: 15, phase: Phase.MidRace, endRate: 15/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 700, endDist: 750, slope: 0}, - {section: 16, phase: Phase.MidRace, endRate: 16/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 750, endDist: 800, slope: 0}, - {section: 17, phase: Phase.LateRace, endRate: 17/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 800, endDist: 850, slope: 0}, - {section: 18, phase: Phase.LateRace, endRate: 18/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 850, endDist: 900, slope: 0}, - {section: 19, phase: Phase.LateRace, endRate: 19/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 900, endDist: 950, slope: 0}, - {section: 20, phase: Phase.LateRace, endRate: 20/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 950, endDist: 1000, slope: 0}, - {section: 21, phase: Phase.LateRace, endRate: 21/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1000, endDist: 1050, slope: 0}, - {section: 22, phase: Phase.LateRace, endRate: 22/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1050, endDist: 1100, slope: 0}, - {section: 23, phase: Phase.LateRace, endRate: 23/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1100, endDist: 1150, slope: 0}, - {section: 24, phase: Phase.LateRace, endRate: 24/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1150, endDist: 1200, slope: 0}, - ], - }, - { - raceLen: 1200, - slopes: [{per: 1, span: [0, 50]}], - want: [ - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 0, endDist: 50, slope: 1}, - {section: 2, phase: Phase.EarlyRace, endRate: 2/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 50, endDist: 100, slope: 0}, - {section: 3, phase: Phase.EarlyRace, endRate: 3/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 100, endDist: 150, slope: 0}, - {section: 4, phase: Phase.EarlyRace, endRate: 4/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 150, endDist: 200, slope: 0}, - {section: 5, phase: Phase.MidRace, endRate: 5/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 200, endDist: 250, slope: 0}, - {section: 6, phase: Phase.MidRace, endRate: 6/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 250, endDist: 300, slope: 0}, - {section: 7, phase: Phase.MidRace, endRate: 7/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 300, endDist: 350, slope: 0}, - {section: 8, phase: Phase.MidRace, endRate: 8/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 350, endDist: 400, slope: 0}, - {section: 9, phase: Phase.MidRace, endRate: 9/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 400, endDist: 450, slope: 0}, - {section: 10, phase: Phase.MidRace, endRate: 10/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 450, endDist: 500, slope: 0}, - {section: 11, phase: Phase.MidRace, endRate: 11/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 500, endDist: 550, slope: 0}, - {section: 12, phase: Phase.MidRace, endRate: 12/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 550, endDist: 600, slope: 0}, - {section: 13, phase: Phase.MidRace, endRate: 13/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 600, endDist: 650, slope: 0}, - {section: 14, phase: Phase.MidRace, endRate: 14/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 650, endDist: 700, slope: 0}, - {section: 15, phase: Phase.MidRace, endRate: 15/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 700, endDist: 750, slope: 0}, - {section: 16, phase: Phase.MidRace, endRate: 16/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 750, endDist: 800, slope: 0}, - {section: 17, phase: Phase.LateRace, endRate: 17/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 800, endDist: 850, slope: 0}, - {section: 18, phase: Phase.LateRace, endRate: 18/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 850, endDist: 900, slope: 0}, - {section: 19, phase: Phase.LateRace, endRate: 19/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 900, endDist: 950, slope: 0}, - {section: 20, phase: Phase.LateRace, endRate: 20/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 950, endDist: 1000, slope: 0}, - {section: 21, phase: Phase.LateRace, endRate: 21/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1000, endDist: 1050, slope: 0}, - {section: 22, phase: Phase.LateRace, endRate: 22/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1050, endDist: 1100, slope: 0}, - {section: 23, phase: Phase.LateRace, endRate: 23/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1100, endDist: 1150, slope: 0}, - {section: 24, phase: Phase.LateRace, endRate: 24/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1150, endDist: 1200, slope: 0}, - ], - }, - { - raceLen: 1200, - slopes: [{per: 1, span: [0, 225]}], - want: [ - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 0, endDist: 50, slope: 1}, - {section: 2, phase: Phase.EarlyRace, endRate: 2/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 50, endDist: 100, slope: 1}, - {section: 3, phase: Phase.EarlyRace, endRate: 3/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 100, endDist: 150, slope: 1}, - {section: 4, phase: Phase.EarlyRace, endRate: 4/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 150, endDist: 200, slope: 1}, - {section: 5, phase: Phase.MidRace, endRate: 5/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 200, endDist: 225, slope: 1}, - {section: 5, phase: Phase.MidRace, endRate: 5/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 225, endDist: 250, slope: 0}, - {section: 6, phase: Phase.MidRace, endRate: 6/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 250, endDist: 300, slope: 0}, - {section: 7, phase: Phase.MidRace, endRate: 7/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 300, endDist: 350, slope: 0}, - {section: 8, phase: Phase.MidRace, endRate: 8/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 350, endDist: 400, slope: 0}, - {section: 9, phase: Phase.MidRace, endRate: 9/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 400, endDist: 450, slope: 0}, - {section: 10, phase: Phase.MidRace, endRate: 10/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 450, endDist: 500, slope: 0}, - {section: 11, phase: Phase.MidRace, endRate: 11/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 500, endDist: 550, slope: 0}, - {section: 12, phase: Phase.MidRace, endRate: 12/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 550, endDist: 600, slope: 0}, - {section: 13, phase: Phase.MidRace, endRate: 13/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 600, endDist: 650, slope: 0}, - {section: 14, phase: Phase.MidRace, endRate: 14/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 650, endDist: 700, slope: 0}, - {section: 15, phase: Phase.MidRace, endRate: 15/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 700, endDist: 750, slope: 0}, - {section: 16, phase: Phase.MidRace, endRate: 16/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 750, endDist: 800, slope: 0}, - {section: 17, phase: Phase.LateRace, endRate: 17/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 800, endDist: 850, slope: 0}, - {section: 18, phase: Phase.LateRace, endRate: 18/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 850, endDist: 900, slope: 0}, - {section: 19, phase: Phase.LateRace, endRate: 19/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 900, endDist: 950, slope: 0}, - {section: 20, phase: Phase.LateRace, endRate: 20/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 950, endDist: 1000, slope: 0}, - {section: 21, phase: Phase.LateRace, endRate: 21/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1000, endDist: 1050, slope: 0}, - {section: 22, phase: Phase.LateRace, endRate: 22/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1050, endDist: 1100, slope: 0}, - {section: 23, phase: Phase.LateRace, endRate: 23/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1100, endDist: 1150, slope: 0}, - {section: 24, phase: Phase.LateRace, endRate: 24/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1150, endDist: 1200, slope: 0}, - ], - }, - { - raceLen: 1200, - slopes: [{per: 1, span: [25, 50]}], - want: [ - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 0, endDist: 25, slope: 0}, - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 25, endDist: 50, slope: 1}, - {section: 2, phase: Phase.EarlyRace, endRate: 2/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 50, endDist: 100, slope: 0}, - {section: 3, phase: Phase.EarlyRace, endRate: 3/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 100, endDist: 150, slope: 0}, - {section: 4, phase: Phase.EarlyRace, endRate: 4/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 150, endDist: 200, slope: 0}, - {section: 5, phase: Phase.MidRace, endRate: 5/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 200, endDist: 250, slope: 0}, - {section: 6, phase: Phase.MidRace, endRate: 6/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 250, endDist: 300, slope: 0}, - {section: 7, phase: Phase.MidRace, endRate: 7/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 300, endDist: 350, slope: 0}, - {section: 8, phase: Phase.MidRace, endRate: 8/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 350, endDist: 400, slope: 0}, - {section: 9, phase: Phase.MidRace, endRate: 9/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 400, endDist: 450, slope: 0}, - {section: 10, phase: Phase.MidRace, endRate: 10/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 450, endDist: 500, slope: 0}, - {section: 11, phase: Phase.MidRace, endRate: 11/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 500, endDist: 550, slope: 0}, - {section: 12, phase: Phase.MidRace, endRate: 12/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 550, endDist: 600, slope: 0}, - {section: 13, phase: Phase.MidRace, endRate: 13/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 600, endDist: 650, slope: 0}, - {section: 14, phase: Phase.MidRace, endRate: 14/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 650, endDist: 700, slope: 0}, - {section: 15, phase: Phase.MidRace, endRate: 15/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 700, endDist: 750, slope: 0}, - {section: 16, phase: Phase.MidRace, endRate: 16/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 750, endDist: 800, slope: 0}, - {section: 17, phase: Phase.LateRace, endRate: 17/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 800, endDist: 850, slope: 0}, - {section: 18, phase: Phase.LateRace, endRate: 18/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 850, endDist: 900, slope: 0}, - {section: 19, phase: Phase.LateRace, endRate: 19/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 900, endDist: 950, slope: 0}, - {section: 20, phase: Phase.LateRace, endRate: 20/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 950, endDist: 1000, slope: 0}, - {section: 21, phase: Phase.LateRace, endRate: 21/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1000, endDist: 1050, slope: 0}, - {section: 22, phase: Phase.LateRace, endRate: 22/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1050, endDist: 1100, slope: 0}, - {section: 23, phase: Phase.LateRace, endRate: 23/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1100, endDist: 1150, slope: 0}, - {section: 24, phase: Phase.LateRace, endRate: 24/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1150, endDist: 1200, slope: 0}, - ], - }, - { - raceLen: 1200, - slopes: [{per: 1, span: [10, 20]}, {per: -1, span: [30, 40]}], - want: [ - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 0, endDist: 10, slope: 0}, - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 10, endDist: 20, slope: 1}, - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 20, endDist: 30, slope: 0}, - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 30, endDist: 40, slope: -1}, - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 40, endDist: 50, slope: 0}, - {section: 2, phase: Phase.EarlyRace, endRate: 2/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 50, endDist: 100, slope: 0}, - {section: 3, phase: Phase.EarlyRace, endRate: 3/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 100, endDist: 150, slope: 0}, - {section: 4, phase: Phase.EarlyRace, endRate: 4/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 150, endDist: 200, slope: 0}, - {section: 5, phase: Phase.MidRace, endRate: 5/24, posKeep: true, rush: true, spotStruggleEnter: true, startDist: 200, endDist: 250, slope: 0}, - {section: 6, phase: Phase.MidRace, endRate: 6/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 250, endDist: 300, slope: 0}, - {section: 7, phase: Phase.MidRace, endRate: 7/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 300, endDist: 350, slope: 0}, - {section: 8, phase: Phase.MidRace, endRate: 8/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 350, endDist: 400, slope: 0}, - {section: 9, phase: Phase.MidRace, endRate: 9/24, posKeep: true, rush: true, spotStruggleEnter: false, startDist: 400, endDist: 450, slope: 0}, - {section: 10, phase: Phase.MidRace, endRate: 10/24, posKeep: true, rush: false, spotStruggleEnter: false, startDist: 450, endDist: 500, slope: 0}, - {section: 11, phase: Phase.MidRace, endRate: 11/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 500, endDist: 550, slope: 0}, - {section: 12, phase: Phase.MidRace, endRate: 12/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 550, endDist: 600, slope: 0}, - {section: 13, phase: Phase.MidRace, endRate: 13/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 600, endDist: 650, slope: 0}, - {section: 14, phase: Phase.MidRace, endRate: 14/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 650, endDist: 700, slope: 0}, - {section: 15, phase: Phase.MidRace, endRate: 15/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 700, endDist: 750, slope: 0}, - {section: 16, phase: Phase.MidRace, endRate: 16/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 750, endDist: 800, slope: 0}, - {section: 17, phase: Phase.LateRace, endRate: 17/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 800, endDist: 850, slope: 0}, - {section: 18, phase: Phase.LateRace, endRate: 18/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 850, endDist: 900, slope: 0}, - {section: 19, phase: Phase.LateRace, endRate: 19/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 900, endDist: 950, slope: 0}, - {section: 20, phase: Phase.LateRace, endRate: 20/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 950, endDist: 1000, slope: 0}, - {section: 21, phase: Phase.LateRace, endRate: 21/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1000, endDist: 1050, slope: 0}, - {section: 22, phase: Phase.LateRace, endRate: 22/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1050, endDist: 1100, slope: 0}, - {section: 23, phase: Phase.LateRace, endRate: 23/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1100, endDist: 1150, slope: 0}, - {section: 24, phase: Phase.LateRace, endRate: 24/24, posKeep: false, rush: false, spotStruggleEnter: false, startDist: 1150, endDist: 1200, slope: 0}, - ], - }, -])('splitSectionSlopes($raceLen, $slopes)', ({raceLen, slopes, want}) => { - expect(course.splitSectionSlopes(raceLen, slopes)).toEqual(want); -}) \ No newline at end of file +test.for<{ raceLen: number; slopes: course.Slope[]; want: course.SectionSlopeSegment[] }>([ + { + raceLen: 1200, + slopes: [], + want: [ + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 0, + endDist: 50, + slope: 0, + }, + { + section: 2, + phase: Phase.EarlyRace, + endRate: 2 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 50, + endDist: 100, + slope: 0, + }, + { + section: 3, + phase: Phase.EarlyRace, + endRate: 3 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 100, + endDist: 150, + slope: 0, + }, + { + section: 4, + phase: Phase.EarlyRace, + endRate: 4 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 150, + endDist: 200, + slope: 0, + }, + { + section: 5, + phase: Phase.MidRace, + endRate: 5 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 200, + endDist: 250, + slope: 0, + }, + { + section: 6, + phase: Phase.MidRace, + endRate: 6 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 250, + endDist: 300, + slope: 0, + }, + { + section: 7, + phase: Phase.MidRace, + endRate: 7 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 300, + endDist: 350, + slope: 0, + }, + { + section: 8, + phase: Phase.MidRace, + endRate: 8 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 350, + endDist: 400, + slope: 0, + }, + { + section: 9, + phase: Phase.MidRace, + endRate: 9 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 400, + endDist: 450, + slope: 0, + }, + { + section: 10, + phase: Phase.MidRace, + endRate: 10 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 450, + endDist: 500, + slope: 0, + }, + { + section: 11, + phase: Phase.MidRace, + endRate: 11 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 500, + endDist: 550, + slope: 0, + }, + { + section: 12, + phase: Phase.MidRace, + endRate: 12 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 550, + endDist: 600, + slope: 0, + }, + { + section: 13, + phase: Phase.MidRace, + endRate: 13 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 600, + endDist: 650, + slope: 0, + }, + { + section: 14, + phase: Phase.MidRace, + endRate: 14 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 650, + endDist: 700, + slope: 0, + }, + { + section: 15, + phase: Phase.MidRace, + endRate: 15 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 700, + endDist: 750, + slope: 0, + }, + { + section: 16, + phase: Phase.MidRace, + endRate: 16 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 750, + endDist: 800, + slope: 0, + }, + { + section: 17, + phase: Phase.LateRace, + endRate: 17 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 800, + endDist: 850, + slope: 0, + }, + { + section: 18, + phase: Phase.LateRace, + endRate: 18 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 850, + endDist: 900, + slope: 0, + }, + { + section: 19, + phase: Phase.LateRace, + endRate: 19 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 900, + endDist: 950, + slope: 0, + }, + { + section: 20, + phase: Phase.LateRace, + endRate: 20 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 950, + endDist: 1000, + slope: 0, + }, + { + section: 21, + phase: Phase.LateRace, + endRate: 21 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1000, + endDist: 1050, + slope: 0, + }, + { + section: 22, + phase: Phase.LateRace, + endRate: 22 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1050, + endDist: 1100, + slope: 0, + }, + { + section: 23, + phase: Phase.LateRace, + endRate: 23 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1100, + endDist: 1150, + slope: 0, + }, + { + section: 24, + phase: Phase.LateRace, + endRate: 24 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1150, + endDist: 1200, + slope: 0, + }, + ], + }, + { + raceLen: 1200, + slopes: [{ per: 1, span: [0, 25] }], + want: [ + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 0, + endDist: 25, + slope: 1, + }, + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 25, + endDist: 50, + slope: 0, + }, + { + section: 2, + phase: Phase.EarlyRace, + endRate: 2 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 50, + endDist: 100, + slope: 0, + }, + { + section: 3, + phase: Phase.EarlyRace, + endRate: 3 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 100, + endDist: 150, + slope: 0, + }, + { + section: 4, + phase: Phase.EarlyRace, + endRate: 4 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 150, + endDist: 200, + slope: 0, + }, + { + section: 5, + phase: Phase.MidRace, + endRate: 5 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 200, + endDist: 250, + slope: 0, + }, + { + section: 6, + phase: Phase.MidRace, + endRate: 6 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 250, + endDist: 300, + slope: 0, + }, + { + section: 7, + phase: Phase.MidRace, + endRate: 7 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 300, + endDist: 350, + slope: 0, + }, + { + section: 8, + phase: Phase.MidRace, + endRate: 8 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 350, + endDist: 400, + slope: 0, + }, + { + section: 9, + phase: Phase.MidRace, + endRate: 9 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 400, + endDist: 450, + slope: 0, + }, + { + section: 10, + phase: Phase.MidRace, + endRate: 10 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 450, + endDist: 500, + slope: 0, + }, + { + section: 11, + phase: Phase.MidRace, + endRate: 11 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 500, + endDist: 550, + slope: 0, + }, + { + section: 12, + phase: Phase.MidRace, + endRate: 12 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 550, + endDist: 600, + slope: 0, + }, + { + section: 13, + phase: Phase.MidRace, + endRate: 13 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 600, + endDist: 650, + slope: 0, + }, + { + section: 14, + phase: Phase.MidRace, + endRate: 14 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 650, + endDist: 700, + slope: 0, + }, + { + section: 15, + phase: Phase.MidRace, + endRate: 15 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 700, + endDist: 750, + slope: 0, + }, + { + section: 16, + phase: Phase.MidRace, + endRate: 16 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 750, + endDist: 800, + slope: 0, + }, + { + section: 17, + phase: Phase.LateRace, + endRate: 17 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 800, + endDist: 850, + slope: 0, + }, + { + section: 18, + phase: Phase.LateRace, + endRate: 18 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 850, + endDist: 900, + slope: 0, + }, + { + section: 19, + phase: Phase.LateRace, + endRate: 19 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 900, + endDist: 950, + slope: 0, + }, + { + section: 20, + phase: Phase.LateRace, + endRate: 20 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 950, + endDist: 1000, + slope: 0, + }, + { + section: 21, + phase: Phase.LateRace, + endRate: 21 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1000, + endDist: 1050, + slope: 0, + }, + { + section: 22, + phase: Phase.LateRace, + endRate: 22 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1050, + endDist: 1100, + slope: 0, + }, + { + section: 23, + phase: Phase.LateRace, + endRate: 23 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1100, + endDist: 1150, + slope: 0, + }, + { + section: 24, + phase: Phase.LateRace, + endRate: 24 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1150, + endDist: 1200, + slope: 0, + }, + ], + }, + { + raceLen: 1200, + slopes: [{ per: 1, span: [0, 50] }], + want: [ + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 0, + endDist: 50, + slope: 1, + }, + { + section: 2, + phase: Phase.EarlyRace, + endRate: 2 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 50, + endDist: 100, + slope: 0, + }, + { + section: 3, + phase: Phase.EarlyRace, + endRate: 3 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 100, + endDist: 150, + slope: 0, + }, + { + section: 4, + phase: Phase.EarlyRace, + endRate: 4 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 150, + endDist: 200, + slope: 0, + }, + { + section: 5, + phase: Phase.MidRace, + endRate: 5 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 200, + endDist: 250, + slope: 0, + }, + { + section: 6, + phase: Phase.MidRace, + endRate: 6 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 250, + endDist: 300, + slope: 0, + }, + { + section: 7, + phase: Phase.MidRace, + endRate: 7 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 300, + endDist: 350, + slope: 0, + }, + { + section: 8, + phase: Phase.MidRace, + endRate: 8 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 350, + endDist: 400, + slope: 0, + }, + { + section: 9, + phase: Phase.MidRace, + endRate: 9 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 400, + endDist: 450, + slope: 0, + }, + { + section: 10, + phase: Phase.MidRace, + endRate: 10 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 450, + endDist: 500, + slope: 0, + }, + { + section: 11, + phase: Phase.MidRace, + endRate: 11 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 500, + endDist: 550, + slope: 0, + }, + { + section: 12, + phase: Phase.MidRace, + endRate: 12 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 550, + endDist: 600, + slope: 0, + }, + { + section: 13, + phase: Phase.MidRace, + endRate: 13 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 600, + endDist: 650, + slope: 0, + }, + { + section: 14, + phase: Phase.MidRace, + endRate: 14 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 650, + endDist: 700, + slope: 0, + }, + { + section: 15, + phase: Phase.MidRace, + endRate: 15 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 700, + endDist: 750, + slope: 0, + }, + { + section: 16, + phase: Phase.MidRace, + endRate: 16 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 750, + endDist: 800, + slope: 0, + }, + { + section: 17, + phase: Phase.LateRace, + endRate: 17 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 800, + endDist: 850, + slope: 0, + }, + { + section: 18, + phase: Phase.LateRace, + endRate: 18 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 850, + endDist: 900, + slope: 0, + }, + { + section: 19, + phase: Phase.LateRace, + endRate: 19 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 900, + endDist: 950, + slope: 0, + }, + { + section: 20, + phase: Phase.LateRace, + endRate: 20 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 950, + endDist: 1000, + slope: 0, + }, + { + section: 21, + phase: Phase.LateRace, + endRate: 21 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1000, + endDist: 1050, + slope: 0, + }, + { + section: 22, + phase: Phase.LateRace, + endRate: 22 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1050, + endDist: 1100, + slope: 0, + }, + { + section: 23, + phase: Phase.LateRace, + endRate: 23 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1100, + endDist: 1150, + slope: 0, + }, + { + section: 24, + phase: Phase.LateRace, + endRate: 24 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1150, + endDist: 1200, + slope: 0, + }, + ], + }, + { + raceLen: 1200, + slopes: [{ per: 1, span: [0, 225] }], + want: [ + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 0, + endDist: 50, + slope: 1, + }, + { + section: 2, + phase: Phase.EarlyRace, + endRate: 2 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 50, + endDist: 100, + slope: 1, + }, + { + section: 3, + phase: Phase.EarlyRace, + endRate: 3 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 100, + endDist: 150, + slope: 1, + }, + { + section: 4, + phase: Phase.EarlyRace, + endRate: 4 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 150, + endDist: 200, + slope: 1, + }, + { + section: 5, + phase: Phase.MidRace, + endRate: 5 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 200, + endDist: 225, + slope: 1, + }, + { + section: 5, + phase: Phase.MidRace, + endRate: 5 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 225, + endDist: 250, + slope: 0, + }, + { + section: 6, + phase: Phase.MidRace, + endRate: 6 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 250, + endDist: 300, + slope: 0, + }, + { + section: 7, + phase: Phase.MidRace, + endRate: 7 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 300, + endDist: 350, + slope: 0, + }, + { + section: 8, + phase: Phase.MidRace, + endRate: 8 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 350, + endDist: 400, + slope: 0, + }, + { + section: 9, + phase: Phase.MidRace, + endRate: 9 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 400, + endDist: 450, + slope: 0, + }, + { + section: 10, + phase: Phase.MidRace, + endRate: 10 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 450, + endDist: 500, + slope: 0, + }, + { + section: 11, + phase: Phase.MidRace, + endRate: 11 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 500, + endDist: 550, + slope: 0, + }, + { + section: 12, + phase: Phase.MidRace, + endRate: 12 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 550, + endDist: 600, + slope: 0, + }, + { + section: 13, + phase: Phase.MidRace, + endRate: 13 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 600, + endDist: 650, + slope: 0, + }, + { + section: 14, + phase: Phase.MidRace, + endRate: 14 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 650, + endDist: 700, + slope: 0, + }, + { + section: 15, + phase: Phase.MidRace, + endRate: 15 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 700, + endDist: 750, + slope: 0, + }, + { + section: 16, + phase: Phase.MidRace, + endRate: 16 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 750, + endDist: 800, + slope: 0, + }, + { + section: 17, + phase: Phase.LateRace, + endRate: 17 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 800, + endDist: 850, + slope: 0, + }, + { + section: 18, + phase: Phase.LateRace, + endRate: 18 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 850, + endDist: 900, + slope: 0, + }, + { + section: 19, + phase: Phase.LateRace, + endRate: 19 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 900, + endDist: 950, + slope: 0, + }, + { + section: 20, + phase: Phase.LateRace, + endRate: 20 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 950, + endDist: 1000, + slope: 0, + }, + { + section: 21, + phase: Phase.LateRace, + endRate: 21 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1000, + endDist: 1050, + slope: 0, + }, + { + section: 22, + phase: Phase.LateRace, + endRate: 22 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1050, + endDist: 1100, + slope: 0, + }, + { + section: 23, + phase: Phase.LateRace, + endRate: 23 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1100, + endDist: 1150, + slope: 0, + }, + { + section: 24, + phase: Phase.LateRace, + endRate: 24 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1150, + endDist: 1200, + slope: 0, + }, + ], + }, + { + raceLen: 1200, + slopes: [{ per: 1, span: [25, 50] }], + want: [ + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 0, + endDist: 25, + slope: 0, + }, + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 25, + endDist: 50, + slope: 1, + }, + { + section: 2, + phase: Phase.EarlyRace, + endRate: 2 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 50, + endDist: 100, + slope: 0, + }, + { + section: 3, + phase: Phase.EarlyRace, + endRate: 3 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 100, + endDist: 150, + slope: 0, + }, + { + section: 4, + phase: Phase.EarlyRace, + endRate: 4 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 150, + endDist: 200, + slope: 0, + }, + { + section: 5, + phase: Phase.MidRace, + endRate: 5 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 200, + endDist: 250, + slope: 0, + }, + { + section: 6, + phase: Phase.MidRace, + endRate: 6 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 250, + endDist: 300, + slope: 0, + }, + { + section: 7, + phase: Phase.MidRace, + endRate: 7 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 300, + endDist: 350, + slope: 0, + }, + { + section: 8, + phase: Phase.MidRace, + endRate: 8 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 350, + endDist: 400, + slope: 0, + }, + { + section: 9, + phase: Phase.MidRace, + endRate: 9 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 400, + endDist: 450, + slope: 0, + }, + { + section: 10, + phase: Phase.MidRace, + endRate: 10 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 450, + endDist: 500, + slope: 0, + }, + { + section: 11, + phase: Phase.MidRace, + endRate: 11 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 500, + endDist: 550, + slope: 0, + }, + { + section: 12, + phase: Phase.MidRace, + endRate: 12 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 550, + endDist: 600, + slope: 0, + }, + { + section: 13, + phase: Phase.MidRace, + endRate: 13 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 600, + endDist: 650, + slope: 0, + }, + { + section: 14, + phase: Phase.MidRace, + endRate: 14 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 650, + endDist: 700, + slope: 0, + }, + { + section: 15, + phase: Phase.MidRace, + endRate: 15 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 700, + endDist: 750, + slope: 0, + }, + { + section: 16, + phase: Phase.MidRace, + endRate: 16 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 750, + endDist: 800, + slope: 0, + }, + { + section: 17, + phase: Phase.LateRace, + endRate: 17 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 800, + endDist: 850, + slope: 0, + }, + { + section: 18, + phase: Phase.LateRace, + endRate: 18 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 850, + endDist: 900, + slope: 0, + }, + { + section: 19, + phase: Phase.LateRace, + endRate: 19 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 900, + endDist: 950, + slope: 0, + }, + { + section: 20, + phase: Phase.LateRace, + endRate: 20 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 950, + endDist: 1000, + slope: 0, + }, + { + section: 21, + phase: Phase.LateRace, + endRate: 21 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1000, + endDist: 1050, + slope: 0, + }, + { + section: 22, + phase: Phase.LateRace, + endRate: 22 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1050, + endDist: 1100, + slope: 0, + }, + { + section: 23, + phase: Phase.LateRace, + endRate: 23 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1100, + endDist: 1150, + slope: 0, + }, + { + section: 24, + phase: Phase.LateRace, + endRate: 24 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1150, + endDist: 1200, + slope: 0, + }, + ], + }, + { + raceLen: 1200, + slopes: [ + { per: 1, span: [10, 20] }, + { per: -1, span: [30, 40] }, + ], + want: [ + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 0, + endDist: 10, + slope: 0, + }, + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 10, + endDist: 20, + slope: 1, + }, + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 20, + endDist: 30, + slope: 0, + }, + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 30, + endDist: 40, + slope: -1, + }, + { + section: 1, + phase: Phase.EarlyRace, + endRate: 1 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 40, + endDist: 50, + slope: 0, + }, + { + section: 2, + phase: Phase.EarlyRace, + endRate: 2 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 50, + endDist: 100, + slope: 0, + }, + { + section: 3, + phase: Phase.EarlyRace, + endRate: 3 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 100, + endDist: 150, + slope: 0, + }, + { + section: 4, + phase: Phase.EarlyRace, + endRate: 4 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 150, + endDist: 200, + slope: 0, + }, + { + section: 5, + phase: Phase.MidRace, + endRate: 5 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: true, + startDist: 200, + endDist: 250, + slope: 0, + }, + { + section: 6, + phase: Phase.MidRace, + endRate: 6 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 250, + endDist: 300, + slope: 0, + }, + { + section: 7, + phase: Phase.MidRace, + endRate: 7 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 300, + endDist: 350, + slope: 0, + }, + { + section: 8, + phase: Phase.MidRace, + endRate: 8 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 350, + endDist: 400, + slope: 0, + }, + { + section: 9, + phase: Phase.MidRace, + endRate: 9 / 24, + posKeep: true, + rush: true, + spotStruggleEnter: false, + startDist: 400, + endDist: 450, + slope: 0, + }, + { + section: 10, + phase: Phase.MidRace, + endRate: 10 / 24, + posKeep: true, + rush: false, + spotStruggleEnter: false, + startDist: 450, + endDist: 500, + slope: 0, + }, + { + section: 11, + phase: Phase.MidRace, + endRate: 11 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 500, + endDist: 550, + slope: 0, + }, + { + section: 12, + phase: Phase.MidRace, + endRate: 12 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 550, + endDist: 600, + slope: 0, + }, + { + section: 13, + phase: Phase.MidRace, + endRate: 13 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 600, + endDist: 650, + slope: 0, + }, + { + section: 14, + phase: Phase.MidRace, + endRate: 14 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 650, + endDist: 700, + slope: 0, + }, + { + section: 15, + phase: Phase.MidRace, + endRate: 15 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 700, + endDist: 750, + slope: 0, + }, + { + section: 16, + phase: Phase.MidRace, + endRate: 16 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 750, + endDist: 800, + slope: 0, + }, + { + section: 17, + phase: Phase.LateRace, + endRate: 17 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 800, + endDist: 850, + slope: 0, + }, + { + section: 18, + phase: Phase.LateRace, + endRate: 18 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 850, + endDist: 900, + slope: 0, + }, + { + section: 19, + phase: Phase.LateRace, + endRate: 19 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 900, + endDist: 950, + slope: 0, + }, + { + section: 20, + phase: Phase.LateRace, + endRate: 20 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 950, + endDist: 1000, + slope: 0, + }, + { + section: 21, + phase: Phase.LateRace, + endRate: 21 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1000, + endDist: 1050, + slope: 0, + }, + { + section: 22, + phase: Phase.LateRace, + endRate: 22 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1050, + endDist: 1100, + slope: 0, + }, + { + section: 23, + phase: Phase.LateRace, + endRate: 23 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1100, + endDist: 1150, + slope: 0, + }, + { + section: 24, + phase: Phase.LateRace, + endRate: 24 / 24, + posKeep: false, + rush: false, + spotStruggleEnter: false, + startDist: 1150, + endDist: 1200, + slope: 0, + }, + ], + }, +])('splitSectionSlopes($raceLen, $slopes)', ({ raceLen, slopes, want }) => { + expect(course.splitSectionSlopes(raceLen, slopes)).toEqual(want); +}); diff --git a/zenno/src/lib/course.ts b/zenno/src/lib/course.ts index 6aa87a1..ca7d348 100644 --- a/zenno/src/lib/course.ts +++ b/zenno/src/lib/course.ts @@ -1,64 +1,64 @@ import * as math from 'mathjs'; -import { Phase, type Stat, type Surface } from "./race"; +import { Phase, type Stat, type Surface } from './race'; export interface Race { - location: RaceLocation; - length: number; - surface: Surface; - direction: Direction; - spans: Span[]; - slopes: Slope[]; - thresholds: [] | [Stat] | [Stat, Stat]; + location: RaceLocation; + length: number; + surface: Surface; + direction: Direction; + spans: Span[]; + slopes: Slope[]; + thresholds: [] | [Stat] | [Stat, Stat]; } export enum RaceLocation { - Sapporo = 'Sapporo', - Hakodate = 'Hakodate', - Niigata = 'Niigata', - Fukushima = 'Fukushima', - Nakayama = 'Nakayama', - Tokyo = 'Tokyo', - Chukyo = 'Chukyo', - Kyoto = 'Kyoto', - Hanshin = 'Hanshin', - Kokura = 'Kokura', - Ooi = 'Ooi', - Kawasaki = 'Kawasaki', - Funabashi = 'Funabashi', - Morioka = 'Morioka', - Longchamp = 'Longchamp', - SantaAnitaPark = 'Santa Anita Park', - DelMar = 'Del Mar', + Sapporo = 'Sapporo', + Hakodate = 'Hakodate', + Niigata = 'Niigata', + Fukushima = 'Fukushima', + Nakayama = 'Nakayama', + Tokyo = 'Tokyo', + Chukyo = 'Chukyo', + Kyoto = 'Kyoto', + Hanshin = 'Hanshin', + Kokura = 'Kokura', + Ooi = 'Ooi', + Kawasaki = 'Kawasaki', + Funabashi = 'Funabashi', + Morioka = 'Morioka', + Longchamp = 'Longchamp', + SantaAnitaPark = 'Santa Anita Park', + DelMar = 'Del Mar', } export enum Direction { - Right, - Left, - Stretch, + Right, + Left, + Stretch, } export enum SpanType { - FrontStraight, - AcrossStraight, - FalseStraight, - Corner1, - Corner2, - Corner3, - Corner4, + FrontStraight, + AcrossStraight, + FalseStraight, + Corner1, + Corner2, + Corner3, + Corner4, } export interface Span { - type: SpanType; - span: [number, number]; + type: SpanType; + span: [number, number]; } export interface Slope { - per: -2 | -1.5 | -1 | 1 | 1.5 | 2; - span: [number, number]; + per: -2 | -1.5 | -1 | 1 | 1.5 | 2; + span: [number, number]; } function sortSlopes(slopes: Slope[]): Slope[] { - return slopes.toSorted((a, b) => a.span[0] - b.span[0]); + return slopes.toSorted((a, b) => a.span[0] - b.span[0]); } /** @@ -67,70 +67,70 @@ function sortSlopes(slopes: Slope[]): Slope[] { * @returns Quadruple of phase end points, including separate late and last spurt phases */ export function phases(raceLen: number): [number, number, number, number] { - const sixth = raceLen / 6; - const half = raceLen / 2; - return [sixth, sixth + half, 2*sixth + half, raceLen]; + const sixth = raceLen / 6; + const half = raceLen / 2; + return [sixth, sixth + half, 2 * sixth + half, raceLen]; } export interface SectionInfo { - section: number; - phase: Phase; - endRate: number; - posKeep: boolean; - rush: boolean; - spotStruggleEnter: boolean; + section: number; + phase: Phase; + endRate: number; + posKeep: boolean; + rush: boolean; + spotStruggleEnter: boolean; } export const SECTIONS: ReadonlyArray = [ - {section: 1, phase: Phase.EarlyRace, endRate: 1/24, posKeep: true, rush: false, spotStruggleEnter: false}, - {section: 2, phase: Phase.EarlyRace, endRate: 2/24, posKeep: true, rush: true, spotStruggleEnter: true}, - {section: 3, phase: Phase.EarlyRace, endRate: 3/24, posKeep: true, rush: true, spotStruggleEnter: true}, - {section: 4, phase: Phase.EarlyRace, endRate: 4/24, posKeep: true, rush: true, spotStruggleEnter: true}, - {section: 5, phase: Phase.MidRace, endRate: 5/24, posKeep: true, rush: true, spotStruggleEnter: true}, - {section: 6, phase: Phase.MidRace, endRate: 6/24, posKeep: true, rush: true, spotStruggleEnter: false}, - {section: 7, phase: Phase.MidRace, endRate: 7/24, posKeep: true, rush: true, spotStruggleEnter: false}, - {section: 8, phase: Phase.MidRace, endRate: 8/24, posKeep: true, rush: true, spotStruggleEnter: false}, - {section: 9, phase: Phase.MidRace, endRate: 9/24, posKeep: true, rush: true, spotStruggleEnter: false}, - {section: 10, phase: Phase.MidRace, endRate: 10/24, posKeep: true, rush: false, spotStruggleEnter: false}, - {section: 11, phase: Phase.MidRace, endRate: 11/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 12, phase: Phase.MidRace, endRate: 12/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 13, phase: Phase.MidRace, endRate: 13/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 14, phase: Phase.MidRace, endRate: 14/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 15, phase: Phase.MidRace, endRate: 15/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 16, phase: Phase.MidRace, endRate: 16/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 17, phase: Phase.LateRace, endRate: 17/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 18, phase: Phase.LateRace, endRate: 18/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 19, phase: Phase.LateRace, endRate: 19/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 20, phase: Phase.LateRace, endRate: 20/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 21, phase: Phase.LateRace, endRate: 21/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 22, phase: Phase.LateRace, endRate: 22/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 23, phase: Phase.LateRace, endRate: 23/24, posKeep: false, rush: false, spotStruggleEnter: false}, - {section: 24, phase: Phase.LateRace, endRate: 24/24, posKeep: false, rush: false, spotStruggleEnter: false}, + { section: 1, phase: Phase.EarlyRace, endRate: 1 / 24, posKeep: true, rush: false, spotStruggleEnter: false }, + { section: 2, phase: Phase.EarlyRace, endRate: 2 / 24, posKeep: true, rush: true, spotStruggleEnter: true }, + { section: 3, phase: Phase.EarlyRace, endRate: 3 / 24, posKeep: true, rush: true, spotStruggleEnter: true }, + { section: 4, phase: Phase.EarlyRace, endRate: 4 / 24, posKeep: true, rush: true, spotStruggleEnter: true }, + { section: 5, phase: Phase.MidRace, endRate: 5 / 24, posKeep: true, rush: true, spotStruggleEnter: true }, + { section: 6, phase: Phase.MidRace, endRate: 6 / 24, posKeep: true, rush: true, spotStruggleEnter: false }, + { section: 7, phase: Phase.MidRace, endRate: 7 / 24, posKeep: true, rush: true, spotStruggleEnter: false }, + { section: 8, phase: Phase.MidRace, endRate: 8 / 24, posKeep: true, rush: true, spotStruggleEnter: false }, + { section: 9, phase: Phase.MidRace, endRate: 9 / 24, posKeep: true, rush: true, spotStruggleEnter: false }, + { section: 10, phase: Phase.MidRace, endRate: 10 / 24, posKeep: true, rush: false, spotStruggleEnter: false }, + { section: 11, phase: Phase.MidRace, endRate: 11 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 12, phase: Phase.MidRace, endRate: 12 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 13, phase: Phase.MidRace, endRate: 13 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 14, phase: Phase.MidRace, endRate: 14 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 15, phase: Phase.MidRace, endRate: 15 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 16, phase: Phase.MidRace, endRate: 16 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 17, phase: Phase.LateRace, endRate: 17 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 18, phase: Phase.LateRace, endRate: 18 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 19, phase: Phase.LateRace, endRate: 19 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 20, phase: Phase.LateRace, endRate: 20 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 21, phase: Phase.LateRace, endRate: 21 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 22, phase: Phase.LateRace, endRate: 22 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 23, phase: Phase.LateRace, endRate: 23 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, + { section: 24, phase: Phase.LateRace, endRate: 24 / 24, posKeep: false, rush: false, spotStruggleEnter: false }, ]; export interface SectionSlopeSegment extends SectionInfo { - startDist: number; - endDist: number; - slope: -2 | -1.5 | -1 | 0 | 1 | 1.5 | 2; + startDist: number; + endDist: number; + slope: -2 | -1.5 | -1 | 0 | 1 | 1.5 | 2; } export function splitSectionSlopes(raceLen: number, slopes: Slope[]): SectionSlopeSegment[] { - const ss = sortSlopes(slopes); - return SECTIONS.flatMap((sec) => { - const startDist = (sec.section - 1) * raceLen / 24; - const endDist = sec.section * raceLen / 24; - const s = ss.filter((sl) => sl.span[0] < endDist && sl.span[1] > startDist); - if (s.length === 0) { - return [{...sec, startDist, endDist, slope: 0}]; - } - const r: Array = [{...sec, startDist, endDist: math.min(s[0].span[0], endDist), slope: 0}]; - for (const [i, sl] of s.entries()) { - const slopeEnd = math.min(endDist, sl.span[1]); - r.push( - {...sec, startDist: math.max(startDist, sl.span[0]), endDist: slopeEnd, slope: sl.per}, - {...sec, startDist: slopeEnd, endDist: math.min(s[i+1]?.span[0] ?? endDist, endDist), slope: 0}, - ); - } - return r.filter((sl) => sl.startDist < sl.endDist); - }) + const ss = sortSlopes(slopes); + return SECTIONS.flatMap((sec) => { + const startDist = ((sec.section - 1) * raceLen) / 24; + const endDist = (sec.section * raceLen) / 24; + const s = ss.filter((sl) => sl.span[0] < endDist && sl.span[1] > startDist); + if (s.length === 0) { + return [{ ...sec, startDist, endDist, slope: 0 }]; + } + const r: Array = [{ ...sec, startDist, endDist: math.min(s[0].span[0], endDist), slope: 0 }]; + for (const [i, sl] of s.entries()) { + const slopeEnd = math.min(endDist, sl.span[1]); + r.push( + { ...sec, startDist: math.max(startDist, sl.span[0]), endDist: slopeEnd, slope: sl.per }, + { ...sec, startDist: slopeEnd, endDist: math.min(s[i + 1]?.span[0] ?? endDist, endDist), slope: 0 }, + ); + } + return r.filter((sl) => sl.startDist < sl.endDist); + }); } diff --git a/zenno/src/routes/race/stam/+page.svelte b/zenno/src/routes/race/stam/+page.svelte index 136ddb7..f825a1b 100644 --- a/zenno/src/routes/race/stam/+page.svelte +++ b/zenno/src/routes/race/stam/+page.svelte @@ -1,356 +1,390 @@

Stamina Calculator

- {#each race.StatList as stat (stat)} - {@const statName = race.Stat[stat]} -
- - -
- {/each} -
- - -
-
- - -
-
- - -
-
- - -
-
- - -
+ {#each race.StatList as stat (stat)} + {@const statName = race.Stat[stat]} +
+ + +
+ {/each} +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
-
-
- Skill Passives -
-
- {#each race.StatList as stat (stat)} - {@const statName = race.Stat[stat]} -
- - -
- {/each} +
+
+ Skill Passives +
+
+ {#each race.StatList as stat (stat)} + {@const statName = race.Stat[stat]} +
+ + +
+ {/each}
-
-
- - {raceLen}m -
- - -
- - -
-
- - -
+
+
+ + {raceLen}m +
+ + +
+ + +
+
+ + +
-
- -
- - -
+
+ +
+ + +
-
- - - - - - - - - - - - - {#each slopesRaw as slope, i (slope.span[0])} - - - - - - - {/each} - - - - - - - -
Slopes
SlopeStartEnd
{slope.per}{slope.span[0]}{slope.span[1]} - -
- - - - - - - -
+
+ + + + + + + + + + + + + {#each slopesRaw as slope, i (slope.span[0])} + + + + + + + {/each} + + + + + + + +
Slopes
SlopeStartEnd
{slope.per}{slope.span[0]}{slope.span[1]} + +
+ + + + + + + +
-
-
- Max HP - {Math.floor(maxHP)} -
-
- Spurt Threshold - {Math.ceil(needHP)} -
-
- Late Race Start - {#if spurtStartHP != null} - {Math.ceil(spurtStartHP[1])} – {Math.ceil(spurtStartHP[0])} - {/if} -
+
+
+ Max HP + {Math.floor(maxHP)} +
+
+ Spurt Threshold + {Math.ceil(needHP)} +
+
+ Late Race Start + {#if spurtStartHP != null} + {Math.ceil(spurtStartHP[1])} – {Math.ceil(spurtStartHP[0])} + {/if} +
- - - - - - - - - - - - - - - - - - - - - - - - - {#each sections as s (s.startDist)} - - - - - - - - - - - - - - - - - {/each} - -
Section DataSection StateFastestSlowest
SectionPhaseSpanSlopeSpot StruggleSpeedTimeHPRemainingSpeedTimeHPRemaining
{s.section}{phaseNames[s.phase]}{s.startDist.toFixed(1)} m{s.endDist.toFixed(1)} m{s.slope}{s.speed[1].toFixed(3)} m/s{s.time[1].toFixed(3)} s{s.hp[1].toFixed(1)}{s.remain[0].toFixed(1)}{s.speed[0].toFixed(3)} m/s{s.time[0].toFixed(3)} s{s.hp[0].toFixed(1)}{s.remain[1].toFixed(1)}
\ No newline at end of file + + + Section Data + Section State + Fastest + Slowest + + + Section + Phase + Span + Slope + Spot Struggle + Speed + Time + HP + Remaining + Speed + Time + HP + Remaining + + + + {#each sections as s (s.startDist)} + + {s.section} + {phaseNames[s.phase]} + {s.startDist.toFixed(1)} m + {s.endDist.toFixed(1)} m + {s.slope} + + {s.speed[1].toFixed(3)} m/s + {s.time[1].toFixed(3)} s + {s.hp[1].toFixed(1)} + {s.remain[0].toFixed(1)} + {s.speed[0].toFixed(3)} m/s + {s.time[0].toFixed(3)} s + {s.hp[0].toFixed(1)} + {s.remain[1].toFixed(1)} + + {/each} + +