Tighten multiplayer transport callback ownership
This commit is contained in:
parent
c1010458f8
commit
5c192b0fa4
5 changed files with 684 additions and 116 deletions
|
|
@ -226,7 +226,7 @@ transition.
|
|||
is narrower now too: the entry-side match key `[entry+0x50]` is no longer just an opaque request
|
||||
field. The profile-key callback lanes feed
|
||||
`multiplayer_transport_parse_selector_view_probe_marker`, which decodes one local `X%sX|%d` marker
|
||||
into a request id plus companion value, and
|
||||
into a probe request id plus displayed version/build integer, and
|
||||
`multiplayer_transport_arm_selector_view_probe_tracking` stores those into `[entry+0x50]` and
|
||||
`[entry+0x54]` before arming the live probe gate at `[entry+0x58]`. The current-selector callback
|
||||
root at `0x59f8b0` is now bounded as well: it resolves and upserts the active selector name,
|
||||
|
|
@ -248,17 +248,194 @@ transition.
|
|||
`[entry+0x98]`, clears `[entry+0x7c]`, stamps the last-success tick at `[entry+0x6c]`, appends the
|
||||
returned sample into the short rolling history at `[entry+0x84..]`, grows the bounded sample-count
|
||||
`[entry+0x94]` up to four, computes the current average into `[entry+0x80]`, and then publishes
|
||||
that averaged sample through `multiplayer_transport_enqueue_callback_slot24_record`. So the
|
||||
publication boundary is explicit and the request-id ownership is explicit, even though the exact
|
||||
user-facing meaning of the sample and the companion value at `[entry+0x54]` is still open. The
|
||||
that averaged `ms` sample through `multiplayer_transport_enqueue_callback_slot24_record`. So the
|
||||
publication boundary is explicit and the request-id ownership is explicit: `[entry+0x80]` now
|
||||
reads as the averaged millisecond probe sample and `[entry+0x54]` as the displayed version/build
|
||||
companion integer. The adjacent route-callback side is tighter too, but it is now kept separate:
|
||||
the staged route-callback path at `0x5958e0` and the later compatibility gate at
|
||||
`multiplayer_transport_route_binding_matches_route_callback_descriptor_tuple` `0x595d00` operate
|
||||
on a compact GameSpy-style server or route descriptor family with a primary endpoint tuple at
|
||||
`[descriptor+0x00]/[+0x04]`, an optional secondary endpoint tuple at `[descriptor+0x08]/[+0x0c]`,
|
||||
string-key lookups such as `hostname` and `gamever`, and numeric-key lookups such as
|
||||
`numplayers`, `numservers`, `numwaiting`, and `gsi_am_rating`. The route-binding side uses that
|
||||
descriptor family's primary dword and host-order port plus the optional secondary tuple against
|
||||
route-binding offsets `+0x54/+0x58` and route word `+0x30`. Current evidence still does not prove
|
||||
that descriptor tuple is the same field family as the selector-view marker companion integer at
|
||||
`[entry+0x54]`. The higher compact decode owners are tighter now too: `0x5907d0` is the
|
||||
allocate-and-append lane for one self-consistent compact payload, while `0x590d00` is the keyed
|
||||
upsert-by-primary-endpoint lane that reuses an existing descriptor when possible and then notifies
|
||||
the owner callback. The route-callback-table runtime above that decode side is tighter now too:
|
||||
`multiplayer_transport_route_callback_table_construct` `0x5905e0` seeds one transport-owned
|
||||
table block, `multiplayer_transport_route_callback_table_release_decoded_schema_dictionary`
|
||||
`0x5906f0` tears down the decoded schema dictionary rooted at `[this+0x08]`,
|
||||
`multiplayer_route_callback_runtime_acquire_shared_string_copy` `0x590540` and
|
||||
`multiplayer_route_callback_runtime_release_shared_string_copy` `0x5905a0` now bound the shared
|
||||
string pool used by that decoded schema, and the higher bring-up owner `0x596090` now clearly
|
||||
splits between `[transport+0xba4]` with owner callback `0x595a40`, the local field-cache family
|
||||
`[transport+0x1724]` seeded through `0x5a08f0/0x595b60`, and `[transport+0x1164]` with owner
|
||||
callback `0x595bc0`, while
|
||||
`multiplayer_transport_route_callback_table_service_receive_decode_state_machine` `0x5908c0`
|
||||
is the current live receive/decode state machine serviced by `0x591290` in table states `2/3`.
|
||||
The route-handle lifecycle above that decode path is tighter now too: `0x590740` cleanly resets
|
||||
one table's live route plus decode-side runtime without destroying the outer object; `0x5907a0`
|
||||
is the broader destroy path that also releases the active descriptor collection; `0x590ed0`
|
||||
opens the live route handle into `[this+0x4a0]`, stages the initial outbound request, and seeds
|
||||
state `3` plus the staged receive buffer; `0x5911e0` is the state-`2/3` socket-service wrapper
|
||||
that reads new bytes, grows the staged buffer, and re-enters `0x5908c0`; `0x5912c0` is the
|
||||
one-shot send-with-reopen-retry helper; and `0x590ea0` is the shared disconnect publication and
|
||||
reset tail. The recurring service helper `0x591290` is tighter too: it now first clears the
|
||||
staged intrusive descriptor list through `0x590490` before entering the state-driven seed-or-
|
||||
receive branch. The upstream owners are tighter too: `0x5962e0` is now the field-subscription
|
||||
route-table opener above `[transport+0xba4]`, while `0x596530` is the `gsi_am_rating` reopen
|
||||
path above `[transport+0x18bc]`. On that latter branch, `0x590dc0` is now bounded as the
|
||||
state-`0` raw-endpoint seed pass over the live route handle, repeatedly pulling endpoint tuples
|
||||
through `0x58bc7e` record type `0x1f3` before stamping descriptor flag byte `0x15` with `0x11`.
|
||||
That makes the remaining source-flag meaning narrower too: current evidence now supports reading
|
||||
byte-`0x15` bit `0x1` as a primary-endpoint-seed or endpoint-only marker. In the `gsi_am_rating`
|
||||
dispatcher, clear-bit descriptors can take the richer direct transition lane, while set-bit
|
||||
descriptors are staged through the queued enrichment path and still suppress that direct
|
||||
transition even after the ready bit arrives.
|
||||
The adjacent capacity-descriptor side is tighter too: `0x595bc0` now clearly publishes a
|
||||
descriptor block from live descriptor properties `hostname`, `numwaiting`, `maxwaiting`,
|
||||
`numservers`, and `numplayers` plus three carried sidecar scalars. That sidecar at
|
||||
`[transport+0x1778]` is tighter now too: current evidence says it behaves as one cached pointer
|
||||
into the transient work-record family at `[transport+0x1780]`, because every meaningful branch
|
||||
in `0x595bc0` reads the same `+0x0c/+0x10/+0x18` metadata triplet and replay modes later consume
|
||||
the pointer through `0x5933a0`. The negative result is stronger too: local text-side xrefs still
|
||||
show no direct store to `[transport+0x1778]`, and a wider local sweep also failed to show any
|
||||
obvious `lea`-based replay-band writer, so the sidecar writer remains upstream of this leaf
|
||||
publisher. Mode `0` is now also tied more cleanly to the generic descriptor append-notify lane
|
||||
at `0x590370`, while mode `2` stays outside this helper as the separate
|
||||
remove-notify-and-stage path at `0x590430`. The opcode-`2` payload boundary is tighter too:
|
||||
`0x592ae0` now grounds that payload
|
||||
as a seven-dword block with an owned string slot at `+0x08`, so live mode supplies a populated
|
||||
payload while modes `3` and `5` deliberately enqueue an all-zero payload and reuse only
|
||||
the wrapper-side sidecar metadata. Those two modes are tighter now too: they are the live
|
||||
receive-state owner callbacks emitted by `0x5911e0 -> 0x5908c0`, not loose generic replay
|
||||
guesses. So those paths are better read as delayed metadata replays over one cached work record,
|
||||
not over a separate anonymous cache blob. The neighboring
|
||||
work queue is tighter too: `0x593330/0x593370/0x593380` now bound `[transport+0x1780]` as the
|
||||
construct/clear/destroy owner family, while `0x5933a0`, `0x5934e0`, and `0x593570` ground the
|
||||
remove, allocate, and completion side over that same collection. The small sibling `0x593400` is
|
||||
tighter too: it is a pure work-record uniqueness predicate over field `+0x0c`. Its caller is
|
||||
tighter now too: `0x58d720` is an immediate-drain quiescence gate over one transport context id,
|
||||
using `0x593400` for the queued work family at `[transport+0x1780]` and `0x592970` for the
|
||||
active opcode-record collection at `[transport+0x17fc]`. The strongest current read is that
|
||||
`0x5934c0` seeds that shared drain context id first, then the transport copies it into queued
|
||||
work field `+0x0c` and active opcode-record field `+0x14` before the immediate-drain roots wait
|
||||
on one shared disappearance test rather than on a vague settle loop. The currently grounded
|
||||
roots are `0x58df20`, the neighboring formatted selector-text publish path at `0x58dfb0`, and
|
||||
callback-table registration at `0x58e200`. The active-opcode side is tighter too: `0x5927b0`
|
||||
now bounds the per-record service-and-retire path, `0x592800` the wider context-or-idle sweep,
|
||||
`0x5929a0` the remove-by-opcode-type sweep, and `0x5929f0` the narrower opcode-`3`
|
||||
field-snapshot removal keyed by the subscribed callback-pair payload. That also corrects
|
||||
`0x595b80`, whose final cleanup is an active field-snapshot purge rather than a queued-work
|
||||
drain. The adjacent route-callback descriptor-table lifecycle is tighter too: `0x590410` now
|
||||
grounds `[table+0x5bc]` as the staged intrusive descriptor-list head, `0x590430` is the generic
|
||||
remove-notify-and-stage lane, `0x590490` releases the staged list, and `0x5904d0` releases the
|
||||
active descriptor collection before tearing that staged list down. That also makes the earlier
|
||||
`0x5962e0` “release active descriptors” step explicit. The callback-table attach side now constrains the
|
||||
same work-record metadata family a little further too: `0x593650` deliberately duplicates one
|
||||
caller metadata dword into both fields `+0x0c` and `+0x18`, while preserving the remaining
|
||||
caller callback function pointer in `+0x10`. The lower opcode wrappers are tighter now too:
|
||||
`0x592a40` and `0x592a70` both consume that staged triplet in the order `( callback fn +0x10,
|
||||
callback companion +0x18, drain context id +0x0c )`. The producer side is tighter too:
|
||||
bound-route requests, selector-text route requests, and the type-`9` text fastpath also stage
|
||||
that same triplet through `0x5934e0`, and the fastpath shim `0x593d00` now gives the cleanest
|
||||
proof of the callback split by only re-emitting the follow-on lane when `+0x10` is nonnull and
|
||||
then forwarding `(+0x10, +0x18, +0x0c)` into `0x593170` as callback function, callback
|
||||
companion, and trailing drain context. So the replay-side triplet is clearly a broader
|
||||
transport callback-wrapper family, not one fixed route-only tuple. The nearby
|
||||
field-subscription side is tighter too: `0x592b50` now clearly uses `[transport+0x1774]` as a
|
||||
cached progress percentage under `[transport+0xba4]`, and `0x5962e0` seeds that percentage to
|
||||
`1` just before the first immediate mode-`3` snapshot. The nearby route-callback-table
|
||||
lifecycle is tighter now too: `0x596090` seeds `[transport+0xba0]` as the callback-plumbing
|
||||
enable latch, clears staged payload slot `[transport+0xb50]`, and constructs the three owner
|
||||
branches rooted at `[transport+0xba4]`, `[transport+0x1164]`, and `[transport+0x18bc]`. The
|
||||
matching local cleanup is tighter too: `0x5962c0` is the explicit staged route-callback payload
|
||||
clear on `[transport+0xb50]`, while `0x595ce0` now clearly resets only the capacity-descriptor
|
||||
route callback table at `[transport+0x1164]`, not the field-subscription table at
|
||||
`[transport+0xba4]`. The remaining gap on the capacity side is
|
||||
therefore narrower: mainly the still-unrecovered writer that stages `[transport+0x1778]`. The
|
||||
carried sidecar fields themselves now read more cleanly as the cached callback-wrapper triplet
|
||||
reused elsewhere (`drain context id +0x0c`, `callback fn +0x10`, `callback companion +0x18`),
|
||||
and the negative result is stronger too: nearby replay-band fields `[transport+0x176c]`,
|
||||
`[transport+0x1770]`, `[transport+0x1774]`, `[transport+0x177c]`, `[transport+0x1780]`, and
|
||||
`[transport+0x1784]` all have direct local owners while `[transport+0x1778]` still appears only
|
||||
as the single read in `0x595bc0`. So the remaining writer looks upstream and indirect rather
|
||||
than like one missing ordinary field store in the local cluster. The adjacent staged-route
|
||||
callback side is tighter too: `0x595860` is now bounded as the
|
||||
submit-result handler beneath `0x5958e0`, and the old `[transport+0xac0]` ambiguity there is now
|
||||
gone. That branch is using the already-grounded third selector-generation counter at `[0xac0]`
|
||||
together with target `[0xb48]` to decide whether staged route-callback traffic can push the
|
||||
multiplayer route-mode ladder from `2` into `3` and later `4`. The selector-view counter beneath
|
||||
that gate is tighter now too: `0x594e30` counts slot-`2` entries whose flag dword carries bit
|
||||
`0x20`, optionally filtered by the current transport name buffer. The selector-view mutation
|
||||
family under that same lane is tighter too: `0x594a30` is now the direct keyed-store remover,
|
||||
`0x594fb0` clears one selector-slot ownership pointer plus its slot-local flag dword and drops
|
||||
the whole entry when no slots remain, `0x595010` rekeys one selector-view entry under a new name
|
||||
while preserving the `0x40..` runtime band, and callback root `0x59f9c0` now reads as the
|
||||
sibling lane that clears one named selector-view slot, publishes callback slot `18`, and may
|
||||
still re-enter the route-mode setter from the same slot-`2` status and generation gates. The
|
||||
neighboring callback roots are tighter now too: `0x5950a0` clears one selector slot from every
|
||||
selector-view entry in the keyed store, `0x59fab0` is the rename or relabel sibling above
|
||||
`0x595010`, `0x59faf0` updates one selector slot's fixed sample-text buffer and refreshes the
|
||||
active selector object when present, and `0x59fb60` replaces one selector slot's name set,
|
||||
requests the default profile-key bundle for that slot, and publishes callback slot `20`. Slot
|
||||
`16` is tighter now too: current grounded caller `0x59f440` forwards the staged route-callback
|
||||
payload handle from `[transport+0xb50]` through `0x592ea0` just before route mode `5`. The
|
||||
last adjacent callback root in that block is tighter now too: `0x59fbd0` is the built-in
|
||||
per-slot profile-key query sibling. It resolves the caller selector name into one slot index,
|
||||
forwards the caller trio into `0x596b90`, and then publishes callback slot `28`; that lower
|
||||
helper indexes one slot-specific built-in string pair from `[transport+0x189c]` and
|
||||
`[transport+0x18ac]`, reuses the generic per-key handler `0x596970`, and only republishes slot
|
||||
`28` when that lower query path succeeds.
|
||||
The compact-header side is tighter now too: `0x58fe20` and `0x58ff20` now show that compact
|
||||
payloads always carry the primary IPv4 dword and that header bit `0x10` only gates whether the
|
||||
primary port word is inline or inherited from the owner default port. `0x58fe90` now validates
|
||||
the `0x40` inline keyed-property vector against the owner schema, and `0x58fe50` validates the
|
||||
signed-`0x80` trailing string-pair tail before decode. `0x58ff60` then grounds bit `0x02` as
|
||||
the inline secondary IPv4 dword branch, bit `0x20` as the paired secondary-port word branch with
|
||||
owner-port fallback, bit `0x08` as one still-unresolved auxiliary dword stored at
|
||||
`[descriptor+0x10]`, bit `0x40` as one inline keyed-property vector decoded through the
|
||||
property-store writers, and signed bit `0x80` as one trailing string-pair tail. The
|
||||
descriptor-state side is tighter now too: the shared queue helper at
|
||||
`0x005a09a0` stamps pending state `0x4` for the local field-cache family `[transport+0x1724]`
|
||||
and pending state `0x8` for the `gsi_am_rating` queued-descriptor family `[transport+0x1e7c]`,
|
||||
while later service through `0x005a0c80` promotes those pending tags into ready bits `0x1` and
|
||||
`0x2` in descriptor byte `[entry+0x14]`. That makes the current transport-side tests cleaner:
|
||||
`0x58d1c0` is the field-cache ready gate, `0x58d1d0` is the `gsi_am_rating` queued-descriptor
|
||||
ready gate, and `0x58d230` is the remaining flag-byte split between direct primary-endpoint
|
||||
handling at `[transport+0x18bc]` and the queued path at `[transport+0x1e7c]`. That byte-`0x14`
|
||||
story is no longer queue-only either: `0x58ff60` can also OR in bit `0x1` after the inline
|
||||
keyed-property vector and bit `0x2` after the signed string-pair tail. The flag-byte split is no
|
||||
longer purely behavioral either: current evidence now says byte `[descriptor+0x15]` bit `0x1` is
|
||||
a source-side descriptor header bit, explicitly seeded during the primary-endpoint table refresh
|
||||
around `0x590dc0` and preserved by the compact descriptor decode path at `0x58ff60`, rather than
|
||||
a queue-generated runtime state. The `gsi_am_rating` dispatcher side is tighter too: that same
|
||||
bit no longer just looks like a direct-versus-queued routing split, because `0x595e10` also uses
|
||||
it to suppress the direct `0x595dc0` transition even after queued ready bit `0x2` is present.
|
||||
The descriptor body is tighter too: `[descriptor+0x20]` is now the intrusive next-link used by
|
||||
the transport-owned primary-endpoint list headed at `[table+0x5bc]`, and `[descriptor+0x1c]` is
|
||||
now the special numeric scalar behind the current `queryid`/`ping` fallback pair. The compact-only
|
||||
auxiliary dword at `[descriptor+0x10]` is tighter in a negative way too: local xref scans now
|
||||
only show it being preserved by later generic helpers like
|
||||
`generic_record_0x1c_deep_copy_with_owned_string_at_0x08` `0x591410` and the adjacent
|
||||
callback-marshaling wrappers `0x591480` and `0x591510`, not read through any dedicated semantic
|
||||
accessor yet. The route-event dispatcher side is tighter too: the mode-`5` tails in both
|
||||
callback families do not copy a descriptor-local field but instead mirror the transport-staged
|
||||
companion dword at `[this+0x490]` into `[this+0x54]` and the local field-cache family. The
|
||||
`gsi_am_rating` maintenance lane is tighter now too: after pruning failed descriptors it sorts
|
||||
the surviving primary-endpoint table through `0x590310` in mode `1` with key `gsi_am_rating`,
|
||||
then selects the new head through `0x590480` before re-entering the route-transition path. The
|
||||
same service loop also owns a slower sidecar lane keyed off `[entry+0xa4]`:
|
||||
`multiplayer_transport_select_stale_selector_view_progress_entry` walks the store through
|
||||
`multiplayer_transport_pick_stale_selector_view_progress_entry`, picks one stale entry whose
|
||||
progress latch `[entry+0x9c]` is clear and whose last progress tick `[entry+0x70]` is old enough,
|
||||
and then hands it to `multiplayer_transport_stage_selector_view_progress_snapshot`. That helper
|
||||
now looks more bounded too: it rebuilds the marker text from `[entry+0x50]` through
|
||||
`multiplayer_transport_format_selector_view_probe_marker`, formats one `PNG %s %d` line around
|
||||
that marker and the entry-local selector-view sample at `[entry+0x80]`, appends bounded
|
||||
now looks more bounded too: it rebuilds the core `X%sX` marker text from `[entry+0x50]` through
|
||||
`multiplayer_transport_format_selector_view_probe_marker_core`, formats one `PNG %s %d` line
|
||||
around that marker and the entry-local averaged millisecond sample at `[entry+0x80]`, appends bounded
|
||||
selector-slot `PNG` fragments for live overlapping slots, marks progress-snapshot state in flight
|
||||
at `[entry+0x9c]`, and stamps both `[entry+0x70]` and the transport-wide throttle tick
|
||||
`[transport+0xaec]`. So the selector-view sidecar no longer looks like one undifferentiated
|
||||
|
|
@ -322,7 +499,14 @@ transition.
|
|||
seed to `multiplayer_transport_handle_validated_route_cookie_event` `0x005972c0`. That helper
|
||||
either marks route progress and re-enters `multiplayer_transport_set_route_mode`, or forwards the
|
||||
event id plus payload into the owner callback at `[transport+0x17f0]` with context
|
||||
`[transport+0x17f8]`. Subtype `6` still validates the same cookie, dedupes one 32-bit cookie or
|
||||
`[transport+0x17f8]`. The surrounding status-route callback vector is tighter now too:
|
||||
`0x005970e0` publishes either the active selector text or the averaged probe sample at
|
||||
`[entry+0x80]` and otherwise falls back to owner callback `[transport+0x17e0]`;
|
||||
`0x00597180` is a straight owner-forwarding lane through `[transport+0x17e4]`;
|
||||
`0x005971b0` seeds the local status-control id list and can then notify owner callback
|
||||
`[transport+0x17e8]`; and `0x00597270` returns the third selector-slot generation counter
|
||||
`[transport+0xac0]` on its bounded local branch before falling back to owner callback
|
||||
`[transport+0x17ec]`. Subtype `6` still validates the same cookie, dedupes one 32-bit cookie or
|
||||
packet id, and then dispatches the trailing payload through the natneg-or-raw callback layer
|
||||
rooted at `[route+0xa0]` and `[route+0xa4]`. This separates the shell-frame preview refresh at
|
||||
`0x006cd8d8` from the actual transport cadence at `0x006cd970`, and also separates that transport
|
||||
|
|
@ -505,10 +689,11 @@ transition.
|
|||
resolver is tighter now too: `scenario_state_compute_issue_opinion_multiplier` `0x00436590` is no
|
||||
longer just an abstract issue table lookup because its merger callsite uses issue id `0x3a`, which
|
||||
lines up directly with localized id `726` saying merger votes depend on public attitude toward the
|
||||
management of the two companies. By contrast the public-support helper
|
||||
`company_compute_public_support_vote_scalar` `0x00424fd0` uses the broader issue id `0x37`, which
|
||||
currently looks like a more general company-management or public-sentiment slot rather than the
|
||||
merger-only attitude term. The supporting stat layer is bounded more cleanly now too: the
|
||||
management of the two companies. By contrast the broader support-adjusted share-price helper
|
||||
`company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0` uses the broader issue
|
||||
id `0x37`, which currently looks like a more general company-management or public-sentiment slot
|
||||
rather than the merger-only attitude term. The supporting stat layer is bounded more cleanly now
|
||||
too: the
|
||||
surrounding `0x0b` setup in the merger and takeover offer builders is formatter mode rather than a
|
||||
player-facing issue number, while the company-side stat wrapper
|
||||
`company_read_year_or_control_transfer_metric_value` `0x0042a5d0` now reads as a generic
|
||||
|
|
@ -1025,8 +1210,10 @@ transition.
|
|||
shared hundredths-scaled build-version query
|
||||
`runtime_query_hundredths_scaled_build_version` `0x00482e00` over `0x006cec74`. The current
|
||||
caller thresholds `>= 0x67`, `>= 0x68`, `>= 0x69`, and `>= 0x6a` now line up with executable
|
||||
build values `1.03`, `1.04`, `1.05`, and `1.06`, so this split is no longer best-read as a
|
||||
time- or era-side cutover at all. That lower split is tighter now too:
|
||||
build values `1.03`, `1.04`, `1.05`, and `1.06`, and the version source itself can come from
|
||||
the multiplayer companion path as well as the local executable, so this split is no longer
|
||||
best-read as a time- or era-side cutover at all. It now reads more cleanly as a pre-`1.03`
|
||||
versus `1.03+` route-metric compatibility dispatcher. That lower split is tighter now too:
|
||||
`0x004a5280` is the weighted recursive branch with heuristic ordering, per-tracker best-cost
|
||||
cache `0x006cfcac`, and prune threshold `0x006cfcb0`, while `0x004a5900` is the alternate
|
||||
recursive neighbor-walk branch that stays within compatible component labels through
|
||||
|
|
@ -1137,9 +1324,17 @@ transition.
|
|||
`0x00407bd0` was only revisited on the longer interval.
|
||||
That heavier sibling is now bounded too:
|
||||
`company_rebuild_linked_transit_autoroute_site_score_cache` `0x00407bd0` no longer looks like a
|
||||
generic tail refresh. It reuses the fast peer tables, rolls candidate-local service metrics and
|
||||
peer-route deltas back into three per-site cache floats at `+0x0e`, `+0x12`, and `+0x16`, and
|
||||
then feeds the neighboring selectors
|
||||
generic tail refresh. It reuses the fast peer tables, rebuilds candidate-local amount bands plus
|
||||
normalized issue-opinion scales, and then folds the peer-side route metrics back into three
|
||||
per-site cache floats with a cleaner split:
|
||||
`+0x12` is the raw surviving site-score total,
|
||||
`+0x0e` is the continuity-and-step-weighted companion total,
|
||||
and `+0x16` is the promoted final site-ranking lane chosen from the strongest grouped candidate
|
||||
bands.
|
||||
That also closes most of the cross-version impact question:
|
||||
the pre-`1.03` versus `1.03+` tracker metric split now looks like it mainly perturbs the weighted
|
||||
`+0x0e` lane and the promoted `+0x16` lane, not the raw `+0x12` total.
|
||||
That final lane then feeds the neighboring selectors
|
||||
`company_select_best_owned_linked_transit_site_by_autoroute_score` `0x00408280` and
|
||||
`company_build_linked_transit_autoroute_entry` `0x00408380`. That makes the company-side follow-on
|
||||
read more like a linked-transit autoroute cache family than a generic company maintenance pass.
|
||||
|
|
@ -1160,9 +1355,19 @@ transition.
|
|||
its live roster through `company_count_owned_trains` `0x004264c0`, measure one aggregate linked
|
||||
transit site pressure through `company_compute_owned_linked_transit_site_score_total`
|
||||
`0x00408f70`, and then rebalance that roster through
|
||||
`company_balance_linked_transit_train_roster` `0x00409950`. Current grounded evidence says that
|
||||
pass prunes or upgrades older company-owned trains, then fills any remaining deficit by either
|
||||
packaging multiplayer opcode `0x75` or locally re-entering
|
||||
`company_balance_linked_transit_train_roster` `0x00409950`.
|
||||
The aggregate helper no longer reads as a raw sum either:
|
||||
it starts from the site-cache `+0x12` totals, converts that into one tentative roster target
|
||||
through year and site-count ladders, and on build `1.03+` adds one special distance-side scaling
|
||||
branch when exactly two eligible linked transit sites survive.
|
||||
Because it consumes `+0x12` rather than `+0x0e` or `+0x16`, current evidence now says the tracker
|
||||
compatibility split is more important for seeded route choice and ranked site choice than for the
|
||||
final company train-count target itself.
|
||||
The balancer then applies two age bands to company-owned trains:
|
||||
very old trains are removed when the roster already exceeds target or upgraded when it still
|
||||
needs capacity, while the mid-age band can trigger one narrower upgrade pass.
|
||||
After that it fills any remaining deficit by either packaging multiplayer opcode `0x75` or
|
||||
locally re-entering
|
||||
`company_try_add_linked_transit_train_and_publish_news` `0x00409830`. The two visible news
|
||||
helpers under it are bounded too: `0x00409830` emits RT3.lng `2896` for a newly added train,
|
||||
while `company_publish_train_upgrade_news` `0x00409300` emits RT3.lng `2897` for the upgrade
|
||||
|
|
@ -1228,12 +1433,15 @@ transition.
|
|||
`company_issue_public_shares_and_raise_capital` `0x00427450`. The threshold side is tighter now
|
||||
too. The earliest creditor-pressure lane requires scenario mode `0x0c`, the bankruptcy toggle
|
||||
`[0x006cec78+0x4a8f]` to be clear, at least `13` years since `[company+0x163]`, and at least
|
||||
`4` years since founding year `[company+0x157]`; it then scans the last three years of slots
|
||||
`0x2b` and `0x2c`, chooses one negative pressure ladder `-600000 / -1100000 / -1600000 /
|
||||
-2000000` from the current slot-`0x2c` bands around `120000 / 230000 / 340000`, requires public
|
||||
support at least `15` or `20` depending on whether all three sampled years failed, checks slot
|
||||
`0x09` against `0.08` times that ladder, and requires the three-year slot-`0x2b` total to clear
|
||||
one final `-60000` gate before it falls into the bankruptcy commit and RT3.lng `2881` headline.
|
||||
`4` years since founding year `[company+0x157]`; it then scans the last three years of the
|
||||
derived net-profits and revenue lanes `0x2b` and `0x2c`, chooses one negative pressure ladder
|
||||
`-600000 / -1100000 / -1600000 /
|
||||
-2000000` from the current slot-`0x2c` bands around `120000 / 230000 / 340000`, requires the
|
||||
broader support-adjusted share-price or public-support scalar at least `15` or `20` depending on
|
||||
whether all three sampled years failed, checks the current fuel-cost lane in slot `0x09` against
|
||||
`0.08` times that ladder, and requires the
|
||||
three-year slot-`0x2b` total to clear one final `-60000` gate before it falls into the
|
||||
bankruptcy commit and RT3.lng `2881` headline.
|
||||
The middle debt-capital layer is split more clearly now too. With `[+0x4a8b]` clear, one annual
|
||||
bond lane first simulates full repayment through `company_repay_bond_slot_and_compact_debt_table`
|
||||
and then uses the post-repayment cash window with fixed `-250000` and `-30000` thresholds plus
|
||||
|
|
@ -1243,24 +1451,35 @@ transition.
|
|||
suppress it, and `[+0x4a87]` is clear, it starts from one `1000`-share batch, can replace its
|
||||
default `1.0` factor with one linked-chairman personality scalar, scales that by `1.6` when
|
||||
growth setting `1` is active, and then runs one `800000` stock-value gate plus one
|
||||
support-times-factor-times-`1000`-times-`1.2` affordability gate before the repeated `1000`-share
|
||||
buyback commits behind RT3.lng `2887`. The ordering above this helper is tighter now too:
|
||||
support-adjusted-share-price-times-factor-times-`1000`-times-`1.2` affordability gate before the
|
||||
repeated `1000`-share buyback commits behind RT3.lng `2887`. The ordering above this helper is
|
||||
tighter now too:
|
||||
`company_service_periodic_city_connection_finance_and_linked_transit_lanes` clears those latches
|
||||
first, runs the city-connection and linked-transit branches, and only then enters the annual
|
||||
finance helper, so these look like same-cycle reaction gates rather than long-lived balance-sheet
|
||||
flags.
|
||||
After the earlier debt or bankruptcy outcomes stay inactive, the later stock-capital lane also
|
||||
has a bounded first threshold layer: with the bond and stock toggles `[+0x4a8b]` and `[+0x4a87]`
|
||||
clear, at least two bond slots live, and at least one year since founding, it derives one
|
||||
1000-share batch with floor `2000`, requires public support at least `22`, requires the support
|
||||
times batch product to clear `55000`, and then uses a piecewise approval ladder
|
||||
`0.07/1.3 -> 0.14/0.35` before the share-issue path proceeds.
|
||||
has a tighter bounded shape now too: it only opens on build `1.03+`, only after the earlier
|
||||
bankruptcy, bond, and repurchase outcomes stay inactive, and with the bond and stock toggles
|
||||
`[+0x4a8b]` and `[+0x4a87]` clear, at least two bond slots live, and at least one year since
|
||||
founding. It derives one issue batch from outstanding shares rounded down to `1000`-share lots
|
||||
with floor `2000`, trims that batch until the broader support-adjusted share-price scalar times
|
||||
batch no longer exceeds the `55000` gate, requires that scalar at least `22`, resolves the
|
||||
highest-coupon live bond slot, and then uses current cash from `0x2329/0x0d` as a gate against
|
||||
that slot's principal plus a small fixed buffer before it compares the chosen bond-rate lane
|
||||
against a normalized scalar ratio built from the same support-adjusted share-price lane and
|
||||
current `Book Value Per Share` from `0x2329/0x1d` through the piecewise approval ladder
|
||||
`0.07/1.3 -> 0.14/0.35`. On success it issues two
|
||||
same-sized tranches through repeated `company_issue_public_shares_and_raise_capital` calls and
|
||||
publishes a separate equity-offering news family rooted at localized id `4053`, not the earlier
|
||||
debt or buyback headline family.
|
||||
The dividend side is bounded too: it requires the dividend toggle `[0x006cec78+0x4a93]` to be
|
||||
clear, mode `0x0c`, at least `1` year since `[company+0x0d2d]`, and at least `2` years since
|
||||
founding, then averages the last three years of slot `0x2b`, folds in the unassigned-share pool
|
||||
and the current `0x0d` band, applies the map-editor building-growth setting `[0x006cec78+0x4c7c]`,
|
||||
treats growth setting `1` as a `0.66` scale-down and setting `2` as a zeroing pass on the current
|
||||
dividend, quantizes surviving adjustments in tenths, and finally clamps against
|
||||
founding, then averages the last three years of the net-profits lane `0x2b`, folds in the
|
||||
unassigned-share pool and the current `0x0d` band, applies the map-editor building-growth
|
||||
setting `[0x006cec78+0x4c7c]`, treats growth setting `1` as a `0.66` scale-down and setting `2`
|
||||
as a zeroing pass on the current dividend, quantizes surviving adjustments in tenths, and
|
||||
finally clamps against
|
||||
`company_compute_board_approved_dividend_rate_ceiling` `0x00426260`.
|
||||
The linked-transit route-seeding side has one tighter sibling now too:
|
||||
`company_reset_linked_transit_caches_and_reseed_empty_train_routes` `0x00401940`. It clears the
|
||||
|
|
@ -1507,9 +1726,11 @@ transition.
|
|||
`shell_format_company_financial_summary_card` through
|
||||
`shell_company_detail_render_company_summary_card`, controls `0x947d` and `0x947e` now ground a
|
||||
bond maturity and repay panel through `shell_company_detail_render_bond_maturity_and_repay_panel`,
|
||||
control `0x9488` now grounds the debt or capital or dividend summary block through
|
||||
`shell_company_detail_render_capital_and_dividend_summary_panel`, control `0x948a` now grounds the
|
||||
per-share metrics block through `shell_company_detail_render_per_share_metrics_panel`, and the
|
||||
control `0x9488` now grounds the debt or credit or rate summary block through
|
||||
`shell_company_detail_render_debt_credit_and_rate_summary_panel`, control `0x948a` now grounds the
|
||||
share-value and dividend-payout block through
|
||||
`shell_company_detail_render_share_value_and_dividend_summary_panel`, while the broader six-row
|
||||
per-share stock-data family is now bounded under `shell_format_company_stock_data_panel`, and the
|
||||
adjacent territory selector lane is bounded through
|
||||
`shell_company_detail_select_territory_access_row`,
|
||||
`shell_company_detail_render_territory_access_row`,
|
||||
|
|
@ -1523,10 +1744,13 @@ transition.
|
|||
`shell_resolve_chairmanship_takeover_vote_and_commit_outcome`,
|
||||
`shell_present_chairmanship_takeover_vote_outcome_dialog`,
|
||||
`shell_resolve_merger_vote_and_commit_outcome`, and `shell_present_merger_vote_outcome_dialog`.
|
||||
The remaining company-side uncertainty is therefore narrower than before: the public-support side
|
||||
is now tighter too because `company_compute_cached_recent_performance_support_score` and
|
||||
`company_compute_public_support_vote_scalar` bound the recent-performance and public-support blend
|
||||
beneath those vote resolvers, `scenario_state_compute_issue_opinion_multiplier` now bounds the
|
||||
The remaining company-side uncertainty is therefore narrower than before: the broader support and
|
||||
valuation side is now tighter too because
|
||||
`company_compute_cached_recent_per_share_performance_subscore`,
|
||||
`company_compute_five_year_weighted_shareholder_return`, and
|
||||
`company_compute_public_support_adjusted_share_price_scalar` bound the recent per-share
|
||||
performance and investor-support/share-price blend beneath those vote resolvers,
|
||||
`scenario_state_compute_issue_opinion_multiplier` now bounds the
|
||||
next layer of optional company, chairman, and territory-specific opinion overrides on the active
|
||||
scenario state, and the broader stat-reader family around
|
||||
`company_read_control_transfer_metric_slot` and
|
||||
|
|
@ -1916,15 +2140,24 @@ transition.
|
|||
weight, `company_query_min_linked_site_distance_to_xy` at `0x00405920` provides the nearest
|
||||
linked-site distance term, `company_count_linked_transit_sites` at `0x00426590` provides one of
|
||||
the company-side caps, `company_compute_connection_bonus_value_ladder` at `0x00425320` supplies
|
||||
the bounded company-side value scalar, `company_compute_issue39_opinion_bias_scalar` at
|
||||
`0x00424580` contributes one smaller issue-`0x39` opinion term,
|
||||
the bounded company-side value scalar, and
|
||||
`company_compute_prime_rate_from_issue39_scenario_baseline` at `0x00424580` now bounds the
|
||||
shared prime-rate-side helper that this lane reuses beside the raw issue-`0x39` total,
|
||||
`scenario_state_sum_issue_opinion_terms_raw` at `0x00436710` now bounds the raw additive
|
||||
issue-total helper beneath that term, and `company_connection_bonus_lane_is_unlocked` at
|
||||
`0x00427590` is the small boolean gate above the ladder. Wider governance and CompanyDetail xrefs
|
||||
now tighten slot `0x2b` into a rolling shareholder-facing performance lane reused by annual
|
||||
shareholder-revolt or creditor-pressure checks and a per-share/history formatter, while `0x09`
|
||||
remains the narrower current governance-pressure term read after those broader gates. The wider
|
||||
sibling news owner above the same city-pair route family is bounded now too:
|
||||
now tighten slot `0x2b` into the rolling net-profits lane reused by annual finance checks and a
|
||||
per-share/history formatter, while the report-history descriptor table now aligns raw slot `0x09`
|
||||
with the Income Statement fuel-cost lane surfaced by tooltip `1309`. The wider result now reads
|
||||
more like recent net profits minus recent fuel burden than a governance-pressure term. That now
|
||||
also sharpens the annual finance lane at `0x00401c50`: the first bankruptcy branch reads as
|
||||
sustained cash-and-debt stress over recent profits and fuel burden, the later fallback branch as
|
||||
a deeper `-300000` cash / three bad years cleanup trigger, and the later stock-issue branch reads
|
||||
as a price-to-book-versus-coupon approval ladder rather than a generic support vote. The tail is
|
||||
cleaner now too: it compares total retired versus newly issued principal to choose the `2882..2886`
|
||||
debt headline family, then publishes `2887` separately from the accumulated repurchased-share
|
||||
count. The sibling news owner above the same
|
||||
city-pair route family is bounded now too:
|
||||
`simulation_try_select_and_publish_company_start_or_city_connection_news` `0x00404ce0`
|
||||
filters and scores candidate city entries, re-enters the same shared heavy builder through
|
||||
`city_connection_try_build_route_between_region_entry_pair` `0x00404c60` for the dense pair
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue