Extend atlas seam annotations across load/save and transport

This commit is contained in:
Jan Petykiewicz 2026-04-13 23:35:17 -07:00
commit 7b44279d7e
7 changed files with 1450 additions and 330 deletions

File diff suppressed because one or more lines are too long

View file

@ -18,7 +18,24 @@ The broader map-editor page owner is now bounded through
the paired overall growth selector whose effects later appear in the city-growth side of the
simulation. `map_editor_city_region_panel_construct` and
`map_editor_city_region_panel_handle_message` own the city-or-region editing lane with rename and
copy-industry-data flows. That copy side is tighter now too: the handler first enters
copy-industry-data flows. The adjacent economic tuning page is explicit now too:
`map_editor_economic_cost_slider_panel_construct` `0x004cadf0` registers
`map_editor_economic_cost_slider_dispatch` `0x004ca980` on six visible slider controls
`0x5bcd..0x5bd7`, re-publishes the current values from
`[world+0x0be2/+0x0be6/+0x0bea/+0x0bee/+0x0bf2/+0x0bf6]`, and pairs that band with the localized
captions `Prime Rate`, `Merger Premium`, and the construction/maintenance cost family
`Build Stations Cost` through `Steam Engine Cost`. The dispatch side writes those six floats
directly back into the same state band and mirrors the first lane into `[world+0x0bde]`, which
now ties the editor page directly to the `.smp` save/load plateau and the post-load/runtime
consumers grounded elsewhere in the atlas. The read-side presentation seam is explicit now too:
`map_editor_economic_cost_panel_refresh_preview_curve_and_numeric_rows` `0x004caaf0` is the
control-`0x5be1` sibling for that same page. It reads the live six-float band, builds one
preview curve from leading lane `[world+0x0be2]` plus the stepped multiplier table
`[world+0x0be6/+0x0bea/+0x0bee/+0x0bf2/+0x0bf6]`, and republishes the six formatted numeric
rows through the neighboring dynamic-text controls `0x5bce/0x5bd0/0x5bd2/0x5bd4/0x5bd6/0x5bd8`.
That closes the economic tuning page as one real save/load-facing editor family rather than only
a constructor plus one write-only slider dispatcher. The city-or-region copy side is tighter now too: the
handler first enters
`0x00420e00`, which rebuilds the selected region's profile collection `[region+0x37f]`, clones
the source region's live label-weight entries when a source region is present, and otherwise
reseeds a fixed default weight set through repeated `0x004206b0` calls. The no-source companion
@ -49,6 +66,13 @@ The broader map-editor page owner is now bounded through
region id `[region+0x23a]` by squared XY distance through `0x0051db80`, and returns `0` when no
qualifying region is found; `0x004220b0` is the small wrapper above it that returns the matched
region name `[region+0x356]` or the fallback localized scratch string at `0x0062ba90`.
The adjacent scenario-rule page is tighter on the same save/load axis too:
`map_editor_scenario_special_conditions_panel_clear_visible_row_band` `0x004cb1a0` and
`map_editor_scenario_special_conditions_panel_format_row_by_index` `0x004cb1c0` are now the
concrete range and row callbacks behind list control `0xa7fa`, so the persisted 49-dword
scenario-rule band `[world+0x4a7f..+0x4b3f]` is no longer only constructor-shaped in the atlas.
The constructor `0x004cb2b0` binds those callbacks, counts enabled rows directly from that same
dword band, and keeps the trailing scalar `[world+0x4b43]` in the same page family.
`map_editor_territory_panel_construct` and
`map_editor_territory_panel_handle_message` own the territory rename and border-remap lane;
`map_editor_locomotive_availability_panel_construct` plus
@ -69,26 +93,40 @@ The broader map-editor page owner is now bounded through
result is now a full chain rather than only the importer:
`scenario_state_rebuild_port_warehouse_cargo_recipe_runtime_tables` first imports those same five
lines into one repeated array of identical `0xbc`-byte runtime descriptors with no row-index
special casing, and the candidate-side rebuild pass at
special casing, while mode `3` keeps reseeding the primary token lane until it differs from the
one-row subordinate lane and then writes literal `1.0` into the subordinate amount slot
`[desc+0x48]`. The candidate-side rebuild pass at
`structure_candidate_collection_rebuild_runtime_records_from_scenario_state` `0x00412d70` then
projects those descriptors into the live structure collection at `0x0062b268` in two
availability-bank passes. The current local disassembly now shows that this bridge reuses live
candidate slots by prior ordinal field `[candidate+0x794]` when possible, otherwise allocates one
fresh candidate, clones from the current bank's template source candidate, and only then copies in
the imported recipe-line count, shared production-cap float, and packed `0xbc` descriptor strip
from scenario state. Each rebuilt candidate then feeds
from scenario state. The label side is narrower than the earlier note too: current local
disassembly of `0x00412d70` does not consult the recipe-book name at `[state+0x0fe8]` at all.
Instead it formats display stem `[candidate+0x04]` directly from one of two fixed built-in roots
chosen by availability bit `[candidate+0xba] & 1`, together with the current ordinal. Each
rebuilt candidate then feeds
`structure_candidate_rebuild_cargo_membership_and_scaled_rate_tables` `0x00411ee0`, which rebuilds
the per-cargo runtime summary tables. That helper now reads more concretely too: it clears both
emitted cargo-id tables at `[candidate+0x79c]` and `[candidate+0x7a0]`, rebuilds one local
`0x35`-cargo mark band from the descriptor strip, accumulates the scaled per-cargo runtime rates
into `[candidate+0xa1..+0xb8]`, and then allocates the two final compact membership tables from
the `mark>=1` and `mark>=2` sets with counts stored at `[candidate+0x7a4]` and `[candidate+0x7a8]`.
The same scan also makes the production-mode split explicit on the runtime side: descriptor mode
`0` uses the shared production cap at `[candidate+0x2a]` divided by the descriptor amount, while
nonzero mode bypasses that scaling path. The immediate sibling
emitted cargo-id tables at `[candidate+0x79c]` and `[candidate+0x7a0]`, clears the per-cargo
float band at `[candidate+0xa1..+0xb8]`, and fills one local `0x35`-cargo status scratch from
the descriptor strip. Each subordinate row contributes status `1` when the cargo is only
referenced and status `2` when the row is currently year-active, with the helper keeping the
maximum status per remapped cargo id through `0x0062ba8c+0x9a`. It then allocates the two final
compact membership tables from the `status>=1` and `status>=2` sets with counts stored at
`[candidate+0x7a4]` and `[candidate+0x7a8]`. The same scan also makes the production-mode split
explicit on the runtime side: descriptor mode `0` uses the shared production cap at
`[candidate+0x2a]` divided by the descriptor amount, while nonzero mode bypasses that scaling
path and publishes the row amount directly. At that point the candidate import strip is
structurally closed in current local evidence: the local import and rebuild seam is no longer
where the loader reconstructs runtime descriptor or membership tables, but only what the
unresolved supply-marker token family means before those already-grounded candidates are projected
back into live cargo ids. The immediate sibling
`structure_candidate_refresh_recipe_runtime_mode_flags_0x78c_0x790` `0x00411ce0`, which for
subtype byte `[candidate+0x32] == 2` scans the imported descriptor strip and derives two compact
post-import flags from mode `0` presence and subordinate-row presence. The stream-load side is
post-import flags from mode `0` presence and whether every mode-`0` descriptor keeps at least
one subordinate row. The stream-load side is
tighter in the same way: the constructor-side load owner
`structure_candidate_collection_construct_and_stream_load_runtime_records` `0x004131f0`
seeds global pool `0x0062b268` and immediately re-enters the broader collection importer
@ -99,14 +137,39 @@ The broader map-editor page owner is now bounded through
`0x00412ab0`, the collection aggregate subtotal pass over `[pool+0x8c..+0x9c]`, rebuilds the
fixed name catalog at `0x0061dbc2/0x0061dc09` for non-subtype-`1` zero-availability candidates
with live ids `<= 0x6e` via localized string `0x0b53`, and only then re-enters the same
named-availability refresh at `0x00412c10` before returning. The neighboring placed-structure
named-availability refresh at `0x00412c10` before returning. The broader scenario-state reset
side is explicit now too: `0x00436d10` is the shared reset-and-rebuild owner beneath startup and
world-entry paths. It zeroes the late scenario-state bands, seeds the fixed year defaults and
chairman-slot rows, rebuilds the two named availability collections at `[state+0x66b2]` and
`[state+0x66b6]`, re-seeds the twelve recipe books at `[state+0x0fe7]` from the fixed template
at `0x005c9f78`, refreshes selected-year state through `0x00409e80`, `0x00433bd0`,
`0x00435603`, and the year-gap scalar helper `0x00434130`, and only then re-enters
`0x00435630`, `0x0041e970`, `0x00412bd0`, and `0x00436af0`. The startup side is tighter now too:
`0x00438890` does not jump straight into one selector-specific file-load branch. It first
re-enters `0x00436d10`, mirrors one shell-managed label list from `0x006d4020+0x429b0` into local
state, allocates the common runtime pools (`0x0062ba8c`, `0x0062b268`, `0x0062b2fc`,
`0x0062ba88`, `0x006ada84`, `0x0062c120`, `0x006cfcbc`, `0x0062be10`, `0x006ceb9c`,
`0x006cea4c`, `0x006acd34`, `0x0062b244`), and pre-seeds named locomotive-availability rows
through `0x004350b0` before the profile selector at `[profile+0x01]` chooses tutorial,
setup-generation, or file-load lanes. The neighboring placed-structure
side is bounded too: global pool `0x0062b26c` comes from
`placed_structure_collection_construct_empty_runtime_pool` `0x00413230`, while the paired tagged
collection owners `0x00413280` and `0x00413440` now own the broader placed-structure stream
load/save path around tags `0x36b1/0x36b2/0x36b3` and the per-entry virtual load/save slots
`+0x40/+0x44`. The adjacent collection pass `0x00412ab0` is tighter in
the same way: it now reads as a pure stem-policy sweep that refreshes candidate dword `[+0xbc]`
from defaults `0x1869f/3/4` plus the fixed override table at `0x005edca8..0x005edd20`. The
from defaults `0x1869f/3/4` plus the fixed override table at `0x005edca8..0x005edd20`, with the
non-default `3/4` branches driven directly by post-import flag `[candidate+0x78c]` and subtype
byte `[candidate+0x32]`. The stream-load side is tighter too: `0x004120b0` now clearly reads the
fixed header fields first, allocates the descriptor strip as `count*0xbc + 1`, zeroes every
loaded `0xbc` descriptor slot before import, resolves primary mode-`0` cargo names from
`+0x08 -> +0x1c` and subordinate row cargo names from `+0x30 -> +0x44`, clamps descriptor start
year `[desc+0x20]` upward to the resolved cargo availability floor `[cargo+0x21]`, and only then
reruns `0x00411ee0` plus `0x00411ce0`. Its version gates are explicit too: bundles before
`0x3ed` omit `[candidate+0x3b..+0xbb]`, bundles before `0x3f2` keep the narrow `0x02`-byte form
of `[candidate+0xc0]`, nonzero `[candidate+0x4b]` forces `[candidate+0x47] = 1.0` and rescales
`[candidate+0x43]` to at least `0x1388`, and the later stem-index resolution first checks two
built-in alias stems before the full fixed row table at `0x005ed338..0x005edca4`. The
current local file-side result is now tighter too: the
grounded recipe-book root at `0x0fe7` is preserved byte-for-byte across the checked map/save
scenario pairs, so the loader can safely treat the twelve `0x4e1`-byte books as preserved
@ -122,16 +185,20 @@ The broader map-editor page owner is now bounded through
to the supply-half runtime branch and bypassing that scaling on the normalized demand half. The
lower gameplay side is tighter now too: `structure_candidate_query_cargo_runtime_summary_channels`
`0x00412650` is the first grounded consumer beneath that rebuild chain, because it lazily rebuilds
four per-cargo summary banks and returns one direct-supply channel, one cap-normalized supply
channel, one demand or input channel, and one scaled production-output subrow channel for a
requested cargo id. The internal indexing is tighter now too: the direct-supply lane indexes from
`[desc+0x1c]`, the demand or input lane uses that same resolved cargo id in the no-subrow branch,
and the scaled production-output lane indexes each subordinate row directly from
`[desc+0x44+row*0x1c]`, with no post-resolution failure guard between the importer writes and the
summary-bank updates. So the strongest current read is narrower than a full cargo-id decode: if
four per-cargo summary banks and returns one direct primary-cargo scalar channel, one cap-share
primary-cargo scalar channel, one nonzero-mode subrow channel, and one zero-mode cap-scaled
subrow channel for a requested cargo id. The internal indexing is tighter now too: the two
primary-cargo banks index from `[desc+0x1c]`, while both subordinate-row banks index each row
directly from `[desc+0x44+row*0x1c]`. The mode split is tighter in the same way: nonzero-mode
descriptors bypass the primary-cargo banks entirely and only feed the nonzero-mode subrow bank,
while mode-`0` descriptors either add their direct scalar to `[this+0x03a]` or, when subrows are
present, add one cap-share scalar to `[this+0x0a4]` and one cap-scaled row contribution to
`[this+0x178]`. There is still no post-resolution failure guard between the importer writes and
the summary-bank updates. So the strongest current read is narrower than a full cargo-id decode: if
the imported low-16 marker rows fail the exact matcher at `0x0041e9f0`, the resulting `0` ids
will still hit the first summary-bank bucket inside `0x00412650`, but the semantic meaning of
cargo id `0` itself remains ungrounded. The sibling helper
cargo id `0` itself remains ungrounded. So the remaining gap here is semantic only, not another
missing import or rebuild owner. The sibling helper
`structure_candidate_supports_or_references_cargo_id`
`0x004129d0` then uses those same banks plus the cached cargo-membership arrays to answer whether
a live candidate materially references a cargo at all. One compare step tighter, the raw line
@ -195,12 +262,13 @@ The broader map-editor page owner is now bounded through
cargo-name resolution unless another upstream transform exists.
The wrapper layer above that query no longer looks like a hiding place for special treatment
either. Local `objdump` now shows `0x00412960` simply summing the two supply-side floats returned
by `0x00412650`, while `0x004129a0` returns the single scaled production-output lane directly;
by `0x00412650`, while `0x004129a0` returns the single zero-mode cap-scaled subrow lane directly;
neither wrapper checks for cargo id `0` after the query returns. The broader world-side
accumulator at `0x0041e7be` is tighter in the same way: it calls `0x00412650`, requires all four
returned channels to be positive before continuing, queries one linked-instance count through
`0x00413940`, scales each of the four channel values by that count, and then writes the finished
quartet into candidate dwords `[candidate+0x8e/+0x92/+0x96/+0x9a]` while stamping
`0x00413940`, scales the direct-primary, cap-share-primary, nonzero-mode-subrow, and
zero-mode-cap-scaled-subrow lanes by that count, and then writes the finished quartet into
candidate dwords `[candidate+0x8e/+0x92/+0x96/+0x9a]` while stamping
`[candidate+0x8a]` from current world field `[0x006cec78+0x15]`. So the current strongest read
remains structural rather than semantic: unresolved marker rows can still propagate through the
first bank bucket, but the first place that meaning matters is a normal positivity-gated
@ -426,17 +494,19 @@ The broader map-editor page owner is now bounded through
when `0x004349a0` reports more than one active profile. After those gates it forwards target mode
`([shell+0x68] == 0)` into
`shell_set_editor_map_mode_and_refresh_detail_panel_world_and_graphics_side_effects` `0x00482e50`.
The adjacent startup-year strip is grounded now too:
`shell_command_raise_startup_selected_year_scalar_by_half_step_and_refresh_calendar` `0x00441cb0`
and `shell_command_lower_startup_selected_year_scalar_by_half_step_and_refresh_calendar`
`0x00441d20` are the paired registered commands beneath localized ids `0x0db5/0x0db6`. Both
The adjacent time-of-day strip is grounded now too:
`shell_command_increment_time_of_day_presentation_scalar_by_half_step_and_refresh_calendar`
`0x00441cb0` and
`shell_command_decrement_time_of_day_presentation_scalar_by_half_step_and_refresh_calendar`
`0x00441d20` are the paired registered commands beneath localized ids `0x0db5/0x0db6`, whose
RT3.lng captions are `Increment Time Of Day` and `Decrement Time Of Day`. Both
require active scenario state plus the same single-profile gate from `0x004349a0`, clear shell
dwords `[0x006cec74+0x233]` and `[+0x124]`, then adjust startup scalar `[0x006cec78+0xbfa]` by
`+0.5` or `-0.5` before re-entering
`world_set_selected_year_and_refresh_calendar_presentation_state` `0x00409e80` with absolute
counter `[0x006cec78+0x15]` and refreshing the live world view through `0x00439a80`. The exact
player-facing command labels are still open, but the static owner boundary is now clear: these
are not generic shell scalars, they are the paired half-step selected-year presentation commands.
counter `[0x006cec78+0x15]` and refreshing the live world view through `0x00439a80`. So the
registration-side identity is now closed: these are the paired half-step time-of-day
presentation commands, not generic shell scalars and not the earlier selected-year read.
The adjacent progress-status side is tighter now too:
`shell_build_percent_status_payload_clamped_0_to_100` `0x00441d90` is the shared save or load
progress payload builder, and
@ -889,7 +959,8 @@ The broader map-editor page owner is now bounded through
`0x00437d70`. That owner increments the shared shell counter at `[0x006d401c+0xc60]`, opens the
localized cheat prompt `2922` `Do I detect a cheater in the house?\n\nEnter code (or <ESC> to
cancel):`, and then scans the fixed 26-entry table at `0x005ee2c8`. The active selector strip is
now grounded: winner/loss strings `3618/3619/3620/3622` route through `0x004367c0`, selector `1`
now grounded: winner/loss strings `3618/3619/3620/3622` route through
`world_set_outcome_mode_and_copy_cheat_win_or_loss_status_text` `0x004367c0`, selector `1`
jumps to the out-of-line reset branch at `0x004d676c` that clears the selected-company stat bands
rooted at `[company+0x0cfb]`, `[company+0x0d7f]`, and `[company+0x1c47]`, selectors `2` and `3`
post deltas into the selected company and selected chairman profile through `0x0042a080` and
@ -958,10 +1029,11 @@ The broader map-editor page owner is now bounded through
refreshes the live company-detail branch in mode `7`, the stock-buy branch in mode `0x0b`, the
mode-`8` timed overlay only when the current subject id matches the caller dword, and the
`Overview.win` side in mode `9`. Its wrapper
`shell_refresh_active_window_followons_and_adjacent_station_or_company_lists` `0x00436170`
`shell_refresh_active_window_followons_and_adjacent_station_or_train_lists` `0x00436170`
forwards through that helper and then adds the station-list refresh through
`shell_station_list_window_refresh_rows_selection_and_status` `0x00506f30` when mode `4` is
active plus the company-list refresh through `0x005158f0(-1)` when mode `1` is active. The
active plus the `TrainList.win` refresh through
`shell_train_list_window_refresh_controls` `0x005158f0(-1)` when mode `1` is active. The
shared world-side follow-on beneath those shell branches is explicit now too:
`world_refresh_collection_side_effects_after_broad_state_change` `0x004361d0` sweeps the live
region, placed-structure, and three adjacent world collections, re-entering their per-record

