diff --git a/docs/atlas/multiplayer.md b/docs/atlas/multiplayer.md index 5bcf6b8..5ea8be5 100644 --- a/docs/atlas/multiplayer.md +++ b/docs/atlas/multiplayer.md @@ -205,7 +205,14 @@ Highest-value open edge: wrappers `0x591480` and `0x591510`, but still no dedicated semantic reader has been recovered. So the main remaining uncertainty is the exact higher-level meaning of header bit `[descriptor+0x15] & 0x1`, plus whether `[descriptor+0x10]` ever matters outside that - preservation path. The route-event dispatcher side is cleaner too: + preservation path. The route-mode setter is clearer too: `0x595650` now reads as a compact + state machine over the transport-owned route tables, where mode `0` splits the `gsi_am_rating` + branch into direct primary-endpoint handling versus queued insertion, mode `1` adds the ready-bit + gate and the same queued fallback, mode `2` removes pending descriptors from the queued family, + mode `3` forces mode `2` when the primary-endpoint table is empty, mode `4` updates the deferred + route-status state around `[this+0x1ed4]` and `[this+0x1ed8]`, and mode `5` copies the staged + route companion dword at `[this+0x490]` into `[this+0x54]` while mirroring that value into the + local field-cache family. The route-event dispatcher side is cleaner too: the mode-`5` tails in both callback families do not copy a descriptor-local field. They mirror the transport-staged companion dword at `[this+0x490]` into `[this+0x54]` and the local field-cache family instead. The `gsi_am_rating` maintenance lane is tighter now too: it sorts the diff --git a/docs/control-loop-atlas.md b/docs/control-loop-atlas.md index 5296201..af77f3a 100644 --- a/docs/control-loop-atlas.md +++ b/docs/control-loop-atlas.md @@ -487,10 +487,15 @@ transition. context `[transport+0x17f8]`. The grounded live-route connect path at `multiplayer_transport_try_connect_live_route` does not currently perform any matching post-construction patch for `[route+0xa0]`, `[route+0xa4]`, or `[route+0xd4]`, and the higher - route-mode state machine now looks consistent with that: current grounded mode transitions switch - by releasing route objects through `multiplayer_gamespy_route_release_and_free` and rebuilding - them through `multiplayer_transport_try_connect_live_route`, not by mutating callback slots in - place. The parser behavior is now tighter as well: semicolon lines only dispatch when + route-mode state machine now looks consistent with that: `multiplayer_transport_set_route_mode` + latches the requested small mode at `[this+0x18b8]`, then uses mode `0` for the direct-versus + queued `gsi_am_rating` split, mode `1` for the ready-bit plus queued fallback, mode `2` for + pending-descriptor cleanup, mode `3` for the empty-table fallback, mode `4` for deferred + route-status recovery, and mode `5` for copying the staged route companion dword into `[this+0x54]` + and the local field cache. The current grounded mode transitions still switch by releasing route + objects through `multiplayer_gamespy_route_release_and_free` and rebuilding them through + `multiplayer_transport_try_connect_live_route`, not by mutating callback slots in place. The + parser behavior is now tighter as well: semicolon lines only dispatch when `[route+0xd4]` is non-null, and the subtype-`6` raw fallback only dispatches when `[route+0xa4]` is non-null. For the currently grounded transport-owned status and live routes, those two branches therefore remain optional and can cleanly no-op instead of implying a hidden mandatory callback