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