diff --git a/zenno/src/routes/doc/frbm/+page.svelte b/zenno/src/routes/doc/frbm/+page.svelte
index e15afa2..4881d49 100644
--- a/zenno/src/routes/doc/frbm/+page.svelte
+++ b/zenno/src/routes/doc/frbm/+page.svelte
@@ -5,6 +5,7 @@
AptitudeLevel,
downhillAccelEnterChance,
frontModeEnterChance,
+ HORSE_LENGTH,
moveLaneModifier,
paceUpEnterChance,
Phase,
@@ -31,6 +32,20 @@
return x * (1 - p) + x * bonus * p;
}
+ const uphillSlowPow = 800;
+ const uphillFastPow = 1200;
+ const uphillBaseSpeed = mean2(sectionSpeed(2500, 1200, 1200, RunningStyle.FrontRunner, Phase.MidRace));
+ const uphillSlopes = [
+ { per: 2, len: 110 },
+ { per: 1.5, len: 200 },
+ ]
+ .map((s) => ({ ...s, slowSpeed: uphillMod(uphillSlowPow, s.per), fastSpeed: uphillMod(uphillFastPow, s.per) }))
+ .map((s) => ({ ...s, slowTime: s.len / (uphillBaseSpeed + s.slowSpeed), fastTime: s.len / (uphillBaseSpeed + s.fastSpeed) }))
+ // TODO(zeph): should include the difference with decel down to uphill speed and accel out of it,
+ // since the high power horse is favored for both
+ .map((s) => ({ ...s, dx: (s.fastSpeed - s.slowSpeed) * s.fastTime + s.slowSpeed * (s.slowTime - s.fastTime) }));
+ const uphillLengths = uphillSlopes.reduce((m, { dx }) => m + dx, 0) / HORSE_LENGTH;
+
const secSpeedS = 1200;
const secSpeedA = 1000;
const secSpeedExample = $derived(sectionSpeed(raceLen, secSpeedS, secSpeedS * 1.1, RunningStyle.FrontRunner, Phase.EarlyRace));
@@ -425,14 +440,15 @@
Running uphill carries a penalty to target speed. This penalty scales negatively with the power stat; that is, higher power - means faster uphill running. It scales positively with slope angle. + means faster uphill running. It scales positively with slope angle. There is also a flat reduction in base acceleration for + running uphill, which does not change with stats nor slope angle.
- The practical impact is that steep early- and mid-race hills filter out front runners with low power. Even with an otherwise
- perfect build, an 800 power VBourbon is likely to be passed by a 1280 power (