Web frontend and supporting services for lance.blue

feat(daily-challenge): launch, score and account for the day's fight master

GET /api/daily/{slug} answers how many have taken a challenge on and whether the caller has used their attempt; POST starts it against Princess. The scenario is compiled into the binary and carried in the launch manifest, so a fight no arena image has ever heard of is launchable. Scored on battle value remaining, both sides, normalised to 1,000,000: half for what you kept and half for what you took. That is what makes hiding in a corner and trading your whole force score the same 500,000, and it is why winning is not an input - Princess usually loses, so ranking on victory would rank almost everybody equal first. One attempt per player per challenge, enforced by the primary key rather than by a check somebody can forget, and claimed before the launch so two clicks cannot start two matches. It is only spent when the match produces a result: a match that fails, or whose result carries no battle value, releases it. An attempt lost to our own infrastructure is not a score. A challenge whose day has passed is playable and is not an attempt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Change-Id: Id950e4ce8e0564c32bf4c77d115e75b8c55b857f


Author permadeath.com Co-author Claude Opus 5 (1M context) Committer Tangled Date Commit e2fb0f8c Parent 48365ca4 Change ID Id950e4c