zenno/doc/race: add reference links to doccy

This commit is contained in:
2026-07-13 18:20:23 -04:00
parent 009dd1d695
commit 197df8f022
2 changed files with 138 additions and 26 deletions
+10 -6
View File
@@ -7,12 +7,13 @@
h?: 1 | 2 | 3 | 4 | 5 | 6; h?: 1 | 2 | 3 | 4 | 5 | 6;
id: string; id: string;
children: Snippet; children: Snippet;
ref?: string;
top?: string; top?: string;
toc?: boolean; toc?: boolean;
class?: ClassValue | null; class?: ClassValue | null;
} }
let { h = 1, id, children, top = '#top', toc = true, class: className }: Props = $props(); let { h = 1, id, children, ref, top = '#top', toc = true, class: className }: Props = $props();
const tag = $derived(`h${h}`); const tag = $derived(`h${h}`);
const href = $derived(`#${id}`); const href = $derived(`#${id}`);
@@ -39,9 +40,12 @@
<svelte:element this={tag} {id} class={['relative w-full', className]}> <svelte:element this={tag} {id} class={['relative w-full', className]}>
<!-- eslint-disable svelte/no-navigation-without-resolve --> <!-- eslint-disable svelte/no-navigation-without-resolve -->
<a {href}><span class="hidden md:inline">{sign}</span> {@render children()}</a> <a {href}><span class="hidden md:inline">{sign}</span> {@render children()}</a>
{#if h >= 2} <div class="absolute right-0 bottom-0 inline-block text-end align-bottom text-sm whitespace-nowrap">
<a href={top} class="absolute right-0 bottom-0 text-end align-bottom text-sm whitespace-nowrap transition-all hover:bottom-px" {#if ref != null}
>Top ▲</a <a href={ref} target="_blank" rel="noopener noreferrer">Ref &UpperRightArrow;</a>
> {/if}
{/if} {#if h >= 2}
<a href={top} class="ml-4">Top ▲</a>
{/if}
</div>
</svelte:element> </svelte:element>
+128 -20
View File
@@ -215,6 +215,16 @@
{/if} {/if}
{/snippet} {/snippet}
{#snippet docref(h: string)}
<p class="ml-auto text-right text-sm italic">
<a
href={`https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=${h}`}
target="_blank"
rel="noopener noreferrer">ref &UpperRightArrow;</a
>
</p>
{/snippet}
<Article> <Article>
{#snippet head()} {#snippet head()}
<Sec h={1} id="top" class="text-center">Race Mechanics Charts</Sec> <Sec h={1} id="top" class="text-center">Race Mechanics Charts</Sec>
@@ -239,23 +249,43 @@
<Sec h={2} id="speed">Speed</Sec> <Sec h={2} id="speed">Speed</Sec>
<Sec h={3} id="spurt-speed">Spurt Speed</Sec> <Sec
h={3}
id="spurt-speed"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.mpfjmgpzqalr"
>Spurt Speed</Sec
>
<p>Target speed during the Uma's last spurt. See also <a href="#spurt-speed-guts">the effect of Guts</a>.</p> <p>Target speed during the Uma's last spurt. See also <a href="#spurt-speed-guts">the effect of Guts</a>.</p>
{@render statChart(race.Stat.Speed, spurtSpeed, 'Spurt Speed (m/s)', [20, 26.5], { len: true, style: true, dist: true })} {@render statChart(race.Stat.Speed, spurtSpeed, 'Spurt Speed (m/s)', [20, 26.5], { len: true, style: true, dist: true })}
<Sec h={3} id="late-race-speed">Late Race Speed</Sec> <Sec
h={3}
id="late-race-speed"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.43unjgrhmm7e"
>Late Race Speed</Sec
>
<p>Base target speed during late race when the Uma is not spurting (but not dead yet).</p> <p>Base target speed during late race when the Uma is not spurting (but not dead yet).</p>
{@render statChart(race.Stat.Speed, nonSpurtSpeed, 'Base Target Speed (m/s)', [18, 23], { len: true, style: true, dist: true })} {@render statChart(race.Stat.Speed, nonSpurtSpeed, 'Base Target Speed (m/s)', [18, 23], { len: true, style: true, dist: true })}
<Sec h={2} id="stamina">Stamina</Sec> <Sec h={2} id="stamina">Stamina</Sec>
<Sec h={3} id="hp">HP</Sec> <Sec
h={3}
id="hp"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.fnd75v9k5dx3"
>HP</Sec
>
<p>Max HP, i.e. starting HP.</p> <p>Max HP, i.e. starting HP.</p>
{@render statChart(race.Stat.Stamina, hp, 'HP', [1000, 5000], { len: true })} {@render statChart(race.Stat.Stamina, hp, 'HP', [1000, 5000], { len: true })}
<Sec h={2} id="power">Power</Sec> <Sec h={2} id="power">Power</Sec>
<Sec h={3} id="move-lane-mod">Move Lane Modifier</Sec> <Sec
h={3}
id="move-lane-mod"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.s5glz57t0wzd"
>Move Lane Modifier</Sec
>
<p> <p>
Target speed bonus when changing lanes while under the effect of a lane change speed skill. See <a Target speed bonus when changing lanes while under the effect of a lane change speed skill. See <a
href={resolve('/doc/frbm#lane-combo')}>lane combo</a href={resolve('/doc/frbm#lane-combo')}>lane combo</a
@@ -263,15 +293,30 @@
</p> </p>
{@render statChart(race.Stat.Power, moveLane, 'Target Speed Modifier (m/s)', [0.2, 0.6])} {@render statChart(race.Stat.Power, moveLane, 'Target Speed Modifier (m/s)', [0.2, 0.6])}
<Sec h={3} id="uphill">Uphill Target Speed Loss</Sec> <Sec
h={3}
id="uphill"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.wdj69udyo340"
>Uphill Target Speed Loss</Sec
>
<p>Target speed modifier while running uphill.</p> <p>Target speed modifier while running uphill.</p>
{@render statChart(race.Stat.Power, uphill, 'Target Speed Modifier (m/s)', [-2, 0])} {@render statChart(race.Stat.Power, uphill, 'Target Speed Modifier (m/s)', [-2, 0])}
<Sec h={3} id="acceleration">Acceleration</Sec> <Sec
h={3}
id="acceleration"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.t9fv1oq5lsu9"
>Acceleration</Sec
>
<p>Acceleration.</p> <p>Acceleration.</p>
{@render statChart(race.Stat.Power, accel, 'Acceleration (m/s²)', [0.1, 0.55], { style: true })} {@render statChart(race.Stat.Power, accel, 'Acceleration (m/s²)', [0.1, 0.55], { style: true })}
<Sec h={3} id="lane-change-target-speed">Lane Change Target Speed</Sec> <Sec
h={3}
id="lane-change-target-speed"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.8brkec5lv1fh"
>Lane Change Target Speed</Sec
>
<p>Horizontal (rather than forward) target speed of changing lanes.</p> <p>Horizontal (rather than forward) target speed of changing lanes.</p>
<div class="mb-4 h-60 w-full md:h-96"> <div class="mb-4 h-60 w-full md:h-96">
<StatChart <StatChart
@@ -283,8 +328,16 @@
/> />
</div> </div>
<Sec h={3} id="conserve-power">Conserve Power Acceleration</Sec> <Sec
<p>Bonus acceleration at spurt start from the Conserve Power mechanic.</p> h={3}
id="conserve-power"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.9edgwx6l733b"
>Fully Charged Acceleration</Sec
>
<p>
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.
</p>
<p> <p>
This mechanic does not appear to be well understood, in particular how long the acceleration bonus lasts and how the rushed 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. and spot struggle multipliers apply.
@@ -293,26 +346,51 @@
<Sec h={2} id="guts">Guts</Sec> <Sec h={2} id="guts">Guts</Sec>
<Sec h={3} id="spurt-speed-guts">Spurt Speed</Sec> <Sec
h={3}
id="spurt-speed-guts"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.mpfjmgpzqalr"
>Spurt Speed</Sec
>
<p>Target speed during the Uma's last spurt. See also <a href="#spurt-speed">the effect of Speed</a>.</p> <p>Target speed during the Uma's last spurt. See also <a href="#spurt-speed">the effect of Speed</a>.</p>
{@render statChart(race.Stat.Guts, gutsSpurt, 'Spurt Speed (m/s)', [20, 26.5], { len: true, style: true, dist: true })} {@render statChart(race.Stat.Guts, gutsSpurt, 'Spurt Speed (m/s)', [20, 26.5], { len: true, style: true, dist: true })}
<Sec h={3} id="min-speed">Minimum Speed</Sec> <Sec
h={3}
id="min-speed"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.nn1kp5g8fdhu"
>Minimum Speed</Sec
>
<p>Forced minimum speed, as well as target speed when out of HP.</p> <p>Forced minimum speed, as well as target speed when out of HP.</p>
{@render statChart(race.Stat.Guts, minSpeed, 'Target Speed (m/s)', [15.8, 18.5], { len: true })} {@render statChart(race.Stat.Guts, minSpeed, 'Target Speed (m/s)', [15.8, 18.5], { len: true })}
<Sec h={3} id="hp-rate-mod">Late Race HP Consumption Rate Modifier</Sec> <Sec
h={3}
id="hp-rate-mod"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.o0be6rj0myb1"
>Late Race HP Consumption Rate Modifier</Sec
>
<p>Multiplier on HP consumption rate during late race and last spurt phase.</p> <p>Multiplier on HP consumption rate during late race and last spurt phase.</p>
{@render statChart(race.Stat.Guts, gutsHPRate, 'HP Consumption Multiplier', [1.2, 1.6])} {@render statChart(race.Stat.Guts, gutsHPRate, 'HP Consumption Multiplier', [1.2, 1.6])}
<Sec h={3} id="spot-struggle">Spot Struggle</Sec> <Sec
h={3}
id="spot-struggle"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.5l523bk8k3vz"
>Spot Struggle</Sec
>
<p>Speed boost and duration of spot struggle.</p> <p>Speed boost and duration of spot struggle.</p>
<div class="mb-4 grid h-96 w-full md:grid-cols-2"> <div class="mb-4 grid h-96 w-full md:grid-cols-2">
<StatChart stat={race.Stat.Guts} y={ssBoost} yLabel="Speed Bonus (m/s)" range={[0, 0.4]} /> <StatChart stat={race.Stat.Guts} y={ssBoost} yLabel="Speed Bonus (m/s)" range={[0, 0.4]} />
<StatChart stat={race.Stat.Guts} y={ssDur} yLabel="Duration (s)" range={[0, 14]} /> <StatChart stat={race.Stat.Guts} y={ssDur} yLabel="Duration (s)" range={[0, 14]} />
</div> </div>
<Sec h={3} id="dueling">Dueling</Sec> <Sec
h={3}
id="dueling"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.98rgrb7ww1td"
>Dueling</Sec
>
<p>Speed boost and acceleration boost of dueling.</p> <p>Speed boost and acceleration boost of dueling.</p>
<div class="mb-4 grid h-96 w-full md:grid-cols-2"> <div class="mb-4 grid h-96 w-full md:grid-cols-2">
<StatChart stat={race.Stat.Guts} y={duelSpeed} yLabel="Speed Bonus (m/s)" range={[0, 0.8]} /> <StatChart stat={race.Stat.Guts} y={duelSpeed} yLabel="Speed Bonus (m/s)" range={[0, 0.8]} />
@@ -321,7 +399,12 @@
<Sec h={2} id="wit">Wit</Sec> <Sec h={2} id="wit">Wit</Sec>
<Sec h={3} id="section-speed">Section Speed</Sec> <Sec
h={3}
id="section-speed"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.xdha40q2176g"
>Section Speed</Sec
>
<p>Random variance in target speed per race section.</p> <p>Random variance in target speed per race section.</p>
<div class="mb-24 h-60 w-full md:mb-20 md:h-96"> <div class="mb-24 h-60 w-full md:mb-20 md:h-96">
<StatChart <StatChart
@@ -353,29 +436,54 @@
</div> </div>
</div> </div>
<Sec h={3} id="downhill">Downhill Accel Mode Chance</Sec> <Sec
h={3}
id="downhill"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.wdj69udyo340"
>Downhill Accel Mode Chance</Sec
>
<p>Chance each second to enter downhill accel mode when eligible.</p> <p>Chance each second to enter downhill accel mode when eligible.</p>
{@render statChart(race.Stat.Wit, downhill, 'Entry Chance (% each second)', [0, 75])} {@render statChart(race.Stat.Wit, downhill, 'Entry Chance (% each second)', [0, 75])}
<Sec h={3} id="spurt-accept">Reduced Spurt Accept Chance</Sec> <Sec
h={3}
id="spurt-accept"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.mpfjmgpzqalr"
>Reduced Spurt Accept Chance</Sec
>
<p>Chance to accept each checked spurt delay and speed when not full spurting.</p> <p>Chance to accept each checked spurt delay and speed when not full spurting.</p>
{@render statChart(race.Stat.Wit, reducedSpurt, 'Accept Chance (% each candidate)', [0, 100])} {@render statChart(race.Stat.Wit, reducedSpurt, 'Accept Chance (% each candidate)', [0, 100])}
<Sec h={3} id="skill">Skill Activation Chance</Sec> <Sec
h={3}
id="skill"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.23v0k7wyzcmb"
>Skill Activation Chance</Sec
>
<p> <p>
Chance that each skill that has a wit check will be eligible to activate. This uses base wit, so style aptitude and passive Chance that each skill that has a wit check will be eligible to activate. This uses base wit, so style aptitude and passive
wit skills do not affect the chance, although mood does. wit skills do not affect the chance, although mood does.
</p> </p>
{@render statChart(race.Stat.Wit, skillChance, 'Skill Activation Chance (%)', [0, 100])} {@render statChart(race.Stat.Wit, skillChance, 'Skill Activation Chance (%)', [0, 100])}
<Sec h={3} id="poskeep">Position Keep Mode Chance</Sec> <Sec
h={3}
id="poskeep"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.tulele26d1pm"
>Position Keep Mode Chance</Sec
>
<p> <p>
Chance for front runners to enter speed-up or overtake mode, or for non-front runners to enter pace-up mode (but no effect on Chance for front runners to enter speed-up or overtake mode, or for non-front runners to enter pace-up mode (but no effect on
pace-down mode), each 2 seconds when eligible. pace-down mode), each 2 seconds when eligible.
</p> </p>
{@render statChart(race.Stat.Wit, poskeep, 'Mode Entry Chance (%)', [0, 50])} {@render statChart(race.Stat.Wit, poskeep, 'Mode Entry Chance (%)', [0, 50])}
<Sec h={3} id="rushed">Rushed Chance</Sec> <Sec
h={3}
id="rushed"
ref="https://docs.google.com/document/d/15VzW9W2tXBBTibBRbZ8IVpW6HaMX8H0RP03kq6Az7Xg/edit?tab=t.0#heading=h.awbjufvej6ud"
>Rushed Chance</Sec
>
<p>Chance for runners to become rushed at some point during the race. Rushed chance is bracketed to integer percentages.</p> <p>Chance for runners to become rushed at some point during the race. Rushed chance is bracketed to integer percentages.</p>
{@render statChart(race.Stat.Wit, rushed, 'Rushed Chance (%)', [0, 30])} {@render statChart(race.Stat.Wit, rushed, 'Rushed Chance (%)', [0, 30])}
</Article> </Article>