374556aef3
The game-speed, game-time update and game-time set messages were dropped. The login time packet also applied a malformed body and kept unset fields as 31 and 63. Reference: each handler reads its body, refuses one not exactly its length with the "Malformed message" line, and decodes an all-ones field as -1 (`0x642b30`): - **Set** steps back a minute and advances (`0x6434d0`), so an unset field lands at 00:01. - **Sync** steps forward or banks a skip count (`0x6436c0`). - **Frame tick** pays the skip (`0x6435a0`). It runs from world entry to logout (`0x401684`, `0x401f04`). - **Rate** is clamped to [1/60, 60], NaN kept (`0x643820`). Changed: the four bodies parse with exact-length goldens, and the clock is a port of the reference's, ticking only in the world. The day number uses UTC civil days, a written deviation from `mktime`. Tests pin each step. Fixes #2056 Fixes #2082 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>