From 1cf3af5f793c4fcd0ea1422e9aee82e0eb6a2c31 Mon Sep 17 00:00:00 2001 From: Branden J Brown Date: Mon, 21 Sep 2026 09:48:56 -0400 Subject: [PATCH] zenno: update full charge info with new knowledge --- zenno/src/lib/race.ts | 5 +++-- zenno/src/routes/doc/frbm/+page.svelte | 13 ++++++------- zenno/src/routes/doc/race/+page.svelte | 19 ++++++++++++------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/zenno/src/lib/race.ts b/zenno/src/lib/race.ts index 7bbe016..c1eccc3 100644 --- a/zenno/src/lib/race.ts +++ b/zenno/src/lib/race.ts @@ -771,16 +771,17 @@ export function conservePowerAccel( distanceType: Distance, style: RunningStyle, rawPower: number, + basePower: number, powerSkillBonus?: number, spotStruggled?: boolean, rushed?: boolean, ): number { - const power = rawPower + (powerSkillBonus ?? 0); + const power = basePower + 0.5 * Math.max(rawPower - 1200, 0) + (powerSkillBonus ?? 0); if (power <= 1200) { return 0; } const sdc = conserveStratDistCoef[style][distanceType]; - const activity = rushed ? 0.8 : spotStruggled ? 0.98 : 1; + const activity = (rushed ? 0.8 : 1) * (spotStruggled ? 0.98 : 1); return Math.sqrt((power - 1200) * 130) * 0.001 * sdc * activity; } diff --git a/zenno/src/routes/doc/frbm/+page.svelte b/zenno/src/routes/doc/frbm/+page.svelte index 6dcf72c..e8ca8e8 100644 --- a/zenno/src/routes/doc/frbm/+page.svelte +++ b/zenno/src/routes/doc/frbm/+page.svelte @@ -224,10 +224,10 @@ }, ]); const fcSeries: ComputedSeries[] = $derived([ - { label: 'Front Runner', y: (x) => conservePowerAccel(distance(raceLen), RunningStyle.FrontRunner, x) }, - { label: 'Pace Chaser', y: (x) => conservePowerAccel(distance(raceLen), RunningStyle.PaceChaser, x) }, - { label: 'Late Surger', y: (x) => conservePowerAccel(distance(raceLen), RunningStyle.LateSurger, x) }, - { label: 'End Closer', y: (x) => conservePowerAccel(distance(raceLen), RunningStyle.EndCloser, x) }, + { label: 'Front Runner', y: (x, raw) => conservePowerAccel(distance(raceLen), RunningStyle.FrontRunner, raw, x) }, + { label: 'Pace Chaser', y: (x, raw) => conservePowerAccel(distance(raceLen), RunningStyle.PaceChaser, raw, x) }, + { label: 'Late Surger', y: (x, raw) => conservePowerAccel(distance(raceLen), RunningStyle.LateSurger, raw, x) }, + { label: 'End Closer', y: (x, raw) => conservePowerAccel(distance(raceLen), RunningStyle.EndCloser, raw, x) }, ]); @@ -528,9 +528,8 @@

- The exact mechanics of conserving power are unclear at this time. What has been confirmed is that rushed and spot struggle both reduce the chance for it to fire. + Rushed and spot struggle reduce both the duration and effectiveness of full charge, potentially to + zero. In practice, this appears to be a concern primarily on sprints, which already have a -55% penalty to full charge duration.

Lane Combo diff --git a/zenno/src/routes/doc/race/+page.svelte b/zenno/src/routes/doc/race/+page.svelte index 600656e..eb34fcb 100644 --- a/zenno/src/routes/doc/race/+page.svelte +++ b/zenno/src/routes/doc/race/+page.svelte @@ -58,10 +58,10 @@ ]); const laneChange: ComputedSeries[] = [{ label: 'Lane Change Target Speed', y: (x) => race.laneChangeSpeed(x) }]; const conservePower: Array = $derived([ - { label: 'Conserved Power', y: (_raw, x) => race.conservePowerAccel(distanceType, style, x, 0, false, false) }, - { label: 'Rushed', y: (_raw, x) => race.conservePowerAccel(distanceType, style, x, 0, false, true) }, + { label: 'Conserved Power', y: (x, raw) => race.conservePowerAccel(distanceType, style, raw, x, 0, false, false) }, + { label: 'Rushed', y: (x, raw) => race.conservePowerAccel(distanceType, style, raw, x, 0, false, true) }, styleIsFront - ? { label: 'Spot Struggled', y: (_raw, x) => race.conservePowerAccel(distanceType, style, x, 0, true, false) } + ? { label: 'Spot Struggled', y: (x, raw) => race.conservePowerAccel(distanceType, style, raw, x, 0, true, false) } : null, ]); const gutsSpurt: Array = $derived([ @@ -329,11 +329,16 @@ Bonus acceleration at spurt start from the Charge Up/Fully Charged mechanic. Scales with base power plus passive skills, so modifiers for ground conditions and career mode do not apply.

-

- This mechanic does not appear to be well understood, in particular how long the acceleration bonus lasts and how the rushed - and spot struggle multipliers apply. -

{@render statChart(race.Stat.Power, conservePower, 'Acceleration (m/s²)', [0, 0.35], { len: true, style: true })} +

+ The duration of Fully Charged does not depend directly on stats, but rather on a hidden conserved power value which + increases per horse throughout the race. Conserved power does not increase while spot struggling, + so for front runners, the duration may scale negatively with guts. It also does not increase while running in any + position keep mode + other than pace-down, so its duration may have a very slight negative correlation with wit. + Rushed additionally prevents accumulating conserved power, so full charge duration may scale positively with + wit amortized across races. Otherwise, power conservation rate depends on running style. +

Guts