zenno/race/stam: beginning of stamina calculator

This commit is contained in:
2026-06-17 19:55:12 -04:00
parent 7085fea1b7
commit 84f4f8e358
3 changed files with 417 additions and 0 deletions
+86
View File
@@ -0,0 +1,86 @@
<script lang="ts">
import * as course from '$lib/course';
import * as race from '$lib/race';
let rawStats = $state({
[race.Stat.Speed]: 1200,
[race.Stat.Stamina]: 1200,
[race.Stat.Power]: 1200,
[race.Stat.Guts]: 1200,
[race.Stat.Wit]: 1200,
});
let style = $state(race.RunningStyle.FrontRunner);
let surfaceApt = $state(race.AptitudeLevel.A);
let distanceApt = $state(race.AptitudeLevel.S);
let styleApt = $state(race.AptitudeLevel.A);
let mood = $state(race.Mood.Normal);
let isCareer = $state(false);
let skillStatBonus = $state({
[race.Stat.Speed]: 0,
[race.Stat.Stamina]: 0,
[race.Stat.Power]: 0,
[race.Stat.Guts]: 0,
[race.Stat.Wit]: 0,
});
let raceLen = $state(2000);
let slopesRaw: course.Slope[] = $state([]);
let surface = $state(race.Surface.Turf);
let conditions = $state(race.GroundConditions.Firm);
let thresh1: race.Stat | undefined = $state();
let thresh2: race.Stat | undefined = $state();
const baseStats = $derived({
[race.Stat.Speed]: race.baseStat(mood, rawStats[race.Stat.Speed]),
[race.Stat.Stamina]: race.baseStat(mood, rawStats[race.Stat.Stamina]),
[race.Stat.Power]: race.baseStat(mood, rawStats[race.Stat.Power]),
[race.Stat.Guts]: race.baseStat(mood, rawStats[race.Stat.Guts]),
[race.Stat.Wit]: race.baseStat(mood, rawStats[race.Stat.Wit]),
});
const thresholdMod = $derived.by(() => {
if (thresh1 == null) {
if (thresh2 == null) {
return 1;
}
return race.thresholdMod(baseStats[thresh2]);
}
if (thresh2 == null) {
return race.thresholdMod(baseStats[thresh1]);
}
return race.thresholdMod(baseStats[thresh1], baseStats[thresh2]);
});
const adjStats = $derived({
[race.Stat.Speed]: race.adjustedStat(race.Stat.Speed, baseStats[race.Stat.Speed], isCareer, surface, conditions, thresholdMod),
[race.Stat.Stamina]: race.adjustedStat(race.Stat.Stamina, baseStats[race.Stat.Stamina], isCareer),
[race.Stat.Power]: race.adjustedStat(race.Stat.Power, baseStats[race.Stat.Power], isCareer, surface, conditions),
[race.Stat.Guts]: race.adjustedStat(race.Stat.Guts, baseStats[race.Stat.Guts], isCareer),
[race.Stat.Wit]: race.adjustedStat(race.Stat.Wit, baseStats[race.Stat.Wit], isCareer, styleApt),
});
const stats = $derived({
[race.Stat.Speed]: race.finalStat(adjStats[race.Stat.Speed], skillStatBonus[race.Stat.Speed]),
[race.Stat.Stamina]: race.finalStat(adjStats[race.Stat.Stamina], skillStatBonus[race.Stat.Stamina]),
[race.Stat.Power]: race.finalStat(adjStats[race.Stat.Power], skillStatBonus[race.Stat.Power]),
[race.Stat.Guts]: race.finalStat(adjStats[race.Stat.Guts], skillStatBonus[race.Stat.Guts]),
[race.Stat.Wit]: race.finalStat(adjStats[race.Stat.Wit], skillStatBonus[race.Stat.Wit]),
});
let pdmTime = $state(0);
let rushedEnabled = $state(true);
let spotStruggleEnabled = $state(true);
const phases = $derived(course.phases(raceLen));
const sectionSlopes = $derived(course.splitSectionSlopes(raceLen, slopesRaw));
const sectionLen = $derived(raceLen / course.SECTIONS.length);
const phaseSpeed = $derived({
[race.Phase.EarlyRace]: race.sectionSpeed(raceLen, baseStats[race.Stat.Wit], stats[race.Stat.Wit], style, race.Phase.EarlyRace),
[race.Phase.MidRace]: race.sectionSpeed(raceLen, baseStats[race.Stat.Wit], stats[race.Stat.Wit], style, race.Phase.MidRace),
});
const spurtSpeed = $derived(race.spurtSpeed(stats[race.Stat.Speed], stats[race.Stat.Guts], style, distanceApt, raceLen));
const spurtHPRate = $derived(race.hpPerSecond(raceLen, surface, conditions, stats[race.Stat.Guts], race.Phase.LateRace, spurtSpeed));
const needHP = $derived(race.fullSpurtHP(raceLen, spurtSpeed, spurtHPRate));
</script>