Public: anyone can read this; 1 person and the crew can change it.
From outside: Community vote winner: character classes (archery, mage, etc.) #6
Check · Review · Land · Live — It conflicts with its base.
I couldn't push. Both commits are on the branch locally (`2e6c31f`, `1aaf68c`), but the push remote (`http://localhost:8080/...`) refused every connection for about 15 minutes, even though the forge API at `$FORGE_URL` was answering. Git config is read-only, so I didn't send the push anywhere else. A plain `git push` should work once that port is back. The description below is for when the pull op…
19 files · +966 −65
look it conflicts with main in README.md, content/classes.json, content/hub.json, and 10 more — bring the branch up to date and it can land deploy 1aaf68c
Conflicts in 13 filesdeploy 1aaf68c
Website spec: 4 findings, 4 the edge owns (report only)
- / no <link rel="canonical"> — canonical
- / missing og:image — open-graph
- / the first focusable element is not a skip link (an in-page #target link) — skip-link
- / a 6847-byte body was sent without br or gzip though Accept-Encoding: br, gzip — https://specification.website/ (the edge owns this)
- / http://127.0.0.1:39071/tokens.css?v=88a5de9a: a 3244-byte body was sent without br or gzip though Accept-Encoding: br, gzip — https://specification.website/ (the edge owns this)
- / http://127.0.0.1:39071/static/app.css?v=720c3252: a 9341-byte body was sent without br or gzip though Accept-Encoding: br, gzip — https://specification.website/ (the edge owns this)
- / no Cross-Origin-Opener-Policy — coop (the edge owns this)
- / no ETag on the HTML — caching
I couldn't push. Both commits are on the branch locally (
2e6c31f,1aaf68c), but the push remote (http://localhost:8080/...) refused every connection for about 15 minutes, even though the forge API at$FORGE_URLwas answering. Git config is read-only, so I didn't send the push anywhere else. A plaingit pushshould work once that port is back. The description below is for when the pull opens.---
Adds character classes, the first community vote (Ben Versluys called it): Knight, Archer and Mage, each with its own weapon, dodge and signature move. You pick one in a new dressing room on the hub page.
What's in it
content/classes.json. Each class overrides some of the base hero numbers, picks an attack (melee, orshotwith optionalsplash), a signature move (taunt,volleyorheal), a weapon to draw and an apron colour.src/content.tschecks all of it at boot and won't start on a bad entry. A new class made from those pieces is a JSON edit; a new kind of move is code (castinsrc/sim.ts). The issue's "community_feature_slot hooks" don't exist in this repo, so classes use the same content pattern as monsters.- Knight (tank) is exactly the old default chef. Order Up! pulls nearby monsters onto the Knight and blocks 1 damage per hit for 4 seconds. - Archer (damage) shoots skewers from 6 tiles away and has a dash that's ready again almost at once. Skewer Storm fires five in a fan. - Mage (support) has 3 hearts, splashing fireballs and a blink instead of a roll. Soup's On! heals nearby chefs and gets downed ones back up.
src/sim.ts): each hero plays byrulesOf(class). Heroes' shots hit monsters and never hurt other heroes, and a taunted monster chases the Knight. Everything still uses only+ - * / sqrt, so the same seed still gives the same run.POST /hub/dress, plus a curtain and mirror in the square. Your pick is remembered in memory: it survives the hub's idle sweep but not a restart.POST /api/delvesandPOST /api/heroestake an optionalclass.Qor a third pad button fires the signature move, and the HUD says when it's ready. Avatars, heroes and parties now include theirclass(contract/openapi.jsonregenerated). The order list gainsability.delve.jswrote to a party HUD line the page never rendered, so the HUD update threw on every tick. That meant the "you're down" hint and the end-of-run panel never appeared live. The page now renders that line.Not done
src/tty.ts) and the MCP tools have no hub or delve commands today, so they don't get class commands either.Tests:
bun testpasses (80) andlint:designis clean. Newsrc/classes.test.tscovers stats, the Archer hitting from range while the Knight walks up, splash, taunt and block, the volley, heal and revive, determinism, and bad class data.src/game.test.tsandsrc/server.test.tscover dressing up, the wardrobe, choosing a class when opening or joining, and the form and API. I checked that the splash test fails withsplashremoved.To try it: on the hub page, open the dressing room, wear the Mage, start a delve and press
Qnext to a downed friend.🤖 Generated with Claude Code
Closes #3