The body catalogue is a set; this is not. This client addresses 49,152 static
ids and has art for 39,189 of them, plus 4,244 land tiles of 16,384 -- and hues
multiply the statics by three thousand. So there is no manifest and no scan:
`assets.fetch` grows two more families (`static`, `land`) and answers the keys
the website's own data names.
`assets.fetch` becomes shared plumbing. BridgeAssets now owns the command, does
the reqId/consent/key-ceiling checks once, derives the family from the keys
themselves (§5 made the key the address; a request that also named its family
would have two places to be wrong and one of them silent) and dispatches to the
reader that registered it. A batch must be of one family, because the reply
carries one `catalog` id. `assets.sources` gains `families` -- additive, so the
protocol stays 8, and EXTRACTOR_VERSION stays 2 because no existing key's bytes
change.
Two traps, both in §4.5's family -- a confident, plausible, wrong picture:
- `Art.GetStatic` memoises into a static Bitmap[0xFFFF] and hands back the SAME
instance, while `Hue.ApplyTo` repaints in place. Hue a static once and the
plain key comes back hued from then on, and the next hue stacks on the last.
Measured on this client before the fix. `Files.CacheData` is now off for the
life of the process; `TryHue` re-checks it and refuses rather than risk it,
and the same flag decides whether a bitmap is ours to dispose.
- `PartialHue` decides whether a hue repaints every pixel or only the grey ones,
per item id, out of `tiledata.mul` -- 13,259 of 65,536 ids on this client.
Item 597 is a wooden screen with painted flowers: one mode reddens the
flowers, the other the whole screen. Both decode. The first cut of this reader
bound `TileData` to ServUO's OWN `Server.TileData` (the enclosing namespace
beats `using Ultima;`, and it has a PartialHue flag too), which compiled and
refused every hued key at runtime. Every such type is spelled `Ultima.` now.
Land takes no hue segment: the mode that decides how is an item flag and land
has no equivalent, so `land/3/h33` is refused rather than guessed. `h0` is not a
key either -- hue 0 means "not hued", and the plain key already names it.
Measured through the reader over the whole range: 39,189 statics and 4,244 land
tiles served, and the only refusals are the 9,963 + 12,140 empty index slots
§4.5 predicted. Nothing that carries art is refused.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4