Everything Pete published so far was either the present moment (the roster, the Siege bar) or one thing that happened (a dispatch, a run report). None of it said what this place IS — how many zones there are, which are harder, or whether anybody has ever actually beaten them. Three pages off one snapshot, because they are one question and every number on all three comes off the same scan of the same run history upstream: /adventure/realm the world, in difficulty order, with who is inside it /adventure/standings the board, plus Pete's own duel record /adventure/firsts the hall of firsts, as a dated history The map is deliberately not who_map.go's layout engine. That lays out a graph, and the realm has no edges — zones aren't connected, you pick one and go. Forcing a graph onto a set would imply a topology the game doesn't have. What it has is an order, so tier bands are what get drawn. A zone nobody has ever cleared looks different rather than saying so in small text, and that styling keys off the clear count, never off whether a name is attached — otherwise an opt-out would silently redraw a conquered place as one nobody has come out of. The per-kind first dot goes through a custom property instead of a .firsts-entry-zone::before rule: input.css is in Tailwind's content glob, so a hand-written class survives the purge only if its literal name can be lifted out of the file, and a name glued to ::before cannot. It failed silently. Claude-Session: https://claude.ai/code/session_012bxpQQJDjC1mTtLN3VVtBQ
108 lines
5.8 KiB
HTML
108 lines
5.8 KiB
HTML
{{define "title"}}The board — {{.SiteTitle}}{{end}}
|
|
|
|
{{define "main"}}
|
|
<article class="mt-2 mb-10 max-w-4xl mx-auto">
|
|
{{template "realmnav" .}}
|
|
|
|
<header class="rounded-3xl bg-theme-adventure text-white p-6 sm:p-10 shadow-pete relative overflow-hidden">
|
|
<div class="absolute -top-10 -right-6 text-[12rem] opacity-20 select-none" aria-hidden="true">🏆</div>
|
|
<div class="relative">
|
|
<p class="text-sm uppercase tracking-[0.2em] opacity-80">🏆 The board</p>
|
|
<h1 class="font-display text-3xl sm:text-4xl font-bold mt-2 leading-tight">Who's actually been getting on with it.</h1>
|
|
<p class="mt-3 opacity-90 max-w-2xl">
|
|
Ranked by how deep anyone has got, then by how much of the realm they've
|
|
put behind them. Lifetime totals — nothing here decays, and nothing here
|
|
moves while you're not playing.
|
|
</p>
|
|
{{if and .Standings.Known .Standings.Stale}}
|
|
<p class="mt-4 text-xs bg-black/25 rounded-xl px-3 py-2">
|
|
Last count came in {{.Standings.LastSeenAgo}}. Nothing on this board moves fast, but it isn't live either.
|
|
</p>
|
|
{{end}}
|
|
</div>
|
|
</header>
|
|
|
|
{{if .Standings.Rows}}
|
|
<div class="mt-6 rounded-3xl bg-[color:var(--card)] border-2 border-[color:var(--ink)]/10 shadow-pete overflow-hidden">
|
|
<div class="overflow-x-auto">
|
|
<table class="w-full text-sm">
|
|
<thead>
|
|
<tr class="text-[11px] uppercase tracking-wider text-[color:var(--ink)]/45 border-b-2 border-[color:var(--ink)]/10">
|
|
<th class="text-left font-semibold px-4 py-3 w-10">#</th>
|
|
<th class="text-left font-semibold px-2 py-3">Adventurer</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="The deepest tier they have actually beaten a boss in">Deepest</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="Distinct zones cleared">Zones</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="Total successful clears, repeats included">Clears</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="Things nobody in the realm had ever done before">Firsts</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="Total damage dealt to every Siege boss, all time">Siege</th>
|
|
<th class="text-right font-semibold px-4 py-3" title="Deaths I've reported">Deaths</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .Standings.Rows}}
|
|
<tr class="border-b border-[color:var(--ink)]/5 last:border-0 hover:bg-[color:var(--ink)]/[0.03] transition">
|
|
<td class="px-4 py-3 tabular-nums text-[color:var(--ink)]/35 font-semibold">{{.Rank}}</td>
|
|
<td class="px-2 py-3 min-w-0">
|
|
{{if .Token}}<a href="/adventure/who/{{.Token}}" class="font-semibold hover:text-theme-adventure transition">{{.Name}}</a>
|
|
{{else}}<span class="font-semibold">{{.Name}}</span>{{end}}
|
|
<span class="block text-xs text-[color:var(--ink)]/40">
|
|
lv {{.Level}}{{if .ClassRace}} · {{.ClassRace}}{{end}}
|
|
</span>
|
|
</td>
|
|
<td class="px-2 py-3 text-right tabular-nums">
|
|
{{if .DeepestTier}}<span class="standings-tier standings-tier-{{.DeepestTier}}">T{{.DeepestTier}}</span>
|
|
{{else}}<span class="text-[color:var(--ink)]/25">—</span>{{end}}
|
|
</td>
|
|
<td class="px-2 py-3 text-right tabular-nums{{if not .Zones}} text-[color:var(--ink)]/25{{end}}">{{if .Zones}}{{.Zones}}{{else}}—{{end}}</td>
|
|
<td class="px-2 py-3 text-right tabular-nums{{if not .Clears}} text-[color:var(--ink)]/25{{end}}">{{if .Clears}}{{.Clears}}{{else}}—{{end}}</td>
|
|
<td class="px-2 py-3 text-right tabular-nums">
|
|
{{if .Firsts}}<span class="standings-firsts">{{.Firsts}}</span>{{else}}<span class="text-[color:var(--ink)]/25">—</span>{{end}}
|
|
</td>
|
|
<td class="px-2 py-3 text-right tabular-nums{{if not .SiegeDamage}} text-[color:var(--ink)]/25{{end}}">
|
|
{{if .SiegeDamage}}{{.SiegeDamage}}{{else}}—{{end}}
|
|
</td>
|
|
<td class="px-4 py-3 text-right tabular-nums{{if not .Deaths}} text-[color:var(--ink)]/25{{end}}">{{if .Deaths}}{{.Deaths}}{{else}}—{{end}}</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<p class="mt-3 text-xs text-[color:var(--ink)]/40 px-1">
|
|
Deepest is the hardest tier they've actually put a boss down in, not the hardest
|
|
one they've walked into. Deaths is my own count, off the dispatches I've filed.
|
|
</p>
|
|
|
|
{{else}}
|
|
<div class="mt-6 rounded-3xl bg-[color:var(--card)] border-2 border-[color:var(--ink)]/10 p-6 shadow-pete">
|
|
<p class="text-sm text-[color:var(--ink)]/60">
|
|
{{if .Standings.Known}}
|
|
Nobody on the board yet. Make a character and it fills up.
|
|
{{else}}
|
|
Haven't had the count through from the field yet.
|
|
{{end}}
|
|
</p>
|
|
</div>
|
|
{{end}}
|
|
|
|
{{/* Pete keeps score on himself. He can be hired onto an expedition and he
|
|
duels; a paper that ranks everybody else and quietly leaves itself off the
|
|
table is doing something slightly dishonest. */}}
|
|
<section class="mt-8 rounded-3xl bg-[color:var(--card)] border-2 border-theme-adventure/30 p-6 shadow-pete">
|
|
<h2 class="font-display text-xl font-bold">And my own record, since you asked</h2>
|
|
{{if .Standings.PeteFought}}
|
|
<p class="mt-2 text-sm text-[color:var(--ink)]/70">
|
|
<span class="font-semibold text-theme-adventure tabular-nums text-lg">{{.Standings.PeteWins}}</span> won,
|
|
<span class="font-semibold tabular-nums text-lg">{{.Standings.PeteLosses}}</span> lost.
|
|
I file those myself, which you're welcome to hold against me.
|
|
</p>
|
|
{{else}}
|
|
<p class="mt-2 text-sm text-[color:var(--ink)]/60">
|
|
No bouts yet. I'll report them when there are, wins and the other kind.
|
|
</p>
|
|
{{end}}
|
|
</section>
|
|
</article>
|
|
{{end}}
|