Public: anyone can read this; 1 person and the crew can change it.

From outside: Community vote winner: character classes (archery, mage, etc.) #6

opened this in answer to

Check · Review · Land · Live — It conflicts with its base. Next: builder, it conflicts with its base.

Conflicts with main

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)

Look

1 page beside main · 0 new to this pull

main

at df197f5 ·

this pull

In the dark

main

at df197f5 ·

this pull

at 1aaf68c ·

opened this

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 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

  • Classes are data in content/classes.json. Each class overrides some of the base hero numbers, picks an attack (melee, or shot with optional splash), a signature move (taunt, volley or heal), a weapon to draw and an apron colour. src/content.ts checks 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 (cast in src/sim.ts). The issue's "community_feature_slot hooks" don't exist in this repo, so classes use the same content pattern as monsters.
  • The three classes:

- 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.

  • Sim (src/sim.ts): each hero plays by rulesOf(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.
  • Dressing room: a card per class on the hub page, using a no-script form at 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/delves and POST /api/heroes take an optional class.
  • In a delve: each chef is drawn with their class's apron and weapon. Q or a third pad button fires the signature move, and the HUD says when it's ready. Avatars, heroes and parties now include their class (contract/openapi.json regenerated). The order list gains ability.
  • Bug fix: delve.js wrote 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

  • No contract changes: dressing up is an avatar update, and the class is part of opening or joining a table.
  • The terminal (src/tty.ts) and the MCP tools have no hub or delve commands today, so they don't get class commands either.
  • Balance is a first pass, not playtested.

Tests: bun test passes (80) and lint:design is clean. New src/classes.test.ts covers 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.ts and src/server.test.ts cover dressing up, the wardrobe, choosing a class when opening or joining, and the form and API. I checked that the splash test fails with splash removed.

To try it: on the hub page, open the dressing room, wear the Mage, start a delve and press Q next to a downed friend.

🤖 Generated with Claude Code

Closes #3

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs