Skip to content

feat: customize a Yard with World characters and companions - #381

Merged
oddessentials merged 4 commits into
mainfrom
feat/yard-customize
Nov 9, 2026
Merged

oddessentials merged 4 commits into
mainfrom
feat/yard-customize

Conversation

@oddessentials

Copy link
Copy Markdown
Owner

Each Yard's crews and companions can now be replaced with pieces made for Agent Guild: World, such as Steam Workshop items, from a new Customize this Yard dialog. That dialog also holds the world replacement that used to live in the Yard bar.

  • The manager checks every piece before installing it. It loads the piece with the page's own glTF loader in a worker with a time and memory cap, and enforces the skeleton, clip, size and yard extras limits. A refused piece leaves the slot as it was.
  • Pieces live at <data>/yard-pieces/<skin>/<slot>/ and are swapped in through side folders, so an interrupted change recovers on the next start. An installed piece that is damaged later shows its problem, and the Yard draws the original.
  • The folder chooser opens on World's Steam Workshop folder, found from Steam's library records, and lists pieces by title. A piece that needs a newer Agent Guild is listed with that reason and can't be chosen.
  • The page draws the original whenever a piece fails to load. Characters are picked and drawn in their current pose.
  • API: GET/PUT/DELETE /yard-pieces, pieces= on GET /folders, yardPieces in hello, and the yard-pieces.updated event. All of these are in docs/api.md.
  • New dependencies: @jsquash/png, @jsquash/jpeg and @jsquash/webp, bundled and pinned, used to decode textures while checking.

Verified locally on fad539d: npm test, every browser script in ci.yml, WebKit dialogs, tests/browser/yard.mjs, the release plan, a live walkthrough of 7 real Workshop items, and the packed tarball's install, refusal, damage and restore paths.

🤖 Generated with Claude Code

oddessentials and others added 4 commits November 8, 2026 22:00
Customize this Yard replaces the world, any crew's character, or the
companions of one Yard with Agent Guild: World pieces from the Steam
Workshop or a local folder. The picker opens in World's Workshop folder,
found from Steam's library records.

Pieces are checked before the loader runs against the exact glTF shape World
exports, including glTF's accessor types, plain trees, unit rotations,
supported texture channels, playable in-place clips and bounded data, then
drawn with the Yard's own loader in a bounded worker that fully decodes every
PNG, JPEG and WebP texture. Pieces are installed atomically per slot, and
obsolete downloads are cancelled. A piece that cannot be drawn falls back to
the original, and each row says whether its piece is original, being checked,
loading, customized or failed to load.

Guild dialogs now reserve room for their ornate frame, and the Customize
dialog stacks its buttons on phones.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A piece may draw at most 16 mesh parts, counting each primitive once for
every node that draws its mesh, so one mesh repeating its primitive can no
longer add thousands of draw calls. Every shipped character, helper and
Workshop piece draws one part.

Each piece preload now has its own identity, dropped when the piece is
released, so a load left over from before switching Yards away and back can
no longer mark the returned piece as failed or customized.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A skinned mesh keeps the bounds of the pose it first had, so a character
whose animation leaves that pose, as every shipped and Workshop character
does, could not be clicked where it stood and could be culled while on
screen. Picking now refreshes the bounds of the shown characters and helpers,
and their animated meshes are no longer frustum culled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A piece whose format is newer than this release now appears in the
character or companion chooser, unselectable, with "This piece needs a
newer Agent Guild." instead of being hidden behind the empty-folder
message. Such pieces are still refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@oddessentials
oddessentials merged commit d67a772 into main Nov 9, 2026
35 checks passed
@oddessentials
oddessentials deleted the feat/yard-customize branch November 9, 2026 05:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant