b686ad253b
The Craft window answered from a copy a feed refreshed once a frame, and rebuilt and signalled there. **Reference** - The build (`0x4f60c0`) zeroes its counts and, with no craft type open or no player, leaves before CRAFT_UPDATE (`0x4f661a`). The open, SMSG_PET_SPELLS, the record callback, learn and unlearn, and the item watchers rebuild it. - The getters read at the call (`0x4f6c3b`, `0x4f6d52`, `0x4f6fe6`, `0x4f76b2`, `0x4f7a3c`). - GetCraftDescription falls back to the taught spell's text (effect 36 or 57), with the pet flag (`0x4f7b53`). **Changed** - The build and the getters read through the host, and a build with no player empties silently. - The description takes the fallback and the pet flag; the VM fills its templates in the call. - `feed_craft` is gone; the trainer and the window share one token helper. **Tests:** each getter read between two packets, CRAFT_UPDATE between its neighbours, the silent build, the description fallback. Part of #2168 and #2217. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>