View file

@ -4,16 +4,16 @@
`shell_active_mode_run_profile_startup_and_load_dispatch` at `0x00438890`, the shell-mode
switcher `shell_transition_mode` at `0x00482ec0`, the first grounded world-entry branch
`world_entry_transition_and_runtime_bringup` at `0x00443a50`,
`shell_map_file_world_bundle_coordinator` at `0x00445de0`, reference-database setup via
`map_bundle_open_reference_databases` at `0x00444dd0`, and narrower loaders such as
`map_load_geographic_label_database` and `map_load_city_database`.
`shell_map_file_world_bundle_coordinator` at `0x00445de0`, early reference-package save via
`map_bundle_open_reference_package_and_serialize_early_world_datasets` at `0x00444dd0`, and narrower tagged collection owners such as
`geographic_label_database_refresh_records_from_tagged_bundle` and `city_database_entry_collection_refresh_records_from_tagged_bundle`.
- Trigger/Cadence: shell tutorial launch, editor or detail-panel file actions through `fileopt.win`,
map-scenario open paths, and scenario-text export batch commands.
- Key Dispatchers: `shell_map_file_entry_coordinator`,
`shell_active_mode_run_profile_startup_and_load_dispatch`, `shell_transition_mode`,
`world_entry_transition_and_runtime_bringup`, `world_runtime_release_global_services`, `shell_map_file_world_bundle_coordinator`,
`map_bundle_open_reference_databases`, `map_load_geographic_label_database`,
`map_load_city_database`, `scenario_text_export_build_language_file`,
`map_bundle_open_reference_package_and_serialize_early_world_datasets`, `geographic_label_database_refresh_records_from_tagged_bundle`,
`city_database_entry_collection_refresh_records_from_tagged_bundle`, `scenario_text_export_build_language_file`,
`scenario_text_export_report_language_file`, `scenario_text_export_batch_process_maps`.
- State Anchors: shell-side file staging buffers at `0x0062bee0` and `0x0062bec4`, shell and mode
globals at `0x006cec74` and `0x006cec78`, world object root `0x0062c120`, map bundle state
@ -37,7 +37,31 @@
mode `11` is tighter now too: it still maps to `.gmt`, but instead of looking like another
gameplay save family it conditionally diverts into the same `.gmt` preview-surface pipeline owned
by the Multiplayer preview dataset object at `0x006cd8d8`, and only falls back to the normal
reference-bundle path when that dataset object is absent. The shell-side mode owner above those
reference-bundle path when that dataset object is absent. That fallback owner is tighter now too:
`0x00444dd0` is not a generic database opener, but the early package-save prelude that seeds the
shared stage/progress globals, opens one `0x30d40` bundle through `0x00530c80`, handles the
localized failure modal `0x0fda`, and then serializes the first direct package band in a fixed
order: chunks `0x32c8/0x32c9`, direct saves of `[world+0x66be]`, `[world+0x66b2]`, and
`[world+0x66b6]`, chunk `0x32dc`, the staged `0x108` profile block under `0x3714/0x3715`, then
`world_serialize_runtime_grid_and_secondary_raster_tables_into_bundle` `0x00449520` for the
early world-grid and sidecar-table band, then
`aux_candidate_collection_serialize_records_into_bundle_payload` `0x00416a70` for the direct
`0x0062b2fc` source-or-auxiliary record family, and only after that the neighboring reference
and manager families before `shell_map_file_world_bundle_coordinator` continues with the later
tagged collections. That `0x0062b2fc` seam is tighter now too: `0x00416a70` first builds one
temporary scored queue from each record's linked chain at `[entry+0x04]`, writes one leading
`0xbabe` header, and then serializes the fixed fields, counted dword runs, optional byte payload,
paired one-byte bands, and trailing dword for each queued record; the load-side companion is
`aux_candidate_collection_construct_stream_load_records_and_refresh_runtime_followons`
`0x004196c0`, which now clearly tails into
`aux_candidate_collection_rebank_or_clone_records_by_availability_pass_and_refresh_owner_links`
`0x00419230` before the later world-load side continues, with destructor
`aux_candidate_collection_release_templates_queues_and_indexed_storage` `0x00419680`. The fixed
tail is explicit now too: `0x00444dd0` writes one direct dword from
`[world+0x19]`, one zeroed `0x1f4`-byte slab under `0x32cf`, closes the package, derives the
preview path through `0x00442740`, and then conditionally emits the companion-image and
companion-payload sidecars through `0x00441f70` and `0x00442900` when `[world+0x66c8]` and
`[world+0x66c9]` are set. The shell-side mode owner above those
file coordinators is clearer now too. `shell_transition_mode` no longer reads like a generic mode
switch: its ABI is now grounded as a `thiscall` with two stack arguments because the body reads
the requested mode from `[esp+0x0c]` and returns with `ret 8`. The grounded world-entry
@ -52,6 +76,49 @@
`0x0062b2fc`, `0x0062b268`, `0x006cea4c`, and `0x006acd34` in that order before it drains the
shell-helper handle band `[world+0x46a80..+0x46aa0]`, the variable owner band `[world+0x46aa4]`,
and the linked chains at `[world+0x66a6]` and `[world+0x66aa]`.
The corresponding world-load allocation branch is tighter now too: inside `0x00438c70`,
`0x0062b2fc` is allocated as a `0xb8`-byte object and then constructed through
`aux_candidate_collection_construct_seed_globals_and_helper_bands_then_import_records`
`0x0041aa50`, which seeds the collection base, resets the neighboring constructor globals, builds
the helper bands at `[this+0x88/+0x8c/+0x90]` through `0x0041a990`, and only then tails into the
tagged import owner `0x004196c0`. The next two roots in the same load strip are now explicit
too: `0x0062ba8c` is allocated and constructed through
`structure_candidate_collection_construct_and_stream_load_records_then_refresh_counts`
`0x0041f4e0`, which enters the tagged import owner `0x0041ede0` and then refreshes the aggregate
filter/year-visible counts through `0x0041e970`; and `0x006ada84` is allocated and constructed
through `locomotive_collection_construct_and_stream_load_records` `0x00462520`, which enters the
linked-era locomotive import owner `0x00461f10` and then refreshes the live availability override
band through `0x00461e00`. The same fan-out now also has explicit constructor ownership for the
adjacent typed roots: the live company collection `0x0062be10` is constructed through
`company_collection_construct` `0x00429950`, the live profile/chairman collection `0x006ceb9c`
is constructed through `profile_collection_construct` `0x00477740`, the live train collection
`0x006cfcbc` is constructed through `train_collection_construct` `0x004b2340`, the sibling
indexed collection `0x006acd34` is constructed through
`runtime_object_collection_construct_vtable_5cae10` `0x00455320`, the support family
`0x0062b244` is constructed through
`support_collection_construct_seed_counters_and_clear_large_sideband` `0x0040aeb0`, and the live
world root `0x0062c120` is published through
`world_runtime_construct_root_and_seed_global_0x62c120` `0x0044cf70` before the heavier bundle
load body continues through `0x00449200` and `0x0044cfb0`. The profile-side tagged header
siblings are explicit too: runtime load re-enters
`profile_collection_refresh_tagged_header_counts_from_bundle` `0x00477780`, while package save
later mirrors the same `0x5209/0x520a/0x520b` trio back out through
`profile_collection_serialize_tagged_header_counts_into_bundle` `0x004777e0`. The same tagged
symmetry is now bounded for the live company collection too: world-load refresh re-enters
`company_collection_load_tagged_header_counts_and_refresh_live_records_from_bundle` `0x00429af0`,
while the package-save path mirrors the same `0x61a9/0x61aa/0x61ab` bracket through
`company_collection_serialize_tagged_header_counts_and_save_live_records_into_bundle`
`0x00429b90`, whose per-company callback is currently the no-op stub `0x00424000` while the
load-side per-company follow-on is `company_refresh_post_load_year_clamp_and_runtime_support_fields`
`0x004268e0`. The same tagged symmetry is now bounded for the live train collection too:
world-load refresh re-enters
`train_collection_load_tagged_header_counts_and_refresh_live_records_from_bundle` `0x004b2700`,
while the package-save path mirrors the same `0x5209/0x520a/0x520b` header bracket and per-train
record walk through
`train_collection_serialize_tagged_header_counts_and_save_live_records_into_bundle`
`0x004b27a0`; the per-train payload seam itself is now explicit too, with route-list load through
`train_refresh_tagged_route_list_payload_from_bundle` `0x004a84b0` and route-list save through
`train_serialize_tagged_route_list_payload_into_bundle` `0x004a7030`.
The later world-entry reactivation branch correspondingly uses `(1, esi)` rather than `(1, 0)`.
The current live hook probes now push the remaining auto-load gap much later too: on the
hook-driven path `shell_transition_mode(4, 0)` returns cleanly, and the full old-mode teardown
@ -89,30 +156,25 @@
ready-count log so the mode-`4` startup lane either stages immediately or shows exactly how far
the gate gets. That adjustment worked on the next run: the hook now stages and completes the
`shell_transition_mode` path again, with `LoadScreen.win` construction and publish returning
cleanly. But the post-publish startup subchain is still unresolved: there is still no trusted
`0x46c40` allocator hit, no direct `0x004336d0` entry, and no direct `0x00438890` entry. So
the next clean runtime boundary is the tiny `LoadScreen.win` scalar setter at `0x004ea710`,
which sits immediately before the `0x0053b070` allocation in the static mode-`4` branch. The
immediate next runtime check is even more concrete than the helper hook, though: inspect the
state that `0x004ea710` should leave behind. The hook now logs the post-transition
`LoadScreen.win` singleton, its field `[+0x78]`, `0x006cec78`, the shell state's `[+0x0c]`
active-mode object field, and the startup selector. If `0x004ea710` really ran on the mode-`4`
branch, `[LoadScreen.win+0x78]` should no longer be zero after `shell_transition_mode` returns.
The latest run answered that directly: after transition return, `field_active_mode_object` is
still the `LoadScreen.win` singleton, `0x006cec78` is still null, `[LoadScreen.win+0x78]` is
still zero, and the startup selector is still `3`. So the current best read is that RT3 is
still parked in the plain `LoadScreen.win` state at transition return rather than having entered
the separate runtime-object path yet. That shifts the best next runtime boundary from “deeper
inside `shell_transition_mode`” to “what later active-mode service tick, if any, promotes the
load-screen object into the startup-dispatch path.” The next run now logs the first few
shell-state service ticks after auto-load is attempted with that same state tuple
(`0x006cec78`, `[shell_state+0x0c]`, `0x006d10b0`, `[LoadScreen.win+0x78]`, selector), so the
next question is very narrow: does one later service tick finally promote the plain
`LoadScreen.win` state into the startup-runtime object path, or does it stay frozen as-is? The
internal selector split in `0x438890` is tighter now too: `[0x006cec7c+0x01]` is a separate
seven-way startup selector, not the shell mode id. Values `1` and `7` load `Tutorial_2.gmp` and
`Tutorial_1.gmp`, values `3/5/6` collapse into the same profile-seeded file-load lane through
`0x445ac0([0x006cec7c]+0x11, 4, &out_success)`, value `2` is a world-root initialization lane
cleanly. The post-publish startup subchain is no longer unresolved on the static side, though.
Direct disassembly of the mode-`4` branch at `0x0048302a..0x004830ca` now closes it completely:
after constructing `LoadScreen.win`, the branch sets shell state `[transition+0x08] = 4`,
chooses one page scalar `110.0f`, `236.0f`, or `5.0f`, writes that page id through
`shell_load_screen_window_set_active_page` `0x004ea710`, allocates one `0x46c40`-byte runtime
object through `0x0053b070`, resets it through
`world_runtime_reset_startup_dispatch_state_bands` `0x004336d0`, stores the result into
`0x006cec78`, and then directly enters
`shell_active_mode_run_profile_startup_and_load_dispatch` `0x00438890` as `(1, 0)` before
publishing the active-mode object back through `0x005389c0`. So the static startup chain after
`LoadScreen.win` publish is now explicit rather than inferred from the earlier hook traces. The
remaining runtime-side question is narrower: why the earlier hook snapshots still showed
`[LoadScreen.win+0x78] == 0` and `0x006cec78 == 0` immediately after transition return even
though the static mode-`4` branch does not leave those fields that way once it reaches the
startup-dispatch path. The internal selector split in `0x438890` is tighter now too:
`[0x006cec7c+0x01]` is a separate seven-way startup selector, not the shell mode id. Values `1`
and `7` load `Tutorial_2.gmp` and `Tutorial_1.gmp`, values `3/5/6` collapse into the same
profile-seeded file-load lane through `0x445ac0([0x006cec7c]+0x11, 4, &out_success)`, value `2`
is a world-root initialization lane
that allocates `0x0062c120` and then forces selector `3`, and value `4` is the setup-side world
reset or regeneration lane that rebuilds `0x0062c120` from `0x006d14cc/0x006d14d0` before later
world setup continues. The write side is tighter now too: `Campaign.win` writes selector `6`,
@ -346,11 +408,14 @@
sixteen-byte per-scenario campaign selector or unlock band consumed directly by `Campaign.win`.
The neighboring profile helpers are tighter now too: `0x0047bbf0` is the broad default reset for
the staged `0x108`-byte runtime-profile record, clearing the whole record and then reseeding the
visible setup and campaign anchors `[profile+0x77]`, `[profile+0x79]`, `[profile+0x7d]`,
`[profile+0x83]`, `[profile+0x87]`, and `[profile+0x97]`; and `0x0047bc50` is the compact scan
helper over `[profile+0xc6..+0xd5]` that returns the first selector byte below `2`, which keeps
that band tied to staged campaign progress or unlock state rather than to the earlier setup-panel
payload fields.
visible setup and campaign anchors `[profile+0x77]`, `[profile+0x79]`, `[profile+0x7d]`, the
random-like dword `[profile+0x83]`, the first setup row-marker byte `[profile+0x87]`, and the
file-backed launch or rehydrate latch `[profile+0x97]`; `0x00502c00` is now tighter on the same
slab because its file-backed lane copies the selected row's primary and secondary `0x32`-byte
string bands into `[profile+0x11]` and `[profile+0x44]` while arming presence byte
`[profile+0x10]`; and `0x0047bc50` is the compact scan helper over `[profile+0xc6..+0xd5]` that
returns the first selector byte below `2`, which keeps that band tied to staged campaign progress
or unlock state rather than to the earlier setup-panel payload fields.
The message-dispatch side is tighter now too. The local classifier at `0x004b91d8` routes the
control range `0x0c352..0x0c39b` through five concrete case classes: `0x0c352..0x0c361` enter
the shared selector or launch branch, `0x0c362..0x0c367` force local page `1`,
@ -441,10 +506,12 @@
`.gmp`, `.gmx`, `.gmc`, `.gms`, `.gmt`, `.smp`, `Quicksave`, the `0x004dd010` mode table at
`0x005f3d58`, the auxiliary-owner presence check at `0x00434050`, and the `.gmt` handoff through
`0x00469d30`, together with localized string evidence from ids `3018` and `3898`.
- Direct shell stubs above that coordinator are tighter now too: `0x004408b0` is the pure
zero-flag wrapper into `shell_map_file_world_bundle_coordinator`, while `0x004408d0` is the
sibling wrapper with flag triplet `(0, 1, 0)`. The exact user-facing command names for those two
wrappers are still open, but the dispatcher shape is no longer.
- Direct shell stubs above that coordinator are tighter now too: `0x004408b0` is the ordinary
`Save game` wrapper and forwards the pure zero-flag triplet into
`shell_map_file_world_bundle_coordinator`; `0x004408d0` is the sibling `Quick save` wrapper,
forwarding flag triplet `(0, 1, 0)`. RT3.lng closes the neighboring `shell_map_file_entry_coordinator`
pair in the same way: `0x00441ac0` is `Load game` and `0x00441af0` is `Quick load`, with the
same `(0, 0, 0)` versus `(0, 1, 0)` split above `0x00445ac0`.
- Open Questions: bit `0x1` on both broad coordinators now grounds the Quicksave name seed and the
former third `fileopt.win` flag has been ruled out as a file-flow question because it just opens
`SettingsWindow.win`. The old broad extension question is mostly resolved: `.gmp` is the

View file

@ -112,7 +112,11 @@
side is separated now too: `0x0046cce0`, `0x0046cd10`, `0x0046ce90`, and `0x0046d230` are the
current small latch/state owners under `0x006cd91c`, `0x006d1280`, `0x006d1284`, and
`0x006ce9c8`, while `0x0046cd30` and `0x0046ce10` are the paired current-session string/scalar
submit-and-apply handlers over `[entry+0x258c/+0x268c/+0x2690/+0x2694]`. The same callback table
submit-and-apply handlers over `[entry+0x258c/+0x268c/+0x2690/+0x2694]`. One neighboring
cross-subsystem callback is tighter now too: `0x0046cf40` mirrors one remote late
setup-preview/status payload block into `[world+0x66be]`, the same world band later serialized
and restored under bundle chunk ids `0x2ee0/0x2ee1` and re-normalized after restore through
`0x0047bc80`. The same callback table
also owns one small fixed transfer-progress family rooted at `0x006ce2e8`: `0x0046cfe0`
allocates the first free `0x5c` slot and optionally formats one label string, `0x0046d090`
appends progress payload into the matched slot while publishing one percent string through
@ -358,7 +362,9 @@
through `0x596090`, and on success refreshes the current status text at `[transport+0xaf4]`
before rerunning `0x5965d0(1)`. The same local pass also makes the negative boundary tighter:
setup still touches the surrounding callback-table and replay-band fields without ever seeding a
nonzero value into `[transport+0x1778]`, so that sidecar remains an upstream producer gap.
nonzero value into `[transport+0x1778]`, so the local static seam is closed here: no ordinary
constructor, reset, service, or callback-table owner in `RT3.exe` currently writes that sidecar,
and the producer looks upstream of this local cluster.
Beside it, `0x58e200` is the broader callback-table attach or refresh owner:
it seeds one immediate-drain context id, conditionally copies the local name into `[transport+0x04]`,
clears `[transport]`, `[transport+0x48]`, and `[transport+0x1edc]`, stores follow-on callback
@ -398,6 +404,12 @@
refresh path is tighter too: `0x59d5b0` builds one zeroed `0x1e0`-byte stub from the caller
string and appends it into the flat registered-name vector `[transport+0x54c]` through the
shared `generic_vector_push_back` helper `0x59e4d0`, while the smaller sibling `0x58e7a0` sits
beside it as the selector-slot text and registered-name removal path. The selector-text submit
owner itself is explicit now too: `0x593c40` is not just a generic “route request” wrapper. It
rejects null, empty, or `>= 0x101`-byte text, falls back to fixed sample `0x005c87a8` when the
caller sample pointer is null, allocates a type-`2` transient work record through `0x5934e0`,
stores the selector id in work field `+0x1c`, refreshes selector-side naming through
`0x59fc80/0x595140`, and only then hands the request into `0x58e720` with callback `0x593bb0`.
under `0x5954b0` and formats one selector-slot line before removing the corresponding
registered-name entry through `0x59d760`. The selector callback-name side under the same reset
tail is explicit now too: `0x596900` first walks the shared selector callback-name store at
@ -491,8 +503,16 @@
`multiplayer_transport_invoke_bound_route_callback_if_present` `0x592710`, which simply calls the
bound route's optional callback slot `[binding+0x14]` with companion argument `[binding+0x18]`.
When the tuple does not match, the same gate instead compares descriptor fields `maxplayers` and
`numplayers`; only a descriptor with spare capacity reaches that same callback handoff. Current
evidence now also closes the clone side of that staged path: `0x596270` copies the first nine
`numplayers`; only a descriptor with spare capacity reaches that same callback handoff. The owner
directly above that gate is explicit now too: `0x595dc0` first rejects when staged-route busy
latch `[transport+0x1e8c]` or selector-slot object `[transport+0x38c]` is live, then reuses the
same tuple-or-capacity result from `0x595d60`; only a positive result lets it refresh selector
state through `0x5973b0`, reset selector slot `2` through `0x5954b0`, stage the descriptor
through `0x5958e0`, and finally drop route mode back to `0` through `0x595650` when that staging
path fails. That makes the seam read as one bounded ladder instead of three isolated helpers:
descriptor tuple match or spare-capacity gate, optional bound-route callback handoff, then the
busy-latch-screened route-transition owner above it. Current evidence now also closes the clone
side of that staged path: `0x596270` copies the first nine
dwords of the source staged callback payload, clears the intrusive next-link, and then replays
the source keyed-property list through shim `0x596260`, which simply reinserts each owned
`(key,value)` pair into the clone's property store through `0x58d0f0`, before the clone is
@ -513,8 +533,12 @@
`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
`[transport+0x1724]` seeded through `0x5a08f0/0x595b60` with fixed stem `0x00629d50`, and
`[transport+0x1164]` with owner callback `0x595bc0`. The same constructor also builds the
`gsi_am_rating` primary-endpoint table `[transport+0x18bc]` from local transport name
`[transport+0x60]` plus suffix `0x005dccfc` under callback `0x595e10`, and seeds the queued
descriptor family `[transport+0x1e7c]` through `0x5a08f0/0x595f70` with fixed stem
`0x00629d54`, 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 callback-owner mode split above that runtime is now explicit too: append-notify `0x590370`
@ -548,7 +572,13 @@
route in mode `4` through `0x590ed0`. Success seeds cached progress percentage
`[transport+0x1774] = 1` and immediately enqueues one mode-`3` field snapshot through `0x592b50`;
failure falls back through the same clear path. `0x596530` is the `gsi_am_rating` reopen
path above `[transport+0x18bc]`. On that latter branch, `0x590dc0` is now bounded as the
path above `[transport+0x18bc]`, and that owner is tighter now too: when precondition
`[transport+0xba0]` is clear it does not even attempt the reopen and instead stamps
`[transport+0x1ed4] = 1`; otherwise it resets the am-rating route family, clears the callback
table rooted at `[transport+0x18bc]`, tries `0x590ed0(mode 4)` from stored route label
`[transport+0x1ed0]`, and only on success sets `[transport+0x1ec4] = 1` while clearing
`[transport+0x1ed4]`. 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
@ -560,15 +590,22 @@
`[transport+0x1ed4] = 1` and then picks route mode `1` or `3` based on whether deferred
descriptor pointer `[transport+0x1ed8]` is null, and mode `5` mirrors staged companion dword
`[transport+0x490]` into both `[transport+0x54]` and `[transport+0x1724+0x24]`.
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. Its live mode `0` path reads
those descriptor properties through `0x58d1f0`, `0x58d170`, and `0x58d6d0`, then forwards them
through opcode-`2` builder `0x592ae0`; its replay-linked modes `3/5` instead enqueue an all-zero
descriptor payload while preserving only the borrowed callback-wrapper triplet from the cached
sidecar record and then unlink that cached record through `0x5933a0`; and its callback modes
`1/2/6` are now explicit no-op fallthroughs. That sidecar at
`[transport+0x1778]` is tighter now too: current evidence says it behaves as one cached pointer
The adjacent capacity-descriptor side is tighter too: `0x595bc0` is now clearly the owner
callback for the capacity-descriptor route callback table rooted at `[transport+0x1164]`, not a
direct transport method on `ecx = transport`. The route-callback-table constructor `0x5905e0`
installs it with owner cookie `transport`, and the live route machinery later invokes it from
append-notify `0x590370` and decode-service `0x5908c0/0x5911e0` with `ecx = table object`, the
route descriptor or special decode frame on the stack, and the transport cookie on the stack.
Inside that callback it still always reads `[transport+0x1778]` first. Modes `3/5` consume that
sidecar immediately, while live mode `0` first resolves primary IPv4 plus `hostname`,
`numwaiting`, `maxwaiting`, `numservers`, and `numplayers` through `0x58d1f0`, `0x58d170`, and
`0x58d6d0`, and only then forwards those live payload lanes together with the same sidecar
triplet `[+0x0c/+0x10/+0x18]` into opcode-`2` builder `0x592ae0`. So mode `0` is not a
sidecar-free fallback; it still requires the borrowed sidecar before it can publish the
populated descriptor block. The replay-linked modes `3/5` instead enqueue an all-zero
descriptor payload while preserving only that same borrowed callback-wrapper triplet and then
unlinking the cached record through `0x5933a0`; and its callback modes `1/2/6` are now explicit
no-op fallthroughs. 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
@ -598,13 +635,17 @@
`0`, `3`, and `5`; the upstream route-callback-table owner still delivers modes `1`, `2`, and
`6`, but those are explicit no-ops in this capacity leaf. So the owner wiring itself is no
longer the open edge; only the upstream sidecar producer remains unresolved. 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 completion owner is tighter
now too: `0x593570` clears in-flight latch `[transport+0x44]`, stores the final attach result in
`[transport+0x48]`, stamps `[transport+0x50]` on success, refreshes local name buffer
work queue is tighter too: `0x593330/0x593370/0x593380` now bind `[transport+0x1780]` as the
construct/clear/destroy owner family and explicitly treat `[transport+0x1784]` and
`[transport+0x1788]` as the queued-work and completed-work counters beside that collection,
while `0x5933a0`, `0x5934e0`, and `0x593570` ground the remove, allocate, and completion side
over that same queue. The completion owner is tighter now too: `0x593570` clears in-flight
latch `[transport+0x44]`, stores the final attach result in `[transport+0x48]`, stamps current
route scalar `[transport+0x50]` from `0x58f450` on success, refreshes local name buffer
`[transport+0x04]` from `0x58e630`, republishes the staged metadata triplet through opcode-`1`
trigger wrapper `0x592a40`, and only then unlinks the consumed work record. The small sibling
trigger wrapper `0x592a40`, and only then unlinks the consumed work record. When validation of a
nominal success fails through `0x58d7e0/0x58d810`, the same owner still replays that callback
trigger but also arms deferred reset latch `[transport+0x1edc]`. 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
@ -654,11 +695,21 @@
buffer from the current local transport name at `[transport+0x60]` plus format `0x005dccfc`,
constructs `[transport+0x18bc]` with callback `0x595e10` and that stack-built label, seeds
queued descriptor family `[transport+0x1e7c]` through `0x595f70`, clears staged payload slot
`[transport+0xb50]`, and then sets callback-plumbing latch `[transport+0xba0] = 1`. `0x596210`
is the recurring service sweep over those same three
tables plus the field-cache and queued-descriptor families; `0x596060` is the explicit
`gsi_am_rating` runtime-and-queue reset; and `0x596530` is the reopen-from-stored-label sibling
above that same am-rating table. The matching local cleanup is tighter too: `0x595b80` is now
`[transport+0xb50]`, and then sets callback-plumbing latch `[transport+0xba0] = 1`. That
constructor now reads cleanly as pure callback-table and cache bringup: it leaves the later
live-route entry to the dedicated open or reopen owners `0x5962e0` and `0x596530` instead of
trying to start either live route itself. One level lower, `0x5962e0` now reads as the
field-subscription open owner rather than a vague route
helper: it clears the old `[transport+0xba4]` runtime, rebuilds the route label from the
optional caller suffix plus the fixed tail word at `0x005d0b78`, materializes one callback-key
buffer from the fixed stem `0x005e22a0..0x005e22b2`, seeds fixed field ids `1` and `0x0b`,
appends per-field selector-name ids through `0x00629958`, opens the live route in mode `4`, and
then seeds `[transport+0x1774] = 1` before the first immediate field snapshot. `0x596210` is the
recurring service sweep over those same three tables plus the field-cache and queued-descriptor
families; `0x596060` is the explicit `gsi_am_rating` runtime-and-queue reset; `0x596530` is the
reopen-from-stored-label sibling above that same am-rating table; and `0x5965a0` is the single-shot
status-route connect latch that sets `[transport+0xb40]` before forwarding into `0x5973d0`,
leaving the rollback and clear path to `0x5965d0`. The matching local cleanup is tighter too: `0x595b80` is now
explicitly the field-subscription-side live-runtime reset plus field-cache clear plus active
opcode-`3` purge, `0x595ce0` resets only the capacity-descriptor route callback runtime at
`[transport+0x1164]`, `0x5961b0` is the full destroy-side owner over the three tables plus both
@ -675,10 +726,16 @@
body and still never writes a nonzero value into `[transport+0x1778]` before later explicit
neighbor initialization. The callback-binding owner stack now tightens that boundary too:
`0x5934e0` stages the shared work-record metadata triplet, `0x593650` binds it into the
callback-table worker path, and `0x593570` later consumes and republishes it, while
callback-table worker path with one fixed second worker callback and one optional first worker
callback gated by `[transport+0x4c]`, and `0x593570` later consumes and republishes it, while
`[transport+0x1778]` still appears only as the borrowed sidecar read in `0x595bc0`. So this
edge is now locally closed, and the remaining producer looks like an upstream callback or worker
handoff rather than one missing ordinary field store in the local cluster. The adjacent staged-route
local ownership seam is closed: within the mapped transport cluster there is no remaining
ordinary producer to find, and the remaining source now looks like an upstream callback or worker
handoff rather than one missing field store in the local binary. The neighboring callback-vector
strip is explicit now too: `0x597300` is a no-op owner-callback stub, `0x597303` is the
validated-cookie event forwarder over callback slot `[transport+0x17f0]`, and `0x597330` is the
validated extended-payload forwarder over `[transport+0x17f4]`; both reuse the same owner
context at `[transport+0x17f8]`. 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]`
@ -769,12 +826,7 @@
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: `0x595dc0` is no longer just one
vague transition shim. It first rejects when staged-route busy latch `[transport+0x1e8c]` or
selector-slot object `[transport+0x38c]` is live, then reuses `0x595d60`; only a positive
capacity result lets it refresh selector state through `0x5973b0`, reset selector slot `2`
through `0x5954b0`, and stage the descriptor through `0x5958e0` before route mode `0` is
entered through `0x595650`. The mode-`5` tails in both
accessor yet. 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 queue-side slot `[this+0x1724+0x24]`. The
`gsi_am_rating` maintenance lane is tighter now too: after pruning failed descriptors it sorts
@ -947,24 +999,44 @@
force mode `2` when `[this+0xac0] <= 1` and otherwise promote through mode `3` or `4` according
to `[this+0xb48]`, while zero results set `[this+0x1ed8] = 1` and then fall back through route
mode `0` or `1` according to deferred am-rating latch `[this+0x1ed4]`. On success the route-mode setter stores the current
mode at `[this+0x18b8]` and then runs one of the concrete branches: mode `0` refreshes
selector-route side effects through `0x5973b0`, resets selector slot `2`, tries to reopen the
`gsi_am_rating` callback-table family, and then falls back according to deferred route-status
flag `[this+0x1ed8]`; mode `1` conditionally reopens that family and then, when no live route is
present, tries to connect the live route through `0x597480`; mode `2` resets the am-rating
family and promotes a successful live-route connect into mode `1`; once that family is already
populated, the later callback-owner at `0x595f70` takes over by pruning stale entries, refreshing
`gsi_am_rating`, selecting the current head endpoint, and staging the route-callback payload
through `0x5958e0`; mode `3` resets the
am-rating family, refreshes selector-route state, resets selector slot `2`, and releases the
current route binding; mode `4` is the narrow status-route recovery retry; and mode `5` resets
the am-rating family, refreshes selector-route state, and releases the current route binding
without the selector-slot reset. The live-route connect path is tighter now too: `0x597480`
builds one `0x20`-byte local identifier from `[this+0x60]` plus suffix template `0x005dccfc`,
seeds the callback vector `0x596fd0/0x5970e0/0x597180/0x5971b0/0x597270/0x5972c0`, and chooses
either the default route id `0x1964` through `0x58cc40` or the binding-specific id in
`[binding+0x30]` through `0x58c9b0`; on the binding-specific path it also clears pending rebuild
cookie `[binding+0x34]` and marks the constructed route live via `[route+0xbc] = 1`. The stable
mode at `[this+0x18b8]`, mirrors mode changes into the bound-route callback lane through
`multiplayer_transport_enqueue_bound_route_mode_snapshot_opcode4_if_live` `0x5932a0`, and then
runs one of the concrete branches: mode `0` releases the current
live route, resets selector slot `2`, and only when the am-rating route is not already live at
`[this+0x1ec4]` tries to reopen the `gsi_am_rating` callback-table family through `0x596530`;
a failed reopen then falls back according to deferred route-status flag `[this+0x1ed8]`. Mode
`1` conditionally reopens that am-rating family only when both `[this+0x1ec4]` and
`[this+0x1ed4]` are clear and then, when no live route is present, tries to connect the live
route through `multiplayer_transport_try_connect_live_route` `0x597480`; once that family is already populated, the later callback-owner at
`0x595f70` takes over by pruning stale entries, refreshing `gsi_am_rating`, selecting the
current head endpoint, and staging the route-callback payload through `0x5958e0`. Mode `2`
first releases any stale live route through `multiplayer_transport_release_live_route`
`0x5973b0` when status latch `[this+0xb40]` is clear, then resets the am-rating family and
promotes a successful live-route connect into mode `1`. Mode `3` resets the am-rating family,
releases the live route through `0x5973b0`, resets selector slot `2`, and then tears down the
current bound-route payload through
`multiplayer_transport_release_current_route_binding_detach_descriptor_callback_and_clear_slot`
`0x595620`; mode `4` is the narrow status-route recovery retry; and mode `5` resets the
am-rating family, releases the live route through `0x5973b0`, and runs that same
`0x595620` teardown path without the selector-slot reset. That helper is narrower than the older
generic wording implied: it detaches the current binding from route-label object `[this+0x1ed0]`
through `0x58f3c0`, releases the staged bound-route callback payload at `[this+0x1ec8]` through
`0x5933a0`, and only then clears `[this+0x1ec8]`. The status-route connect path is tighter now too:
`0x5973d0` seeds `[this+0xaf4]`, uses the same six callback lanes, mirrors stored route label
`[this+0x9a8]` into `[this+0xb3c]`, patches the created route's extended-payload callback slot,
and clears `[this+0xb38]` on success; when the caller route id is not `-1` it also zero-extends
the supplied route word before forwarding it into `0x58c9b0`. The local status-route helper
strip is explicit too: `0x597350` releases `[this+0xaf0]` through `0x58cfd0`, `0x597370`
services only that route through `0x58cf90`, and `0x597380` is the broader two-route sweep that
services `[this+0xaf0]` and `[this+0x1ecc]` through the common route-object service helper
`0x58d040`. The live-route connect path is tighter in the same way:
`0x597480` builds one `0x20`-byte local identifier from `[this+0x60]` plus suffix template
`0x005dccfc`, seeds the callback vector `0x596fd0/0x5970e0/0x597180/0x5971b0/0x597270/0x5972c0`,
and chooses either the default route id `0x1964` through `0x58cc40` or the binding-specific id
in `[binding+0x30]` through `0x58c9b0`; on the binding-specific path it also clears pending
rebuild cookie `[binding+0x34]` and marks the constructed route live via `[route+0xbc] = 1`,
while the success tail mirrors stored route label `[this+0x9a8]` into `[this+0xb3c]` and clears
live-route mode mask `[this+0xb38]`. The stable
transitions therefore still switch by releasing route objects or route bindings and rebuilding
route state, 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]`

View file

@ -37,7 +37,7 @@
`Computing Transportation and Pricing...` stays visible while the pipeline runs
`world_compute_transport_and_pricing_grid` `0x0044fb70`, the early collection-owned staging pass
`world_rebuild_secondary_raster_derived_surface_and_companion_planes_in_rect` `0x0044e940`,
`world_setup_building_collection_phase` `0x0041ea50`, and the conditional region pair
`structure_candidate_collection_run_post_load_local_service_setup_phase` `0x0041ea50`, and the conditional region pair
`world_region_collection_seed_default_regions` `0x00421b60` plus
`world_region_collection_refresh_neighbor_and_profile_bands` `0x00420f30`. One save-load-side
status-stack strip is now tighter too: `0x004422d0/0x00442330` push and pop the same four shell
@ -2153,9 +2153,14 @@ Current evidence grounds the shell-controller-backed input and frame path as the
bits `0x40`, `0x20`, and `0x10` in the same flag byte during route-entry rewrites. Those bits are
also no longer copy-only: the neighboring shell helper
`shell_building_detail_refresh_flagged_service_capability_rows` `0x004b9a20` now consumes them to
restyle the `BuildingDetail.win` row bands `0x7d07..0x7d1c` and `0x7f58..0x801f`. The exact
player-facing labels for those rows are still open, but the subflags now have one real shell-side
consumer instead of only preservation logic. The broader `BuildingDetail.win` refresh family is
restyle the `BuildingDetail.win` row bands `0x7d07..0x7d1c` and `0x7f58..0x801f`. The important
boundary is tighter now too: the `0x7d07..0x7d1c` band is a style-only indicator family in current
disassembly, not a hidden text-publishing row family with missing captions. The grounded
player-facing text sits elsewhere: the fixed express-side triplet `0x7f58..0x7f5a` is table-fed
from RT3.lng `494/497/498`, and the sibling special service rows still align to `Dining Car` and
`Caboose`. So the subflags now have one real shell-side consumer instead of only preservation
logic, and the old “missing label” seam on the indicator rows is gone. The broader
`BuildingDetail.win` refresh family is
tighter too: `shell_building_detail_refresh_subject_cargo_and_service_rows` `0x004ba3d0` now
clearly owns the selected subject rows around `0x7d06`, `0x7d96..`, and `0x7d0e`, resolving
ordinary ids through the live candidate collection and the special express-side ids through the
@ -2203,6 +2208,12 @@ Current evidence grounds the shell-controller-backed input and frame path as the
installed by the attach helper, and `+0x0e` is the stable second-site field. One more split is
tighter now too: `placed_structure_route_link_recompute_endpoint_pair_state` `0x00467c30`
currently uses `+0x0a` and `+0x0e` as the active endpoint site pair while recomputing state
byte `+0x12`. The load/save boundary is tighter now too: package save currently persists only the
direct indexed-collection header band of `0x006ada90` through `0x00517d90`, world-entry bring-up
mirrors only that header refresh through `0x00518680`, and the live endpoint or grid state is
then regenerated later through `placed_structure_route_link_collection_recompute_all_endpoint_pair_state`
`0x004682c0` and `placed_structure_route_link_collection_rebuild_route_style_grid_counters_and_endpoint_state`
`0x00468300` rather than through a separate tagged per-record payload lane.
byte `+0x12`; `+0x0c` is still not directly read there. The family also has a clearer release
and refresh side now: `placed_structure_route_link_release_and_detach` `0x004680b0` rolls back
the class counters and then tails into `placed_structure_route_link_detach_current_owner_chain`
@ -2749,8 +2760,9 @@ Current evidence grounds the shell-controller-backed input and frame path as the
best read as the shared `(x,y) -> world-cell*` resolver rather than another object-specific
method.
The next sibling table at `0x005c9750` is tighter now too, though still not fully decoded. The
structural anchor is `map_load_city_database` `0x00474610`: that loader stages bundle tags
`0x61a9..0x61ab`, iterates one collection, and dispatches each entry through vtable slot `+0x44`.
structural anchor is `city_database_entry_collection_refresh_records_from_tagged_bundle`
`0x00474540`: that load-side owner stages bundle tags `0x61a9..0x61ab`, iterates one
collection, and dispatches each entry through vtable slot `+0x40`.
In `0x005c9750`, that same slot resolves into the sibling record family beside
`0x0041ab70/0x0041ab80`, which is enough to treat the table as the city-database entry family
rather than a generic unresolved runtime object. The small load-side slot `0x0041ab70` simply
@ -2760,10 +2772,11 @@ Current evidence grounds the shell-controller-backed input and frame path as the
one named handle through owner `0x006d4020`, writes the resulting handle into `[this+0x1c]`,
queries three base floats through `0x0045c480`, and returns one scaled float derived from the
first queried component. That method is currently called from later world-side branches at
`0x0046e4f7`, `0x004aafee`, and `0x004ab020`. The exact user-facing semantics of the handle and
the many constant-return virtuals in the same table are still open, but the family boundary is no
longer arbitrary: this is now the current city-database entry vtable cluster, not another
placed-structure specialization. One correction matters here too: the lower
`0x0046e4f7`, `0x004aafee`, and `0x004ab020`. The exact user-facing semantic of the handle still
is not grounded, but the leftover rows in the same table are now bounded as low-value
constant-return stubs rather than a meaningful unresolved behavior seam. The family boundary is
therefore no longer arbitrary: this is now the current city-database entry vtable cluster, not
another placed-structure specialization. One correction matters here too: the lower
`0x00455660/0x00455800/0x00455810/0x00455930` helpers are no longer city-only. Local `.rdata`
now shows the same shared slots under both the city-entry table `0x005c9750` and the sibling
`Infrastructure` table `0x005cfd00`, whose constructors at `0x0048a240/0x0048a2dc/0x00490a3c`
@ -3080,12 +3093,14 @@ The low helper strip beneath that shared family is tighter now too: `0x0052ecd0`
`0x00474110`, allocates one `0x250`-byte live record, resolves it, constructs it through
`0x00474130`, and then tears the temporary entry down through `0x004743d0`; `0x00474510`
resolves one entry id, releases it through `0x00474400`, and removes it from the collection. The
collection-owned load loop at `0x00474540` sits directly beneath `map_load_city_database`
`0x00474610`: it opens the same `0x61a9/0x61aa/0x61ab` bracket on the caller-supplied bundle,
binds the selected path context, iterates the current collection, dispatches each record through
vtable slot `+0x40`, accumulates the returned byte counts, and tears down the temporary entry
after each record. That still leaves broader semantic questions open, but the current static edges
around the city-entry family are now largely exhausted. The adjacent scaffolding is bounded too.
collection-owned load loop at `0x00474540` now has a direct save-side companion too:
`city_database_entry_collection_serialize_records_into_tagged_bundle` `0x00474610` opens the
same `0x61a9/0x61aa/0x61ab` bracket through `0x00531340`, forwards collection metadata through
`0x00517d90`, and dispatches each record through vtable slot `+0x44`. The refresh side binds the
selected path context, iterates the current collection, dispatches each record through vtable
slot `+0x40`, accumulates the returned byte counts, and tears down the temporary entry after each
record. That still leaves broader semantic questions open, but the current static edges around the
city-entry family are now largely exhausted. The adjacent scaffolding is bounded too.
Base helper `0x00455b20` initializes the shared `0x23a`-sized record family by installing base
vtable `0x005cb1c0`, clearing the scalar bands `[+0x206/+0x20a/+0x20e/+0x22e/+0x232]`, zeroing
the seven-dword block `[+0x212..+0x22a]`, and re-entering `0x0052ecd0`; that is why it shows up
@ -3093,8 +3108,9 @@ The low helper strip beneath that shared family is tighter now too: `0x0052ecd0`
construction paths outside the city family. The city collection itself now has a bounded teardown
side too: `0x00474480` is the small release-and-free wrapper for the collection rooted at
`0x005ce4a8`, and teardown caller `0x004492c3` uses it before freeing the global collection
pointer at `0x006cea50`. On the load side, `0x00445713`'s broader setup branch re-enters
`map_load_city_database` `0x00474610` on that same global `0x006cea50` collection. Outside the
pointer at `0x006cea50`. On the save side, `0x00445713`'s broader package branch re-enters
`city_database_entry_collection_serialize_records_into_tagged_bundle` `0x00474610` on that same
global `0x006cea50` collection. Outside the
city-specific branch, the two tiny dispatch wrappers `0x00455a40` and `0x00455a50` are also now
bounded as raw vtable-slot helpers: the first jumps through entry slot `+0x44`, while the second
pushes one caller argument into slot `+0x40` and then clears the global roots

View file

@ -32,6 +32,18 @@ The neighboring connection-state note pair now appears
currently owns only the `Coming To`, `Going From`, `Current Supply`, `Current Demand`, `--None--`,
and `All` legend lanes.
The shell-side preview arm or clear path above that overlay is explicit now too.
`shell_station_detail_clear_active_candidate_service_preview` `0x00504a90` resets the shared
`(station id, candidate id)` pair, drops the local preview latch at `[window+0x7c]`, decrements
the sibling global refcount `0x0062be84`, and on matching live world-preview state tails into
`world_clear_aux_preview_mode_0x2171_and_overlay_companion_live_flag` `0x00452d30`.
`shell_station_detail_set_active_candidate_service_preview` `0x00504ae0` first clears any prior
preview, then for a nonzero candidate id pushes the current station and candidate through the
world-side setter strip `0x00452f60`, `0x00452d80`, `0x00452db0`, and `0x00452ca0` before
latching `[window+0x7c]`, incrementing `0x0062be84`, and storing the active pair back into
`0x005ee4fc/0x005ee500`. That closes the shell-to-world preview seam end-to-end: row callbacks
arm or clear one explicit candidate pair, and the world-side overlay consumes exactly that pair.
That formatter boundary is tighter now too. `0x004207d0` returns `0` immediately when preview-global
`0x0062be84` is armed, forwards directly into the shared fallback formatter `0x00455860` when
subtype dword `[this+0x23e]` is nonzero, and only otherwise runs its own connection-status path. On
@ -110,11 +122,15 @@ The reusable bridge between the status formatter and the
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
sweep and the final retry, and then publishes `2889` `%1 has started a new company - the %2`
or `2890` `%1 has connected %2 to %3.` through the shell news path. The remaining open edge on
this branch is therefore narrower now: it is mostly whether `0x39` should be read as the
narrower city-connection public-opinion lane or as part of a broader management-attitude family,
not the ownership of the connection-bonus formatter, peer-route candidate path, or company news
gate.
or `2890` `%1 has connected %2 to %3.` through the shell news path. Wider governance and shell
xrefs now close that last `0x39` ambiguity too: `company_compute_prime_rate_from_issue39_scenario_baseline`
`0x00424580`, the `CompanyDetail` and bond-side notes, and the already-grounded
`Prime Rate` label family all point at the same metric, so this city-connection branch is
reusing the explicit issue-`0x39` prime-rate lane rather than a separate public-opinion or
management-attitude family. The local static seam on this branch is therefore closed: `0x39`
itself is no longer ambiguous here, and the remaining work is only how much of the wider
company-start or city-connection ladder above that helper should be described as
recent-profit/fuel-burden pressure versus the already-grounded prime-rate term.
The ordinary `StationDetail.win` caller strip is tighter now too. In the non-scenario, non-class
`3/4` branch, `shell_station_detail_window_refresh_controls` `0x00506610` rebuilds the nearby-site
@ -129,8 +145,67 @@ nearby-site helper has a similarly concrete split now: for each of the fixed fiv
counts entries through `0x0047dc90`, emits the descriptive text block through `0x0051b700 ->
0x0053f9c0`, and then builds the paired jump-control payload through `0x0053b070 -> 0x0055a040 ->
0x0053f9c0`, with text rows under `0xb40a..0xb40e` and jump controls under `0xb410..0xb414`. So
the remaining uncertainty in the ordinary branch is no longer the ownership of those lanes; it is
the broader user-facing meaning of later callers above the row callbacks.
the local static seam in the ordinary branch is closed: the ownership of those lanes now belongs
to the concrete refresh helpers named here, and the remaining work is only the broader
user-facing meaning of later callers above the row callbacks.
The helper strip directly beneath that ordinary branch is explicit now too.
`shell_station_detail_clear_dynamic_rows_and_haul_widgets_if_dirty` `0x005042c0` uses dirty latch
`0x006d16f0` plus the live window singleton `0x006d16d8` to clear the candidate-service and
nearby-site row bands `0xb414..0xb5a3`, `0xb40a..0xb413`, and `0xb400..0xb409`, then disables the
paired haul controls `0xb3f6` and `0xb3f7` before resetting the latch. The current-subject gates
above the lower action strip are tighter in the same way:
`shell_station_detail_has_valid_selected_station` `0x00504370` is the narrow selected-station
presence probe over detail-manager state `[0x006d0818+0x90]`, while
`shell_station_detail_selected_station_belongs_to_selected_company` `0x00504390` resolves that same
station and compares its linked company through `placed_structure_query_linked_company_id`
`0x0047efe0` against the active selected company from `0x004337a0`. The ownership-blocked modal
above that gate is explicit too:
`shell_station_detail_present_selected_station_not_controlled_notice` `0x005043f0` formats
localized id `3595` with the owning railroad name when that owner resolves and otherwise falls back
to the empty-string root before opening the standard shell message-box path at `0x004c98a0`. One
remaining local helper is no longer anonymous either:
`shell_station_detail_refresh_class_partitioned_action_controls_0xb3bb_to_0xb3bf` `0x005044b0`
restyles the lower action controls into affordance states `0x65` or `0x87` according to the linked
candidate class byte `[candidate+0x8c]`, keeping `0xb3bb/0xb3bd/0xb3be` active only for class `0`
and `0xb3bc/0xb3bf` active only for class `1`. That closes the helper seam beneath
`shell_station_detail_window_handle_message` `0x00505e50` and
`shell_station_detail_window_refresh_controls` `0x00506610`: the remaining work in this branch is
above those message and refresh owners, not inside the lower helper strip itself. One layer higher,
the lower action dispatch is no longer opaque either. In the message-`0xcb` path,
`shell_station_detail_window_handle_message` first reduces the clicked control to one small family
split: `0xb3bd` selects family `1`, while the sibling controls select family `2`. It then reduces
linked-site flag bits `[entry+0xc3]` to one action index `0..5` and resolves the resulting
`(action_index, family)` pair through
`aux_candidate_collection_find_entry_id_by_station_detail_action_index_and_family` `0x00419590`,
which formats one localized action stem from the fixed tables at `0x005f3c6c/0x005f3c80` and scans
the auxiliary candidate pool `0x0062b2fc` for the first matching stem at `[entry+0x04]`. Only
after that auxiliary id resolves does the branch enter the deeper world-side validation owner
`placed_structure_validate_station_detail_aux_candidate_action_and_optionally_apply_linked_site_mutation`
`0x0040dc40` plus the two confirmation-modal branches rooted at localized ids `0x0bfe` and
`0x0bff`. The constructor-side special-action strip is explicit now too:
`shell_station_detail_window_construct` `0x005068c0` wires action controls `0xb3b7/0xb3b8`,
navigation controls `0xb3b3/0xb3b4`, and helper roots `0x006d16dc..0x006d16ec`; then it restyles
special control `0xb3f8` with one exact three-way split. When editor-map latch `[0x006cec74+0x68]`
is clear, `0xb3f8` is forced to style `0x87`. When that latch is set and scenario slot
`[0x006cec78+0x4af7]` is nonzero, the same control takes style `0x74` if selected-station byte
`[station+0x5c9]` is nonzero and style `0x65` otherwise. So that control is no longer just “some
editor or scenario action”; the local branch now grounds it as one editor-gated, scenario-gated,
selected-station-special-case affordance under the main StationDetail constructor. That deeper
owner then continues into
`0x0bff`. That deeper owner is no longer just a black box either: it first requires the linked peer
at `[site+0x2a8]` to pass the station-or-transit class gate, resolves the auxiliary candidate,
computes one projected scalar cost from candidate field `[candidate+0x22]`, owner company
`[site+0x276]`, current world coords, and scenario-side scale owner `0x00436590(0x3b, ...)`, and
returns that scalar through the optional out-float. When the caller supplies the optional notice
sink and the current owner company exists, the helper compares that scalar against company metric
`(0x0d, 0x2329)` and on failure formats localized notice `0x0b52` before returning. The success
side is tighter too: it materializes one packed projected-cell list through `0x00417840`, runs the
shared placement validator `0x004197e0`, restores the temporary compact-grid replay bits through
`0x004142c0/0x004142d0`, and only then commits the linked-site mutation through
`0x0040d1f0`, `0x00480710`, `0x0045b160`, `0x0045b9b0`, `0x00418be0`, and `0x0040cd70`, posting
the signed scalar into the owner company through `0x0042a040` and accumulating the running total
in `[site+0x27a]`. So the lower action band is now grounded as a real validate-or-apply linked-site
mutation path with an explicit affordability notice branch, not just one anonymous modal gate.
#### Route-list side
The neighboring helper
@ -138,9 +213,10 @@ The neighboring helper
append-if-missing builder for the six-byte route-entry list rooted at `[site+0x462]` and
`[site+0x466]`. One tighter boundary closes the overlay-side uncertainty further: the directional
overlay query at `0x0047e690` only consumes the leading `u16` peer-site key when it walks that
list and does not currently read the trailing `u32` companion payload at all. So the remaining
uncertainty is no longer route-list ownership or overlay dependence on that payload; it is only
the broader meaning of the payload for other caller families.
list and does not currently read the trailing `u32` companion payload at all. So the local
overlay-side seam is closed: route-list ownership and overlay dependence on that payload are no
longer open here, and the remaining work is only the broader meaning of the payload for other
caller families.
#### Route-entry and Cache Side
The adjacent helper strip is tighter now too.
@ -179,6 +255,6 @@ The nearby linked-instance raster wrappers are no
`0x0047f0e0` and
`placed_structure_resolve_linked_instance_secondary_raster_class_record_via_world_query`
`0x0047f1f0` now bound the two record-returning lanes used by the later world-side and
linked-peer filters. That means the remaining uncertainty in this neighborhood is no longer the
route-entry or terrain-class helper ownership; it is the broader user-facing meaning of the later
callers that consume those gates.
linked-peer filters. So the local static seam in this neighborhood is closed too: route-entry and
terrain-class helper ownership are no longer open here, and the remaining work is only the
broader user-facing meaning of the later callers that consume those gates.