340 KiB
Control-Loop Atlas
This atlas is the high-level map for RT3 1.06. It is intentionally broader than the function map: each section explains who owns a loop, where it starts, what dispatches it, which state blocks anchor it, and where control is handed to neighboring subsystems.
Subsystem notes now live under docs/atlas for faster navigation. The longform atlas remains the canonical narrative reference during this transition.
CRT and Process Startup
- Roots:
entryat0x005a313b, CRT helpers in the0x005a2d..0x005ad4..range, andapp_bootstrap_mainat0x00484440. - Trigger/Cadence: single process startup path before shell or engine services exist.
- Key Dispatchers:
startup_init_tls_state,startup_init_file_handle_table,startup_run_init_callback_table,__setenvp,startup_build_argv,___crtGetEnvironmentStringsA, thenapp_bootstrap_main. - State Anchors: CRT heap and file-handle tables; process environment and argv storage.
- Subsystem Handoffs: exits the generic CRT path at
app_bootstrap_main, which becomes the first RT3-owned coordinator. - Evidence:
artifacts/exports/rt3-1.06/startup-call-chain.md,artifacts/exports/rt3-1.06/function-map.csv. - Open Questions: exact ownership boundary between compiler CRT shims and the first game-owned
bootstrap helper; whether any nontrivial startup callbacks seed game globals before
app_bootstrap_main.
Bootstrap and Shell Service Bring-Up
- Roots:
app_bootstrap_mainat0x00484440,bootstrap_init_shell_window_servicesat0x004840e0, andshell_install_global_controllerat0x0051ff90. - Trigger/Cadence: one-time bootstrap handoff immediately after CRT completion.
- Key Dispatchers:
app_bootstrap_main,bootstrap_init_shell_window_services,shell_install_global_controller,shell_service_pump_iteration, graphics config load or default-init helpers, runtime capability probes, and early shell service initializers under the0x004610..0x0053f0..branch. - State Anchors: global shell controller pointer
0x006d4024, sibling display/runtime globals under0x006d402cand0x006d4030, and host capability flags gathered bybootstrap_probe_system_profile. - Subsystem Handoffs: after the global shell controller has been installed the bootstrap path enters
the repeating
shell_service_pump_iterationloop, which services shell-state work and hands each iteration down into the controller frame path; when the shell lifetime ends this same bootstrap path tears the shell bundle down and returns toapp_bootstrap_main. - Evidence:
startup-call-chain.md, function-map rows forapp_bootstrap_main,bootstrap_init_shell_window_services,shell_install_global_controller,shell_service_pump_iteration,shell_load_graphics_config_or_init_defaults,shell_reset_display_runtime_defaults, and related graphics setup helpers. - Open Questions: whether gameplay or in-engine world stepping later escapes this bootstrap-owned shell loop entirely, or whether gameplay entry still rendezvous with the same outer coordinator before the shell bundle is destroyed.
Shell UI Command and Deferred Work Flow
- Roots: shell callback paths that converge on
shell_dispatch_ui_commandat0x00464410. - Trigger/Cadence: event-driven UI command dispatch plus deferred-message queue flushing during shell activity.
- Key Dispatchers:
shell_dispatch_ui_command,shell_enqueue_deferred_work_message,shell_post_deferred_message_type5,shell_post_deferred_message_type6,shell_enqueue_deferred_message_type4,shell_enqueue_deferred_message_type1. - State Anchors: shell object at
0x0062be68, queue roots around[this+0x11369d],[this+0x1136a1], and[this+0x1136a5], global routing gates at0x006d4034, and the separate detail-panel controller rooted at0x006d0818. - Subsystem Handoffs: routes into graphics config, scenario-text export, overlay generation,
multiplayer UI, shell detail windows such as
EditorPanel.winandTrainDetail.win, and presentation-facing deferred work later drained byshell_service_frame_cycle. - Evidence: function-map shell rows around
0x00464410,0x004d4500,0x004ddbd0, and0x0051f1d0..0x0051f460. - Open Questions: whether the shell command dispatcher is also used by hotkeys or only by UI
callback tables; the current
0x006d0818detail-panel path looks shell-only and does not yet explain gameplay world entry.
Presentation, Overlay, and Frame Timing
- Roots: the bootstrap-owned
shell_service_pump_iterationat0x00483f70, the shell-state service passshell_state_service_active_mode_frameat0x00482160, the installed global shell controller at0x006d4024, the pending frame-cycle ownershell_service_frame_cycleat0x00520620, and the frame-time history path undershell_update_frame_time_historyat0x0051fd70. - Trigger/Cadence: recurring bootstrap-owned shell service work once the active mode, controller window, and display runtime are live; special modal or content-building paths can also force immediate frame servicing inside that broader cadence.
- Key Dispatchers:
shell_service_pump_iteration,shell_state_service_active_mode_frame,shell_service_frame_cycle,shell_refresh_presentation_frame,shell_update_frame_time_history,shell_get_smoothed_frame_scalar,shell_set_gamma_ramp_scalar, and overlay builders such asshell_queue_single_world_anchor_overlay,shell_queue_world_anchor_overlay_list, andshell_queue_indexed_world_anchor_marker. - State Anchors: shell state at
0x006cec74, active mode pointer0x006cec78, shell frame history ring at0x006d403c, display/runtime state inside the controller block near[this+0x114282]and[this+0x11428a], presentation service pointer at[this+0x0c], and the native controller window handle at[this+0x00]. - Subsystem Handoffs: the bootstrap-owned pump runs shell-bundle polling and shell-state maintenance
before the shell-state pass synchronizes active-mode helpers and modal-status work and dispatches
the controller frame cycle, which then consumes world/object state for overlays and presentation
refresh, uses the controller window handle for one-time
ShowWindowand related UI interaction, and drains the deferred work queues at the end of the cycle. - Evidence: function-map rows for
shell_service_pump_iteration,shell_state_service_active_mode_frame,shell_service_frame_cycle,shell_flush_deferred_work_queues, frame history, gamma ramp, world-anchor overlay builders, and graphics runtime helpers. - Open Questions: how simulation cadence rendezvous with the shell presentation cadence once gameplay takes over and whether gameplay stepping exits this shell-owned controller path entirely.
Map and Scenario Content Load
- Roots:
shell_map_file_entry_coordinatorat0x00445ac0, the larger active-mode profile ownershell_active_mode_run_profile_startup_and_load_dispatchat0x00438890, the shell-mode switchershell_transition_modeat0x00482ec0, the first grounded world-entry branchworld_entry_transition_and_runtime_bringupat0x00443a50,shell_map_file_world_bundle_coordinatorat0x00445de0, reference-database setup viamap_bundle_open_reference_databasesat0x00444dd0, and narrower loaders such asmap_load_geographic_label_databaseandmap_load_city_database. - 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,scenario_text_export_report_language_file,scenario_text_export_batch_process_maps. - State Anchors: shell-side file staging buffers at
0x0062bee0and0x0062bec4, shell and mode globals at0x006cec74and0x006cec78, world object root0x0062c120, map bundle state allocated through0x00530c80, and geography tables rooted at0x0062b2fcand0x0062b268. - Subsystem Handoffs: the shared
fileopt.windialog rooted at0x004dc670now looks like the shell-side selector above the two broad file coordinators. Its message handler sets0x006d07f8for the load or restore side or0x006d07ecfor the save or package side before the detail-panel transition manager routes intoshell_map_file_entry_coordinatororshell_map_file_world_bundle_coordinator. The former unresolved third flag at0x006d07f0is now accounted for too: it escapes into the standaloneSettingsWindow.winpath throughshell_open_settings_windowrather than another map or save verb. The broad coordinators now hand their interactive work through the sharedfilerqst.winhelper at0x004dd010, and that helper gives the extension split a firmer shape. The paired editor-map path is now grounded as.gmpthrough load mode4and save mode3. The remaining non-editor families are no longer anonymous either:.gmcis the campaign-scenario branch, backed both by the campaign-screen resignation prompt on0x006cec7c+0xc5and by the numbered%s%02d.gmcsave helper at0x00517c70;.gmxis the sandbox branch, backed by the shell-sideThe briefing is not available in sandbox games.restriction on0x006cec7c+0x82; and the default.gmsbranch is therefore the standalone scenario family. When a live runtime world is already active the same helper bypasses those non-runtime extensions and forces the.smpruntime-state branch instead. The auxiliary save-side mode11is tighter now too: it still maps to.gmt, but instead of looking like another gameplay save family it conditionally diverts into the same.gmtpreview-surface pipeline owned by the Multiplayer preview dataset object at0x006cd8d8, and only falls back to the normal reference-bundle path when that dataset object is absent. The shell-side mode owner above those file coordinators is clearer now too.shell_transition_modeno longer reads like a generic mode switch: its ABI is now grounded as athiscallwith two stack arguments because the body reads the requested mode from[esp+0x0c]and returns withret 8. The grounded world-entry load-screen call shape is(4, 0), not a one-arg mode switch. The second stack argument is now tighter too: current local evidence reads it as an old-active-mode teardown flag, because the0x482fc6..0x482fffbranch only runs when it is nonzero and then releases the prior active-mode world through0x434300,0x433730, and the common free path before clearing0x006cec78. 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 pathshell_transition_mode(4, 0)returns cleanly, and the full old-mode teardown stack under0x5389c0now returns too, including0x5400c0, the0x53fe00 -> 0x53f860remove-node sweep over[object+0x74], and the nearby mode-2teardown helper0x00502720. The same live run now also reaches and returns fromshell_load_screen_window_construct0x004ea620and the immediate shell publish through0x00538e50. Its constructor jump table is tighter now too: mode1is not the directGame.winconstructor, but the startup-dispatch arm rooted at0x483012; mode2entersSetup.win, mode3entersVideo.win, mode4enters the plainLoadScreen.winbranch at0x4832e5, mode5entersMultiplayer.win, mode6entersCredits.win, and mode7entersCampaign.win. The important static correction is that the startup-runtime slice0x004ea710 -> 0x0053b070(0x46c40) -> 0x004336d0 -> 0x00438890belongs to mode1, not mode4. Mode4only constructs and publishes theLoadScreen.winobject through0x004ea620and0x00538e50. The older hook-driven(4, 0)path therefore was not mysteriously skipping the startup-runtime object; it was entering the wrong jump-table arm for that work. The caller split above that owner is tighter now too:world_entry_transition_and_runtime_bringupreaches the same owner at0x443b57with(0, 0)after dismissing the current shell detail panel and servicing0x4834e0(0, 0), while the saved-runtime path at0x446d7fdoes the same before immediately building the.smpbundle payloads through0x530c80/0x531150/0x531360. That makes theLoadScreen.winstartup lane the only currently grounded caller that enters0x438890with(1, 0)instead of(0, 0). The remaining runtime uncertainty is narrower now too: the plain-run logs still show the plainLoadScreen.winstate under(4, 0), and the corrected allocator-window run now reinforces the same read because the post-construct allocator stream stays empty instead of showing the expected0x46c40startup-runtime allocation. The first lower allocator probe on0x005a125dwas not trustworthy because that shared cdecl body sits behind the thunk and the initial hook used the wrong entry shape, and the first direct thunk hook was also not trustworthy because a copied relative-jmpthunk cannot be replayed through an ordinary trampoline. But the later corrected thunk run plus the jump-table decode now agree: the next meaningful hook-driven test is mode1, not mode4.mode_id = 2, and it never advanced intoready gate passed, staging, or transition. So that run did not actually exercise the0x0053b070 -> 0x004336d0 -> 0x00438890subchain at all. The next runtime pass now lowers the ready-poll defaults to1and0and adds an explicit ready-count log so the mode-4startup 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 theshell_transition_modepath again, withLoadScreen.winconstruction and publish returning cleanly. But the post-publish startup subchain is still unresolved: there is still no trusted0x46c40allocator hit, no direct0x004336d0entry, and no direct0x00438890entry. So the next clean runtime boundary is the tinyLoadScreen.winscalar setter at0x004ea710, which sits immediately before the0x0053b070allocation in the static mode-4branch. The immediate next runtime check is even more concrete than the helper hook, though: inspect the state that0x004ea710should leave behind. The hook now logs the post-transitionLoadScreen.winsingleton, its field[+0x78],0x006cec78, the shell state's[+0x0c]active-mode object field, and the startup selector. If0x004ea710really ran on the mode-4branch,[LoadScreen.win+0x78]should no longer be zero aftershell_transition_modereturns. The latest run answered that directly: after transition return,field_active_mode_objectis still theLoadScreen.winsingleton,0x006cec78is still null,[LoadScreen.win+0x78]is still zero, and the startup selector is still3. So the current best read is that RT3 is still parked in the plainLoadScreen.winstate at transition return rather than having entered the separate runtime-object path yet. That shifts the best next runtime boundary from “deeper insideshell_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 plainLoadScreen.winstate into the startup-runtime object path, or does it stay frozen as-is? The internal selector split in0x438890is tighter now too:[0x006cec7c+0x01]is a separate seven-way startup selector, not the shell mode id. Values1and7loadTutorial_2.gmpandTutorial_1.gmp, values3/5/6collapse into the same profile-seeded file-load lane through0x445ac0([0x006cec7c]+0x11, 4, &out_success), value2is a world-root initialization lane that allocates0x0062c120and then forces selector3, and value4is the setup-side world reset or regeneration lane that rebuilds0x0062c120from0x006d14cc/0x006d14d0before later world setup continues. The write side is tighter now too:Campaign.winwrites selector6,Multiplayer.winwrites selector3on one pending-status path, and the largerSetup.windispatcher writes selectors2,3,4, and5on its validated launch branches. That makes the file-load subfamily read less like one generic save-open branch and more like a shared profile-file lane reused by setup, multiplayer, and campaign owners. The world-entry owner boundary is tighter now too:world_entry_transition_and_runtime_bringupat0x00443a50no longer stops at the initial shell transition and world allocation head. The same grounded function continues through the larger post-load generation tail up to0x00444dc2, which means the laterSetting up Players and Companies...and neighboring post-load passes are not floating raw callsites after all. That same owner now clearly covers the event-runtime refresh through0x433130, chairman-profile materialization through0x437220, neighboring route and tracker refresh families, and the one-shot kind-8runtime-effect service through0x432f40before clearing shell-profile latch[0x006cec7c+0x97]. TheSetup.windispatcher is less opaque now too: the early0x0bc1..0x0c24family is mostly fixed submode selection above0x00502c00, except for the separate0x0bc2/0x0bc5/0x0bc6/0x0bc7shell-open quartet above0x00501f20;0x0c1fis the settings-window escape;0x0c1e/0x0c20/0x0c22are direct shell requests into0x00482150; the fixed submode buttons now have concrete lower targets such as0x0bc1/0x0bc8 -> 15,0x0bc3 -> 16,0x0bc4 -> 1,0x0c80 -> 13,0x0c1c -> 17,0x0c1d -> 2,0x0c24 -> 14,0x0c81 -> 14,0x0c82 -> 6,0x0c83 -> 10, and0x0c84 -> 12; the0x0ce6/0x0ce7/0x0d49/0x0d4a/0x0e82/0x0e83branches are bounded list or slider adjustments on staged setup fields; and the later0x0dca/0x0dcb/0x0de9/0x0df3/0x0e81/0x0f6f/0x0f70controls are the explicit selector-writing launch buttons rather than one anonymous validated-launch blob. The constructor-side callbacks are tighter too: control0x0ce8is a table-driven payload-label draw callback above0x00502030, not another launch root, and controls0x0e86and0x0e87do not select more setup roots; they update the persisted shell-state selector pairs at[0x006cec74+0x233/+0x237]and[0x006cec74+0x23b/+0x23f]through0x00502160and0x005021c0, then immediately save config through0x00484910(1). The constructor body is tighter too: it seeds the initialSetup.winstate by running0x502910,0x502550, and0x502c00(1)before the user interacts with the window, installs0x0c80..0x0c86and0x0f6f..0x0f71as homogeneous button bands, and treats0x0e88as one separate special control with retuned float fields rather than another ordinary launch root. The remaining optional constructor child0x0bd0is tighter now too: it is built from a separate template block and optional owned heap object before registration, not another hidden setup-root button. The generic shell helper layer beneath that constructor is tighter now too:0x53fa50is the shared resource-bind and child-list initialization helper,0x53f830is the child-control lookup-by-id helper over the intrusive list at[this+0x70],0x558130is the child-control finalizer that stamps the owner pointer and resolves localized captions before the control goes live, and0x53f9c0is the ordered child-control registration helper used by the optional0x0bd0branch and other shell dialogs. The submode selector itself is tighter now too because its button-state lane is mostly decoded:0xbc5tracks submode15,0xbc6tracks16,0xbbatracks2,0xbbbtracks3,0xbc3tracks13,0xbbcgroups3/4/5,0xbbdtracks4,0xbbetracks5,0xbbfgroups6/12/14,0xbc0tracks7,0xbc1tracks8,0xbc2tracks9,0xe75tracks10, and0xf6etracks17. RT3.lng and the setup art families now also make several of those top-level roots read less like anonymous ids and more like real menu panels: submode1is the strongest current landing-panel fit,2is theSingle Playerroot,7/8/9are theEditor/New Map/Load Mapfamily,15isExtras, and17isTutorial. By elimination against the separate shellCredits.winmode, the remaining top-levelSetup.winroots now most safely read as13 = Multi Playerand16 = High Scores. The file-backed side is tighter too:0x502c00now maps submodes exactly as4 -> dataset 5,9 -> 4,6 -> 8,10 -> 6,12 -> 10, and14 -> 9, so the saved-game-backed family is no longer one blurred list pane but a small set of stable dataset variants above0x4333f0/0x4336a0. The file-list builder under that pair is tighter too:0x4333f0no longer just emits unsorted0x25a-byte rows with raw names at+0x0and normalized labels at+0x12d. After the scan it now clearly re-enters0x51dc60, which is a generic adjacent-swap insertion sort over fixed records; in this setup-side caller it receivesrecord_size = 0x25aandkey_offset = 0x12d, so the resultingSetup.winrows are sorted by display label rather than by the raw filename. The file-backed header split is tighter too:0x5027b0now maps the top header-control ids as4 -> 0xd4b,9 -> 0xde8,6/12/14 -> 0xdf2, and10 -> 0xe85. RT3.lng closes one earlier mistake here: those values are local setup control or resource ids, not localized text ids. The setup art bundle now tightens that family split one step further too: underrt3_2WIN.PK4the distinct file-backed setup art families are the sharedSetup_Loadlane and the separateSetup_Sandboxlane, which matches the selector-side evidence that mode10is the sandbox-backednewlist while mode12is itsloadsibling. Combined with the builder at0x4333f0, that shows only submodes4and10using the alternate localized-stem list-label path;6,9,12, and14keep the direct filename-normalization lane. Thert3_2WIN.PK4extraction path is grounded a bit more cleanly now too: currentpack4samples use a shared0x03ebheader, a fixed0x4a-byte directory entry stride, and a payload base at8 + entry_count * 0x4a. In the checked UI bundle the entry table is contiguous andCampaign.winextracts cleanly at directory index3with payload length0x306a. The extracted.winpayload family now has one narrow shared shape too:Campaign.win,CompanyDetail.win, andsetup.winall share the same first0x50bytes at offsets0x00,0x0c,0x10,0x14,0x34,0x38,0x40, and0x48, whileCompanyDetail.winandsetup.winalso carry an inline root.imbname immediately at0x51. Current resource scans showCampaign.winembedding thelitCamp*/Ribbon*family,CompanyDetail.winembedding mainlyCompanyDetail.imb,GameWindow.imb, andPortrait.imb, andsetup.winembedding the broaderSetup_Background/Buttons/New_Game/Load/Sandboxart families. The control records between those strings are still undecoded, but the resource-record shell itself is tighter now: all checked.winsamples use the same three-word prelude prefix0x0bb8, 0x0, 0x0bb9, and the fourth prelude word matchesresource_name_len + 1. The next word after the terminating NUL then behaves like a per-record selector lane. Insetup.winthe dominantSetup_Buttons.imbfamily alternates between0x00040000and the incrementing0x00010c1c..0x00010c86series with dominant inter-record strides0xb7/0xdb; inCampaign.winthelitCamp*/Ribbon*family carries the incrementing0x0004c372..0x0004c38eselector block with dominant0x158/0x159and0xb2/0xb3strides. That campaign lane is now directly aligned to the executable-side control ids too: the low 16 bits oflitCamp1..16map exactly to0xc372..0xc381, and the low 16 bits ofRibbon1..16map exactly to0xc382..0xc391, matching theCampaign.winprogress and selector control bases already grounded fromRT3.exe. The fuller selector export now tightens the auxiliary families too:litArrows.imbcovers0xc36c..0xc371exactly andlitExits.imbcovers0xc397..0xc39aexactly, matching the constructor-side six-control arrow strip and four-control exit strip. The second post-name dword is tighter now too: its middle 16-bit lane groups those sameCampaign.winrecords under0xc368,0xc369,0xc36a, and0xc36b, which matches the four page-strip controls and cleanly buckets the first five campaign entries, the next five, the next three, and the final three under the same page families. There are still no.imbselector records for0xc393..0xc396or0xc39b, which makes those message-side page-write controls look more like structural buttons than art-backed repeated resource records. The grouped3/4/5family is narrower now too:0x0ce5is no longer part of it, because that control writes selector3and then selects submode9as theLoad Mapsibling. The nearby0x0dcbbranch instead conditionally selects submode5or3, which keeps3as the strongest currentNew Game/Optionscompanion and5as the strongest currentSandboxcompanion. The file-backed single-player side is tighter in the same way now: modes4and10are the only siblings using the alternate localized-stem row-label path, so they now read most safely as the two setup-local template or profile list variants rather than ordinary save lists. Mode10is the stronger one of the pair because neighboring validated launch control0x0e81both routes into selector5and sets sandbox byte[0x006cec7c+0x82] = 1, which makes it the strongest current fit for the setup-localNew Sandboxlist. The distinctSetup_Sandboxart family inrt3_2WIN.PK4now reinforces that same split one step further, which makes mode12the strongest closed fit for the pairedLoad Sandboxlane; mode4is therefore the strongest remaining non-sandbox peer in that same pair and now most safely reads as the setup-localNew Scenario-style chooser. Modes6,12, and14now tighten one step further as the three selector-3direct-filename setup-localloadsiblings because they stay on the direct filename-normalization lane, share the same0xdf2header family, and clear the same presence-style latch[0x006cec7c+0x97]; mode14is the strongest current landing panel for that cluster because0x0c24jumps to it directly while0x0c82and0x0c84only reach the sibling modes6and12from inside the same load family. Current control-pairing and setup-art evidence now make12 = Load Sandboxthe strongest closed per-submode assignment. The remaining non-sandbox pair is closed now too: the deeper bundle filter at0x433260distinguishes dataset9from dataset8by one extra nonzero payload-flag family, and the editor-side metadata path now grounds[0x006cec78+0x66de]as the directCampaign Scenariocheckbox bit becauseeditorDetail.winties control0x5b6eto localized ids3160/3161. That makes dataset9the campaign-designated load family and dataset8the ordinary scenario load family, so14 = Load Campaignand6 = Load Scenarionow read as grounded rather than residual.0x502910is tighter in a corrective way too: it is not a mode-3-only helper after all, but the shared non-file-backed payload panel that formats0xcf3/0xcf4/0xcf5/0xd4f, mirrors option byte[0x006cec7c+0x7d]into0x0ce9..0x0ced, rebuilds row host0x0ce8from payload bytes[+0x31b/+0x31c], and mirrors live row markers into[0x006cec7c+0x87]. That makes mode3just one user of the shared payload-driven panel, not the sole owner of it. The payload-helper cluster under that panel is tighter now too:0x502220does not just republish labels and the preview surface. It first re-entersshell_setup_load_selected_profile_bundle_into_payload_record0x442400, which clears one full0x100f2-byte setup payload record, builds a rooted path from the staged profile stem, opens the selected bundle through0x530c80, and then reads either the ordinary saved-profile chunk family or the map-style chunk family through0x531150/0x531360depending on the selected extension shape. Only after that does0x502220copy payload fields+0x14/+0x3b2/+0x3ba/+0x20into the staged runtime profile through0x47be50, which in turn normalizes the payload category bytes at[payload+0x31a + row*9]and the local marker-slot bytes at[payload+0x2c9..]through0x47bc80. The copied-field consumer split is tighter now too: payload+0x14becomes staged profile[0x006cec7c+0x77], which is the visible setup scalar later formatted into controls0x0e84and0x0d4fand adjusted by the0x0d49/0x0d4apair; payload+0x3b2becomes[0x006cec7c+0x79], the live-row threshold that the payload-row draw callback uses to choose style slot0x18versus0x19; and payload+0x3babecomes[0x006cec7c+0x7b], the current scroll or row-index lane adjusted by the0x0ce6/0x0ce7pair. So the known setup-side payload consumers still stop well before the later candidate table, but the early copied lanes are no longer anonymous. The adjacent region-side worker family is tighter in a negative way too: the setup payload path now gives one useful upper bound on the newer candidate-availability source block too. The map-style setup loader is definitely pulling chunk families0x0004/0x2ee0/0x2ee1into one large0x100f2-byte payload record, and the fixed0x6a70..0x73c0candidate table clearly lives inside the same broad file family; but the grounded setup-side consumers we can actually name after that load still only touch earlier payload offsets such as+0x14,+0x20,+0x2c9,+0x31a,+0x3ae,+0x3b2, and+0x3ba. So the current evidence is strong enough to say the candidate table is probably housed inside the setup payload family, but not yet strong enough to name one setup-side consumer that reads the0x6a70header or the fixed-width entries directly. The newer fixed-offset compare pass tightens that lower setup slice too: across the checked map/save pairsAlternate USA.gmp -> Autosave.gms,Southern Pacific.gmp -> p.gms, andSpanish Mainline.gmp -> g.gms, the known setup payload lanes+0x14and+0x3b2are preserved map-to-save on the same scenario-family split as the later candidate-table headers (0x0771/0x0001,0x0746/0x0006,0x0754/0x0001), while+0x3aestays fixed at0x0186and+0x3bastays fixed at1across all six files. By contrast,+0x20does not survive as one shared source value (0xd3 -> 0xb4,0x6f -> 0x65,0xe3 -> 0x78across those same pairs). So the current best read is that the setup payload mixes preserved scenario metadata and later save-variant state well before the0x6a70candidate table, rather than acting as one uniformly copied prelude. The adjacent region-side worker family is tighter in a negative way too: the setup payload loader is now clearly separate from the broader region-building and placement cluster around0x422320..0x423d30, whose current grounded helpers now include0x422320,0x4228b0,0x422900,0x422a70,0x422be0,0x422ee0,0x4234e0,0x4235c0, andworld_region_refresh_cached_category_totals_and_weight_slots0x423d30rather than one hidden setup-only panel. The leading region helper is no longer unnamed either:0x422320is now bounded as the recurring cached-structure-scalar normalization pass that writes[region+0x2e2/+0x2e6/+0x2ea/+0x2ee], while0x422a70is the shared placement-validation and commit gate beneath both the per-region worker and one second world-side placement loop. The neighboring0x4234e0accessor is tighter too: it is the shared projected structure-count scalar query by category that later feeds both the per-region placement family and the map-editor city count stats report. So the remaining gap is no longer “what are these setup payload helpers doing,” but only how aggressive we want to be when naming the last top-level setup roots from mostly RT3.lng and asset-side evidence. The adjacent summary helper is tighter too:0x502550is not another hidden submode owner. It republishes the staged path tail in0xe7f, the scalar summary in0xe84, the two persisted selector lists in0xe86/0xe87, and the config toggles in0xe88/0xe89/0xe8a. The remaining top-level gap is cleaner now too: submode16still has no distinct downstream helper or launch branch in the local selector/refresh family, but it is no longer a blank bucket. Current evidence now bounds it as the0x0bc3 -> 16top-level button whose visual-state lane is surfaced through control0xbc6, and the strongest residual fit isHigh ScoresbecauseCreditsalready lives in separate shell mode6. The validated launch lane is tighter now too: it no longer just writes selector3or5as one undifferentiated blob, and it no longer includes0x0ce5or0x0dcb.0x0ce5is theLoad Mapselector because it writes selector3and then selects submode9, while0x0dcbis the later conditional5/3companion-selector sibling rather than a file launch. The actual validated staged-profile lane is now bounded more narrowly:0x0cf6and0x0e81are the selector-5siblings, while the neighboring selector-3validated lane is at least shared by0x0de9and0x0df3; the shared bridge at0x4425d0then forces[0x006cec7c+0xc5] = 1, mirrors payload bytes into[profile+0xc4],[profile+0x7d], and[profile+0xc6..+0xd5], and only then issues shell request0x0cc. The file-side staging bytes in that bridge are now tighter too: across the checkedAlternate USA,Southern Pacific, andSpanish Mainlinemap/save pairs, payload+0x33stays0, but payload+0x22and token block+0x23..+0x32do not preserve the earlier map-to-save pairing seen at+0x14/+0x3b2. Instead they split by the finer file family, with examplesAlternate USA.gmp = 0x53 / 0131115401...versusAutosave.gms = 0xae / 01439aae01...,Southern Pacific.gmp = 0xeb / 00edeeeb...versusp.gms = 0x21 / 0100892101..., andSpanish Mainline.gmp = 0x5b / 0044f05b...versusg.gms = 0x7a / 0022907a.... So the validated launch bridge now looks more like a file-family staging lane than a simple copy-forward of the earlier setup summary fields. The destination-side consumers are tighter now too:[profile+0xc4]is no longer just an unnamed staged byte, but the campaign-progress slot later consumed by the numbered%s%02d.gmcsave helper0x00517c70;[profile+0x7d]is the same compact option byte mirrored back into theSetup.winoption controls0x0ce9..0x0ced; and the campaign-side selector block is no longer only a one-byte anchor. DirectRT3.exedisassembly of the campaign-side dispatcher at0x004b89c0now shows the exact mirror shape: when the local campaign-page selector[window+0x78] <= 4, the helper writes one highlighted progress control0x0c372 + [profile+0xc4]and then mirrors the full sixteen-byte band[profile+0xc6..+0xd5]into controls0x0c382..0x0c391through repeated0x540120calls. The same body also treats[profile+0xc4]as an index into the fixed sixteen-entry scenario-name table at0x00621cf0, whose observed entries includeGo West!,Germantown,Central Pacific,Texas Tea,War Effort,State of Germany,Britain,Crossing the Alps,Third Republic,Orient Express,Argentina Opens Up,Rhodes Unfinished,Japan Trembles,Greenland Growing,Dutchlantis, andCalifornia Island. On the launch-side branch the same helper writes startup selector6, copies the resolved campaign filename into[profile+0x11], forces[profile+0xc5] = 1, and then issues shell request0x0cc. The lower refresh tail at0x004b8d49..0x004b8d69also shows the observed page-band split over the same progress byte: values< 5pair with campaign page1, values5..9with page2, values10..12with page3, and values>= 13with page4. So[profile+0xc6..+0xd5]is no longer a generic opaque span at all, but the staged sixteen-byte per-scenario campaign selector or unlock band consumed directly byCampaign.win. The message-dispatch side is tighter now too. The local classifier at0x004b91d8routes the control range0x0c352..0x0c39bthrough five concrete case classes:0x0c352..0x0c361enter the shared selector or launch branch,0x0c362..0x0c367force local page1,0x0c368..0x0c392force local page2,0x0c393..0x0c396force local page0, and0x0c39balone forces local page3. That matches the constructor and refresh shape: the sixteen scenario selector controls live at0x0c352..0x0c361, the four page-strip controls live at0x0c368..0x0c36b, the six-arrow auxiliary strip lives at0x0c36c..0x0c371, the progress band lives at0x0c372..0x0c381, the ribbon or selector band lives at0x0c382..0x0c391, the string or voice target lane lives at0x0c392, the four exit controls live at0x0c397..0x0c39a, and0x0c39bremains the one-off special action control that spawns or dismisses the campaign-side companion object. TheCampaign.winblob now exposes that structural split directly too: alongside the art-backed0x0004c3xxrecords it carries anonymous zero-name records with the same0x0bb8 / 0 / 0x0bb9prelude but selector words in the0x0010c3xxfamily. Current local extraction shows exactly0x0010c352..0x0010c361,0x0010c362..0x0010c367,0x0010c393..0x0010c396, and one0x0010c39brecord, which is the same non-.imbband the message dispatcher treats as the structural selector and page-write family. Their second selector word then buckets those records under the same page-strip ids as the art-backed records:0xc368for0xc352..0xc356,0xc362,0xc393, and0xc39b;0xc369for0xc357..0xc35b,0xc363, and0xc394;0xc36afor0xc35c..0xc35e,0xc365..0xc366, and0xc395; and0xc36bfor0xc367,0xc35f..0xc361, and0xc396. One final anonymous record at0x0002c392has no page bucket at all, which fits the already-grounded read of0xc392as the one-off string or voice target lane rather than a normal page-cell control. The anonymous body layout is only partially named, but one file-side distinction is already stable: the ordinary structural selector/page records all carry footer words0xd3000000and0xd2000007at relative+0x98/+0x9c, while the lone0xc392record carries0x00000000/0x00000000there. So0xc392is no longer just “outside the page buckets”; it is also the only current anonymous-record outlier in that trailing structural footer pair. The structural selector side is tighter now too:0xc352..0xc361partition exactly as5 + 5 + 3 + 3across page buckets0xc368..0xc36b, matching the observed campaign page bands for scenario progress values< 5,5..9,10..12, and>= 13. That makes the anonymous selector records the file-side mirror of the same campaign page split, not a separate unrelated control family. The file-order adjacency is tighter in the same way:0xc352..0xc361each sit immediately after oneRibbonN.imbrecord and before the nextlitCamprecord, which makes them the strongest current file-side fit for the structural selector or click-target siblings of the visible campaign ribbon controls. The auxiliary anonymous bands line up the same way:0xc362..0xc367sit inside the locallitArrows.imbclusters,0xc393..0xc396sit inside thelitExits.imbclusters, and0xc39bsits once between the first arrow and first exit group. So the current best read is that those anonymous records are the structural hitbox or action siblings of the visible arrow, exit, and selector art families, not an unrelated hidden control layer. The generic record cadence is tighter now too: in the currentCampaign.windump the ordinary anonymous structural records all span0x0a7bytes, while the named art-backed records cluster at0x0b1,0x0b2, and0x0b3. The only two visible outliers are the leading0x0080c351record at0x0041with span0x0a3, and the trailing0x0002c392record at0x2fb9with span0x0b1. That reinforces the current read that0xc351and0xc392are one-off structural controls flanking the main selector or page family rather than ordinary repeated art-backed records. The setup-launch corpus now tightens one corrective caveat there too: when the checkedAlternate USA,Southern Pacific, andSpanish Mainline.gmp/.gmsfiles are decoded with that same campaign-side interpretation, payload byte+0x22is always outside the known campaign progress range0..15(0x53,0xeb,0x5b,0xae,0x21,0x7a), so the ordinary validated setup lane is not simply staging a normal campaign-screen state. The paired token block+0x23..+0x32is still structurally compatible with the campaign selector band, but in the checked files it only populates a small recurring subset of the sixteen scenario lanes, chieflyGo West!,Germantown,Central Pacific,Texas Tea, andWar Effort, with scenario-family-specific byte values rather than a simple0/1unlock bitmap. That makes the setup-side staging bridge look more like one shared destination layout being reused for a broader launch token family, not a proof that ordinary setup-launched.gmp/.gmscontent is already in campaign-screen form. Only0x0e81also sets[0x006cec7c+0x82] = 1, which is currently the strongest sandbox-side anchor beneath the later.gmxload family. That launch band is slightly tighter now too:0x0dcais the grayscale-map picker branch above theTGA Files (*.tga)/.\Data\GrayscaleMapshelper at0x004eb0b0, not another ordinary save-file validator. That launch band is tighter in a second way too:0x0ddfis not a lobby branch after all, but the separate windowed-mode-gated grayscale-heightmap generation path. It reopens theTGA Files (*.tga)/.\Data\GrayscaleMapspicker through0x0042a970, validates the chosen image through0x005411c0, and only then writes startup selector2. The fixed- button side is tighter too: submode15now aligns with theExtrasfamily because it sits above the Readme/Weblinks shell-open quartet and the return-to-extras sibling, while submode17now aligns with the tutorial chooser because it is the only branch that later exposes startup selectors1and7, which RT3 uses forTutorial_2.gmpandTutorial_1.gmp. The map-root family is tighter too: submodes7/8/9are the only setup branch that flips the file root intomaps\\*.gm*, with mode8specifically the grayscale-heightmap picker and mode9the file-backed map-list sibling. Submode13is slightly tighter now too: current local evidence shows that it stays outside both the dedicated file-backed pane and the mode-3option-heavy pane, so it is best read for now as one top-level non-file-backed setup branch rather than another saved-game list variant. The setup-side file roots are tighter now too: the shared file-list builder at0x4333f0formats eithersaved games\\*.smpormaps\\*.gm*from the shell-state fields at[0x006cec74+0x68/+0x6c], with the separatedata\\tutorialroot only appearing on the tutorial-side[shell+0x6c] == 2branch. That means theSetup.winsubmode families are no longer one generic file pane: the ordinary setup-backed.smpfamily is broader than the narrower file-list pane, because modes3/4/5/6/10/12/14stay on the ordinary saved-game side while only4/6/9/10/12/14re-enter the dedicated file-list panel at0x5027b0; themapsbranch is the narrower setup or tutorial launch family above the same shared record builder. - Evidence: function-map map/scenario rows, analysis-context exports for
0x00445ac0,0x00445de0,0x00443a50,0x00434300, and0x00444dd0, plus objdump string and mode-table evidence for.gmp,.gmx,.gmc,.gms,.gmt,.smp,Quicksave, the0x004dd010mode table at0x005f3d58, the auxiliary-owner presence check at0x00434050, and the.gmthandoff through0x00469d30, together with localized string evidence from ids3018and3898. - Open Questions: bit
0x1on both broad coordinators now grounds the Quicksave name seed and the former thirdfileopt.winflag has been ruled out as a file-flow question because it just opensSettingsWindow.win. The old broad extension question is mostly resolved:.gmpis the editor-map pair,.gmsis the standalone scenario family,.gmcis the campaign-scenario family,.gmxis the sandbox family, and.gmtis at least bounded as an auxiliary preview-surface branch rather than another gameplay save family. The higher-value global question is no longer whether0x00443a50is world entry. It is where the long-lived simulation cadence takes over after this bring-up and whether that cadence still rendezvous with the shell-owned frame path or escapes into a separate gameplay loop.
Multiplayer Session and Transport Flow
- Roots:
multiplayer_window_init_globalsat0x004efe80,multiplayer_window_service_loopat0x004f03f0, the Multiplayer.win session-event callback table built bymultiplayer_register_session_event_callbacksat0x0046a900, the active session-event transport object at0x006cd970, the Multiplayer preview dataset object at0x006cd8d8, and the lower pending-template and text-stream helpers around0x00597880..0x0059caf0. - Trigger/Cadence: shell-owned Multiplayer.win frame service plus event-driven session callbacks and repeated transport pump steps.
- Key Dispatchers: session-event wrappers for actions
1,2,4,7,8;multiplayer_register_session_event_callbacks;multiplayer_dispatch_requested_action;multiplayer_reset_preview_dataset_and_request_action;multiplayer_preview_dataset_service_frame;multiplayer_load_selected_map_preview_surface;multiplayer_flush_session_event_transport;multiplayer_transport_service_frame;multiplayer_transport_service_worker_once;multiplayer_transport_service_route_callback_tables;multiplayer_transport_service_status_and_live_routes;multiplayer_transport_text_stream_service_io;multiplayer_transport_dispatch_pending_template_node;multiplayer_transport_service_pending_template_dispatch_store. - State Anchors: live session globals at
0x006d40d0, active session-event transport object at0x006cd970, status latch at0x006cd974, session-event mode latch at0x006cd978, retry counter at0x006cd984, preview dataset object at0x006cd8d8, preview-valid flag at0x006ce9bc, staged preview strings at0x006ce670and[0x006cd8d8+0x8f48], Multiplayer.win backing block at0x006d1270, selector-view store root at[transport+0xab4], selector-view generation counters at[transport+0xab8]..[transport+0xac0], selector-view backing arrays around[transport+0xad0]..[transport+0xae4], selector-view entry probe-request id at[entry+0x50], live-state gate at[entry+0x58], third-slot flag word at[entry+0x64], probe-schedule tick at[entry+0x68], last-success tick at[entry+0x6c], pending-probe latch at[entry+0x74], success generation at[entry+0x78], consecutive-failure counter at[entry+0x7c], rolling average at[entry+0x80], recent sample window at[entry+0x84..], bounded sample-count at[entry+0x94], total-success count at[entry+0x98], pending-template list at[transport+0x550], dispatch store at[worker+0x54c], and text-stream buffers rooted under[worker+0x1c]. - Subsystem Handoffs: the Multiplayer.win initializer seeds the backing block at
0x006d1270, later reset paths construct the separate preview dataset at0x006cd8d8, and the shell-owned active-mode frame services that dataset every frame throughmultiplayer_preview_dataset_service_frame. That preview side publishes roster and status controls through the Multiplayer window control paths, loads.gmtpreview surfaces throughmultiplayer_load_selected_map_preview_surface, and is even reused by the map/save coordinator’s mode-11.gmtpath when the dataset already exists. In parallel,multiplayer_register_session_event_callbacksallocates and registers the separate session-event transport object at0x006cd970. The shell-side bridge into that deeper transport cadence is now tighter:multiplayer_window_service_loopand neighboring reset or initializer branches callmultiplayer_flush_session_event_transport, which forces one status flush and then drops intomultiplayer_transport_flush_and_maybe_shutdown. That wrapper in turn runsmultiplayer_transport_service_frame, the recurring pump that services one worker step throughmultiplayer_transport_service_worker_once, sweeps the transport-owned callback tables and field caches throughmultiplayer_transport_service_route_callback_tables, services both the auxiliary status route and the current live route throughmultiplayer_transport_service_status_and_live_routes, and then descends one layer farther into the shared GameSpy route helpermultiplayer_gamespy_route_service_frameat0x58d040. The transport also owns a separate selector-view sidecar beneath that route cadence.multiplayer_transport_ensure_selector_view_storeallocates the keyed selector-view store at[transport+0xab4],multiplayer_transport_find_selector_view_entry_by_nameresolves entries from that store,multiplayer_transport_upsert_selector_name_entrymarks per-slot activity and flags inside each entry, andmultiplayer_transport_mark_selector_slot_views_dirtyplusmultiplayer_transport_reset_selector_view_entry_runtime_statemanage the dirty or refresh fields at+0xa0,+0xa4, and+0xa8. That selector-view maintenance path is now split more cleanly too. The recurring owner ismultiplayer_transport_service_selector_view_refresh_cycle, which first runs the fast deferred-probe lane:multiplayer_transport_collect_refreshable_selector_view_entrieswalks the store throughmultiplayer_transport_filter_insert_refreshable_selector_view_entry, which now shows that[entry+0x64]is not a generic flag bucket but the third selector-slot flag word, parallel to[entry+0x5c]and[entry+0x60]. In that collector, thegandamode-letter bits produced bymultiplayer_transport_parse_selector_mode_lettersbecome mask0x0cin the slot-local flag words, and any third-slot entry carrying those bits at[entry+0x64]is excluded from the refreshable set. Eligible entries then pass slot-aware retry timing on[entry+0x68],[entry+0x6c],[entry+0x78], and[entry+0x7c], after which the service loop schedules refresh probes throughmultiplayer_transport_schedule_selector_view_entry_refresh_probe. That fast lane is narrower now too: the entry-side match key[entry+0x50]is no longer just an opaque request field. The profile-key callback lanes feedmultiplayer_transport_parse_selector_view_probe_marker, which decodes one localX%sX|%dmarker into a probe request id plus displayed version/build integer, andmultiplayer_transport_arm_selector_view_probe_trackingstores those into[entry+0x50]and[entry+0x54]before arming the live probe gate at[entry+0x58]. The current-selector callback root at0x59f8b0is now bounded as well: it resolves and upserts the active selector name, optionally reuses a cachedusernamemarker to arm probe tracking immediately, then submits the same profile-key bundle with selector context and forwards that selector through callback slot17, with the status-route side able to force route-mode transitions2 -> 3 -> 4afterward. One layer lower,multiplayer_transport_handle_profile_key_query_resultat0x596970now bounds the per-key result path itself. It treatsusernameas the probe-marker field,b_flagsas the selector mode-letter field, and(END)as a real sentinel that publishes a zeroed slot-22payload instead of a marker pair. The same helper also hashes the selector-name, key-name, and resolved value text back into the caller table, so the profile-key bundle now looks like a real bounded handoff rather than an anonymous callback cloud. The deferred callback shimmultiplayer_transport_dispatch_selector_view_refresh_probe_resultthen walks the keyed store throughmultiplayer_transport_finish_selector_view_refresh_probe_if_matching, which only completes entries whose pending latch[entry+0x74]is still armed and whose parsed marker request id[entry+0x50]matches the finished request. A failed result-1clears the pending latch and increments the consecutive-failure counter at[entry+0x7c]. A nonfailure result clears the pending latch, increments the success generation at[entry+0x78]and total-success count[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 averagedmssample throughmultiplayer_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 at0x5958e0and the later compatibility gate atmultiplayer_transport_route_binding_matches_route_callback_descriptor_tuple0x595d00operate 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 ashostnameandgamever, and numeric-key lookups such asnumplayers,numservers,numwaiting, andgsi_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/+0x58and 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:0x5907d0is the allocate-and-append lane for one self-consistent compact payload, while0x590d00is 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_construct0x5905e0seeds one transport-owned table block,multiplayer_transport_route_callback_table_release_decoded_schema_dictionary0x5906f0tears down the decoded schema dictionary rooted at[this+0x08],multiplayer_route_callback_runtime_acquire_shared_string_copy0x590540andmultiplayer_route_callback_runtime_release_shared_string_copy0x5905a0now bound the shared string pool used by that decoded schema, and the higher bring-up owner0x596090now clearly splits between[transport+0xba4]with owner callback0x595a40, the local field-cache family[transport+0x1724]seeded through0x5a08f0/0x595b60, and[transport+0x1164]with owner callback0x595bc0, whilemultiplayer_transport_route_callback_table_service_receive_decode_state_machine0x5908c0is the current live receive/decode state machine serviced by0x591290in table states2/3. The callback-owner mode split above that runtime is now explicit too: append-notify0x590370publishes mode0, compact upsert0x590d00publishes mode1, remove-notify0x590430publishes mode2, and the live receive/decode path0x5908c0publishes modes6,5, and3. The route-handle lifecycle above that decode path is tighter now too:0x590740cleanly resets one table's live route plus decode-side runtime without destroying the outer object;0x5907a0is the broader destroy path that also releases the active descriptor collection;0x590ed0opens the live route handle into[this+0x4a0], stages the initial outbound request, and seeds state3plus the staged receive buffer;0x5911e0is the state-2/3socket-service wrapper that reads new bytes, grows the staged buffer, and re-enters0x5908c0;0x5912c0is the one-shot send-with-reopen-retry helper; and0x590ea0is the shared disconnect publication and reset tail. The recurring service helper0x591290is tighter too: it now first clears the staged intrusive descriptor list through0x590490before entering the state-driven seed-or- receive branch. The upstream owners are tighter too:0x5962e0is now the field-subscription route-table opener above[transport+0xba4], while0x596530is thegsi_am_ratingreopen path above[transport+0x18bc]. On that latter branch,0x590dc0is now bounded as the state-0raw-endpoint seed pass over the live route handle, repeatedly pulling endpoint tuples through0x58bc7erecord type0x1f3before stamping descriptor flag byte0x15with0x11. That makes the remaining source-flag meaning narrower too: current evidence now supports reading byte-0x15bit0x1as a primary-endpoint-seed or endpoint-only marker. In thegsi_am_ratingdispatcher, 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:0x595bc0now clearly publishes a descriptor block from live descriptor propertieshostname,numwaiting,maxwaiting,numservers, andnumplayersplus 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 in0x595bc0reads the same+0x0c/+0x10/+0x18metadata triplet and replay modes later consume the pointer through0x5933a0. 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 obviouslea-based replay-band writer. The transient-request lifecycle tightens that further:0x593330/0x593370/0x593380/0x5934e0/0x5933a0now fully bound[transport+0x1780],0x1784, and0x1788without ever touching[transport+0x1778], and the neighboring active-opcode reset helper0x5929a0is likewise scoped only to[transport+0x17fc]. A broader constructor and teardown pass tightened that further too:0x596090,0x5961b0, and0x5962e0all touch the neighboring replay-band fields without ever seeding[transport+0x1778]. A full-binary literal-offset sweep tightens it further still: the only direct0x1778hit inRT3.exeis the read in0x595bc0. One nearby ambiguity is now closed too: the mode-5mirror path in0x595a40and0x595e10does not target[transport+0x1778]; it writes[transport+0x54]and mirrors the same staged route companion dword only into queue-side slot[transport+0x1724+0x24]through0x005a0940. So the sidecar writer remains upstream of this leaf publisher. Mode0is now also tied more cleanly to the generic descriptor append-notify lane at0x590370, while mode2stays outside this helper as the separate remove-notify-and-stage path at0x590430. The opcode-2payload boundary is tighter too:0x592ae0now grounds that payload as a seven-dword block with an owned string slot at+0x08, so live mode supplies a populated payload while modes3and5deliberately 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 by0x5911e0 -> 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 capacity-owner split is tighter now too:0x595bc0only stages descriptor records for modes0,3, and5; the upstream route-callback-table owner still delivers modes1,2, and6, 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/0x593380now bound[transport+0x1780]as the construct/clear/destroy owner family, while0x5933a0,0x5934e0, and0x593570ground the remove, allocate, and completion side over that same collection. The small sibling0x593400is tighter too: it is a pure work-record uniqueness predicate over field+0x0c. Its caller is tighter now too:0x58d720is an immediate-drain quiescence gate over one transport context id, using0x593400for the queued work family at[transport+0x1780]and0x592970for the active opcode-record collection at[transport+0x17fc]. The strongest current read is that0x5934c0seeds that shared drain context id first, then the transport copies it into queued work field+0x0cand active opcode-record field+0x14before the immediate-drain roots wait on one shared disappearance test rather than on a vague settle loop. The currently grounded roots are0x58df20, the neighboring formatted selector-text publish path at0x58dfb0, and callback-table registration at0x58e200. The active-opcode side is tighter too:0x5927b0now bounds the per-record service-and-retire path,0x592800the wider context-or-idle sweep,0x5929a0the remove-by-opcode-type sweep, and0x5929f0the narrower opcode-3field-snapshot removal keyed by the subscribed callback-pair payload. That also corrects0x595b80, 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:0x590410now grounds[table+0x5bc]as the staged intrusive descriptor-list head,0x590430is the generic remove-notify-and-stage lane,0x590490releases the staged list, and0x5904d0releases the active descriptor collection before tearing that staged list down. That also makes the earlier0x5962e0“release active descriptors” step explicit. The callback-table attach side now constrains the same work-record metadata family a little further too:0x593650deliberately duplicates its first caller metadata dword into both fields+0x0cand+0x10, while carrying the second caller metadata dword in+0x18. The lower opcode wrappers are tighter now too:0x592a40turned out to be the explicit opcode-1trigger wrapper whose constructor is a no-op and whose active-side service is0x5913c0, while0x592c40is the real0x08-byte explicit opcode-5binding leaf. The earlier opcode-4read was just the table-indexing mistake in0x5928a0: selector4lands on the row at0x5e2044, not the row at0x5e2034. The producer side is tighter too: bound-route requests, selector-text route requests, and the type-9text fastpath also stage that same triplet through0x5934e0, and the fastpath shim0x593d00now gives the cleanest proof of the callback split by only re-emitting the follow-on lane when+0x10is nonnull and then forwarding(+0x10, +0x18, +0x0c)into0x593170as 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:0x592b50now clearly uses[transport+0x1774]as a cached progress percentage under[transport+0xba4], and0x5962e0seeds that percentage to1just before the first immediate mode-3snapshot. The nearby route-callback-table lifecycle is tighter now too:0x596090seeds[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];0x596210is the recurring service sweep over those same three tables plus the local field cache and queued-descriptor family;0x596060is the explicitgsi_am_ratingreset; and0x596530is the reopen-from-stored-label sibling above that same am-rating table. The matching local cleanup is tighter too:0x5962c0is the explicit staged route-callback payload clear on[transport+0xb50], while0x595ce0now 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: 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 in0x595bc0; even the broader callback-owner lifecycle now skips it while seeding, servicing, resetting, reopening, or tearing down those neighboring tables and caches. The constructor now closes that local search further:0x58dc50bulk-zeroes the full transport 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:0x5934e0stages the shared work-record metadata triplet,0x593650binds it into the callback-table worker path, and0x593570later consumes and republishes it, while[transport+0x1778]still appears only as the borrowed sidecar read in0x595bc0. 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 callback side is tighter too:0x595860is now bounded as the submit-result handler beneath0x5958e0, 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 from2into3and later4. The selector-view counter beneath that gate is tighter now too:0x594e30counts slot-2entries whose flag dword carries bit0x20, optionally filtered by the current transport name buffer. The selector-view mutation family under that same lane is tighter too:0x594a30is now the direct keyed-store remover,0x594fb0clears one selector-slot ownership pointer plus its slot-local flag dword and drops the whole entry when no slots remain,0x595010rekeys one selector-view entry under a new name while preserving the0x40..runtime band, and callback root0x59f9c0now reads as the sibling lane that clears one named selector-view slot, publishes callback slot18, and may still re-enter the route-mode setter from the same slot-2status and generation gates. The neighboring callback roots are tighter now too:0x5950a0clears one selector slot from every selector-view entry in the keyed store,0x59fab0is the rename or relabel sibling above0x595010,0x59faf0updates one selector slot's fixed sample-text buffer and refreshes the active selector object when present, and0x59fb60replaces one selector slot's name set, requests the default profile-key bundle for that slot, and publishes callback slot20. Slot16is tighter now too: current grounded caller0x59f440forwards the staged route-callback payload handle from[transport+0xb50]through0x592ea0just before route mode5. The last adjacent callback root in that block is tighter now too:0x59fbd0is the built-in per-slot profile-key query sibling. It resolves the caller selector name into one slot index, forwards the caller trio into0x596b90, and then publishes callback slot28; that lower helper indexes one slot-specific built-in string pair from[transport+0x189c]and[transport+0x18ac], reuses the generic per-key handler0x596970, and only republishes slot28when that lower query path succeeds. The compact-header side is tighter now too:0x58fe20and0x58ff20now show that compact payloads always carry the primary IPv4 dword and that header bit0x10only gates whether the primary port word is inline or inherited from the owner default port.0x58fe90now validates the0x40inline keyed-property vector against the owner schema, and0x58fe50validates the signed-0x80trailing string-pair tail before decode.0x58ff60then grounds bit0x02as the inline secondary IPv4 dword branch, bit0x20as the paired secondary-port word branch with owner-port fallback, bit0x08as one still-unresolved auxiliary dword stored at[descriptor+0x10], bit0x40as one inline keyed-property vector decoded through the property-store writers, and signed bit0x80as one trailing string-pair tail. The descriptor-state side is tighter now too: the shared queue helper at0x005a09a0stamps pending state0x4for the local field-cache family[transport+0x1724]and pending state0x8for thegsi_am_ratingqueued-descriptor family[transport+0x1e7c], while later service through0x005a0c80promotes those pending tags into ready bits0x1and0x2in descriptor byte[entry+0x14]. That makes the current transport-side tests cleaner:0x58d1c0is the field-cache ready gate,0x58d1d0is thegsi_am_ratingqueued-descriptor ready gate, and0x58d230is the remaining flag-byte split between direct primary-endpoint handling at[transport+0x18bc]and the queued path at[transport+0x1e7c]. That byte-0x14story is no longer queue-only either:0x58ff60can also OR in bit0x1after the inline keyed-property vector and bit0x2after the signed string-pair tail. The flag-byte split is no longer purely behavioral either: current evidence now says byte[descriptor+0x15]bit0x1is a source-side descriptor header bit, explicitly seeded during the primary-endpoint table refresh around0x590dc0and preserved by the compact descriptor decode path at0x58ff60, rather than a queue-generated runtime state. Thegsi_am_ratingdispatcher side is tighter too: that same bit no longer just looks like a direct-versus-queued routing split, because0x595e10also uses it to suppress the direct0x595dc0transition even after queued ready bit0x2is 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 currentqueryid/pingfallback 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 likegeneric_record_0x1c_deep_copy_with_owned_string_at_0x080x591410and the adjacent callback-marshaling wrappers0x591480and0x591510, not read through any dedicated semantic accessor yet. The route-event dispatcher side is tighter too: the mode-5tails 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]. Thegsi_am_ratingmaintenance lane is tighter now too: after pruning failed descriptors it sorts the surviving primary-endpoint table through0x590310in mode1with keygsi_am_rating, then selects the new head through0x590480before 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_entrywalks the store throughmultiplayer_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 tomultiplayer_transport_stage_selector_view_progress_snapshot. That helper now looks more bounded too: it rebuilds the coreX%sXmarker text from[entry+0x50]throughmultiplayer_transport_format_selector_view_probe_marker_core, formats onePNG %s %dline around that marker and the entry-local averaged millisecond sample at[entry+0x80], appends bounded selector-slotPNGfragments 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 refresh bucket: it has a faster deferred-probe lane plus a slower progress-snapshot lane, both still under the shell-owned multiplayer transport cadence. The two descriptor lanes installed bymultiplayer_transport_attach_callback_table_descriptorare now tighter too. The first lane rooted at0x59f5c0can arm deferred-close state on the owner transport and then forward through callback slot23. The second lane is no longer just a loose selector-view bucket:multiplayer_transport_callback_dispatch_selector_name_payload_laneat0x59f650classifies selector payloads throughmultiplayer_transport_is_selector_control_line, routes@@@NFOcontrol lines intomultiplayer_transport_sync_selector_view_nfo_r_flag, and otherwise publishes either callback slot13or the split token-plus-tail callback slot14throughmultiplayer_transport_split_selector_payload_token_and_tail. That local@@@NFOhelper is now bounded more tightly too: it only accepts lines ending in the literalX\tail, searches for the field marker\$flags$\, and then sets or clears bit0x2in the third selector-slot flag word at[entry+0x64]depending on whether that field contains the letterrbefore the next backslash. The siblingmultiplayer_transport_callback_dispatch_current_selector_payload_laneat0x59f720first resolves the active selector through0x5951a0, then handles the current-selector variants of the same control vocabulary:@@@NFOcontinues into the same localr-flag sync helper,@@@GMLplus mode-3/4payloads feed the shared control-token helpermultiplayer_transport_handle_gml_or_png_selector_control, and the remaining non-control payloads publish callback slot9. That shared helper now narrows theGMLandPNGsplit materially: when the token isGMLand the tail isDisconnected, it requires the active selector-view entry to passmultiplayer_transport_selector_view_entry_has_gml_disconnect_gate, which currently means the entry participates in the third selector slot and has bit0x20set in[entry+0x64], before it forces one status-pump pass, emits callback slot16, and re-enters route mode5. Its siblingPNGbranch resolves a named selector-view entry from the tail text and, when that entry overlaps the active selector-slot ownership, refreshes selector-view runtime state through0x5948f0and republishes callback slot25. Alongside those dispatchers, one grounded branch at0x59f560still updates selector-view runtime state through0x5948f0and forwards the same selector-name pair through callback slot25, while0x59f850resets selector text state through0x5954b0, forwards through callback slot19, and when selector2is active in a nonterminal route mode re-entersmultiplayer_transport_set_route_modewith mode1. The low-level route helper still looks like a two-part cycle:multiplayer_gamespy_route_service_retry_and_keepalive_timershandles challenge or retry pressure and periodic outbound control traffic around themaster.gamespy.com,PING,natneg,localport,localip%d, andstatechangedstrings, whilemultiplayer_gamespy_route_drain_inbound_packetsdrains inbound datagrams and dispatches semicolon lines, backslash-delimited key bundles, and0xfe 0xfdGameSpy control packets. The transport-owned callback story is now narrower too. The shared route constructormultiplayer_gamespy_route_construct_and_seed_callback_vectorseeds[route+0x88]through[route+0x9c]from the caller-supplied transport callback table, records the owner transport at[route+0x104], and explicitly zeroes[route+0xa0],[route+0xa4], and[route+0xd4]before any later patch-up. For the transport-owned status route,multiplayer_transport_try_connect_status_routethen patches[route+0xa0]throughmultiplayer_gamespy_route_set_extended_payload_callbackto point atmultiplayer_transport_forward_validated_extended_route_payload0x00597330, which simply forwards the validated payload wrapper into the owner callback at[transport+0x17f4]with context[transport+0x17f8]. The grounded live-route connect path atmultiplayer_transport_try_connect_live_routedoes not currently perform any matching post-construction patch for[route+0xa0],[route+0xa4], or[route+0xd4], and the higher route-mode state machine now looks consistent with that:multiplayer_transport_set_route_modelatches the requested small mode at[this+0x18b8], then uses mode0for the direct-versus queuedgsi_am_ratingsplit, mode1for the ready-bit plus queued fallback, mode2for pending-descriptor cleanup, mode3for the empty-table fallback, mode4for deferred route-status recovery, and mode5for copying the staged route companion dword into[this+0x54]and queue-side slot[this+0x1724+0x24]. The current grounded mode transitions still switch by releasing route objects throughmultiplayer_gamespy_route_release_and_freeand rebuilding them throughmultiplayer_transport_try_connect_live_route, not by mutating callback slots in place. The parser behavior is now tighter as well: semicolon lines only dispatch when[route+0xd4]is non-null, and the subtype-6raw fallback only dispatches when[route+0xa4]is non-null. For the currently grounded transport-owned status and live routes, those two branches therefore remain optional and can cleanly no-op instead of implying a hidden mandatory callback path. Inside the packet parser, subtype4is no longer an unknown callback hop: after cookie validation it dispatches through[route+0x9c], which the transport-owned status and live routes seed tomultiplayer_transport_handle_validated_route_cookie_event0x005972c0. That helper either marks route progress and re-entersmultiplayer_transport_set_route_mode, or forwards the event id plus payload into the owner callback at[transport+0x17f0]with context[transport+0x17f8]. The surrounding status-route callback vector is tighter now too:0x005970e0publishes either the active selector text or the averaged probe sample at[entry+0x80]and otherwise falls back to owner callback[transport+0x17e0];0x00597180is a straight owner-forwarding lane through[transport+0x17e4];0x005971b0seeds the local status-control id list and can then notify owner callback[transport+0x17e8]; and0x00597270returns the third selector-slot generation counter[transport+0xac0]on its bounded local branch before falling back to owner callback[transport+0x17ec]. Subtype6still 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 at0x006cd8d8from the actual transport cadence at0x006cd970, and also separates that transport cadence from the lower GameSpy route-service and packet-parser layer beneath it. - Evidence:
function-map.csv,pending-template-store-management.md,pending-template-store-functions.csv, plus objdump caller traces showingmultiplayer_window_service_loopreachingmultiplayer_flush_session_event_transportand the transport pump chainmultiplayer_flush_session_event_transport -> multiplayer_transport_flush_and_maybe_shutdown -> multiplayer_transport_service_frame -> multiplayer_transport_service_worker_once -> multiplayer_transport_drain_request_text_queue. - Open Questions: unresolved request-id semantics for
1,2,4, and7; whether any non-mode-path helper outside the currently grounded release-and-rebuild flow ever patches[route+0xa4]and[route+0xd4]for the transport-owned status/live routes, or whether those packet families are simply unused in this stack; and how far the Multiplayer preview-dataset machinery is reused outsideMultiplayer.winbeyond the currently grounded.gmtsave-mode hook.
Input, Save/Load, and Simulation
-
Roots: the shell controller window-message ingress
shell_controller_window_message_dispatchat0x0054e3a0, the shell input-state object initialized at0x006d4018throughshell_input_state_init0x0054e710, the saved-world restore pathworld_load_saved_runtime_state_bundleat0x00446d40, the live-world save pathworld_runtime_serialize_smp_bundleat0x00446240,world_entry_transition_and_runtime_bringupat0x00443a50, the frame-owned cadencesimulation_frame_accumulate_and_step_worldat0x00439140, the recurringGameMessage.winservice branch throughgame_message_window_service_if_present0x004e0720, the world-facingGameUppermost.winoverlay branch ensured byshell_ensure_game_uppermost_window0x004e0e40and serviced throughgame_uppermost_window_service_world_hotspot_band0x004e0780, and the lower step family rooted atsimulation_advance_to_target_calendar_point0x0040ab50with periodic branches throughsimulation_service_periodic_boundary_work0x0040a590. -
Trigger/Cadence: shell-side input is event-driven by controller-window
WM_*traffic while save or load work is triggered either directly from shell commands or through thefileopt.winbranch flags into the.smpruntime-state family; post-bring-up world service becomes recurring once a world root exists at0x0062c120, but the current grounded top-level cadence still remains the shell-ownedshell_service_pump_iterationpath, which callssimulation_frame_accumulate_and_step_worlddirectly and lets it accumulate elapsed wall-clock time into one or more simulation-step quanta. A second ingress is now bounded too:simulation_run_chunked_fast_forward_burstat0x00437b20repeatedly calls the same lower steppersimulation_advance_to_target_calendar_point, but current grounded callers put that helper inside the larger post-load generation pipelineworld_run_post_load_generation_pipelineat0x004384d0under theSeeding Economy...phase rather than under the ordinary player-facing speed buttons. That setup pipeline is now clearer at the progress-banner level too: on the fuller setup path it first runs one preliminary named-candidate availability prepass through0x00437743before any visible progress banner is posted. After that, localized id318Computing Transportation and Pricing...stays visible while the pipeline runsworld_compute_transport_and_pricing_grid0x0044fb70, the early collection-owned staging passworld_rebuild_secondary_raster_derived_surface_and_companion_planes_in_rect0x0044e940,world_setup_building_collection_phase0x0041ea50, and the conditional region pairworld_region_collection_seed_default_regions0x00421b60plusworld_region_border_overlay_rebuild0x004882e0. The transport/pricing side is tighter now too:0x0044fb70first routes one null-build path through the preview ensure wrapper0x0044faf0, whose deeper worker0x0044f840allocates a default target through0x00534930, seeds five palette entries through0x0051de10, maps each target pixel back into the live secondary raster through0x00533970/0x00533980, uses the low-3-bit class split plus a local+/-4neighborhood and0x0051db80to choose the preview color, and only then re-enters0x0044e940on the full rectangle. The later322side is tighter now too: the top owner0x0044d410rejects while generation counter[world+0x2205]is live or when0x00449e90cannot supply a surviving work rect, then forwards that rect into0x005374d0,0x00533e70, and0x00537010, notifies the shell owner at0x0062be68, and refreshes neighboring region or manager companions through0x00421f50,0x00461770, and0x00415340. The local companion-float strip under that same owner is tighter now too:0x0044d4e0and0x0044d6e0are sibling five-pass cross-neighbor relaxers over[world+0x1605]; both clamp the caller rectangle, average the four cardinal neighbors, subtract the current sample, scale the delta by one fixed coefficient and caller gain, and then feed the surviving rectangle back into0x0044d410. The first helper only checks raster bit0x01in[world+0x2135], while the second adds the tighter acceptance gate0x004499c0and can skip the final0x0044d410tail when its caller disables that refresh. Their center-biased sibling0x0044d880is now bounded too: it seeds one baseline from the current center sample when its caller gain is positive, expands one square neighborhood by radius, and raises surrounding cells toward that baseline through the same0x0051dc00falloff model before tailing into0x0044d410. The local peak-oriented sibling0x0044da70then raises one clamped square neighborhood by quantized local maxima and on its optional branch also consults0x00534f00before keeping the larger peak. So the0x0044d4e0/0x0044d6e0/0x0044d880/0x0044da70band now reads as the local companion-float refinement layer immediately beneath the sharedCalculating Heights...owner rather than a set of unrelated scalar writes. The default-region side is tighter too: one earlier class-0-only helper0x0041fb00now sits directly under that same family too: it skips nonzero[region+0x23e]records, rounds the region center through0x00455800/0x00455810/0x005a10d0, stamps one orientation-dependent local secondary-overlay pattern through0x00534e10plus0x004497a0, and then runs one bounded scored refinement pass through0x0051db80,0x00534040,0x005340a0,0x00534100, and0x00533fe0. The finalizer0x00421730then clears the per-cell region word at[world+0x212d] + cell*4 + 1across the full live world raster, seeds each live region's cached bounds fields, and repopulates that same raster by writing the nearest class-0 region id[region+0x23a]into empty or weaker cell slots from one bounded center-and-radius sweep. The region-profile side is tighter too:0x0041f940counts only the current subcollection entries whose backing candidates pass0x0041f998, and that smaller predicate now has one real content split instead of staying anonymous. Candidates whose subtype byte is not2pass immediately, while subtype-2 candidates only pass when either availability word[candidate+0xba]or runtime recipe latch[candidate+0x7ac]is nonzero;0x00412af0/0x00412b70now ground the lookup step beneath both counters as a casefolded profile-label-to-candidate resolver over the global candidate pool0x0062b268; and the stricter year-filtered counter0x0041f9b0then stacks the category and[profile+0x26] <= yeargates on top of that same availability test. That border pass is now tighter too: the outer owner refreshes the companion region set0x006cfc9cthrough the reset-and-assign wrapper0x00487650above the heavier record initializer0x00487540, then re-enters0x004881b0to refresh the raw per-region cell-count band from the live world raster, and the inner emitter0x00487de0clears prior chunked segment queues through0x00533cf0, scans the live region raster, and appends fresh border-segment records through0x00536ea0. The lower presentation helper strip under the same owner is now explicit too:0x00533970/0x00533980query the cached world-grid X/Y maxima,0x00533ae0/0x00533af0/0x00533b00expose the secondary-raster and companion byte-raster roots, and0x00533b20/0x00533b30/0x00533b70/0x00533b90expose the normalized coordinate, strip-offset, and sample-triplet tables used by shell-side overlay staging. If shell-state gate[0x006cec74+0x174]is set it then posts id320Setting Up Buildings...forworld_region_collection_run_building_population_pass0x00421c20; if[0x006cec74+0x178] > 0it then posts id321Seeding Economy...forsimulation_run_chunked_fast_forward_burst0x00437b20; only after those setup-side gates does the code post id319Setting up Players and Companies.... That319lane is no longer just a shell-state placeholder: its earlier hidden prepass is tighter now too:0x00437743is the scenario-side named candidate-availability seeding pass over the live candidate pool0x0062b268, feeding the override collection at[state+0x66b2]through0x00434f20before any visible banner is posted. That grounded write path is narrower than the static file evidence, though: the startup reset helperworld_runtime_reset_startup_dispatch_state_bands0x004336d0explicitly clears[state+0x66b2]before the dispatch path begins, and the current exported write-side callers we can name after that reset are still just the live-pool preseed0x00437743, the sibling startup lane0x00436ad7, and the editor-sideIndustry (Overall)toggle handler0x004cf430through0x00434f20. So while the fixed0x6a70..0x73c0candidate-availability block is now well grounded as bundled map/save source data, a direct bulk-import path from that block into the live runtime collection[state+0x66b2]is still not grounded by the current disassembly notes. That candidate-side table now has a grounded fixed record layout too: each entry is a0x22-byte blob with a zero-terminated candidate-name slot at[entry+0x00..+0x1d]and one trailing availability dword at[entry+0x1e], read through0x00434ea0and mirrored later into[candidate+0x7ac]. The same scenario state keeps a locomotive-side sibling collection at[state+0x66b6], read through0x00435030and updated through0x004350b0, which is now the shared named locomotive-availability lane beneath theLocomotiveseditor page and the startup-side locomotive seeding branches. That locomotive-side table is the same pattern at a larger width: each entry is a0x41-byte blob with a zero-terminated locomotive-name slot at[entry+0x00..+0x3c]and one trailing availability dword at[entry+0x3d], later mirrored into[loco+0x7b]. Both override dwords now read most safely as simple availability bits rather than wider mode enums. That319lane is no longer just a shell-state placeholder: its primary grounded work is still the chairman-profile pairworld_seed_default_chairman_profile_slots0x004377a0plusworld_build_chairman_profile_slot_records0x00437220, which seed the 16 selector bytes at[0x006cec7c+0x87], materialize the per-slot chairman records from the scenario selectors, campaign override flag[0x006cec7c+0xc5], and the static persona table at0x005f2d28, and then publish the selected chairman-profile and linked company summary pair through[state+0x25]and[state+0x21]. The local slot-record shape is tighter too because the shell editor panel around0x004cc2d0now surfaces it directly:[slot+0x00]is the staged chairman profile id,[slot+0x01]is the Optional-versus-Mandatory byte with nonzero=Optionaland zero=Mandatory,[slot+0x02]combines with the separate per-slot gate at[world+0x0bc3+slot*9]to surfaceHuman,Computer, andHuman or Computer,[slot+0x03]is the special occupied-seat byte, and[slot+0x04]is the numeric tuning field. Both the selector seeder and the record materializer treat either[slot+0x02]or[slot+0x03]as enough to keep a slot live, but current grounded writes only seed[slot+0x03]on slot zero and later move it solely by whole-record compaction. That makes[slot+0x03]the strongest current anchor for the distinguished primary-human-seat flag rather than a generic role byte. The summary fields are tighter too: current direct accessors now show[state+0x25]as the selected chairman profile id in0x006ceb9c, while[state+0x21]is the linked owning company id copied from[profile+0x1dd]throughscenario_state_set_selected_chairman_profile0x00434890. The editor-side scenario setup surface beside that chairman panel is clearer now too.map_editor_scenario_metadata_panel_refresh_controls0x004ca790republishes the scenario description from[0x006cec78+0x672e], the start-year trio[+0x66ca],[+0x66d2], and[+0x66ce], the direct campaign-designated bit[+0x66de]through control0x5b6e, and the inverse of the paired metadata byte[+0x66f3]through control0x5b74. The resource-side anchor is now explicit too:editorDetail.wincarries localized ids3160/3161Campaign ScenarioandIf checked, this map will be reserved as a campaign scenario.inside the control record rooted at0x5b6e, so[+0x66de]is now the grounded campaign-scenario flag rather than an anonymous metadata boolean.map_editor_scenario_metadata_panel_refresh_briefing_mode0x004ca670now bounds the single-player versus multiplayer briefing switch by flipping selector0x621f50, publishing localized headings1491and3586, and refreshing the two briefing texts from[state+0x4f30]and[+0x5ae9]. The companion dispatchermap_editor_scenario_metadata_panel_handle_message0x004cb4a0makes the year semantics tighter too: it commits the description and both briefing texts from edit-control payloads, toggles the same two booleans, and clamps the three year fields to1829..2100while maintainingminimum <= default <= maximum, which now lines up directly with the editor stringsDescription:Minimum Start Year:Default Start Year:Maximum Start Year:BriefingandMulti-Player Briefing. The neighboring special-conditions page is clearer as well:map_editor_scenario_special_conditions_panel_construct0x004cb2b0now grounds the live owner for theSetup_Options_Buttons.imblist rooted at0xa7fa, walks the 49-entry static rule table at0x005f3ab0, counts enabled flags from[0x006cec78+0x4a7f], and publishes theSpecial Conditions In Effectsummary from localized id1053. The same page now has a bounded live dispatcher too:map_editor_scenario_special_conditions_panel_handle_message0x004cb8e0handles both bulk selection controls and direct row-state changes, commits them back into[0x006cec78+0x4a7f], and then re-enters the panel constructor to refresh the summary. That table is no longer just a raw id run; it now clearly includes the finance and construction restrictions2535..2563, plus later editor toggles such asUse Bio-Accelerator Cars,Disable Cargo Economy,Disable Train Crashes,Disable Train Crashes AND Breakdowns, andAI Ignore Territories At Startup. The neighboring available-chairman page is tighter too.map_editor_available_chairman_panel_construct0x004ca540now bounds the shell-side owner for the 40-entry persona-availability surface under0x5aa0..0x5b03: it walks the same persona table family at0x005f2d28, publishes one localized chairman-name row per profile, counts enabled availability bytes from[0x006cec78+0x6987..], and emits the summary%1 out of %2 are selected.from localized id1035. The live state owner beside it is now grounded as well:map_editor_available_chairman_panel_handle_message0x004cb6f0handles three bulk-selection controls0x5aa1..0x5aa3by rewriting that same availability-byte array from preset bytes embedded in the persona table, and it also commits direct per-row toggle changes from0x5aaa..0x5b03back into[state+0x6987..]before refreshing the page. So the editor lane now has three distinct scenario-setup slices rather than one chairman-only blob: chairman slots, scenario metadata and briefings, plus both a rule-toggle matrix and an available-chairman pool. There is now one adjacent company-side lane too: current neighboring setup flow conditionally entersworld_conditionally_seed_named_starting_railroad_companies0x0047d440when the Multiplayer preview owner0x006cd8d8is absent and either sandbox flag[0x006cec7c+0x82]is set or shell-state flag[0x006cec74+0x14c]is set while editor-map mode[0x006cec74+0x68]is clear. That helper no longer looks like a generic company refresh. It seeds exactly three fixed named railroad-company records fromRT3.lngids575..577:Missouri Pacific,New York Central, andGrand Trunk Railroad. The first seeded company is tied back to the selected chairman-profile summary and becomes the selected company id. The second railroad is tighter now too: it only receives a chairman link whenprofile_collection_count_active_chairman_recordsfinds at least two live chairman records, and the helper then binds the zero-based second active chairman throughprofile_collection_get_nth_active_chairman_recordwith ordinal1. The third railroad currently gets no matching chairman-link branch in the grounded setup flow and therefore remains an unchaired named company in the live roster. The shell UI above that setup lane is now tighter as well:shell_company_list_window_construct0x004c7200builds a live company-list window over the company collection at0x0062be10,shell_company_list_window_refresh_rows0x004c6c30formats the active companies with localized strings267..270, and only then conditionally appends one synthetic row id0x7fffthroughshell_company_list_format_company_or_start_row0x004c6b40so<<Start New Company>>appears as a separate affordance rather than as part of the seeded trio itself. Current shell paging around that same roster is tighter too because the live company collection now has a grounded active-only ordinal helper family:company_collection_count_active_companies0x00429a50,company_collection_count_active_companies_before_company_id0x004299f0, andcompany_collection_get_nth_active_company_id0x00429990. Those helpers now anchor the “current company among active companies” math used by shell-side detail and picker flows rather than leaving it as anonymous collection glue.shell_company_list_window_handle_message0x004c6f30then routes the synthetic row intostart_new_company_dialog_open0x0047d080, whose commit path now grounds throughstart_new_company_dialog_commit_create_company0x0047d120. That lower helper unlinks any current chairman-owned company, allocates a fresh company id from the live collection at0x0062be10, initializes it through0x00428420, and only then publishes the new selected company. The neighboring compact request helperstart_new_company_request_create_company0x0047d320does the same fresh-company path from a request block and is already reached from the startup-company branch at0x00470e48. The immediate sibling shell branch below that roster is still station-oriented: current grounded resource names and handlers put one branch onshell_station_detail_window_construct0x005068c0, another onshell_station_list_window_construct0x005074c0, and the subordinate selector helper onshell_station_pick_window_construct0x00507620. But the broader company-detail ownership question is no longer open. There is now a separately groundedCompanyDetail.winfamily rooted atshell_company_detail_window_construct0x004c5540, withshell_company_detail_window_handle_message0x004c56a0as its main dispatcher andshell_company_detail_window_refresh_controls0x004c2ca0as the shared repopulation pass for the selected-company presentation and tabbed control bands around0x9476..0x9490. A grounded shell detail-manager caller reaches that constructor at0x004dde24, the first finance-action layer beneath it is now bounded throughshell_company_detail_issue_bond_offer_flow0x004c3890,shell_company_detail_issue_stock_offer_flow0x004c3f30,shell_company_detail_buyback_stock_flow0x004c46d0, andshell_company_detail_change_dividend_rate_flow0x004c5360, and the first non-finance layer is now bounded too throughshell_company_detail_resign_chairmanship_flow0x004c5a0e,shell_company_detail_bankruptcy_flow0x004c5b99, the territory-access family rooted atshell_company_detail_refresh_selected_territory_access_summary0x004c1b60plusshell_company_detail_buy_territory_access_rights_flow0x004c5fc9, backed bycompany_clear_selected_chairman_if_current_profile0x00428a10,company_declare_bankruptcy_and_halve_bond_debt0x00425a90,company_has_territory_access_rights0x00424010,company_set_territory_access_rights_byte0x00424030, andcompany_can_purchase_territory_access_rights0x00426be0, plus the two control-transfer lanes.shell_company_detail_attempt_chairmanship_takeover_flow0x0050ccc0now grounds the special chairman's election path: it checks the caller's current stock ownership in the target company, rejects insufficient holdings through localized id623, rejects recent failed attempts through id624, and then opens the confirmation under id625before seeding the local takeover-election state or packaging the same request through the multiplayer shell transport. The follow-on resolvershell_resolve_chairmanship_takeover_vote_and_commit_outcome0x0050c940now closes the single-player election loop too: it walks the active chairman profile collection, computes weighted votes for and against the takeover, compares the affirmative total against half the target-company value, presents the result throughshell_present_chairmanship_takeover_vote_outcome_dialog0x0050c500in single-player or localized id3082in multiplayer, and then either transfers chairmanship through0x00428a30or stamps the current year into[company+0x289]as the grounded takeover-cooldown field.shell_company_detail_attempt_merger_flow0x004ec640now grounds the merger side too: it rejects empty worlds through id727, rejects recent failed attempts through id728, checks the proposed premium against company cash through localized id3889, and then commits into the resolver family. That merger resolver is now bounded too:shell_resolve_merger_vote_and_commit_outcome0x004ebd10walks the active chairman profile collection, computes weighted votes for and against the proposed merger, compares the affirmative total against half the target-company value, presents the result throughshell_present_merger_vote_outcome_dialog0x004eb890in single-player or localized id3059in multiplayer, and then either commits the merger through0x00427e20or stamps the current year into[company+0x15f]as the grounded merger-cooldown field. The vote-bias side beneath that resolver is tighter now too:scenario_state_compute_issue_opinion_multiplier0x00436590is no longer just an abstract issue table lookup because its merger callsite uses issue id0x3a, which lines up directly with localized id726saying merger votes depend on public attitude toward the management of the two companies. By contrast the broader support-adjusted share-price helpercompany_compute_public_support_adjusted_share_price_scalar0x00424fd0uses issue id0x37, while the finance-side debt helpers now bound0x38and0x39separately as the explicit credit-rating and prime-rate lanes. That leaves0x37as the broader investor-confidence lane behind equity support, share price, and adjacent governance pressure, with the strongest current text anchors coming from the investor-attitude strings1217and3048/3049about company or chairman performance rather than from the merger-only management-attitude term. One older local lead is now ruled out too: the0x460a90/0x473620setup block is the camera-view hotkey family over localized ids3482..3489(Select/Assign Camera View 5..8), not issue-opinion infrastructure, so it should no longer be used as evidence for the player-facing meaning of issue0x37. The editor-sideStock Priceslabel is also no longer being used as direct evidence here: the0x4ca980/0x4cadf0panel owns a separate float-tuning block[state+0x0bde..0x0bf6], with[state+0x0bde]merely mirroring[state+0x0be2], so that label belongs to a different settings family than the issue table behind0x37. A direct shell-resource follow-up now narrows the remaining caption question too: the extractedCompanyDetail.winblob fromrt3_2WIN.PK4contains no plain-English investor or finance caption for this lane, which matches the owner-side read that section-0 is a dynamic0x947ftext widget fed byshell_format_company_governance_and_economy_status_panel0x004e5cf0rather than a separate fixed label row. The supporting stat layer is bounded more cleanly now too: the surrounding0x0bsetup in the merger and takeover offer builders is formatter mode rather than a player-facing issue number, while the company-side stat wrappercompany_read_year_or_control_transfer_metric_value0x0042a5d0now reads as a generic stat-family accessor over year-relative series or the bounded slot family incompany_read_control_transfer_metric_slot0x0042a2e0. Its recurring family token0x2329is no longer treated as an issue id here either; it is the stat-family selector paired with localized company-stat label id2329. That means the paired raw and scaled helpers at0x004241e0and0x00424200now read as narrow control-transfer offer policy totals instead of direct issue-argument consumers, and the same broader support-and-governance metric family now also feeds the annual shareholder-revolt and creditor-liquidation lane surfaced by localized ids300..304. The editor-side help text cluster around ids2433..2437is no longer floating either: current grounded map-editor code now has a live economic tuning family beside the chairman-slot panel.map_editor_economic_cost_slider_panel_construct0x004cadf0binds six slider controls throughmap_editor_economic_cost_slider_dispatch0x004ca980into the scenario-state float block[0x006cec78+0x0be2..0x0bf6], while the surrounding descriptor table at0x00611c70..0x00612220pairs that wider editor lane with localized fieldsPrime Rate,Merger Premium, andBuild Stations CostthroughSteam Engine Costplus the comparison or help texts2433..2437. The broader shell-state master flag at[0x006cec74+0x68]still sits above the remaining post-load phases, plus two narrower per-phase gates:[0x006cec74+0x174]directly fronts id320Setting Up Buildings...and the later region-owned structure-demand and placement pass throughworld_region_collection_run_building_population_pass0x00421c20plus the deeper per-region workerworld_region_balance_structure_demand_and_place_candidates0x004235c0, while[0x006cec74+0x178]directly fronts id321Seeding Economy...and the chunked burst helpersimulation_run_chunked_fast_forward_burst, whose grounded tail now also sweeps the live region collection throughworld_region_refresh_cached_category_totals_and_weight_slots0x00423d30; id322then frontsCalculating Heights.... The master+0x68flag is no longer just structural: the shell load/save coordinators now use the same flag to force the editor-map.gmpfamily, so current evidence treats it as the broader editor-map mode above those later setup branches rather than an unnamed generic toggle. That worker is no longer one opaque building bucket: current grounded categories split intoHouse, a weighted region-profile family surfaced through theIndustry Weightingsstats path, and a third branch whose low-level fallback token isCommercialbut whose aligned stats label isCity Support. The same placement-commit gate beneath it,world_region_validate_and_commit_candidate_placement0x00422a70, is also corroborated by the separate world-side randomized batch helperworld_try_place_random_structure_batch_from_compact_record0x00430270, which retries placements around one compact center/radius record rather than the ordinary per-region demand deficits. That batch placer now sits under a wider compact runtime-effect dispatcher,world_apply_compact_runtime_effect_record_to_resolved_targets0x00431b20, so the world-side branch is no longer just “another caller near0x43051e” but one real effect family alongside the ordinary region-demand worker. Above that, the live scenario event collection at0x0062be18now has a tighter runtime-effect lane too:scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects0x004323a0services one live runtime-effect record, dispatches its linked compact effects through0x00431b20, and can synthesize follow-on records throughscenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets0x00430b50, which in turn allocates new live records throughscenario_event_collection_allocate_runtime_effect_record_from_compact_payload0x00432ea0. Above that,scenario_event_collection_service_runtime_effect_records_for_trigger_kind0x00432f40now bounds the collection-wide loop that services those live runtime-effect records for one trigger kind. That trigger split is tighter now too: recurring simulation maintenance drives kinds1,0,3, and2; the neighboring route-style follow-on drives5and4; startup-company and named-railroad creation branches drive7; kind6is now bounded as a mixed post-change family spanning the placed-structure post-create tail, one build-version-gated company-startup or roster-refresh tail, and the route-entry post-change sweep on0x006cfca8; one world-entry-side one-shot gate drives8and then clears shell-profile latch[0x006cec7c+0x97]; the briefing-text query lane is kind9; and the collection dirty latch still forces the internal rerun at kind0x0a. That moves this branch out of the “isolated world-side placement oddity” bucket and into a real scenario-runtime effect pipeline with a mostly bounded trigger-kind family. The same lower helper also reappears later on a slower simulation-side cadence with scale1/12, so it no longer looks like one-time setup glue only. The actual game-speed control family remains separate, rooted atworld_set_game_speed_mode0x00434680,world_adjust_game_speed_mode_delta0x00434850, andworld_toggle_pause_or_restore_game_speed0x00437a60. -
CompanyDetail addendum: the shared helper
shell_company_detail_resolve_selected_companyat0x004c16f0now bounds the common current-company accessor beneath the whole pane, and the read-side owner also has a separate active-company navigation family throughshell_company_detail_step_selected_active_company_deltaat0x004c3470plus the next or previous wrappers at0x004c3540and0x004c3550. The section switch inshell_company_detail_window_refresh_controlsis now grounded too: section index0x006cfe60selects a chairman/governance slice, a debt-and-capital slice, a per-share slice, or a territory-access slice, published through the tab band around0x9472..0x9479, with adjacent section-navigation controls around0x947b..0x947cand0x948f..0x9490. -
Key Dispatchers:
shell_controller_window_message_dispatch,shell_input_apply_window_key_transition,shell_input_snapshot_dispatch_state,shell_input_cursor_inside_active_view,world_load_saved_runtime_state_bundle,world_runtime_serialize_smp_bundle,simulation_frame_accumulate_and_step_world,game_message_window_service_if_present,game_message_window_service_frame,game_uppermost_window_handle_message,game_uppermost_window_service_world_hotspot_band,game_uppermost_window_refresh_controls,world_view_service_keyboard_turn_pan_and_zoom_bindings,world_view_step_heading_quadrant,world_view_step_zoom_bucket,world_seed_default_chairman_profile_slots,world_build_chairman_profile_slot_records,world_conditionally_seed_named_starting_railroad_companies,scenario_state_set_selected_chairman_profile,scenario_state_get_selected_chairman_profile_record,scenario_state_get_selected_chairman_company_record,shell_company_list_window_construct,shell_company_list_window_refresh_rows,shell_company_list_window_handle_message,start_new_company_dialog_open,start_new_company_dialog_commit_create_company,start_new_company_request_create_company,shell_station_detail_window_construct,shell_station_list_window_construct,shell_station_list_window_handle_message,shell_station_pick_window_construct,shell_station_pick_window_populate_station_rows,map_editor_chairman_slot_panel_construct,map_editor_chairman_slot_panel_handle_message,map_editor_chairman_slot_panel_refresh_selected_slot,map_editor_chairman_slot_panel_cycle_selected_slot_profile,map_editor_available_chairman_panel_construct,map_editor_available_chairman_panel_handle_message,map_editor_scenario_metadata_panel_refresh_briefing_mode,map_editor_scenario_metadata_panel_refresh_controls,map_editor_scenario_metadata_panel_handle_message,map_editor_scenario_special_conditions_panel_construct,map_editor_scenario_special_conditions_panel_handle_message,map_editor_economic_cost_slider_panel_construct,map_editor_economic_cost_slider_dispatch,station_place_world_surface_sync_and_dispatch,station_place_window_handle_message,track_lay_window_refresh_controls,track_lay_window_service_frame,track_lay_window_handle_message,simulation_advance_to_target_calendar_point, the smaller single-step helper at0x00409e80,0x0040a9c0,0x0040a910, andsimulation_service_periodic_boundary_work. -
State Anchors: shell input object
0x006d4018, per-key state table starting at[input+0x100], packed shell input flags at[input+0xa8c]now grounded as Right Shift0x1, Left Shift0x2, Control0x4, and Alt0x20, nested dispatch counter[input+0xa90], global shell controller0x006d4024, active world root0x0062c120,GameMessage.winobject0x006d081c,GameUppermost.winoverlay object0x006d0820,StationPlace.wintool object0x006d1720,TrackLay.wintool object0x006d1a8c, accumulated leftover simulation time at[this+0x4c80], shell and mode globals at0x006cec74,0x006cec78, and0x006cec7c, world manager collections at0x0062be10,0x006ceb9c,0x006cfcbc,0x006cec20,0x0062bae0, and0x006acd34, plus the packed calendar-like tuple fields around[this+0x0d],[this+0x0f],[this+0x11], and[this+0x14]. -
Subsystem Handoffs: the controller window dispatcher now looks like the first grounded input ingress. It translates keyboard and mouse
WM_*traffic into shell controller state and the separate input object at0x006d4018; read-side cursor and camera helpers later snapshot that object throughshell_input_snapshot_dispatch_stateand gate world-relative interaction throughshell_input_cursor_inside_active_view. Current grounded consumers around0x00478cb0,0x004e0780,0x0053f450, and0x0053fe90still sit on the shell controller path and consult0x006d4024or the world owner at0x0062be68, so there is still no evidence for a distinct gameplay-only input object after world entry. Instead, the first deeper world-mode interaction branch now looks like a shared world-view coordinator layered on top of the same shell-fed input state. Shell_transition_mode ensures theGameUppermost.winobject at0x006d0820; its message dispatchergame_uppermost_window_handle_messageowns the narrow action band0x7918through0x7921; and the recurring service helpergame_uppermost_window_service_world_hotspot_bandrate-limits those hotspot actions, rechecksshell_input_cursor_inside_active_view, and then pans the live world view throughworld_view_pan_relative_offset_in_camera_plane0x0043d130. The same lower setter family is also reached from the cursor-drag path throughworld_view_apply_screen_delta_to_focus_position0x0043d0c0. Above both of those sits the larger recurring serviceworld_view_service_shell_input_pan_and_hover0x0043db00, which now has one grounded keyboard branch beneath it:world_view_service_keyboard_turn_pan_and_zoom_bindings0x0043d740. That helper resolves four binding-pair families from the shell input table via0x0054e7d0, and the localized labels are now grounded fromData/Language/RT3.lng:Camera ForwardandCamera Backwardfeed the first signed pan channel,Camera LeftandCamera Rightfeed the second signed pan channel,Camera Zoom InandCamera Zoom Outfeed the signed zoom-step channel that0x0043db00smooths intoworld_view_step_zoom_bucket0x0043cc30, andCamera Rotate LeftplusCamera Rotate Rightfeed the continuous heading-turn branch through0x0043c810. The setup side is now better bounded too:world_view_seed_keyboard_binding_slot_pairsat0x00439e40seeds the eight slot pairs at[this+0x0a6]through[this+0x0e2]from the global action-binding registry through0x0045f370using the distinct registry keys0x0043d2a0through0x0043d310, and the registration block at0x00460769through0x004608e7shows those roots are defaulted to the expected Up Down Left and Right virtual keys before runtime polling begins. Beneath that camera stack, the enclosing frame path now has one grounded non-view sidecar: after0x0043db00it reads the active controller-view object pointer at[0x006d4024+0x18]+0x366e, compares it against the latched target at[frame_owner+0x66a2], fires exit and enter-style vtable callbacks on pointer changes through slots+0x64and+0x60, and only latches the new object when the object passes its own slot+0x1cavailability test and shell detail control id0x07d6on0x006d0818has flag bit0x4. That0x07d6gate is now more bounded than before: the dedicatedTrackLay.wintool family rooted at0x006d1a8cspecial-cases the same control id in bothtrack_lay_window_service_frameandtrack_lay_window_handle_message, uses world hit tests through0x00448ac0to arm and release a drag latch on that surface, and routes the resulting command work through the shared track-lay mode state at0x00622b0c. The surroundingtrack_lay_window_refresh_controlspass now shows that this is not just one isolated drag handler: the same tool family owns three mutually exclusive primary mode buttons at0x985e0x985fand0x9860, and current primary evidence now bounds those values asLay single track.0x1,Lay double track.0x4, andBulldoze0x40from the localized strings 2054 2055 and 1721 plus the matching control-routing branches intrack_lay_window_handle_message. The same family also owns the downstream route-entry policy bridge at0x004955b0: current caller evidence says that helper maps the live TrackLay primary mode into endpoint-synthesis policy1or4before the tool re-enters0x00493cf0, which is the strongest current bridge from the player-facing single-track versus double-track buttons into the lower route-builder policy bytes. The same family also owns a bridge-type preference selector rooted at0x006cec74+0x138, two wrappedNeverthroughCommonfrequency settings at0x006cec74+0x140and0x006cec74+0x13c, two boolean track-lay preference toggles, and the electrify-all-track action path. Those last two toggles are now tighter than before: current evidence strongly aligns control0x986eand state0x006cec74+0x144withAuto-Hide Trees During Track Layfrom strings 1838 and 1839, while control0x986dand state0x006cec78+0x4c74align withAuto-Show Grade During Track Layfrom strings 3904 and 3905. That mapping is still evidence-backed rather than absolutely direct from a recovered resource table, but the state ownership and control order now make it the strongest current fit. That makes0x07d6look like the shared main-world interaction surface inside a broader TrackLay world-command subsystem, not an unrelated detail button. The neighboringStationPlace.winfamily is now grounded on that same surface too: the shell detail-panel constructor family allocates it throughstation_place_window_constructat0x00509d80, publishes it at0x006d1720, services it each frame throughstation_place_window_service_frameat0x0050a530, and routes player-facing commands throughstation_place_window_handle_messageat0x005091b0. That dispatcher special-cases the same0x07d6control, and the shared helperstation_place_world_surface_sync_and_dispatchat0x00508bb0either accepts that direct surface traffic or falls back to the same detail-panel control looked up through0x006d0818, rechecks flag bit0x4, hit-tests the world through0x00448ac0, stages world coordinates into0x006d1738and0x006d173c, refreshes the selected-site summary throughstation_place_format_selected_site_summary, and updates the live station-placement selection state at0x00622af0,0x00622aec, and0x006d1740. The category side of that state is now tighter too: the shared helper0x0044bd10quantizes the staged world coordinates into the current cell, resolves the mixed byte-or-word region id from[world+0x212d], looks up the owning city-or-region entry through0x0062bae0, and returns[entry+0x272]with fallback5; the StationPlace world-surface branches at0x00508b80,0x00508d59, and0x0050a4e6use that result directly to refresh the current selection category latch at0x00622af0. Together withstation_place_select_category_and_refresh0x00508880,station_place_refresh_category_controls0x00507b90, andstation_place_format_preview_panel0x00508730, that makes StationPlace a second grounded consumer of the shared main-world interaction surface rather than only a sibling constructor plus frame hook. The StationPlace control semantics are now tighter too: the top category strip at0x697cthrough0x6981now grounds as small station, medium station, large station, service tower, maintenance facility, and non-station building fromRT3.lngstrings 2197 through 2202. For the three station categories only, the secondary strip at0x6988and0x6989plus display field0x698cno longer looks like another placement mode family; it is a building-style scroller. The click handlers on0x6988and0x6989cycle the style override in0x00622aec, and the display path builds the active style token fromStationSml,StationMed, orStationLrgplus the localized architecture stylesVictorian,Tudor,Southwest,Persian,Kyoto, andClapboardfromRT3.lngids 2672 through 2667. One layer lower, the remaining opaque controls are now much tighter:0x6985and0x6986are no longer a generic assist toggle but the two station-rotation policy choices from strings 2207 and 2206, switching between auto-orienting the building to track or obstacles and strictly obeying the rotation specified by the circle above. The dedicated control at0x6987is the station-rotation circle itself, wired through callback0x00507a90and aligned withClick to rotate the building. You can also use bracket keys [ and ] to rotate buildings.string 2208. That matches the lower behavior too: when the strict-rotation choice is off, both preview and commit paths route staged coordinates through0x00508040, which performs the extra orientation search before validation; when strict rotation is on, that pass is skipped and the current angle in0x006d172cis used directly. The direct shell UI also exposes the same discrete view-step family throughworld_view_step_heading_quadrant0x0043cb00andworld_view_step_zoom_bucket0x0043cc30. The neighboring gating predicatesworld_view_should_drive_primary_pan_channelandworld_view_should_drive_secondary_pan_channeltest packed shell input bits0x3, andshell_input_apply_window_key_transitionnow grounds those bits as the left and right Shift modifiers from scan codes0x2aand0x36. That means cursor drag, overlay hotspots, held Shift state, direct keyboard turn/pan/zoom bindings, the TrackLay and StationPlace world-command surfaces, and at least one frame-owned hover or focus-target branch all converge under the same shell-fed world-mode input path rather than a separate gameplay-input stack. -
Evidence: function-map rows for
shell_controller_window_message_dispatch,shell_drain_pending_window_messages,shell_input_state_init,shell_input_apply_window_key_transition,shell_input_snapshot_dispatch_state,shell_input_cursor_inside_active_view,world_load_saved_runtime_state_bundle,world_runtime_serialize_smp_bundle,world_entry_transition_and_runtime_bringup,simulation_frame_accumulate_and_step_world,game_message_window_service_if_present,game_message_window_service_frame,shell_ensure_game_uppermost_window,game_uppermost_window_construct,game_uppermost_window_handle_message,game_uppermost_window_service_world_hotspot_band,world_view_set_focus_position_xyz,world_view_apply_screen_delta_to_focus_position,world_view_pan_relative_offset_in_camera_plane,world_view_seed_keyboard_binding_slot_pairs,world_view_service_keyboard_turn_pan_and_zoom_bindings,world_view_step_heading_quadrant,world_view_step_zoom_bucket,world_view_should_drive_primary_pan_channel,world_view_should_drive_secondary_pan_channel,world_view_service_shell_input_pan_and_hover,world_seed_default_chairman_profile_slots,world_build_chairman_profile_slot_records,world_conditionally_seed_named_starting_railroad_companies,profile_collection_count_active_chairman_records,profile_collection_get_nth_active_chairman_record,scenario_state_set_selected_chairman_profile,scenario_state_get_selected_chairman_profile_record,scenario_state_get_selected_chairman_company_record,start_new_company_dialog_open,start_new_company_dialog_commit_create_company,start_new_company_request_create_company,shell_company_list_format_company_or_start_row,shell_company_list_activate_or_shift_center_company,shell_company_list_window_refresh_rows,shell_company_list_window_handle_message,shell_company_list_window_construct,shell_company_detail_window_refresh_controls,shell_company_detail_window_construct,shell_company_detail_window_handle_message,shell_station_detail_window_construct,shell_station_list_window_construct,shell_station_list_window_handle_message,shell_station_pick_window_construct,shell_station_pick_window_populate_station_rows,map_editor_chairman_slot_panel_construct,map_editor_chairman_slot_panel_refresh_slot_list,map_editor_chairman_slot_panel_refresh_selected_slot,map_editor_chairman_slot_panel_refresh_slot_counters,map_editor_chairman_slot_panel_cycle_selected_slot_profile,map_editor_chairman_slot_panel_handle_message,map_editor_available_chairman_panel_construct,map_editor_available_chairman_panel_handle_message,map_editor_scenario_metadata_panel_refresh_briefing_mode,map_editor_scenario_metadata_panel_refresh_controls,map_editor_scenario_metadata_panel_handle_message,map_editor_scenario_special_conditions_panel_construct,map_editor_scenario_special_conditions_panel_handle_message,map_editor_economic_cost_slider_panel_construct,map_editor_economic_cost_slider_dispatch,station_place_refresh_category_controls,station_place_format_selected_site_summary,station_place_format_preview_panel,station_place_select_category_and_refresh,station_place_world_surface_sync_and_dispatch,station_place_window_handle_message,station_place_window_construct,station_place_window_service_frame,track_lay_window_refresh_controls,track_lay_window_construct,track_lay_window_service_frame,track_lay_window_handle_message, andsimulation_service_periodic_boundary_work, plus the shell-input disassembly around0x0054f290, the world-view setup and service branches around0x00439e40,0x0043d740,0x0043db00,0x0043cb00, and0x0043cc30, the319setup-side branches around0x004377a0,0x00437220,0x00477820,0x00477860,0x0047d440,0x004c6c30,0x004c6f30,0x0047d080,0x0047d120,0x0047d320,0x004c2ca0,0x004c5540,0x004c56a0,0x005068c0,0x005071e0,0x005074c0, and0x005076c0, the direct summary-field helpers around0x004348700x00434890and0x004348c0, the company-link writers at0x00427c70and0x00427d74, the company constructor at0x00428420, the startup-company branch around0x00470e48, the shell company-list strings266<<Start New Company>>,267You are the chairman of the %1!,268The %1 has no chairman at the moment.,269%1 is the chairman of the %2.,270Double-click for details., and2992Shift-Click to center on this company's primary station., theCompanyDetail.imbandCompanyDetail.winresource strings in.rdata, theStationDetail.imb,StationDetail.win,StationList.win, andStationPick.winresource strings in.rdata, the shell editor window branches around0x004c9da0,0x004ca010,0x004ca1c0,0x004ca540,0x004ca670,0x004ca790,0x004ca980,0x004cb2b0,0x004cb4a0,0x004cb6f0,0x004cb8e0,0x004cc250,0x004cc2d0,0x004ceb90, and0x004cecc0, the localized chairman-slot strings2997through3001OptionalMandatoryHuman or ComputerComputerandHuman, the localized scenario-editor strings1483..1492Description:throughType the briefing for this map., the localized summary strings1035%1 out of %2 are selected.and1053Special Conditions In Effect, the 40-entry persona availability page under0x5aa0..0x5b03, the 36-entry special-condition table at0x005f3ab0covering ids2535..2563,2874,3722,3835,3850,3852, and3920, the static persona table at0x005f2d28, the selector array at0x006cec7c+0x87, the persona collection at0x006ceb9c, the localized persona strings inData/Language/RT3.lngincluding2730Unassigned, the named-chairman range2731+, and the neighboring biography range2495+, plus the seeded railroad-name strings575Missouri Pacific,576New York Central, and577Grand Trunk Railroad, the StationPlace.win constructor plus category, dispatcher, rotation-circle, shared-world-surface, preview-build, and recurring service branches around0x00507a90,0x00507b90,0x00508550,0x00508730,0x00508880,0x00508bb0,0x005091b0,0x00509d80, and0x0050a530, the StationPlace string clusterPlace a small station2197Place a medium station2198Place a large station2199Place a service tower2200Place a maintenance facility2201Place a non-station building2202Scroll through building styles.2203When placing the building, it will strictly adhere to the rotation specified by the circle above.2206When placing the building, it will rotate itself as needed to orient to track or avoid obstacles.2207Click to rotate the building. You can also use bracket keys [ and ] to rotate buildings.2208 and the architecture-style labelsClapboard2667Kyoto2668Persian2669Southwest2670Tudor2671 andVictorian2672, the TrackLay.win constructor and dispatcher family around0x0050d2d0,0x0050e400,0x0050e1e0, and0x0050e5c0, the localizedNeverthroughCommonstrings 615 through 618, the track-lay stringsBulldoze1721Lay single track.2054Lay double track.2055 and 3114, and the deeper shared bulldoze helper at0x0044b160. That helper is no longer just a vague proximity scan: it validates the active company unless editor mode is active, emits the exact RT3.lng bulldoze rejection ladder419..424, reads company cash through0x0042a5d0, debits approved bulldoze cost through0x0042a080, and then scans nearby route entries, linked structures, city-or-region records, route blockers, and placed structures before dispatching the selected delete branch through0x004937f0,0x004941a0,0x0048abf0, or the surrounding placed-structure virtual slot+0x58. That makes the TrackLayBulldozemode tighter than before: the tool-side mode latch at0x00622b0c == 0x40is only the front-end selector, while the actual world-side bulldoze choice and failure policy sits under0x0044b160and is reused by neighboring world-surface callers beyond TrackLay itself. the TrackLay preference stringsAuto-Hide Trees During Track Lay1838If 'Auto-Hide Trees During Track Lay' is checked, trees will automatically be reduced to small stumps whenever you are in track laying mode.1839Auto-Show Grade During Track Lay3904 andIf 'Auto-Show Grade During Track Lay' is checked, you'll see the grade number over the track while laying track - useful for trying to keep your slopes to a minimum.3905, the electrify-all confirmation and failure strings 3083 3084 3837 and 3900, the binding-registry lookup path at0x0045f370, the registration block at0x00460769through0x004608e7, and the localized labels inData/Language/RT3.lngids3466through3473. -
Open Questions: current evidence grounds the shell-controller-backed input and frame path as the only coordinator after world entry; no separate outer gameplay loop or gameplay-only input object is grounded yet. The new setup-pipeline evidence also points the same way: the currently grounded chunked burst path at
0x00437b20now looks subordinate toworld_run_post_load_generation_pipelinerather than to the ordinary speed controls, and even there it still reuses the same lower stepper and pumps shell work between chunks instead of revealing a detached gameplay loop owner. The player-facing speed-control family is now cleaner too:world_set_game_speed_modeowns the boundedPausedthroughVery Fastladder plus the hiddenUltra Fast 6..9extension,world_toggle_pause_or_restore_game_speeduses[this+0x1d]as the resume slot, and the multiplayer host restriction now looks attached to that same setter family rather than to the setup-side burst helper. The frame-owned shell coupling is tighter now too: insidesimulation_frame_accumulate_and_step_worlditself, one direct branch opens or focusesLoadScreen.winthroughshell_open_or_focus_load_screen_page, and the post-step shell-window ladder also probes several sibling shell windows by the same presence-plus-dirty pattern, including the liveLoadScreensingleton, the shared callback-driven custom modal, the shared file-options dialog,SettingsWindow.win, the now-groundedOverview.winandBuildingDetail.winsingletons, the adjacent tool-window strip now grounded asBulldoze.win,ChangeHeight.win,ChangeTrees.win,PaintRegion.win,PaintSound.win,PaintTerrain.win,PaintTerritory.win, andStockBuy.win, and now the shell-sideTrainbuy.winsingleton too. That train-buy family is no longer just an unnamed probe pair either: the opener path is now grounded under the same shell-owned cadence throughshell_can_open_trainbuy_window_or_warnandshell_open_or_focus_trainbuy_window, and its current family semantics already extend beyond a bare locomotive picker into selected-train upgrade summary and route-edit affordances. The selected-train side is tighter now too: we have explicit query helpers for the selected train record, id, validity, and company ownership, plus one explicit ownership-mismatch warning modal. That same pass also clarified one boundary we should not conflate: the neighboring shell family rooted at0x006d3b20is now grounded separately asTrainDetail.win. It reuses the same selected-train context and some of the same helpers, but it is not the sameTrainbuy.winsingleton family. TheTrainDetail.winside now has its own constructor, opener, refresh path, and message owner above the broader train-command strip. Its inner0xcbstrip is tighter now too: one bounded branch is the selected-train engine-replacement or trainbuy handoff lane using warning ids593/594, and another is the selected-train retirement lane using595/596/597with either a local teardown path or multiplayer opcode0x37. The remaining train-command family is narrower too: the shared0x33-stride helper trio at0x004b2f00,0x004b3000, and0x004b3160now looks like a real train route-stop or waypoint list rather than a generic row buffer, and route-entry flag byte+0x28now has one grounded top-level split: sign bit clear entries are the live placed-structure-backed family, while sign bit set entries use the direct route-node payload side. The helpertrain_route_list_count_live_site_reference_entries0x004b2b80now counts the first family explicitly. One deeper lower-bit result is grounded too: bothtrain_route_list_insert_staged_entry_at_indexand the auxiliary finalize helpertrain_finalize_aux_route_entry_buffer_preserving_subflags0x004a94b0explicitly preserve bits0x40,0x20, and0x10in the same flag byte during route-entry rewrites. Those bits are also no longer copy-only: the neighboring shell helpershell_building_detail_refresh_flagged_service_capability_rows0x004b9a20now consumes them to restyle theBuildingDetail.winrow bands0x7d07..0x7d1cand0x7f58..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 broaderBuildingDetail.winrefresh family is tighter too:shell_building_detail_refresh_subject_cargo_and_service_rows0x004ba3d0now clearly owns the selected subject rows around0x7d06,0x7d96.., and0x7d0e, resolving ordinary ids through the live candidate collection and the special express-side ids through the embeddedAnyCargo.imb,AnyFreight.imb, andPassMail.imbpaths. The first fixed triplet is now table-grounded instead of only inferred:0x00621df8seeds the short-label controls0x7dc8..0x7dcawith RT3.lng494..496Any Cargo,Any Freight, andAny Express, while0x00621e10seeds the adjacent0x7e90..0x7e92icon-name triplet withAnyCargo,AnyFreight, andPassMailbefore%1.imbformatting. RT3.lng also tightens the longer popup side now:0x00621e04feeds the first clickable selector triplet0x7f58..0x7f5awith494/497/498, so the help text there isAny Cargo,Any Freight\n(Freight is everything but Passengers, Mail, and Troops), andAny Express\n(Express is Passengers, Mail, and Troops). The sibling special service rows still align toDining CarandCaboose. The extractedBuildingDetail.winblob now sharpens the resource boundary too: its embedded text table is currently sparse rather than rich, exposing the help line for0x7d01, repeatedBuildingDetail.imbasset strings, and one standalone caption entryCargo. That makesCargothe strongest current resource-side anchor for the row header around0x7d06. The ordinary deeper rows are tighter now too: they do not look like hidden caption-table entries, but like live candidate-derived rows. The current path validates each ordinary id throughindexed_collection_entry_id_is_live0x00517d40, resolves the concrete candidate record throughindexed_collection_resolve_live_entry_by_id0x00518140, and then reuses candidate field[record+0x04]as one shared stem for both the row asset%s.imbpath and the neighboring display-label lookup throughlocalization_lookup_display_label_by_stem_or_fallback0x0051c920. That lookup is now bounded too: it scans the static stem table at0x006243c8, already grounding entries such asAlcohol,Aluminum Mill,Automobiles,Bauxite, andBig Boyagainst RT3.lng3202..3220, and only falls back to localized id3866when no table entry matches before the fixed0x384..0x386express-side triplet takes over. One neighboring candidate-side helper is tighter now too:structure_candidate_query_route_style_or_local_availability_metric0x0041e650shares the same route-style byte at[candidate+0x46], returning the cached local float at[candidate+0x5a]for ordinary candidates but switching route-style rows to one normalized count over the world-side route-link collection0x006ada90keyed by candidate class[candidate+0x3e]. That collection is tighter now too: it is constructed during world bring-up byplaced_structure_route_link_collection_construct0x00468110, and current grounded creation flow throughplaced_structure_route_link_allocate_site_pair_for_candidate_class0x00467f50seeds class byte+0x10, a masked initial state template, and the strongest current creation-side site-pair fields at+0x0cand+0x0ebeforeplaced_structure_route_link_attach_site_owner0x00467eb0links the new route-link record into the placed-structure-owned chain at[site+0x272]. The owner-side split is tighter now too: route-link field+0x08is the separate route-node-style owner anchor used byplaced_structure_route_link_attach_route_node_owner0x00467f20, while+0x0a/+0x0c/+0x0enow read as the site-reference triple matched byplaced_structure_route_link_collection_remove_links_touching_site_id0x004681f0. Creation flow now sharpens that further:+0x0cis the strongest current candidate for the stable first-site field seeded before owner attachment,+0x0ais the mutable owner-site anchor installed by the attach helper, and+0x0eis the stable second-site field. One more split is tighter now too:placed_structure_route_link_recompute_endpoint_pair_state0x00467c30currently uses+0x0aand+0x0eas the active endpoint site pair while recomputing state byte+0x12;+0x0cis still not directly read there. The family also has a clearer release and refresh side now:placed_structure_route_link_release_and_detach0x004680b0rolls back the class counters and then tails intoplaced_structure_route_link_detach_current_owner_chain0x00467df0, whileplaced_structure_route_link_collection_recompute_all_endpoint_pair_state0x004682c0explicitly reruns the per-record endpoint-pair reconciler across the whole live route-link collection. One layer above that,placed_structure_route_link_rebuild_route_style_grid_counters_and_endpoint_state0x00468300now looks like the full-family refresh owner: it clears three route-style class lanes in the world-grid tables rooted at[0x0062c120+0x2129], then clears bit0x2across the live route-link records and reruns the endpoint-pair reconciler. That now lines up with the visible shell split: non-route candidates keep the richer local metric and price lane, while route-style candidates use one world-side route-link family instead. The emission side is tighter now too:placed_structure_try_emit_best_route_style_peer_link_for_candidate_class0x0040fef0scans the live placed-structure collection for one best peer site by class-specific weight, distance window, and type gate, then only creates a new route-link throughplaced_structure_route_link_allocate_site_pair_for_candidate_class0x00467f50whenplaced_structure_endpoint_pair_has_shared_route_entry_key0x0040fbe0says the chosen site pair does not already share a route-entry key. One layer above that,placed_structure_rebuild_route_style_candidate_scores_and_peer_links0x004101e0now reads as the broader per-site owner of this lane: it computes per-class route-style score scalars from local site state and scenario multipliers, drives the first three route-style emission attempts, and then continues into a larger descriptor-driven scoring phase. Inside that larger pass,placed_structure_accumulate_candidate_metric_or_emit_route_style_peer_link0x0042cab0now cleanly shows the split between ordinary candidates, which add directly into the local route-style grid lane at[site+candidate*4+0x103], and remapped route-style candidates, which re-enter the peer-link emitter. One layer above that, the broader post-create or post-edit site rebuildplaced_structure_finalize_creation_or_rebuild_local_runtime_state0x0040ef10conditionally re-enters0x004101e0with stack flag1when its local latch at[site+0x29e]stays clear, so the route-style lane is no longer floating under an unnamed single-site caller. The placement side is tighter now too: the direct constructorplaced_structure_collection_allocate_and_construct_entry0x004134d0is the shared allocator immediately beneath the current placement-side callers before they hand the new site into0x0040ef10, and the lower constructorplaced_structure_construct_entry_from_candidate_and_world_args0x0040f6d0now bounds the actual field-seeding layer beneath that allocator. The old unresolved higher placement chooser is bounded more cleanly now too: the0x00403ed5and0x0040446bdirect-placement commits sit inside one larger helper,city_connection_try_build_route_with_optional_direct_site_placement0x00402cb0. That shared heavy builder is now the common target of the compact wrapper0x00404640, the peer-route candidate builder0x004046a0, the region-entry pair wrappercity_connection_try_build_route_between_region_entry_pair0x00404c60, and the direct retry paths insidesimulation_try_select_and_publish_company_start_or_city_connection_news0x00404ce0. Internally it now has three bounded lanes: an early route-entry search or synthesis attempt throughroute_entry_collection_try_build_path_between_optional_endpoint_entries0x004a01a0, a single-endpoint direct-placement lane that scansMaintenanceandServiceTowercandidates and commits through0x00403ed5 -> 0x004134d0 -> 0x0040ef10, and a later paired-endpoint fallback lane that seeds two endpoint candidates from the same stem family, walks a temporary route-entry list, and commits through0x0040446b -> 0x004134d0 -> 0x0040ef10. That early lane can now be described more concretely: it can reuse supplied route-entry endpoints, synthesize a missing leading endpoint from the caller's coordinates, seed the route-store builder-state block, and then hand off to the deeper path-search core without placing a new site. The previously vague side family at0x006cfcb4is tighter too: current evidence now bounds it as a small auxiliary route-entry tracker collection with an allocator at0x004a42b0, a refcount or destroy path at0x004a4340, a direct route-entry group-id setter at0x00489f80, an endpoint-membership probe at0x00494ed0, a boolean-latch refresh or owner-notify path at0x00494fb0, and a two-endpoint merge or bind helper at0x00494f00. One smaller constructor-side ownership split is tighter now too: the cachedu16chain fields[site+0x26e],[site+0x270], and[site+0x383]are no longer free-floating. Constructor-side helper0x0041f7e0prepends one new peer into that chain by storing the old head from[this+0x383]into[peer+0x270]and then replacing[this+0x383]with the peer's own placed-structure id[peer+0x2a4]; the direct resolver0x0041f810turns the cached head id back into one live record through0x0062b26c; and the removal-side companion0x0041f850removes one peer from the same chain before clearing[peer+0x26e/+0x270]. That caller split is now strong enough to treat this as one cached single-link or predecessor-chain family beneath placed-structure construction and rebuild rather than as unrelated scratch words. That bind side is tighter now too: the trackers group route entries only when a route-key-like value from0x0048aa70, the route-entry signature word+0x22e, and the boolean latch derived from byte+0x44all agree. The deeper handoff under that lane is no longer anonymous either:route_entry_collection_search_path_between_entry_or_coord_endpoints0x0049d380is now bounded as the internal search core that runs the first candidate sweep, quality gates, and the later route-extension fallbacks before returning one resolved route-entry id or-1. The first sweep now has a bounded owner at0x0049bd40, and the two later fallback helpers are bounded as the route-entry point-window coverage query0x00494cb0and the frontier-extension helper0x0049c900. The math side is bounded more cleanly now too: the family reusesmath_measure_float_xy_pair_distance0x0051db80for its direct point-to-point scalar,math_compute_quadrant_adjusted_heading_angle_from_xy_pair0x004952f0for heading-angle construction,math_normalize_subtracted_angle_delta_and_report_wrap0x004953c0for wrapped angle-delta checks, andmath_abs_double_with_crt_special_case_handling0x005a152efor the absolute-value side of the quality gates. Current evidence also bounds the threshold shape a little more tightly: the initial sweep and later extension path both reuse one signed angle-bias term+/-0.181000038854627, and the first sweep switches between a looser1.4and stricter1.8quality multiplier depending on route-policy byte4or the broader display-runtime preference[0x006cec78+0x4c74], already grounded elsewhere asAuto-Show Grade During Track Lay. The small policy-byte semantics are still not fully closed, but current evidence is tighter than before. Literal byte1is now the strongest current match for direct linked-site endpoint-anchor creation or replacement, because the linked-site constructor and neighboring repair branches around0x00480463,0x00480a77, and0x00480b69all feed that byte into0x00493cf0before rebinding one chosen route-entry anchor through0x0048abc0. Literal byte2now looks broader: the later world-side caller at0x00480cd0and the linked-site refresh helperplaced_structure_refresh_linked_site_display_name_and_route_anchor0x00480bb0both reach0x004a01a0with both optional endpoint-entry ids unset and that byte, so the strongest current read is a full linked-site route-anchor rebuild between optional endpoint entries rather than the narrower direct creation lane. The TrackLay side now gives one tighter user-facing anchor too: the live mode field0x00622b0cis already grounded asLay single track.0x1versusLay double track.0x4, and the small mapper0x004955b0collapses that state into the endpoint-policy bytes later passed to0x00493cf0, so the strongest current read ispolicy 1 = single-track endpoint synthesisandpolicy 4 = double-track endpoint synthesis. Bytes1/2are still the ones that enable the auxiliary tracker lane in0x004a01a0, while byte4now reads more narrowly as the larger company-side endpoint-synthesis charge inside0x00493cf0, because that helper feeds-1versus-2into the saturating company counter helper0x00423ec0on[company+0x7680]rather than skipping the company branch entirely. That counter is tighter now too: nearby company initialization seeds it to50when scenario byte0x4aafis enabled and to sentinel-1otherwise, while the companion getter0x004240a0returns either the live counter or fixed fallback29999. Current language-table correlation also gives0x4aafa stronger player-facing meaning: it is the live gate behindCompany track laying is limited...and the event variable labelCompany Track Pieces Buildable. So the current strongest read is available track-laying capacity, not an abstract company route-budget. That site-side helper also closes one adjacent ownership gap: beneathplaced_structure_finalize_creation_or_rebuild_local_runtime_state0x0040ef10, it rebuilds one linked site's route-entry anchor and display-name buffer. That path is tighter now than just “bind anchor then touch0x006cfcb4”: after the literal-policy-2rebuild succeeds it re-entersaux_route_entry_tracker_collection_refresh_route_entry_group_membership0x004a45f0, which can now be described more concretely. Its early prepass at0x004a4380can split one mismatching adjacent subchain into a fresh tracker group; its later helper at0x004a4ce0can transfer one compatible adjacent chain between neighboring groups; and the repair-side helper at0x004a4ff0can reseed a whole route-entry component into a fresh tracker when the old group id is missing or invalid. The regrouping pass also still rewrites compatible endpoint slots through0x004950f0and refreshes one nearby cached-match payload band through0x00495020before the helper resumes the name-buffer work. The remaining display-name side still matches the earlier grounded text family: copy the resolved city name when available, append civic suffixesTownship,New,Modern, orRenaissance, appendService TowerorMaintenance Facilityon the linked-instance class branches, and otherwise fall back through the olderJunction..CenterandAnytowntext families. The higher owner-refresh side of that same tracker family is tighter now too. The reusable gate at0x004a4c00no longer looks like a stray predicate: it explicitly requires both route-entry trackers to keep matching cached fields+0x18/+0x1c/+0x1d/+0x1eand both route entries to keep their special side fields+0x20e/+0x222unset before adjacent-chain transfer is allowed. The collection-wide traversal sweep at0x004a5fc0is bounded now as the connected-component refresh owner over tracker field+0x0c, with a temporary queue at[this+0x94]and direct fallback into the reseed helper0x004a4ff0whenever one neighboring route entry has lost valid tracker ownership. Above both of those sitsaux_route_entry_tracker_collection_refresh_owner_adjacent_compatible_group_links0x004a6360, which now reads as the owner-side latch-change refresher invoked from0x00494fb0: it starts from one owner route-entry id, confirms both bound endpoint entries agree on the boolean class state implied by route-entry byte+0x44, and then probes both endpoint sides for adjacent route-entry groups that can be absorbed through the0x004a4c00 -> 0x004a4ce0gate-and-transfer pair. The sibling query side is bounded now too:aux_route_entry_tracker_collection_query_component_label_by_tracker_id0x004a6320is the dirty-aware accessor for tracker field+0x0c, whileaux_route_entry_tracker_dispatch_route_entry_pair_metric_query0x004a65b0is the remaining mode-switched lower metric dispatcher beneath the heavier chooser at0x004a6630, forwarding fixed route-entry-pair candidate sets into either0x004a5280or0x004a5900depending on the shared hundredths-scaled build-version queryruntime_query_hundredths_scaled_build_version0x00482e00over0x006cec74. The current caller thresholds>= 0x67,>= 0x68,>= 0x69, and>= 0x6anow line up with executable build values1.03,1.04,1.05, and1.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.03versus1.03+route-metric compatibility dispatcher. That lower split is tighter now too:0x004a5280is the weighted recursive branch with heuristic ordering, per-tracker best-cost cache0x006cfcac, and prune threshold0x006cfcb0, while0x004a5900is the alternate recursive neighbor-walk branch that stays within compatible component labels through0x004a62c0and accumulates step and mismatch penalties over route-entry links+0x206/+0x20a/+0x20e. Above both of them,aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks0x004a6630is now bounded as the real chooser: direct fixed-pair query when both entries pass0x0048b870, otherwise endpoint-pair fallback across the two tracker groups. The adjacent route-style rebuild side is tighter now too: the same build-version family reachesplaced_structure_rebuild_route_style_candidate_scores_and_peer_links0x004101e0, where build1.04+keeps oneRecycling Plantstem-specific compatibility branch alive and build1.05+skips one older descriptor-side attenuation fallback. There is also one neighboring world-side compatibility lane now bounded below the same family:placed_structure_collect_connected_component_tile_bounds_with_version_gate0x004160c0skips one older recursive component-bounds walk through0x00415f20on build1.03+when scenario field[0x006cec78+0x46c38]is already active. The wrapper above that path is bounded now too:placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh0x00416170walks the caller rectangle, maps tile keys into the component table rooted at0x0062ba7c, and only re-enters0x004160c0when the current owner still has no cached bounds and the local world or scenario suppressors stay clear. The higher neighboring raster side is tighter too.world_grid_refresh_projected_rect_sample_band_and_flag_mask0x00418610is the shared projected-rectangle helper aboveworld_grid_refresh_flagged_region_float_extrema_and_mean0x00415020: it refreshes the temporary sample band at0x0062b7d0, publishes the surviving rectangle through0x0044d410, and on the single-sample path re-entersworld_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples0x004185a0to flip mask bit0x01for the corresponding non-sentinel cells. Current grounded callers for0x00418610are the neighboring placed-structure local-runtime helper0x00418be0and the heavier placement validator0x004197e0, so this adjacent family now reads more like projected placement or local raster prep than an unowned generic world-grid scan. One neighboring caller into the same height-support band is tighter now too: the world-side branch at0x00419070..0x004190f0walks one admitted local window, dispatches the acceptance-gated relaxer0x0044d6e0once per cell with a one-cell radius and no immediate tail refresh, and only after that outer loop completes re-enters0x0044d410on the full surviving rectangle. The higher owner split is tighter now too.placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch0x00418be0is the broader construction or rebuild lane: resolve one candidate id from a stem, build projected scratch through0x00416ec0, then publish the projected rectangle and validate its side windows throughplaced_structure_publish_projected_runtime_rect_globals_and_validate_side_windows0x00416620. That publish pass is bounded now too: it stages0x0062b308/0x0062b30c/0x0062b310, validates the rectangle against route-entry coverage throughroute_entry_collection_query_rect_window_passes_entry_type_gate0x00494240, can branch into the special projected-slot pickerplaced_structure_try_select_projected_rect_profile_slot0x00415570, and refreshes the compact per-cell side tables throughworld_grid_refresh_projected_rect_surface_and_region_byte_tables0x00414e10before the finished scratch is copied into one queued runtime record and the new record re-enters0x00416170when its rectangle is valid. The smaller sibling0x00419200is now bounded beneath that same projected-rectangle family too: it is the tiny getter over the temporary dword cell-value bank at0x0062b300, flattening one caller cell through live world width[0x0062c120+0x2155]and returning the corresponding dword when the bank exists, else0. Current grounded caller is the later world-side branch at0x0048af99. The smaller siblingplaced_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds0x00418a60now reads as the current-subject clone path above the same connected-component and mask-refresh helpers, returning the cloned local runtime record later stored into[site+0x24e]byplaced_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem0x0040e450. The higher wrapper above that clone path is bounded now too:placed_structure_collection_refresh_local_runtime_records_and_position_scalars0x004133b0first drains the temporary site-id queue rooted at0x0062ba64/0x0062ba6c/0x0062ba70throughplaced_structure_local_runtime_site_id_queue_count0x00414480andplaced_structure_local_runtime_site_id_queue_pop_next0x00413f50, rebuilding one cloned local-runtime record per queued placed structure through0x0040e450, and only then sweeps all live placed structures through the side refresh helperplaced_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon0x0040ee10. The constructor or ownership split beneath that family is tighter now too. The shared allocatorplaced_structure_collection_allocate_and_construct_entry0x004134d0no longer just reaches an anonymous0x3e1-byte scratch object: it first constructs one concrete placed-structure specialization throughplaced_structure_construct_concrete_specialization_vtable_5c8c500x0040c950, which calls0x0045b680to seed the common base table0x005cb4c0, clear the derived field band[this+0x23a..+0x26a], and re-enter the older base initializer0x00455610, then installs the specialization table0x005c8c50. The paired cleanup path at0x0040c970now reads like the matching teardown thunk: it briefly reinstalls0x005c8c50, then immediately demotes the record back to the base table through0x0045b040 -> 0x00455650before the stack object is freed or unwound. The corresponding serializer entry0x0040c980is equally tight now: it simply tails into0x0045b560, which first re-enters the base serializer0x004559d0and then emits the derived payload bracketed by tags0x5dc1and0x5dc2over[this+0x23e],[this+0x242],[this+0x246],[this+0x24e], and[this+0x252]. One nearby string clue is useful but narrower than it first looked. The specialization table at0x005c8c50is immediately followed byRadioStationandRadio Station, but the local member method0x0040ce60now shows why: it compares site stem[this+0x3ae]againstRadio Station, canonicalizes that stem toRadioStationon match, and then re-enters0x0040cd70plus0x0045c150. So those adjacent strings ground one stem-normalization lane inside the specialization, not the specialization name by themselves. The small virtual-slot and cached-id side is tighter now too. The same0x005c8c50table carries three literal-false stubs0x0040cc10/0x0040cc20/0x0040cc30, one literal-true stub0x0040ccc0, and the narrower linked-site-id presence predicate0x0040ccb0, which simply returns whether[this+0x2a8]is nonzero. Beneath the stem-normalization path,0x0040cd70is now bounded as the common cached source/candidate resolver: it clears[this+0x3cc]and[this+0x3d0], scans source collection0x0062b2fcfor a stem match against[this+0x3ae], stores the matched source id into[this+0x3cc]plus the linked candidate/profile id from[source+0x173]into[this+0x3d0], and when no match exists formats localized id0x00adthrough0x0051e980with the current stem buffer. The two tiny followers0x0040cec0and0x0040cee0then resolve those cached ids back into concrete source and candidate records through0x0062b2fcand0x0062b268respectively. The derived payload and transient family under that same table is tighter now too.0x0045c150is the clear payload-loader counterpart to0x0045b560: it reinitializes the derived field band, opens the0x5dc1/0x5dc2payload bracket, restores the two payload strings into[this+0x23e]and[this+0x242], clears the transient roots[this+0x24e],[this+0x256],[this+0x25a], and[this+0x25e], and then rebuilds follow-on specialization state through0x0045b5f0and0x0045b6f0. The neighboring builder pair is coherent too:0x0045b210formatsamb_%1_01.wav, allocates a0x141-byte transient object, stores it at[this+0x24a], and registers it through0x0052da00, while0x0045c310allocates the separate primary transient handle at[this+0x246]from payload strings[this+0x23e]and[this+0x242], then publishes it through0x00530720and0x0052d8a0. The next rebuild layer is tighter now too.0x0045b5f0resolves one current world-position tuple through0x0052e720 -> 0x0051f090 -> 0x00534490, then uses that derived scalar to refresh the ambient-side transient again through0x0045b210. Above that,0x0045b6f0clears the optional handles at[this+0x25a]and[this+0x25e], then probes and materializes a larger named variant family rooted in[this+0x23e]through strings such as%1_,%1_Upgrade1,%1_Anim%2.3dp,%1_Upgrade1Anim%2.3dp, and%1_Upgrade1Light%2.3dp, looping across numbered variants and publishing surviving records through0x0052d8a0. One higher timed branch is bounded now too:0x0045baf0advances the two timer-like fields[this+0x26a]and[this+0x266], gates on nearby world-distance and candidate-side checks, and then formats one output aroundrnd_%1_%2.wavplus the same anim or light string family before dispatching through0x00531e50under owner0x006d402c. Their release-side companions0x0045b160and0x0045c3c0tear down those same transient roots and payload strings again, and the recurring service slice0x0045be50updates the derived scalar triplet[this+0x22e],[this+0x232], and[this+0x236]before republishing it through0x00530720. The string literalsamb_%1_01.wav,%1_Anim%2.3dp,%1_Upgrade1Anim%2.3dp,%1_Upgrade1Light%2.3dp, andrnd_%1_%2.wavtherefore ground the derived band[this+0x23e..+0x26a]as one payload-plus-transient owner family with ambient, animation, light, and random-sound components, rather than more linked-site or route-entry ids. One intermediate transient build layer is bounded now too.0x0040cf00first requires creation-mode byte[this+0x3d4] == 1and live seed handle[this+0x24e], re-enters0x0045b370(1), derives one scaled float from current local geometry through[this+0x14],[this+0x21],[this+0x3a], and0x005c8cf4, and then allocates a second transient handle into[this+0x25a]through0x00475ed0. It follows that with one current world-position resolve through0x00414450and0x0052e720, several local offset-triplet writes through0x00475010, and four numbered channel updates through0x00475030with selector ids1..4. That is enough to bound it as another specialization-side transient-handle builder beneath the same payload family as0x0045c310and0x0045b210, without yet over-naming the user-facing subtype or effect semantics of the built handle. One adjacent helper block is tighter now too, and it should stay separate from the concrete0x005c8c50vtable rather than being folded into it. The small predicates0x0040cc40/0x0040cc60/0x0040cc80all follow the same[this+0x173] -> 0x0062b268chain into one linked candidate/profile record.0x0040cc40returns whether candidate subtype byte[candidate+0x32]equals1,0x0040cc60returns raw candidate byte[candidate+0xba], and0x0040cc80returns the stricter conjunctionsubtype == 1 && class == 3using class byte[candidate+0x8c]. The current grounded caller for all three isworld_grid_refresh_projected_rect_sample_band_and_flag_mask0x00418610, where they derive the two boolean mode inputs for0x00415020; that makes them a shared candidate-profile helper cluster adjacent to the specialization family, not direct overrides in the0x005c8c50table. The neighboring0x0040ccf0stays on the same “adjacent but not the same vtable” side of the boundary: it resolves one linked instance through0x0047de00, follows that instance's vtable+0x80owner chain, and returns candidate class byte[candidate+0x8c]. Current grounded callers at0x00480fb5and0x004b03cecompare that returned class against3and4, so the current safest note is simply “linked-instance candidate-class reader.” One gated collection-side scan in the same neighborhood is bounded now too.0x0040cd10first requires shell latch[0x006cec74+0x1c3]and creation-mode byte[this+0x3d4] == 1, then resolves the current subject's center world-grid cell through0x00455f60, reads the local site roster count and id list at[cell+0xeb]and[cell+0xef], and resolves each listed placed-structure id through0x006cec20. Its current grounded caller is the broader collection sweep at0x00413860, so the strongest current read is a gated center-cell site-roster scan rather than one more direct specialization override. One small neighboring world-grid helper is grounded cleanly enough to keep too.0x0040ccd0takes one live world root, one X-like index, and one Y-like index, multiplies the Y-like term by world width[world+0x2145], adds the X-like term, scales the resulting slot by fixed cell stride0x1d7, and returns the corresponding cell pointer under base[world+0x2129]. Current grounded callers include the placed-structure cargo-service bitset sweep around0x0042c386and several world-grid overlay passes in the0x004525bc..0x00452bb2range, so that helper is now best read as the shared(x,y) -> world-cell*resolver rather than another object-specific method. The next sibling table at0x005c9750is tighter now too, though still not fully decoded. The structural anchor ismap_load_city_database0x00474610: that loader stages bundle tags0x61a9..0x61ab, iterates one collection, and dispatches each entry through vtable slot+0x44. In0x005c9750, that same slot resolves into the sibling record family beside0x0041ab70/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 slot0x0041ab70simply jumps into0x0045c6f0, which restores two strings into[this+0x32e]and[this+0x332], stages the same0x61a9/0x61aa/0x61abtag family, and iterates the child runtime band rooted at[this+0x316]. The one real behavioral slot we recovered there is0x0041ab80: it refreshes one named handle through owner0x006d4020, writes the resulting handle into[this+0x1c], queries three base floats through0x0045c480, and returns one scaled float derived from the first queried component. That method is currently called from later world-side branches at0x0046e4f7,0x004aafee, and0x004ab020. 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 lower0x00455660/0x00455800/0x00455810/0x00455930helpers are no longer city-only. Local.rdatanow shows the same shared slots under both the city-entry table0x005c9750and the siblingInfrastructuretable0x005cfd00, whose constructors at0x0048a240/0x0048a2dc/0x00490a3call re-enter0x00455b20, install0x005cfd00, and seed the same scalar-band family through0x00455b70with the literal stemInfrastructure. So the safest current family name for those low helpers is the broader0x23aruntime-object band rather than city-entry-only.0x00455800and0x00455810are simply the paired normalized coordinate getters over[this+0x1e2]and[this+0x1ea], which explains why they recur all over the city-side, route-link, and placed-structure placement code. The narrower helper0x00455660sits above those getters: it scales the caller-supplied normalized coordinate pair, converts it through0x006d4024 -> 0x0051f090 -> 0x00534490, adds a caller-supplied integer height bias, optionally rounds that height through0x005a10d0when the auxiliary-preview gate0x00434050is active, and finally publishes the resulting world-anchor triplet through0x00530720. One serializer-side sibling is bounded too.0x00455930queries two triplet-like scalar bands through0x0052e720and0x0052e880and writes the resulting six dwords through0x00531030; its load-side stream counterpart0x00455870reads the same six four-byte lanes back through0x00531150, republishes the first triplet through0x00530720, republishes the second through0x0052e8b0, and returns the summed byte count. The tagged load-side mirror0x004559d0restores the same[this+0x206/+0x20a/+0x20e]band beneath tags0x55f1..0x55f3, then dispatches vtable slot+0x4c. TheInfrastructureside is tighter now too. The optional child attach helper0x0048a1e0allocates and seeds one freshInfrastructurechild and, when the owner already has more than one child, clones the first child's two triplet bands into that new child before attaching it. The looped rebuild0x0048dd50then rebuilds the owner-visibleInfrastructurechildren one ordinal at a time, tears down the higher extras above ordinal5, refreshes cached primary-child slot[this+0x248]when needed, and finishes with the same world-cell and route-side follow-on family around0x00448a70,0x00493660, and0x0048b660. The smaller attach helper0x00490a3cis now bounded too: it conditionally allocates oneInfrastructurechild from a caller-supplied payload stem, attaches it to the current owner, and then seeds three caller-supplied position lanes through0x00539530and0x0053a5b0. The direct route-entry side of the same family is no longer anonymous either:0x0048e140,0x0048e160, and0x0048e180are the three direct resolvers over owner fields[this+0x206/+0x20a/+0x20e]into the live route-entry collection0x006cfca8. Another shared sibling family is tight enough now too: the real packed-byte-triplet owner is0x0052e680, and the two local wrappers0x00455820and0x00455840both force its recursion flag on.0x00455820forwards three explicit byte arguments, while0x00455840unpacks one packedu24-style dword into three byte lanes first. The downstream setter writes packed byte-triplet lane[this+0x43], defaults that lane to0x007f7f7fwhen all three bytes are zero, and when recursion is enabled it walks child list[this+0x75]through0x00556ef0/0x00556f00and re-applies the same packed update recursively to every child. The siblingInfrastructuretable0x005cfd00also still carries three tiny fixed-return slots after the shared formatter thunk0x00455860: two return literal0x46, and one returns fixed float1.25f, so those slots are now bounded as small table constants rather than as missing behavior. One other sibling table is bounded enough now to keep separate too: local.rdataat0x005c9a60carries the same shared low0x23aslots plus table-specific overrides0x0041f680,0x0041f720,0x0041f7b0,0x0041f7e0,0x0041f810, and0x0041f850, with nearby literals(%1)andMarker09. The exact subtype name behind that table is still open, but the behavior split is strong enough:0x0041f680first refreshes the current global preview/helper owner through0x00455de0and then forwards mode1plus handle[this+0x23a]into0x004cf830;0x0041f720formats[this+0x356], publishes the resulting shell text, and conditionally dispatches0x00452fa0with action0x12when world state[0x0062c120+0x2175]is0or0x15;0x0041f7b0publishes one fixed payload and only then jumps to0x00453510when that same world state is0x12. The same table also has a tighter adjacent helper strip now:0x0041f6a0is the direct[this+0x37f] -> 0x00517cf0slot-count query,0x0041f6b0is the rounded normalized-coordinate world-scalar query above0x0044afa0, and that deeper helper is no longer opaque: it first computes one distance-like term from the current cell to global preview-anchor fields[0x0062be68+0x24/+0x1c]through the precomputed radial helper0x0051dc00, samples the companion float raster[world+0x1605]at the current cell plus two 8-direction rings, keeps the strongest local rise above the center sample, adds one thresholded preview-scalar bias from[0x0062be68+0x20], and then adds0x32more when the small global gate0x0041fff0passes. That gate itself now reads as a shared shell/preview threshold test: it returns true when[0x006cec74+0x2bb] == 2, or when the same mode dword is merely nonzero and preview scalar[0x0062be68+0x20]exceeds the float threshold at0x005c9a9c.0x0041f6e0resolves the current center world-grid cell and checks one packedu16token through0x0042b2d0, and0x0041f6f0is the raw byte getter over[this+0x42]. One nearby mode-gated flag reader is bounded too:0x0041f910returns literal1when shell mode gate0x004338c0is inactive or the object class dword[this+0x23e]is nonzero, and only on the class-0 path does it return the same byte[this+0x42]. The release side under that same sibling family is bounded too:0x00420650lazily seeds[this+0x317]from shell-profile word[0x006cec78+0x0d]before re-entering0x00420350, and that body is now bounded as the local scalar refresh over[this+0x31b]: it compares the seeded word against the current shell-profile word, maps the delta through one bounded piecewise float curve, and applies one extra affine adjustment when[this+0x23e]is nonzero.0x00420670then frees the optional dynamic payload at[this+0x37f], clears the cachedu16link chain through0x0041f8d0, and tails into base cleanup0x00455d20; and the small collection-side wrapper0x00421700simply resolves one entry id, re-enters0x00420670, and erases that id from the owning collection. The city-entry family also now has one tighter helper-object branch.0x00474030switches over mode enum0..10, maps those cases into0x00475ed0with selector families4/0xd/0xeand fixed scalar presets0.5/0.75/1.0/1.5/2.0, and on success publishes the caller-supplied world triplet through[helper+0x4]. The refresh helper0x00474260first reloads payload through0x00455fc0, then samples the current normalized coordinates plus one world-height scalar from0x00448bd0, and rebuilds[this+0x23a]through that same mode-selected helper builder using mode[this+0x242]. The surrounding collection-side and teardown helpers are tight enough now too.0x004743d0and0x00474400are the two release siblings over the same helper field[this+0x23a]: both destroy that helper through0x00475100when live and clear the field, but0x004743d0tails into the smaller base cleanup0x00455650, while0x00474400tails into the heavier dynamic-payload cleanup0x00455d20. The small predicate0x00474430simply returns1unless shell mode gate0x004338c0is active, in which case it returns byte[this+0x42]; the exact meaning of that flag byte is still open, but the mode-gated query itself is bounded now. One level higher,0x00474450constructs the collection rooted at vtable0x005ce4a8with fixed parameters(0,0,0,0x14,0x0a,0,0), and bootstrap caller0x004487a9stores that collection into global0x006cea50. The collection's entry path is also bounded now:0x004744a0seeds a stack-local temporary entry through0x00474110, allocates one0x250-byte live record, resolves it, constructs it through0x00474130, and then tears the temporary entry down through0x004743d0;0x00474510resolves one entry id, releases it through0x00474400, and removes it from the collection. The collection-owned load loop at0x00474540sits directly beneathmap_load_city_database0x00474610: it opens the same0x61a9/0x61aa/0x61abbracket 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. Base helper0x00455b20initializes the shared0x23a-sized record family by installing base vtable0x005cb1c0, clearing the scalar bands[+0x206/+0x20a/+0x20e/+0x22e/+0x232], zeroing the seven-dword block[+0x212..+0x22a], and re-entering0x0052ecd0; that is why it shows up not only in the city-entry temporary constructor0x00474110, but also in several later object construction paths outside the city family. The city collection itself now has a bounded teardown side too:0x00474480is the small release-and-free wrapper for the collection rooted at0x005ce4a8, and teardown caller0x004492c3uses it before freeing the global collection pointer at0x006cea50. On the load side,0x00445713's broader setup branch re-entersmap_load_city_database0x00474610on that same global0x006cea50collection. Outside the city-specific branch, the two tiny dispatch wrappers0x00455a40and0x00455a50are also now bounded as raw vtable-slot helpers: the first jumps through entry slot+0x44, while the second pushes one caller argument into slot+0x40and then clears the global roots0x006acd38/0x006acd3c/0x006acd40. Finally,0x00455a70is now bounded as the generic current-position triplet publisher that queries0x0052e720, converts through0x006d4024 -> 0x0051f090 -> 0x00534490, adds a caller-supplied height bias, optionally rounds under0x00434050, and publishes through0x00530720. The temporary-entry constructor and live entry constructor are bounded now too.0x00474110is the tiny stack-local initializer: it re-enters shared base init0x00455b20, clears helper fields[+0x23a]and[+0x242], installs vtable0x005ce428, and returns.0x00474130is the real live-entry constructor: it stores the entry id into[+0x23e], clears the trailing helper payload block[+0x246..+0x24e], stores mode[+0x242], derives one world-height scalar from the supplied coordinate pair through0x00448bd0, builds helper field[+0x23a]through0x00474030, and then seeds the remaining default scalar or flag tuple through0x00455b70using the fixed defaults at0x005ce49c/0x005ce4a0/0x005ce4a4. That broader helper is no longer city-specific either:0x00455b70is now bounded as the shared scalar-band initializer that clears the same[+0x206/+0x20a/+0x20e/+0x22e/+0x232]family, optionally copies up to three caller-supplied strings into[+0x206/+0x20a/+0x20e], synthesizes one default local token buffer when the middle string is absent, chooses one effective mode string from the third or first input, derives one owner handle or transform token through0x0051f090unless the caller suppresses that path, and then seeds the remaining scalar band through0x0052edf0and0x0052e670. The same specialization also now has one tighter UI-facing side. The override trio0x0040e4e0,0x0040e880, and0x0040e9d0all sit in the same0x005c8c50table and reuse the linked-site-capable vtable+0x70latch together with creation-mode byte[this+0x3d4].0x0040e4e0is the strongest current owner for contextual status text: it branches across linked-peer checks, world-mode fields[0x0062c120+0x2171/+0x2175/+0x2179/+0x2181], current owner state, and candidate or linked-peer display labels, then formats localized ids such as0x00af,0x00b0,0x00b1,0x00b2,0x00b3, and0x0afdbefore pushing the result through shell presenter0x00538c70.0x0040e880pairs with that publisher on the action side: it first resets the same presenter through the fixed token at0x005c87a8, then dispatches several world-side follow-ons through0x00413620,0x00453510,0x00452db0, and0x00452fa0under the same linked-peer and world-mode gates.0x0040e9d0is the narrower query-style formatter: when shell branch[0x006cec74+0x74]is live it formats one localized label with the fixed suffix\nAbsIndex %d, otherwise it can return one company-side owner label through0x00426b10, and only then falls back to0x00455860. So the current best read is that this concrete specialization owns both the ambient or animation transient family and one linked-peer status or action UI surface, without yet proving the user-facing subtype name. One smaller subtype hook cluster is tighter now too. The concrete table also carries0x0040d170and0x0040d1b0, both of which resolve the current candidate through cached stem id[this+0x3cc]and then test candidate dword[candidate+0x4b]. When that flag is nonzero,0x0040d170tail-calls the primary transient builder0x0045c310and0x0040d1b0tail-calls the matching release path0x0045c3c0. The same neighborhood now also gives direct cached-record resolvers instead of more anonymous pointer math:0x0040d1f0returns the linked peer from[this+0x2a8]through0x006cec20, while0x0040d210returns the owner-side record from[this+0x276]through0x0062be10. That makes the specialization-side ownership split cleaner: the0x005c8c50family is not only formatting labels and driving side effects, it also has a direct candidate-flag hook for building or dropping the primary transient handle. The last lower side reads are tighter now too.0x0040e450first seeds the projected-slot cache throughplaced_structure_cache_projected_rect_profile_slot_id0x00414470before it re-enters0x00418a60, and the broader stem-based builder at0x00418be0now has one named optional side renderer instead of an anonymous callsite:placed_structure_render_local_runtime_overlay_payload_from_projected_bounds0x00418040. The side refresh split is bounded now too.0x0040ee10publishes one local position or scalar triplet through the shared setter0x00530720, then tails intoplaced_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime0x0040e360; that smaller follow-on only runs on the current subtype-1, class-3, linked-site branch, and recomputes one local-runtime triplet from the linked peer's route-entry anchor when that anchor is still live. The heavier sibling above that side refresh is bounded now too:placed_structure_set_world_coords_and_refresh_local_runtime_side_state0x0040eba0is the world-coordinate mutation helper that recomputes[site+0x388]and[site+0x38c], rewrites the world-grid owner mapping through0x0042c9f0and0x0042c9a0, updates the subtype-4proximity-bucket family when needed, rebuilds the same local position or scalar triplet, and then tails into the linked-site anchor follow-on at0x0040e360. One later caller into that same side-refresh family is bounded now too:0x00419110clamps a caller rectangle to the live world bounds, resolves one per-cell bucket chain through the hashed map at[arg0+0x88]and0x0053dae0, and then re-enters0x0040eba0for every bucketed site in that rectangle using the stored per-entry coordinate pair plus two zero flags. Current grounded caller is the edit-side branch at0x004bc851, immediately after the neighboring nibble and companion-float mutations, so this now looks like a bucket-map-driven local-runtime side-state refresh wrapper rather than another broad site sweep. The sibling policy-1side is tighter now too. The constructor lane no longer stops at “one linked site id at[site+0x2a8]”: the subtype-1branch inplaced_structure_construct_entry_from_candidate_and_world_args0x0040f6d0now clearly allocates that linked record throughplaced_structure_collection_allocate_and_construct_linked_site_record0x00481390, whose lower constructor isplaced_structure_construct_linked_site_record_from_anchor_and_coords0x00480210. That lower constructor seeds the linked record's own id and anchor-site id, clears the local route-anchor and display-name fields, projects the anchor footprint into world space, and then either binds an already-covered route entry through0x00417b40or falls through into the neighboring policy-1route-entry synthesis family around0x00493cf0before rebinding the chosen route entry through0x0048abc0. The cleanup side is tighter now too. Linked-site removal now has a bounded owner atplaced_structure_collection_remove_linked_site_record0x004813d0: it resolves the linked record through0x006cec20, runs the per-record teardownplaced_structure_teardown_linked_site_runtime_state_before_removal0x00480590, removes the live entry from the collection, and only then re-enters the still-bounded company-wide follow-on at0x00429c10when the removed record passed the narrower transit-like latch. That per-record teardown is no longer just “clear some scratch fields.” It now clearly clears the route-style scratch lane, clears the five proximity buckets at[site+0x590..0x5b8], detaches or invalidates the current route-entry anchor, frees the three per-site byte arrays at[site+0x24..0x2c], clears this site's indexed byte from the corresponding arrays of later placed-structure records, and then re-enters0x00436040with the current site id. That company-side follow-on is no longer just one opaque callback either. It is now bounded ascompany_collection_refresh_active_company_linked_transit_site_peer_caches0x00429c10, which walks the active company roster and re-enterscompany_rebuild_linked_transit_site_peer_cache0x004093d0on each company. That per-company fast pass stamps a refresh tick at[company+0x0d3e], clears and repopulates the placed-structure-side cache cells addressed through[site+0x5bd][company_id], marks the eligible linked transit sites for that company, allocates one0x0d-stride peer table for each eligible site, and fills those peer rows fromaux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks0x004a6630. That helper no longer reads as one anonymous route sweep: it either uses the fixed pair directly or falls back across tracker endpoint combinations before returning the winning route-entry id, one route-step count, and one companion mismatch count. The fast cache now reads more cleanly too: peer-record dword+0x05stores that step count, while float+0x09stores the normalized continuity share derived from(steps - mismatches) / max(steps, 1), not a raw delta-per-step ratio. The adjacent timed wrappercompany_service_linked_transit_site_caches0x00409720now shows the cadence too:0x004093d0is the shorter-interval refresh, while the older heavier sibling at0x00407bd0was only revisited on the longer interval. That heavier sibling is now bounded too:company_rebuild_linked_transit_autoroute_site_score_cache0x00407bd0no longer looks like a 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:+0x12is the raw surviving site-score total,+0x0eis the continuity-and-step-weighted companion total, and+0x16is 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.03versus1.03+tracker metric split now looks like it mainly perturbs the weighted+0x0elane and the promoted+0x16lane, not the raw+0x12total. That final lane then feeds the neighboring selectorscompany_select_best_owned_linked_transit_site_by_autoroute_score0x00408280andcompany_build_linked_transit_autoroute_entry0x00408380. That makes the company-side follow-on read more like a linked-transit autoroute cache family than a generic company maintenance pass. The neighboring reachability gate is tighter now too:company_query_cached_linked_transit_route_anchor_entry_id0x00401860caches one company-side route-entry anchor, andplaced_structure_is_linked_transit_site_reachable_from_company_route_anchor0x004801a0uses that anchor to decide whether a foreign linked transit site can still participate in the current company's fast peer cache. The first direct train-side consumer above that cache family is bounded now too:train_try_append_linked_transit_autoroute_entry0x00409770. After servicing the owning company's caches, it asks0x00408380for one staged0x33-byte route entry using the train's current anchor site, then either appends that entry through0x004b3160and refreshes the new trailing selection through0x004b2f00, or rotates one existing slot in place when the local two-entry cap has already been reached. So this edge now reaches an actual train-side autoroute append lane rather than stopping at anonymous company-side cache cells. The weighted cache lanes still do not escape that route-choice family directly: this train-side append path only inherits the weighted site and peer choice by calling0x00408380, not by reading cache+0x0e/+0x16itself. The train-side follow-on above that seed path is bounded now too. The owning company can count its live roster throughcompany_count_owned_trains0x004264c0, measure one aggregate linked transit site pressure throughcompany_compute_owned_linked_transit_site_score_total0x00408f70, and then rebalance that roster throughcompany_balance_linked_transit_train_roster0x00409950. The aggregate helper no longer reads as a raw sum either: it starts from the site-cache+0x12totals, converts that into one tentative roster target through year and site-count ladders, and on build1.03+adds one special distance-side scaling branch when exactly two eligible linked transit sites survive. Because it consumes+0x12rather than+0x0eor+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 local linked-transit chain is now bounded enough to say that directly: weighted cache lanes feed0x00408280 -> 0x00408380 -> 0x00409770/0x00409830, while the separate pressure or roster lane feeds0x00408f70 -> 0x00409950from raw+0x12. 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 opcode0x75or locally re-enteringcompany_try_add_linked_transit_train_and_publish_news0x00409830. The two visible news helpers under it are bounded too:0x00409830emits RT3.lng2896for a newly added train, whilecompany_publish_train_upgrade_news0x00409300emits RT3.lng2897for the upgrade branch. The subtype-4sibling side is bounded now too. The nearby-site bucket family now has:placed_structure_append_nearby_transit_site_distance_bucket_entry0x0047fdb0,placed_structure_remove_site_id_from_proximity_bucket_lists0x0047dd10, andplaced_structure_clear_proximity_bucket_lists0x0047dcd0, plus the two collection sweepsplaced_structure_collection_append_site_into_all_proximity_bucket_lists0x00481480andplaced_structure_collection_remove_site_id_from_all_proximity_bucket_lists0x004814c0. Current evidence says those five buckets store(peer site id, distance)pairs for nearby station-or-transit peers, grouped through the five-way classifier at0x0040d350. The older stream-backed side is bounded too:placed_structure_collection_load_dynamic_side_buffers_from_stream0x00481430walks the live placed-structure collection and re-entersplaced_structure_load_dynamic_side_buffers_from_stream0x0047d8e0, which repopulates the route-entry list, the three per-site byte arrays, the five proximity buckets, and the trailing scratch band from the caller-supplied persistence stream. The linked-site route-entry list itself is tighter now too. The refresh or teardown branch at0x0040e102re-entersplaced_structure_remove_route_entry_key_and_compact0x0047d810, which removes one matchingu16key from the six-byte list rooted at[site+0x462]/[site+0x466], compacts the surviving entries into a replacement buffer, and decrements the stored route-entry count. The broader company-side owner above these pieces is tighter now too. The periodic service passcompany_service_periodic_city_connection_finance_and_linked_transit_lanes0x004019e0now reads as the current outer owner for this branch: it sequences the city-connection announcement lanes, the linked-transit train-roster balancer, the acquisition-side siblingcompany_try_buy_unowned_industry_near_city_and_publish_news0x004014b0, the annual finance-policy helpercompany_evaluate_annual_finance_policy_and_publish_news0x00401c50, and the shorter-versus- longer linked-transit cache refresh tail through0x004093d0and0x00407bd0. That outer pass also has one tighter temporary-state role now: it clears company bytes0x0d17/0x0d18/0x0d56, mirrors0x0d17into scenario field0x006cec78+0x4c74only while the earlier route-building side runs, and restores the original scenario value on exit. Current evidence now ties0x0d17to the shared preferred-locomotive chooser0x004078a0: the override is only armed when that helper picks one locomotive whose engine-type dword is2. That engine-type lane now best reads as electric rather than an unnamed class slot, because the linked approval helper around0x0041d550now reads as a real locomotive-era and engine-type policy gate, dispatching the same0/1/2field across three scenario-opinion lanes while the local player-facing engine-type family is explicitlySteam / Diesel / Electric. That same gate also now ties the later scenario bytes0x4c97..0x4c99back to the editor-sideLocomotivespage rather than treating them as anonymous availability flags: they are the liveAll Steam Locos Avail.,All Diesel Locos Avail., andAll Electric Locos Avail.policy bytes behind0x004cd680/0x004cf0d0. The current logic is also tighter than a plain override tier: a positive engine-family opinion result can carry the gate by itself only while none of those three editor bytes is enabled; once any of them is nonzero,0x0041d550instead requires one matching intersection between the record-local family bytes and the enabled editor family bytes. TheWhaleLcarveout is narrower now too: current data-file correlation ties that stem to theOrca NX462/WhaleL_NElocomotive family, and it explicitly zeros that positive-opinion result before the later family-availability checks, so it loses the shortcut rather than gaining a special approval path. The same chooser now also has a bounded fallback below it,locomotive_collection_select_best_era_matched_non_electric_fallback_id0x00461cd0, which explicitly skips engine-type2and chooses the lowest-penalty remaining locomotive by era mismatch and approval gates. The route-search side is tighter too: this electric-only override now clearly feeds the first path-sweep branch in0x0049bd40, forcing the larger1.8initial quality multiplier instead of1.4, which is the same branch otherwise chosen by explicit route-policy byte4. So the later annual finance helper is reading same-cycle side-channel state from the earlier city-connection and linked-transit branches, not unrelated long-lived finance fields. The inner finance helper is not debt-only either. Current grounded outcomes include bankruptcy news2881, the debt restructure family2882..2886, a later share-repurchase headline2887, and the dividend-side adjustment branch. The main commit verbs under that helper are now grounded too:company_repay_bond_slot_and_compact_debt_table0x00423d70,company_issue_bond_and_record_terms0x004275c0,company_repurchase_public_shares_and_reduce_capital0x004273c0, andcompany_issue_public_shares_and_raise_capital0x00427450. The threshold side is tighter now too. The earliest creditor-pressure lane requires scenario mode0x0c, the bankruptcy toggle[0x006cec78+0x4a8f]to be clear, at least13years since[company+0x163], and at least4years since founding year[company+0x157]; it then scans the last three years of the derived net-profits and revenue lanes0x2band0x2c, chooses one negative pressure ladder-600000 / -1100000 / -1600000 / -2000000from the current slot-0x2cbands around120000 / 230000 / 340000, requires the broader support-adjusted share-price or public-support scalar at least15or20depending on whether all three sampled years failed, checks the current fuel-cost lane in slot0x09against0.08times that ladder, and requires the three-year slot-0x2btotal to clear one final-60000gate before it falls into the bankruptcy commit and RT3.lng2881headline. The middle debt-capital layer is split more clearly now too. With[+0x4a8b]clear, one annual bond lane first simulates full repayment throughcompany_repay_bond_slot_and_compact_debt_tableand then uses the post-repayment cash window with fixed-250000and-30000thresholds plus the broader linked-transit train-service latch[company+0x0d56]to decide whether to append one or more500000principal,30-year bonds. The repurchase lane is separate again: when the city-connection announcement-side latch[company+0x0d18]is set, growth setting2does not suppress it, and[+0x4a87]is clear, it starts from one1000-share batch, can replace its default1.0factor with one linked-chairman personality scalar, scales that by1.6when growth setting1is active, and then runs one800000stock-value gate plus one support-adjusted-share-price-times-factor-times-1000-times-1.2affordability gate before the repeated1000-share buyback commits behind RT3.lng2887. The ordering above this helper is tighter now too:company_service_periodic_city_connection_finance_and_linked_transit_lanesclears 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 tighter bounded shape now too: it only opens on build1.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 to1000-share lots with floor2000, trims that batch until the broader support-adjusted share-price scalar times batch no longer exceeds the55000gate, recomputes the pressured support-adjusted share-price scalar and the pairedprice/bookratio, then tests the remaining gates in a fixed order: share-price floor22, proceeds floor55000, current cash from0x2329/0x0dagainst the chosen highest-coupon bond principal plus5000, one later stock-issue cooldown gate that converts the current issue mixed-radix calendar tuple at[company+0x16b/+0x16f]throughcalendar_point_pack_tuple_to_absolute_counter0x0051d3c0and compares the result against the active world absolute calendar counter[world+0x15], and only then the coupon-versus-price-to-book approval ladder0.07/1.3 -> 0.14/0.35. The issue mutator preserves the previous tuple in[company+0x173/+0x177]and refreshes the current tuple from[world+0x0d/+0x11]on the derived-pricing lane. On success it issues two same-sized tranches through repeatedcompany_issue_public_shares_and_raise_capitalcalls and publishes a separate equity-offering news family rooted at localized id4053, not the earlier debt or buyback headline family. The dividend side is bounded too: it requires the dividend toggle[0x006cec78+0x4a93]to be clear, mode0x0c, at least1year since[company+0x0d2d], and at least2years since founding, then averages the last three years of the net-profits lane0x2b, folds in the unassigned-share pool and the current0x0dband, applies the map-editor building-growth setting[0x006cec78+0x4c7c], treats growth setting1as a0.66scale-down and setting2as a zeroing pass on the current dividend, quantizes surviving adjustments in tenths, and finally clamps againstcompany_compute_board_approved_dividend_rate_ceiling0x00426260. The linked-transit route-seeding side has one tighter sibling now too:company_reset_linked_transit_caches_and_reseed_empty_train_routes0x00401940. It clears the two company-side linked-transit cache timestamps, forces one immediate cache rebuild through0x00409720, strips route lists from company-owned trains in modes0x0a/0x13, and then re-enterstrain_try_append_linked_transit_autoroute_entry0x00409770only when a train's route list has become empty. On the wider chooser question, the current evidence is also tighter than before: every recovered external owner of0x00402cb0is still in the city-connection family, so the two later direct placement lanes currently read as city-connection fallback behavior rather than a broadly shared world placement service. It can still unwind through route-state cleanup without committing new placed structures, so the exact lower helper semantics are not fully closed, but the broader chooser is no longer anonymous and its main policy split is now visible. The two lower helpers directly under those commit lanes are bounded now too:placed_structure_project_candidate_grid_extent_offset_by_rotation0x00417840is the shared projected-footprint offset helper over candidate bytes[candidate+0xb8]and[candidate+0xb9], andplaced_structure_validate_projected_candidate_placement0x004197e0is the shared go-or-no-go validator that checks company, territory, world-tile, and footprint occupancy state before either direct-placement commit is allowed to fire. Its strongest current subtype branch is a station-attachment or upgrade-style lane keyed by[candidate+0x32] == 1, which now has the concrete failure family2901..2906: blocked upgrade footprint, ground not flat enough, not your track, insufficient track-laying capacity, cannot connect to existing track, and ground too steep. That tightens the chooser materially without yet proving that the validator is station-only for every caller. The recurring outer owner is tighter now too:placed_structure_collection_refresh_quarter_subset_route_style_state0x00413580walks every fourth live placed structure from a scenario-time-derived offset and re-enters the per-site rebuild with stack flag0, giving the route-style lane a concrete recurring maintenance sweep undersimulation_service_periodic_boundary_workrather than only a floating caller note. One neighboring helper is now bounded on the message side too:shell_building_detail_handle_subject_value_row_band_action0x004ba270switches over the clicked row family0x7d07..0x7d14, treats subject bytes+0x21/+0x22/+0x23as one current selection plus one bounded low/high pair, increments the family dirty latch at0x006cfe0con change, and republishes the refreshed value through the shared shell control helper on code0x66. One neighboring helper is now bounded on the side-list path too:shell_building_detail_propagate_selected_subject_state_into_side_list0x004b9ec0walks the sibling list owner at0x006cfe08, copies the active subject state into each side-list record, mirrors the current service or capability id at+0x24, and preserves the0x40/0x20/0x10subflags from the active subject. That means the value-row actions and later selector rows now read as propagating one shared building-detail state across the sibling list rather than only mutating one isolated subject record. One neighboring helper is now bounded separately too:shell_building_detail_refresh_subject_pair_value_rows0x004bad20owns the mutually exclusive value-row pairs0x7d07/0x7d08,0x7d11/0x7d12, and0x7d13/0x7d14, choosing among them from the same selected-subject flag byte and payload fields at+0x22/+0x23, while the larger cargo-or-service row owner also gates the extra visual lanes0x7d6a,0x7d6b, and0x7d9dfrom that same subflag family. The asset-string block is tighter too: that branch family now explicitly usesAnyCargo.imb,AnyFreight.imb,PassMail.imb,Caboose.imb, andDining.imb, with the bit-0x20special lane already aligned toCaboose.imband the sibling bit-0x10special lane now aligned toDining.imb. The larger0x7f58..0x801fband is no longer just a styled row family either:shell_building_detail_present_flagged_service_capability_popup0x004b9fd0is now grounded as its explanatory popup callback. It resolves either one fixed express-side row from0x00621e04or one active candidate or service id from[subject+0x24], then formats one popup through the shell message-box path. The neighboring refresh helpershell_building_detail_refresh_flagged_service_capability_rows0x004b9a20is tighter now too:0x7d07..0x7d1cis not one anonymous block, but a real mask partition over subject bits0x20and0x10, with one zero-mask pair, one bit-0x20-only pair, one exclusive-or pair, and later one-bit and two-bit indicator rows. RT3.lng now closes the fixed popup text family too: the single-line branch uses3922%1\nLoads available at %2: %3, while the richer ordinary-candidate branch uses2981%1\nLoads available at %2: %3 Current Price: %4and can append2982Price at next station, %1: %2 (%3%4). The selector band is narrower too: current refresh-side evidence shows0x7f58..0x801fas one selected-ordinal highlight family over the three fixed express rows plus the ordinary active-candidate rows, not as a generic unstructured list. The neighboring0x8020..0x8051band is tighter too: it is primarily the matching remove-entry family for the selected subject's live id list, with two special row indices re-routing into the0x7d0f/0x7d10subflag-clearing path instead of ordinary list compaction when the current0x20/0x10service-bit combination demands it. That means the exact captions are no longer broadly open across the whole selector family: the fixed express-side rows, the mask partitions, and the add/remove structure are grounded, and the remaining caption gap is mostly the ordinary candidate rows further down the same band. The top-level toggles are tighter now too: the paired0x7d02/0x7d03controls are the real mode switch over subject bit0x40, choosing between the bounded pair-value branch and the current-selection/status branch around0x7d0d/0x7d0e, while the smaller0x7d0f/0x7d10controls flip the same special-service subflags later rendered asCabooseandDining Car. One adjacent control is tighter now too: the extractedBuildingDetail.winresource contains the plain-English lineSet the initial cargo amount for 'Disable Cargo Economy' scenarios., and the0x7d01plus0x7d09/0x7d0amessage-side branch can mirror the current subject or selection throughshell_building_detail_submit_aux_owner_subject_sync_request0x004b9e10into the auxiliary owner queue at[0x006cd8d8+0x8f48], with side-owner presence now explicitly grounded throughshell_has_auxiliary_preview_owner0x00434050. That queued request is tighter too: both current callsites forward the same side-list mirror latch at[0x006cfe08+0x0c], so the auxiliary owner now clearly sees not just the staged subject but also whether the localBuildingDetailside-list is in mirrored-subject mode. The same0x7d01lane also now has one clear rejection note: localized id3587This option is only available by following the tutorial.now sits behind the active tutorial flag at0x006d3b4cand the cached previous tutorial expected-control id at0x00622b38, while the neighboring tutorial helpertutorial_advance_step_and_refresh_expected_control_ids0x00516be0now grounds0x00622b34/0x00622b38/0x00622b3cas the current and previous expected-control cache rather than anonymous globals. The last field is tighter now too:0x00622b3cis currently best read as the active tutorial step's alternate-accepted companion control id, because the generic shell control path compares clicked control ids against it directly and suppresses the3587tutorial rejection when they match. That does not fully close the player-facing caption bind for every control, but it does bound the neighboring side-owner sync and tutorial-rejection lane instead of leaving it as anonymous glue. The extra pre-insert gate is narrower than it first looked. It is now grounded as tutorial-only:tutorial_validate_train_route_station_indicator_step0x00516d00checks the current tutorial step from the shell tutorial descriptor table at0x00622b48before a live station-or-transit site id can be committed into the staged route entry, and the currently accepted steps align with localized prompts3777and3778, the two train-routing tutorial instructions that tell the player to click the Milan and Turin station indicators. Outside that tutorial state family, the route-entry insertion path is not gated there. The adjacent validator is tighter now too:train_route_list_validate_reachability_and_station_pair0x004b2c10walks that same route list, resolves placed-structure-backed entries through the live placed-structure and route-node collections, uses the direct route-node payload branch for the remaining entry family, and fails with3089..3091when the resulting route cannot be traversed or does not preserve a valid terminal station pair. The post-validation follow-on is bounded too:train_current_route_context_uses_strict_reachability_mode0x004a9460is now the small shared gate above the stricter branch, keyed off the current linked route object's downstream class type, andtrain_set_route_operating_mode_and_scalar0x004ab980now reads as the shared train mode setter beneath route editing, with the local and multiplayer insertion paths choosing mode0x13only when that stricter second validation succeeds and mode0x0aon the looser fallback path. The first deeper world-mode interaction branch is now better bounded:GameUppermost.winhotspots, cursor drag, held Shift state, discrete shell view-step commands, direct keyboard turn/pan/zoom bindings, theTrackLay.winandStationPlace.winworld-command surfaces, and a frame-owned hover or focus-target transition branch all feed the same shell-controller-backed path. The remaining uncertainty has moved farther from basic ownership: the hover-target branch clearly exists, and0x07d6now looks like the shared main-world interaction surface rather than a generic detail button for one tool family only. One more shell-side consumer is bounded now too:0x004bc350is a world-surface brush handler over that same0x07d6control plus the adjacent mode family0x0faa..0x0fafand ordinal strip0x0fa0..0x0fa7. That family is no longer just a generic unlabeled brush owner: the detail-panel manager now grounds the sibling tool-window strip immediately above it asBulldoze.win,ChangeHeight.win,ChangeTrees.win,PaintTerrain.win,PaintRegion.win,PaintSound.win, andPaintTerritory.win, each with its own constructor, refresh pass, and message owner beneath the same controller rooted at0x006d0818. Once its local drag latch is active it dispatches the current mode dword at[0x006d0818+0x8c]into the companion-float helpers0x0044d4e0,0x0044d880, and0x0044da70, or into the secondary-raster nibble path0x00448e20 -> 0x00419110, so the remaining uncertainty has narrowed from ownership to the exact one-to-one mode-button mapping inside that grounded tool-window strip. ThePaintTerrain.winside is tighter now too: constructor0x004f7ce0seeds shell singleton0x006d1304, callback root0x006d1334, a constructor-time bulk-update latch at0x006d1330/0x006d1331, and the broader terrain mode or scalar state from0x00622748..0x00622788plus0x006d1308..0x006d1324; it then registers the callback strip0x004f5960,0x004f59f0,0x004f6070, and0x004f69e0through0x00540120. The direct message owner under that same family is no longer just a loose branch fan-out either:0x004f6f50owns messages2/0xca/0xcb, keeps control0x07d6as the live world-surface drag latch, routes explicit undo control0x2775into0x004f5c30, maps the selector and mode strips0x2711..0x2730,0x27d9..0x27df,0x283d..0x2843,0x28a1..0x28e6,0x2915..0x291e,0x2964..0x2967, and0x29cd..into the cached terrain lanes, and then fans the active drag path into preview helpers0x004f6930,0x004fb5e0,0x004fc280,0x004fc4d0, and0x004fc630depending on the current terrain mode. Inside that same family0x004f5a80/0x004f5c30are now the bounded local undo snapshot pair,0x004f5dd0is the tiny active-scalar-group selector,0x004f6b50owns the ten-entry mode strip rooted at0x28dd,0x004f6390is the broad mode-panel repaint owner,0x004f6250is the mode-dependent world-dispatch bridge,0x004f6930samples the current preview raster at world coordinates, and0x004fb5e0is the heavier preview-raster rebuild and shell-surface publish worker. The next local helpers under that same family are tighter now too:0x004f5ea0and0x004f5ec0are just the two tiny special-mode predicates(mode 5, variant 2)and(mode 4, variant 2),0x004f8770is the weighted RGB sampler over the current preview or undo-backed raster neighborhood,0x004f89b0is the local byte-grid connected-component grower over the eight-neighbor tables0x00624b28/0x00624b48, and0x004f8bb0is the main drag-path preview compositor that consumes the drag sample strip[this+0xf0/+0xf4/+0xf8], allocates temporary float or byte grids, and then rasterizes the surviving preview rectangle through the current terrain descriptor tables at0x005f3500, the weighted color sampler0x004f8770, the component grower0x004f89b0, and several live world samplers before writing final RGBA pixels back into the preview surface. The late tail under that same compositor is tighter too: the mode-4, variant-2path toggles secondary-raster byte-2 bit0x20by comparing current and previous cells through0x00534f40; the broader mode-4/5world-facing branch samples class set2/4/5through0x00534ec0, re-enters0x0044de30and0x0044df10, latches pending world coordinates into[0x006d1304+0x78/+0x7c], and rewrites the low nibble plus the signed overlay-vector planes through0x00448df0,0x00448e20,0x00448ec0,0x00448ee0,0x00448e60, and0x00448e90. After the optional mode-5smoothing sweep through0x004f8370, the publish tail either materializes one shell preview surface through0x0051f090 -> 0x00534730or, for the mode-4/5world-facing variants, converts the surviving preview rectangle back into world-space bounds and re-enters0x0044e940,0x00452f20, and0x0044d410. The companion preview-rebuild owner0x004fb5e0is tighter on entry, too:0x004f726cis the early rebuild path that first copies the live preview raster into[this+0x118]and snapshots undo state through0x004f5a80, while0x004f7adais the later drag-active path that first allocates a temporary occupancy mask before rebuilding and then conditionally mirrors that mask through0x00450520on the world-mode-0x17side path. So the remaining uncertainty has narrowed again from family ownership to the exact meaning of a few per-mode scalar and token lanes, not to whetherPaintTerrain.winitself is still a mixed shell/world owner. The same brush strip is tighter now too:0x004bc210stores the selected ordinal and refreshes one scalar caption from table0x00621e24,0x004bc260exposes the cached world coordinate pair plus the currently selected scalar, and0x004bc290restyles the ordinal strip0x0fa1..0x0fa7plus the mapped mode strip0x0faa..0x0fafagainst the current mode dword[0x006d0818+0x8c]. The next unresolved layer is narrower and more semantic: the setup side now has one grounded owner,world_run_post_load_generation_pipeline, and its building-side branch is no longer just one opaque block. We now have a region family, a region-border overlay rebuild, a region-owned structure-demand and placement dispatcher, and a deeper per-region worker that computes category demand, subtracts existing coverage, and tries candidate placements. The category map is tighter too: category0falls back toHouse, category2is the year-gated weighted region-profile family that also feeds the localizedIndustry Weightingsstats panel, and category3now reaches a separate pool-driven picker whose fallback label isCommercialbut whose aligned player-facing stats bucket isCity Support. The normalized region band is tighter too:world_region_normalize_cached_structure_balance_scalars0x00422320no longer just writes an anonymous cached preview band at[region+0x2e2/+0x2e6/+0x2ea/+0x2ee]. Current growth-report evidence now grounds[region+0x2e2]as the weighted-profit-margin scalar and[region+0x2ee]as the annual-density-adjust scalar later formatted as a percent inStats - City/Region, with[region+0x2e6/+0x2ea]left as the intermediate normalized-delta and clamped companion slots beneath that final adjust term. The per-region prepass feeding that normalization is tighter too:0x00420d40clears[region+0x306/+0x30a/+0x30e], walks the linked placed-structure chain from[region+0x383], accumulates two local placed-structure metrics through0x0040ca70and0x0040ca80, and only for class-0 candidates also folds source field[source+0x141]through0x0040cec0into the third accumulator before tailing into the later scalar refresh. That tail helper0x00420560is tighter now too: on class-0 regions it revisits the same linked chain and folds a class-mix contribution into[region+0x312], with one source-derived term for candidate class0, a separate branch keyed by[candidate+0x78c]and[site+0x246]for class2, one fixed increment for class3, and no current contribution from class1. The remaining setup-side uncertainty has therefore narrowed again: the region seed and border-overlay pair clearly complete before theSetting up Players and Companies...banner is posted;[0x006cec74+0x174]now looks like the direct building-population gate;[0x006cec74+0x178]now looks like the direct seeding-burst gate and selected-year-adjust policy; and[0x006cec74+0x68]now aligns with editor-map mode because the same flag forces the.gmpfamily in the shell file coordinators while suppressing the later building and seeding branches and diverting the deeper region worker into alternate logic. One write side for that[shell+0x178]policy is now grounded too: insideshell_dispatch_ui_command0x00464410, command ids0x9d26..0x9d28storecommand_id - 0x9d26directly into[0x006cec74+0x178], yielding live values0,1, and2. That means the later restore branch is no longer gated by an abstract hidden shell latch; at least one of its adjustment inputs is an explicit UI launch policy and current evidence still does not show that value being recovered from saved state. The319lane itself is no longer the open structural gap; it now clearly owns chairman-profile slot seeding, profile-record materialization, a shell editor surface over the same local record family, and a separate live-company presentation path through the company-list window. The later interior order of that same319lane is tighter now too: after the route-entry collection refresh on0x006cfca8it refreshes the auxiliary route-entry tracker collection0x006cfcb4, then runsplaced_structure_collection_refresh_local_runtime_records_and_position_scalars0x004133b0, then a flagged world-grid cleanup sweep through the compact grid-flag query0x00448af0plus the neighboring local chunk-cell write helper0x00533fe0, and only after that the later route-entry post-pass at0x00491c20. The same319lane is tighter internally now too: before that later world and shell reactivation tail,world_entry_transition_and_runtime_bringupruns one distinct post-bundle status and runtime refresh phase that posts progress ids0x196and0x197through0x005193f0/0x00540120with paired0x004834e0follow-ons, refreshes the live event collection at0x0062be18throughscenario_event_collection_refresh_runtime_records_from_packed_state0x00433130, rebuilds the scenario-side port-or-warehouse cargo recipe runtime tables through0x00435630, and then runs the named-candidate availability preseed through0x00437743. One later subphase is tighter now too: before the broad world-reactivation sweep it posts progress ids0x32dc/0x3714/0x3715, reloads one0x108-byte packed profile block through0x00531150, conditionally copies staged runtime-profile bytes back into0x006cec7cwhile latch[profile+0x97]is set, mirrors the grounded campaign-scenario bit[profile+0xc5]and sandbox bit[profile+0x82]into world bytes[world+0x66de]and[world+0x66f2], and restores the selected year/profile lane through a tighter two-stage calendar path than before. Current local disassembly now shows the raw saved lane at[profile+0x77]first feeding helper0x0051d3f0with constant components(month=1, day=1, subphase=0, tick=0), which writes the resulting Jan-1-style tuple dwords into[world+0x05/+0x09]. Only after that seed does the same lane enter one mode-sensitive adjustment branch: non-editor startup mode can decrement the lane by1or3depending on shell-state editor gate[0x006cec74+0x68], shell-side selected-year-adjust policy[0x006cec74+0x178], and the saved special-condition slot[0x006cec78+0x4af7], and only that adjusted lane then feeds helper0x0051d390beforeworld_set_selected_year_and_refresh_calendar_presentation_state0x00409e80stores the final absolute counter into[world+0x15]and refreshes[world+0x0d/+0x11]. That means the restore no longer reads as a direct[profile+0x77] -> [world+0x15]copy; the raw lane seeds the tuple immediately, but the final absolute-counter restore still depends on live shell/startup context. That dependency is tighter now too: current local evidence shows[shell+0x178] == 1decrementing the restored lane by1,[shell+0x178] == 2subtracting3, and otherwise a nonzero[0x006cec78+0x4af7]supplying the fallback-1branch. That field is no longer unresolved: current local disassembly now shows0x00436d10bulk-zeroing the dword table rooted at[startup+0x4a7f]throughrep stos, which includes+0x4af7, while the editor-side special conditions owner at0x004cb2b0/0x004cb8e0counts and commits that same 49-entry table from the static rule descriptors at0x005f3ab0. The.smpsave or restore family now grounds that live band directly too:world_runtime_serialize_smp_bundle0x00446240writes49dwords from[world+0x4a7f..+0x4b3f]plus one trailing scalar at[world+0x4b43], andworld_load_saved_runtime_state_bundle0x00446d40restores the same fixed0xc8-byte band symmetrically. Slot30in that table is localized pair3722/3723Disable Cargo Economy, so+0x4af7now reads as the live copy of that saved scenario rule, not a startup-runtime-only mystery latch. The neighboring fixed reads line up with the same rule cluster too:+0x4aefis slot28Completely Disable Money-Related Things,+0x4af3is slot29Use Bio-Accelerator Cars,+0x4afbis slot31Use Wartime Cargos,+0x4affis slot32Disable Train Crashes,+0x4b03is slot33Disable Train Crashes AND Breakdowns, and+0x4b07is slot34AI Ignore Territories At Startup. So the remaining loader gap is narrower than before: the restore still depends on live shell policy[shell+0x178], but the+0x4af7input itself is save-derived scenario rule data rather than something that requires runtime tracing to discover. Its read-side family is no longer isolated to the selected-year restore either: it also shapes the chunk size insimulation_run_chunked_fast_forward_burst0x00437b20and appears in candidate/local-service selection and station-detail-side scoring branches around0x0047f910,0x00410d87, and0x005069c6, which now makes this whole slot cluster look like broader runtime consumers of scenario special conditions rather than one startup-only mode enum. One file-side anchor is now tighter too: the checked classic and 1.05gmp/gms/gmxcorpus does expose the same aligned0x0d64..0x0e2c50-dword band as the grounded.smpruntime save or restore copy into[world+0x4a7f..+0x4b43], but most checked file families only populate a sparse subset of that band. The first36dwords still behave like the older inferred fixed rule matrix with hidden slot35fixed to sentinel value1, while the trailing13unlabeled rule lanes plus one scalar vary much more selectively by file family. Current local corpus scans make that split concrete: the grounded 1.05 scenario-save family (p.gms,q.gms) stably lights lanes35, 37, 39, 44, 45, 46, 47, 48; the base 1.05 save family (Autosave.gms,nom.gms) only shares lane35stably and otherwise varies sparsely through42,45, and47; the checked grounded 1.05 maps, the lone 1.05 alt save, and the visible sandbox-family.gmxfiles keep only the sentinel lane35nonzero. So the current loader boundary is narrower than before: the.smppath still gives a grounded direct runtime-band restore, and checkedgmp/gms/gmxfiles now show a partially populated projection of that same aligned band rather than a wholly separate fixed record family. The overlap against the later scalar window is now explicit too: trailing band indices36..49are byte-identical with post-window offsets0x00..0x34, so every nonzero lane in that prefix of the post-sentinel scalar window is also a nonzero lane in the aligned runtime-rule band. That means the real “other fields” boundary inside the post-sentinel window starts only at0x0e2c:0x0df4..0x0e2cis the aligned-band overlap prefix, while0x0e2c..0x0f30is the later tail that still looks like save-side scalar state. Local corpus scans now make that tail split more specific. The base 1.05 save family (Autosave.gms,nom.gms) shares a stable tail subset at relative offsets0xb4,0xc0,0xe0,0xfc, and0x100, with additional per-file lanes around them. The 1.05 scenario-save family (p.gms,q.gms) has a much denser stable tail covering0x08,0x0c,0x10,0x14,0x20,0x24,0x28,0x30,0x34,0x3c,0x5c,0x6c,0xa0,0xa8,0xbc,0xc0,0xc4,0xc8,0xcc,0xdc,0xe0,0xe4,0xe8,0xf4,0xf8, and0xfc; those values still differ per save, but the occupancy is stable. The lone 1.05 alt save (g.gms) only lights0x20,0x34,0xf0, and0xf4. Grounded map families and classic saves keep the tail zeroed, while the only current map-side outlier remainsTutorial_2.gmpunder the broad unknown map-family bucket. The immediately following fixed file window at0x0df4..0x0f30is now bounded separately as well: checked maps and classic saves leave that whole post-sentinel band zeroed, while checked 1.05 saves carry sparse nonzero dwords there, many of which decode cleanly as normal little-endianf32values. That makes the adjacent band look like a 1.05 save-only runtime band rather than scenario-static payload, even though its semantics are still open. One numeric alignment inside that band is now exact too: the tail start0x0e2cis the same relative distance from the aligned runtime-rule base0x0d64as live object offset+0x4b47is from grounded world-rule base[world+0x4a7f], so the bounded tail window0x0e2c..0x0f30is offset-aligned with live bytes[world+0x4b47..+0x4c4b]. The first grounded live field at that boundary is no longer anonymous.0x004367c0sets one outcome mode in[world+0x4a73], zeros[world+0x4d], snapshots the selected-year lane to[world+0x4c88], and then copies localized id2923You lose.or2924You win, cheater...into[world+0x4b47];0x00472dd0formats localized id3918%1 has won the game!with one live profile name and writes that string into the same destination; and one compact runtime-effect branch insideworld_apply_compact_runtime_effect_record_to_resolved_targets0x00431b20resets the same destination to the fixed placeholder token at0x005c87a8. That gives a grounded live interpretation for the start of the tail:[world+0x4b47]is the start of a victory or outcome status-text buffer, not a float lane. The same evidence also gives a useful caution: those live helpers copy up to0x12cbytes into[world+0x4b47..+0x4c73], so the current bounded file-tail window0x0e2c..0x0f30cuts through the first0x104bytes of a grounded text field rather than ending on a clean live-field boundary. One small continuation probe now tightens that edge: the remaining file window0x0f30..0x0f58is exactly the last0x28bytes needed to reach the clean live-field boundary at[world+0x4c73], and checked 1.05 saves still carry sparse nonzero bytes in that continuation window rather than a trailing text-looking suffix. Checked 1.05 save bytes in the aligned region therefore still do not resemble preserved text; they stay mostly zero at the beginning and many nonzero lanes decode as ordinaryf32values. So the safest current note is: the tail is offset-aligned with the live object beyond+0x4b43, but it is not yet a validated byte-for-byte mirror of the live[world+0x4b47]status-text buffer, and the current nonzero save-side content continues right up to the first clean field edge at0x0f58. The next exact grounded fields after that edge are byte lanes, not restored dwords:0x0f59maps to[world+0x4c74]Auto-Show Grade During Track Lay,0x0f5dmaps to[world+0x4c78]Starting Building Density Level,0x0f61maps to[world+0x4c7c]Building Density Growth,0x0f65maps to grounded dword[world+0x4c80]leftover simulation time accumulator, and0x0f6dmaps to byte[world+0x4c88]selected-year lane snapshot. The first later grounded dword after that is[world+0x4c8c]at0x0f71. That means the simple 4-byte file-lane model stops matching grounded live field boundaries immediately after the text-buffer edge: the post-0x0f58file bytes are still offset-correlated to live state, but they are no longer naturally dword-aligned with the next grounded object fields. The new byte-neighborhood probe makes the mismatch more concrete. In checked 1.05 scenario saves, the exact grounded byte offsets themselves do not look like clean selector values:p.gmscarries0x33at0x0f5dand0x8cat0x0f6d, whileq.gmscarries0xccand0xbaat those same offsets. The only clean float-looking starts in that neighborhood instead appear one byte earlier, at0x0f5cand0x0f6c:p.gmsdecodes those as roughly7.6and6.0172, whileq.gmsdecodes them as roughly23.6and44.6824. That tightens the current read further: the checked save bytes remain offset-correlated to the live[world+0x4c74..+0x4c8c]neighborhood, but they are still not a validated byte-for-byte mirror of the exact live field layout. Local A second byte-oriented neighborhood immediately after that now has the same kind of split rather than a clean restored-field mirror. The earlier grounded anchors in that band all stay zero in the checked 1.05 saves: exact file offset0x0f87maps to selected-year bucket companion scalar[world+0x4ca2], while0x0f93and0x0f97map to the two startup-dispatch reset-owned bands[world+0x4cae]and[world+0x4cb2], and the local corpus leaves all three exact dword starts zeroed. The same is true for the later exact byte-owned policy lanes: file offsets0x0f78,0x0f7c,0x0f7d, and0x0f7emap cleanly to grounded byte fields[world+0x4c93]and[world+0x4c97..+0x4c99]: the linked-site removal follow-on gate plus the three editor locomotives-page policy bytesAll Steam Locos Avail.,All Diesel Locos Avail., andAll Electric Locos Avail.. In the checked 1.05 save corpus those four exact byte lanes all stay0, which is at least structurally clean. The later grounded dword fields in the same neighborhood are less direct again. Exact file offset0x0f9fmaps to[world+0x4cba](the station-list selected-station mirror) and exact offset0x0fa3maps to cached available-locomotive rating[world+0x4cbe], but the checked save bytes at those exact dword starts do not look like clean preserved ids or floats. The only stable float-looking starts sit three bytes earlier, at0x0f9cand0x0fa0:p.gmsyields roughly96.8754and186.4795,q.gmsyields329.9467and the same0x0fa0-side candidate shape,g.gmsyields7.0and95.8507, andAutosave.gmsonly shows the later0x0fa0candidate at about68.2629. So this later band now has the same conservative read as the post-text one: the save bytes are still offset-correlated to grounded live fields, but the exact live byte or dword layout is not yet validated as a direct on-disk mirror. One more structural cut is now grounded beyond that neighborhood. The aligned scalar plateau0x0fa7..0x0fe7ends exactly at the later recipe-book root[world+0x0fe7]already grounded in the port-or-warehouse cargo editor and runtime rebuild path. We still do not have live semantic names for the plateau itself, but its aligned dword run now splits cleanly by save family. The base 1.05 saves (Autosave.gms,nom.gms) carry one stable signature with0x0faf = 0x8000003f,0x0fb3 = 0x75c28f3f, repeated0x75c28f3clanes through0x0fbf, a sign-flipped lane0x0fc3 = 0xa3d70a3c, one tiny marker at0x0fc7 = 0x0000003b, and0x0fcb = 0x00300000. The scenario-save family (p.gms,q.gms) carries a different stable plateau over the same offsets, beginning0x0faf = 0x4000003f,0x0fb3 = 0xe560423f, then0x03126f3b,0x1374bc3c, and paired0x23d70a3clanes at0x0fbf/0x0fc3, with0x0fc7 = 0x0000003c. The alt-save family (g.gms) follows the base signature through0x0fc7, then diverges sharply into the same0xcdcdcd..fill pattern already seen in its earlier header lanes. So the current best fit for0x0fa7..0x0fe7is a family-shaped aligned scalar plateau that belongs to save-side runtime state and terminates immediately before the grounded recipe-book block, not one more directly named live-field mirror. One conservative loader-side summary probe now starts exactly at that recipe root instead of extending the plateau model further. The fixed recipe-book block spans twelve books from0x0fe7with stride0x4e1, and the checked map/save pairsAlternate USA.gmp -> Autosave.gms,Southern Pacific.gmp -> p.gms, andSpanish Mainline.gmp -> g.gmspreserve that rooted block byte-for-byte in the sampled local corpus. The current probe therefore treats it as preserved scenario payload rather than save-only runtime drift and only reports per-book signatures: a coarse head kind over the pre-line region, the rawbook+0x3edannual-production dword, and one raw summary for each of the five fixed0x30-byte cargo lines beginning atbook+0x3f1: coarse line kind, raw mode dword, raw annual-amount dword, and the raw supplied/demanded cargo-token dwords at+0x08and+0x1c. That is enough to separate zero,0xcd-filled, and mixed books or lines without overstating line semantics beyond the grounded editor/runtime ownership already documented below. Local corpus clustering now makes the remaining split more specific. The base 1.05 save family (Autosave.gms,nom.gms) shares a narrow tail-heavy subset with stable relative offsets0xec,0xf8,0x118,0x134, and0x138, while still varying in value across files. The 1.05 scenario-save family (p.gms,q.gms) shares a much broader stable set spanning almost the whole window from0x04through0x134, again with per-file scalar differences but consistent occupancy. Pairwise compare runs tighten that read further:Autosave.gmsvsnom.gmsdoes not preserve one common numeric tail signature even at the shared base-save offsets, andp.gmsvsq.gmskeeps the broad scenario-save occupancy pattern but still changes every shared value, withq.gmsadditionally lighting two extra lanes at0x78and0x84. So the current best fit is “family-shaped live scalar state” rather than family-default constants. The lone 1.05 alt-save sample (g.gms) only lights up four lanes at0x58,0x6c,0x128, and0x12c. The checked 1.05 maps and classic saves stay zero in that same bounded window, which strengthens the current read that this is runtime-save scalar state rather than generic map payload. One older unknown map-family outlier in the local corpus does still carry a populated window:Tutorial_2.gmpunder the classic install tree. So the safest current note is “zero for grounded map families and classic save families, nonzero for observed 1.05 save families, with one older unknown-map exception.” Static consumer grounding is still sparse for that tail: direct object-offset hits currently only name the trailing scalar[world+0x4b43]through the editor panel and.smpsave or restore family, while local opcode searches do not yet surface equally direct reads for the intervening+0x4b0b..+0x4b3ftail lanes. So the save-file family clustering is now strong, but those later tail scalars remain structurally bounded rather than semantically named. The same branch is no longer world-entry-only either: current local disassembly now shows the identical lane-adjust and0x51d3f0 -> 0x51d390 -> 0x409e80sequence in the post-fast-forward selected-year tail at0x004370e0, which lines up with the existing post-fast-forward callers already mapped under0x00433bd0,0x00435603,0x0041e970, and0x00436af0. That restore now also has some neighboring slot semantics bounded well enough to carry in the loader notes. Slot31[0x006cec78+0x4afb]is no longer best read as an unnamed runtime cargo-economy latch: local disassembly now ties it directly to the saved special-condition table entryUse Wartime Cargos, and the strongest current runtime owner isstructure_candidate_collection_refresh_cargo_economy_filter_flags0x0041eac0. Inside that candidate-collection sweep the branch at0x0041ed37only activates when slot31is set and then treats the string familyClothing,Cheese,Meat,Ammunition,Weapons, andDieselas one special cargo set before writing the live candidate filter byte[entry+0x56]. That makes the old read-side note around0x00412560tighter too: the neighboring descriptor gate is now best understood as using the live copy of theUse Wartime Cargosscenario rule, not an anonymous cargo-economy mode byte. Slot34[0x006cec78+0x4b07]is similarly bounded on the runtime side: the wrapper at0x004013f0, which sits immediately above the broader company-start or city-connection chooser0x00404ce0, snapshots region dword[entry+0x2d]across all0x18live region records in0x006cfc9c, zeros that field while the chooser runs, and then restores the original values on exit. That is a strong current fit for the editor ruleAI Ignore Territories At Startup, even though the exact meaning of region field+0x2dremains open. Slot29[0x006cec78+0x4af3]is less semantically tidy but still worth carrying as a bounded consumer family: the branch at0x0041d286activates one later placed-structure or building-side scoring path only when that slot is nonzero and the linked candidate or era record at[entry+0x41]equals5, while two already-grounded world helpersworld_scan_secondary_grid_marked_cell_bounds0x0044ce60andworld_service_secondary_grid_marked_cell_overlay_cache0x0044c670also gate on the same slot. So the identity of slot29as saved rule data is grounded, but the downstream runtime semantics are still mixed enough that the loader should preserve the raw value without trying to rename its whole consumer family yet. The neighboring train-safety slots are now bounded enough to keep as a cautious runtime split too. Slot33[0x006cec78+0x4b03]Disable Train Crashes AND Breakdownsis the coarse gate in the currently recovered train-side deterioration family around0x004af8a0: the very first branch at0x004af8abjumps straight to the function tail when the slot is set, bypassing the year-scaled threshold build, the later random or threshold comparison, and the two follow-on state transitions at0x004ad7a0and0x004ada00. Slot32[0x006cec78+0x4aff]Disable Train Crashesis narrower in the same family: after the threshold path has already run, the branch at0x004af9c1uses slot32to suppress only the lower failure-transition path and force the milder follow-on at0x004ada00. That same slot-33read also appears in the smaller train-side scalar query at0x004ac460, where setting it returns one fixed float immediately before the ordinary route-object-dependent calculation runs. So the current best loader-facing read is: slot33is the broad train deterioration bypass, slot32is the narrower crash-only branch inside that same family, but the exact player-facing names of the two unnamed train helpers still need one more naming pass. That restore now also has one concrete file-side correlation in the classic.gmsfamily: local save inspection now consistently finds0x32dcat0x76e8,0x3714at0x76ec, and0x3715at0x77f8inAutosave.gms,kk.gms, andhh.gms, leaving one exact0x108-byte span from0x76f0to0x77f8between0x3714and0x3715. That span already carries staged-profile-looking payload text such asBritish Isles.gmp, so the current static-file evidence now supports the atlas-side0x108packed-profile note for the classic save family even though the exact field layout inside that block is still unresolved. The same classic corpus is tighter now too: inside that0x108span the map-path C string begins at relative offset0x13, the display-name C string begins at0x46, the block is otherwise almost entirely zeroed, and the three local samples are byte-identical except for the leading dword at+0x00(3inAutosave.gmsandhh.gms,5inkk.gms). The currently atlas-tracked bytes[profile+0x77],[profile+0x82],[profile+0x97], and[profile+0xc5]are all0in that classic sample set, so the current file-side evidence grounds the block boundaries and the embedded strings but does not yet show live examples of those branch-driving latches being set. One 1.05-era file-side analogue is now visible too, but only as an inference from repeated save structure rather than a disassembly-side field map: local.gmsfiles inrt3_105/Saved Gamescarry one compact string-bearing block at0x73c0with the same broad shape as the classic profile slab, including a leading dword at+0x00, one map-path string at+0x10, one display-name string at+0x43, and a small nonzero tail around+0x76..+0x88. In that 1.05 corpus the analogue bytes at relative+0x77and+0x82are now nonzero in every checked sample (Autosave.gms/nom.gmsshow0x07and0x4d;p.gms/q.gmsshow0x07and0x90;g.gmsshows0x07and0xa3), while relative+0x97and+0xc5remain0. The compared 1.05 save set is tighter now too:Autosave.gmsandnom.gmscluster together onAlternate USA.gmpwith+0x82 = 0x4d,g.gmscarriesSpanish Mainline.gmpwith+0x82 = 0xa3, andp.gms/q.gmscluster onSouthern Pacific.gmpwith+0x82 = 0x90; across all five files the same inferred analogue lane at+0x77stays fixed at0x07, while the same map- or scenario-sensitive tail word at+0x80tracks those0x4d/0xa3/0x90byte lanes (0x364d0000,0x29a30000,0x1b900000). The leading dword at+0x00also splits the same corpus, withAutosave.gmsalone at3and the other four checked 1.05 saves at5. That is enough to say the wider save corpus does contain nonzero candidates for two of the atlas-tracked profile lanes, and that one of them varies coherently with the loaded scenario family, but not yet enough to claim that the 1.05 block reuses the exact same semantic field assignments as the classic one. The loader-side family split is tighter now too:p.gmsandq.gmsno longer live under a generic fallback; their save headers now classify as one explicitrt3-105-scenario-savebranch with preamble words0x00040001/0x00018000/0x00000746and the early secondary window0x00130000/0x86a00100/0x21000001/0xa0000100, whileg.gmsnow classifies as a second explicitrt3-105-alt-savebranch with the different preamble lane0x0001c001/.../0x00000754and early window0x00010000/0x49f00100/0x00000002/0xa0000000. That branch now carries the same bootstrap, anchor-cycle, named 1.05 trailer, and narrow profile-block extraction path as the other 1.05 saves. The bridge just below that trailer is now explicit too: the common 1.05 save branch carries selector/descriptor0x7110 -> 0x7801inAutosave.gmsand0x7110 -> 0x7401innom.gms, and both still reach the same first later candidate atspan_target + 0x189c, well before the packed profile atspan_target + 0x3d48; thert3-105-alt-savebranch instead carries0x54cd -> 0x5901and its first later candidate lands atpacked_profile + 0x104, essentially on the profile tail; the scenario-save branch still diverges locally with0x0001 -> 0x0186and never enters that later0x32c8-spanned bridge at all. The common-branch bridge payload is narrower now too: both checked base saves expose the same 0x20-byte primary block at0x4f14followed by the same denser secondary block at0x671c,0x1808bytes later, and that secondary block now appears to run intact up to the packed-profile start at0x73c0for a total observed span of0xca4bytes. The trailing slice of that secondary block is now typed one level further: a small header atsecondary+0x354carries the observed stride0x22, capacity0x44, and count0x43, followed by a fixed-width 67-entry name table starting atsecondary+0x3b5and running through names likeAluminumMill,AutoPlant,Bakery,Port00..11, andWarehouse00..11, with a short footer (dc3200001437000000) after the last entry. The trailing per-entry word is now surfaced too: most entries carry0x00000001, while the currently observed zero-trailer subset isNuclear Power Plant,Recycling Plant, andUranium Mine. That footer is tighter now too: it parses directly as0x32dc,0x3714, and one trailing zero byte, so the shared map/save catalog currently ends on the same two grounded late-rehydrate progress ids that the classic staged-profile band already exposed. The strongest structural read is therefore that the entire0x6a70..0x73c0catalog region is shared verbatim betweenAlternate USA.gmpand the derivedAutosave.gms, not rebuilt independently during save. Combined with the earlier grounded record-layout work under0x00437743,0x00434ea0, and0x00434f20, the current safest semantic read is that this shared catalog is the bundled source form of the scenario-side named candidate-availability table later mirrored into[state+0x66b2], with each entry's trailing dword now reading as the same availability override bit later copied into[candidate+0x7ac]. The loader-side coverage is tighter now too: the same table parser now attaches both to the common-save bridge payload and directly to the fixed source range in.gmpfiles and the non-commonrt3-105-scenario-save/rt3-105-alt-savebranches. That makes the scenario variation explicit instead of anecdotal.Alternate USAkeeps only three zero-availability names in this table (Nuclear Power Plant,Recycling Plant,Uranium Mine),Southern Pacificwidens the zero set to twelve (AutoPlant,Chemical Plant,Electric Plant,Farm Rubber,FarmRice,FarmSugar,Nuclear Power Plant,Plastics Factory,Recycling Plant,Tire Factory,Toy Factory,Uranium Mine), andSpanish Mainlinewidens it again to forty-two, includingBauxite Mine,Logging Camp,Oil Well,Port00, and theWarehouse00..11run while also flippingRecycling Plantback to available. The header lanes just ahead of the table vary coherently with those scenario branches too:Alternate USAcarriesheader_word_0 = 0x10000000,Southern Pacificcarries0x00000000, andSpanish Mainlinecarries0xcdcdcdcd, while the structural fields fromheader_word_2onward remain stable (0x332e,0x1,0x22,0x44,0x43) and the 9-byte footer still decodes as0x32dc,0x3714,0x00in all three checked maps. A wider corpus scan over the visible.gmp/.gmsfiles makes those two anonymous header lanes less mysterious too: the parser currently sees only three stable(header_word_0, header_word_1)pairs across 79 files with this table shape, namely(0x00000000, 0x00000000),(0x10000000, 0x00009000), and(0xcdcdcdcd, 0xcdcdcdcd). The zero-availability count varies widely underneath the first and third pairs (0..56under the zero pair,14..67under the0xcdcdcdcdpair), so those two lanes no longer look like counts or direct availability payload; the safest current read is that they are coarse scenario-family or source-template markers above the stable0x332e/0x22/0x44/0x43table header, with0xcdcdcdcdstill plausibly acting as one reused filler or sentinel lane rather than a meaningful numeric threshold. Current exported disassembly notes still do not ground one direct loader-side or editor-side consumer ofheader_word_0orheader_word_1themselves, so that family-marker read remains an inference from corpus structure rather than a named field assignment. The new loader-side compare command makes the save-copy claim sharper too: for the checked pairsAlternate USA.gmp -> Autosave.gms,Southern Pacific.gmp -> p.gms, andSpanish Mainline.gmp -> g.gms, the parsed candidate-availability table contents now match exactly entry-for-entry, with the only reported differences being the outer container family (mapvssave) and source-kind path (map-fixed-catalog-rangevs the save-side branch). has the explicit companionworld_refresh_selected_year_bucket_scalar_band0x00433bd0, which rebuilds the dependent selected-year bucket floats after the packed year changes; and then rehydrates the named locomotive availability collection at[world+0x66b6]throughlocomotive_collection_refresh_runtime_availability_overrides_and_usage_state0x00461e00. That locomotive-side restore is tighter now too: its tail explicitly re-entersscenario_state_refresh_cached_available_locomotive_rating0x00436af0, which rebuilds one cached available-locomotive rating at[state+0x4cbe]from the current year plus the strongest surviving available locomotive-side rating scalar[loco+0x20], and the tiny query sibling0x00434080is now bounded as the shell-side clamped read helper over that same cached field, with the grounded shell-side reader later bucketing that value against40/50/70/85/100. The same rehydrate band also refreshes the live structure-candidate filter and year-visible counts throughstructure_candidate_collection_refresh_filter_and_year_visible_counts0x0041e970, rebuilding the paired per-slot bands at[candidates+0x246]and[candidates+0x16e]and the aggregate counts at[candidates+0x31a]and[candidates+0x242]; the same late checkpoint also re-entersplaced_structure_collection_seed_candidate_subtype2_runtime_latch0x00434d40, which seeds runtime dword[candidate+0x7b0]across subtype-2candidate records before the later world-wide reactivation sweep. That checkpoint also now has an explicit shell-facing scalar publisher:world_publish_shell_controller_progress_scalar_from_year_thresholds_or_selector_overrides0x004354a0writes one clamped0..255value into the current shell presentation object, sourcing it either from the shell selector override pairs or from the scenario-side year-threshold band rooted at[state+0x3a/+0x51/+0x55/+0x59/+0x5d/+0x61]; and just ahead of the later scenario-side recipe rebuild, the same band also re-entersscenario_state_ensure_derived_year_threshold_band0x00435603, which only falls into its heavier rebuild body while[state+0x3a] < 2and otherwise leaves the derived year-threshold companion slots[state+0x51/+0x55/+0x59/+0x5d/+0x61]unchanged. The neighboring late status checkpoints around progress ids0x196and0x197also share one explicit stage gate now:world_query_global_stage_counter_reached_late_reactivation_threshold0x00444dc5compares the global counter0x00620e94against threshold0x9901, and the two current callers use a negative result to clear[world+0x39]before the broader world and shell reactivation sweep. The later reactivation tail is tighter now too: it includes the region-center world-grid flag reseed pass0x0044c4b0, which clears bit0x10across the live grid and then marks one representative center cell for each class-0region through0x00455f60; its immediate sibling0x0044c450then rerunsplaced_structure_rebuild_candidate_cargo_service_bitsets0x0042c690across every live grid cell. The small secondary-raster premark helper0x0044c570is bounded now too: it only admits cells whose current raster byte has no bits in mask0x3eand whose parallel class query0x00534e10is false, then rewrites that masked class field to0x02and widens the same cached bounds-and-count band[world+0x21c6..+0x21d6]. The next helper0x0044ce60scans the secondary raster at[world+0x2135]for cells with any bits in mask0x3e, caching min/max bounds plus a marked-cell count in[world+0x21c6..+0x21d6]; the larger sibling0x0044c670then consumes those cached bounds to normalize the same raster and rebuild one dependent overlay/cache surface before the later route-style rebuild, shell-window, and briefing branches. That overlay side is tighter now too: after0x0044c670resolves scaled surface dimensions through0x00534c50, it walks one local3 x 32sample lattice through the static offset tables at0x00624b28/0x00624b48, keeps only secondary-raster classes4..0x0d, folds several interpolated0x0051db80samples into one strongest local score, writes packed overlay pixels into the staged surface buffer, and only then publishes that staged overlay through0x00534af0. The lower helper layer under that overlay pass is tighter now too:0x00534e10is the reusable secondary-raster class-set predicate for classes1/3/4/5,0x00534e50is the smaller neighboring class-subset predicate for1/4,0x00534ec0covers2/4/5,0x00534f00covers3/5,0x00534e90is the marked-bit query over the same 3-byte cell family, and the nearby local counter0x0044bdb0is now bounded as the 8-neighbor count companion for that same2/4/5subset, walking the shared0x00624b28/0x00624b48offset tables and re-entering0x00534ec0on each bounded neighbor cell. The first caller cluster around0x0044bf9d..0x0044c37btherefore reads as a secondary-raster neighborhood service band rather than a generic map scan.0x00533e70and0x00534160are the coarser siblings over the overlay table at[world+0x1685]: the first clears coarse chunk objects across one clamped rectangle, while the second ensures one chunk object and seeds local marks through its deeper stamp helper. One level up, the neighboring rect owner0x005374d0now reads as the shared secondary-overlay refresh pass: it reruns the local sample and unsigned-word reducers0x00536230/0x00536420, rebuilds the signed vector byte planes through0x00536710, and then rebuilds the multiscale support surfaces through0x00533890, whose inner reducers now explicitly target the packed sample-triplet buffer plus the float and unsigned-word support planes rooted at the five-entry per-scale families[world+0x15f1..+0x1601],[world+0x1605..+0x1615], and[world+0x1619..+0x1629]. The setup side of that same family is tighter now too:0x005375c0is the shared ensure-and-seed owner that allocates the sample, sidecar, mask, raster, vector, and coarse-cell tables together; crucially, it seeds[world+0x1655]with byte0x02and[world+0x1659]with byte0x01, which closes the default-fill split. The local component-walk owner under the same neighborhood band is tighter now too:0x0044c200allocates a temporarywidth*heightvisit bitmap at0x0062c128, seeds one class-2/4/5starting cell, derives an initial direction index through the remap table0x005ee5d4, and then fans into the deeper recursive walker0x0044be20. That deeper walker widens dirty bounds[world+0x21ad..+0x21b9], stamps one companion-word orientation lane through0x005ee5cc, reuses0x00534ec0plus0x0044bdb0to filter admissible neighbors, tracks temporary visitation in0x0062c128, and then applies the local byte-1 edge-bit0x04/0x08updates before returning. So the0x0044bf9d..0x0044c422cluster now reads as a real connected-component walk plus edge-flag refresh layer over the secondary raster rather than only a loose group of local neighbor counters. The adjacent mutation strip is tighter now too:0x0044dcf0refreshes companion-word bit0x200in one local rectangle by checking whether any neighbor belongs to class set2/4/5, while0x0044df10clears three local sidecar byte planes, demotes class4to1and class5to3, and then reruns that marked-bit refresh over the surrounding+/-1window. One level up,0x0044e500is the rect-wide owner that recomputes byte-1 edge bits0x04/0x08for class-2/4/5cells, dispatches0x0044df10on incompatible local patterns, and finally consumes the pending global seed pair at[0x006d1304+0x78/+0x7c]through0x0044c200. The shell-side owner of that pending pair is tighter now too:[0x006d1304]is the livePaintTerrain.winshell singleton while the callback-heavy side also keeps a second rooted pointer at0x006d1334; the tool constructor snapshots the broader terrain-paint state into both families while the world-side raster owner still only consumes[0x006d1304+0x78/+0x7c]as one pending component-seed pair. Its radial sibling0x0044e7d0is narrower: after validating world-space coordinates through0x00414bd0, it stamps class-2marks into the secondary raster by walking one clamped bounding box and admitting cells only when the radial falloff helper0x0051db80stays positive before re-entering0x0044c570. The two small support predicates under that same strip are now explicit too:0x00414bd0is the float grid-bounds gate, and0x00449df0is the integer rectangle clamp-and-validity helper shared by the local mutation owners. One level up, the broader rect-scoped owner is tighter now too:world_rebuild_secondary_raster_derived_surface_and_companion_planes_in_rect0x0044e940first reclamps the caller rectangle through0x00449df0, reruns the local edge-refresh owner0x0044e500, lazily ensures one presentation target through0x0051f090/0x00534910/0x00534920/0x00534930, and then resolves scaled target dimensions through0x00534c50before allocating one temporarywidth*heightmask. Its main scan then walks the live secondary raster[world+0x165d]through the same class predicates0x00534e10/0x00534e50/0x00534f00/0x00534ec0: class-1/3/4/5cells force0xffinto the four sidecar byte planes[world+0x1631..+0x163d], while the broader per-cell pass writes packed values into the ensured target through0x00534730and also updates nibble lanes at byte offsets+0x2and+0x5inside the same three-byte secondary-raster cell family. After the publish it notifies the shell owner at0x0062be68, re-enters0x00449f80and0x004881b0, frees the temporary mask, expands the caller rectangle by dirty bounds[world+0x21ad..+0x21b9]through0x00536710, and finally seeds companion byte[world+0x162d]with0xc4on cells selected from mask plane[world+0x1655]. So the0x0044e500 -> 0x0044e940band is now a real derived-surface and companion-plane rebuild family rather than only a loose collection of local raster mutations. The local evidence now also supports a stronger negative conclusion: unlike[world+0x1655], that second mask plane is not part of the actively rebuilt runtime overlay path, and in the grounded local corpus it behaves only as a separately seeded, cleared, and persisted sibling plane. One level lower, the base-plane allocator0x00532c80now reads more cleanly too: it is the narrower owner that clears[world+0x15e1], optionally applies the current grid dimensions, allocates the base float-summary plane[world+0x1605], the four sidecar byte planes[world+0x1631..+0x163d], both one-byte mask planes[world+0x1655/+0x1659], and the packed secondary raster[world+0x165d], then seeds those planes with the same0x02/0x01/0x00default split. The load-side owner for those same planes is tighter now too: the constructor thunk0x0044e910immediately feeds the heavier payload body0x0044cfb0, which reads the rooted chunk families0x2ee2/0x2ee3/0x2ef4/0x2ef5/0x2ef6/0x2ee4/0x2ee5/0x2f43/0x2f44, allocates the core world-grid and secondary-raster arrays[world+0x2129..+0x2141]plus the route-entry collection0x006cfca8, initializes every grid-cell record through0x0042ae50, and only then hands off intoworld_compute_transport_and_pricing_grid0x0044fb70, the neighboring presentation refresh0x00449f20, and the shell-mode pulse0x00484d70. So the0x0044e910 -> 0x0044cfb0load side is now bounded as the heavy world-grid and secondary-raster bundle-load body rather than just another anonymous constructor tail. One level higher again, the broader world-presentation reinitializer0x00537e60now sits above that base allocator and the larger support-family ensure path0x005375c0: it stores the live grid dimensions, hard-resets the whole overlay runtime family through0x00532590, reinitializes the secondary-overlay family for those dimensions, and then republishes the neighboring overlay constants and support owners used by both the world-side reattach branch and the.smprestore-side presentation rebuild path, including several owners that all funnel through the shared static-template slot allocator0x00532ad0over the local0x100pointer band at[world+0x08]. Those neighboring owners are tighter now too:0x00535070is the small primary overlay-surface-or-template setup owner, while0x005356e0and0x00535890seed two larger static-template slot bands rooted at[world+0x1568/+0x156c/+0x1574/+0x1578]and[world+0x1560/+0x1564]respectively; the remaining heavier sibling0x00535430now reads as a shared four-slot overlay-surface rebuild owner that resamples one source or fallback descriptor into a short local slot strip above[world+0x155c]. The tail of that same reinitializer is tighter now too: after the larger support-family setup it seeds one seven-entry default overlay companion set through0x005373b0, whose inner allocator0x00535950populates the local0x1b-entry slot table from the static template rows0x005dd300..0x005dd378. The lifecycle side is tighter in the same way now:0x00536044is the shared teardown owner that frees those same three five-entry support families together with both mask planes, the packed secondary raster, the vector-byte planes, the local staging buffer, and the neighboring sidecar or coarse-cell tables. The remaining base-float lane is tighter too: the larger rebuild owner0x00538360now clearly writes one base float-summary field into[world+0x1605], clears both one-byte mask planes, and then only repopulates the primary mask plane[world+0x1655]for the qualifying class-1interior cells before re-entering0x00532d90to normalize that base float-summary plane globally and0x00532f60to expand positive cells through one caller radius. That asymmetry is now enough to close the local semantic edge:[world+0x1655]is the actively rebuilt primary overlay mask, while[world+0x1659]is only the separately seeded and persisted secondary mask sibling with no comparably grounded distinct read-side consumer. The only grounded getter call to its root accessor0x00533b60is the shell staging branch at0x00525bad, and that branch immediately discards the returned pointer. The bundle side is now explicit too:.smpsave-load treats the two mask planes as separate payloads with chunk ids0x2ceefor[world+0x1655]and0x2d51for[world+0x1659], while the neighboring0x2d49/0x2d50branches are the separate packed secondary-raster import lanes rather than alternate consumers of the second mask plane. So, in the mapped local code,0x1659is best treated as a persisted compatibility or seed-state sibling, not as a second actively consumed runtime overlay mask. The event side is tighter too: that0x00433130pass in turn materializes each live event record throughscenario_event_refresh_runtime_record_from_packed_state0x0042db20. Current shell-side xrefs now tighten that event branch too: the first rebuilt linked row family under0x0042db20aligns with the standalone condition list later queried byEventConditions.win, while the second rebuilt family aligns with the four grouped effect lists later deep-copied throughscenario_event_clone_runtime_record_deep_copy0x0042e050during event duplication and effect staging. The condition side is tighter now too: the tiny helper cluster0x0042df30/0x0042df70/0x0042dfb0/0x0042dff0is no longer just "some adjacent list scans". Current evidence bounds it as four predicates over the standalone0x1e-row condition list, testing class bits0x01,0x02,0x04, or any of those bits in the static table0x005f3e04 + id*0x81, with special fallback checks through event fields[event+0x7f9],[event+0x7fa], and[event+0x7f0] == 0x63. The shell side is tighter too: vtable slot0x005d0cd8now bindsshell_event_conditions_window_handle_message0x004d59e0, and vtable slot0x005d0cf8bindsshell_event_effects_window_handle_message0x004d7060. The effects side is tighter too: the lower helper trio is no longer anonymous.0x004d5d00now reads as the effect-type selector refresh under control family0x4fb2,0x004d5f50reads as the selected effect parameter-row repaint,0x004d6090is the heavier staged-effect editor refresh over the0x4fc7/0x4fce/0x4ff6/0x4ff9/0x4ffc/0x5041/0x5044/0x5046/0x5047bands, and0x004d67f0commits the current editor state back into the staged effect row at[this+0x78]. The verb side is tighter now too:shell_open_event_conditions_modal_and_return_result0x004d9dc0andshell_open_event_effects_modal_and_return_result0x004d9e40are the shared modal openers above the two editor windows;0x004da640,0x004da700, and0x004d9ed0now read as the add, edit, and remove verbs for standalone condition rows;0x004da7c0,0x004da860, and0x004da920are the matching add, edit, and remove verbs for grouped effect rows; and0x004d8120is now the heavier condition-row list panel refresh those condition-side verbs re-enter after mutation. The conditions-side refresh split is tighter too:0x0042d700aggregates standalone condition-list class or modifier flags,0x0042d740aggregates grouped effect-row type flags for one selected grouped list,0x004d9970owns the condition-class summary and grouped-row status bands,0x004d77b0owns the grouped summary-band affordance gate for0x4fed..0x4ff0when selector0x5000lands on0x5002,0x004d9d10owns the smaller grouped-effect territory-target affordance on control0x500b,0x004d9f50owns the selected-event mode strip and summary text panels, and0x004d9390is the mode-dependent detail-row switch beneath that strip.0x004da0f0is tighter too: selector0x5001now has the strongest current RT3.lng fit as the condition-sideTest against...mode above0x004d9970, while selector0x5002has the strongest current fit as the grouped-effect-sideApply effects...mode. That0x5002branch now clearly builds control0x5014from RT3.lng1160..1164asto the company/player/player (i.e. chairman)/territory for which the condition is TRUEbefore enabling the adjacent0x5005,0x500a, and0x5014..0x501cfamily. The strongest current RT3.lng fit for the remaining visible target-scope strip is now0x5015 = to the whole game,0x5016..0x5018 = to all/human/AI companies,0x5019 + 0x500b = to territories, and0x501a..0x501c = to all/human/AI players; the grouped effect-row type mask matches that split directly through bits0x08,0x01,0x04, and0x02. The selected-event strip is tighter now too:0x004db120is the broader selected-event repaint and navigation refresh above those smaller helpers,0x004db520and0x004db5e0are the previous and next selected-event stepping verbs,0x004db8b0is the add-or-clone event modal helper,0x004dba90is the rename verb,0x004d9360is the delete verb,0x004db6a0is the live selected-event id setter behind control0x4e84, and0x004db6f0is the callback-binding plus pending-selection bootstrap path that seeds the strip during window bring-up. The larger dispatcher at0x004dbb80now makes the strip explicit:0x4e85..0x4e8aare previous, next, add blank, clone selected, rename, and delete event, while the later grouped band commits current summary state through0x004d8d50before changing grouped selector[this+0x9c]via0x004dbf93. The selection bootstrap side is tighter too:0x004daf40is now the placeholder reset helper for the selected-event summary controls0x4eaf,0x4eac,0x4ed9,0x4edb, and0x4fdf..0x4fe2. The grouped target-scope side is tighter too:0x004d8ea0now reads as the commit helper for current selected-event text panels before selection or grouped-action changes,0x004d8d50now records the hidden selector family0x5006..0x500e -> 0..8, and0x004dab60projects that ordinal one-to-one onto the visible grouped-effect target-scope display strip0x5014..0x501c. That split is firmer now:0x5006..0x500eare the canonical hidden selectors that get stored into[event + group + 0x7fb], while0x5014..0x501care the visible mirror rows republished from that same ordinal rather than a second independently named selector family. The grouped row and stored-summary refresh side is tighter too:0x004d88f0is now the selected grouped-effect row-list renderer for0x4ed5, formatting the grouped0x28-byte rows through RT3.lng1154..1159, and0x004da9a0is the current grouped-summary-state republisher that reloads0x500a,0x500b, and visible action selection0x5014..0x501cfrom[event + group + ...]before tailing back into0x004da0f0,0x004dbfcaas the grouped target-scope mode selector that persists the chosen control id into0x00622074, with0x5001/0x5002now strongest-fit asTest against...andApply effects...,0x004dbeebas the pending shared summary-text triplet publish helper for0x4eac/0x4ed9/0x4edb,0x004d91e0as the selected-event summary-header and grouped-mode commit helper above0x004d8d50, and0x004dbe7aas the narrower0x4ec6/0x4ec7choice-event single-player-only warning modal branch rooted at RT3.lng3887. The remaining gaps on this lane are narrower again because the grouped-band0x4dc09ctable now closes one earlier overclaim: controls0x5001/0x5002are the only0x4fed..0x501centries that route into0x004dbfcaon the0xcfside, while visible rows0x5014..0x501conly route to the smaller0x004d9d10affordance path and the rest of0x4ff1..0x5013are default no-ops. The open question is therefore no longer whether those visible target-scope rows are direct selector verbs; current evidence says they are not. The local slot records are rooted at[world+0x69d8],[slot+0x01]polarity and the external role gate at[world+0x0bc3+slot*9]are now grounded, and[slot+0x03]now looks like the distinguished primary-human-seat marker because current grounded writes seed it only on slot zero and later logic moves it solely by whole-record compaction. The open question is no longer whether the seeded trio lands in the visible shell company roster; current evidence says it does, and ordinaryStart New Companynow looks like a fresh-company allocator throughstart_new_company_dialog_commit_create_companyandstart_new_company_request_create_company, not like the path that claims one of the seeded named railroads. The immediate post-roster station branch is now clearly separate: current grounded resource names and handlers put mode8onStationDetail.win, mode5onStationList.win, and the subordinate selector helper onStationPick.win. The company-side ownership question has therefore moved down a layer rather than staying open. We now have a recoveredCompanyDetail.winowner family throughshell_company_detail_window_refresh_controls,shell_company_detail_window_construct, andshell_company_detail_window_handle_message; the same owner now has one broader bounded read-side lane too, because control0x9470usesshell_company_detail_render_financial_history_panelto draw the five-step Revenue or Expenses or Interest or Profit or Lifetime strip, sibling control0x9471reusesshell_format_company_financial_summary_cardthroughshell_company_detail_render_company_summary_card, controls0x947dand0x947enow ground a bond maturity and repay panel throughshell_company_detail_render_bond_maturity_and_repay_panel, control0x9488now grounds the debt or credit or rate summary block throughshell_company_detail_render_debt_credit_and_rate_summary_panel, control0x948anow grounds the share-value and dividend-payout block throughshell_company_detail_render_share_value_and_dividend_summary_panel, while the broader six-row per-share stock-data family is now bounded undershell_format_company_stock_data_panel, and the adjacent territory selector lane is bounded throughshell_company_detail_select_territory_access_row,shell_company_detail_render_territory_access_row,shell_company_detail_sync_selected_territory_from_picker, andshell_company_detail_refresh_selected_territory_access_summary; the first finance-action layer beneath it is bounded through the bond, stock-issue, stock-buyback, and dividend-rate helpers; the territory-access side is bounded too throughshell_company_detail_refresh_selected_territory_access_summary,shell_company_detail_buy_territory_access_rights_flow, and the underlying company access-rights helpers; and the full takeover and merger vote-result lane is now grounded throughshell_resolve_chairmanship_takeover_vote_and_commit_outcome,shell_present_chairmanship_takeover_vote_outcome_dialog,shell_resolve_merger_vote_and_commit_outcome, andshell_present_merger_vote_outcome_dialog. The remaining company-side uncertainty is therefore narrower than before: the broader support and valuation side is now tighter too becausecompany_compute_cached_recent_per_share_performance_subscore,company_compute_five_year_weighted_shareholder_return, andcompany_compute_public_support_adjusted_share_price_scalarbound the recent per-share performance and investor-support/share-price blend beneath those vote resolvers; the recent per-share feeder now has a grounded four-lane tail too, with current partial-year weight(5 * [world+0x0f]) - 5, prior full-year weights48/36/24/12on0x1f/0x1e, dividend non-decline pair weights9/8/7/6on0x20, lane weights40/10/20/30, the startup age ramp0/0/0/100 -> 25/25/35/100 -> 50/50/65/100 -> 75/75/85/100 -> 100/100/100/100, a strongest-lane*1.25boost, a weakest-lane*0.8reduction, and separate bounded-intermediate versus final difficulty applications under0x005f33b8; the next consumer0x00424fd0is also tighter now, with the young-company interpolation against[company+0x57], caller pressure clamped to[-0.2, 0.2], one(shares / 20000)^0.33share-count growth term, and the later threshold ladder0.6 / 0.45 / 0.3 / 1.7 / 2.5 / 4.0 / 6.0before the issue-0x37multiplier,scenario_state_compute_issue_opinion_multipliernow bounds the next layer of optional company, chairman, and territory-specific opinion overrides on the active scenario state, and the broader stat-reader family aroundcompany_read_control_transfer_metric_slotandcompany_read_year_or_control_transfer_metric_valueis no longer just a merger-premium helper. Current grounded callers show the same metric family feeding the annual shareholder-revolt and creditor-liquidation lane surfaced by localized ids300..304, while the debt-side shell and bond lane now separately close0x38asCredit Ratingand0x39asPrime Rate. That means the remaining gap is now mostly gone on the UI side too: issue0x37is already bounded to the same investor-confidence family as the equity-support and governance-pressure paths, and current grounded UI evidence still stops at the investor-attitude sentence family rather than one standalone caption. The calendar side is tighter now too:[world+0x15]is the absolute counter for the same mixed-radix12 x 28 x 3 x 60year-plus-subfield tuple packed by0x0051d3c0and unpacked by0x0051d460, not just a vague “calendar-like” blob. TheTrackLay.winfamily now clearly ownsLay single track.Lay double track.andBulldozeas its three primary modes, its bridge selector, its wrapped frequency preferences, and a strongly aligned pair ofAuto-Hide Trees During Track LayandAuto-Show Grade During Track Laytoggles; theStationPlace.winfamily now clearly owns its six top-level category buttons, the station-style scroller, and the station-rotation controls. The olderBuilding placement centerstring 671 no longer looks like a live StationPlace control label in the current recovered flow, because the active constructor, preview, refresh, and dispatcher paths all use neighboring ids such as 669 and 2208 without a direct recovered lookup of 671. On save or load the broad serialize-versus-restore split is now grounded, the non-Quicksave.gmp/.gmx/.gmc/.gmsfamilies are separated, and the auxiliary.gmtpath is at least bounded to the preview-surface side owner. The higher-value shell-facing gap has therefore shifted upward to the remaining semantics of the post-load generation phases, the later recurring structure-population cadence, the deeper vote-weight formulas inside takeover and merger resolution, and the still-open meaning of the packed simulation calendar tuple. -
CompanyDetail, tighter section ownership: the shell detail family now has an explicit section-selector lane in addition to the read-side panels already mapped. Controls
0x9472..0x9475directly select the four visible CompanyDetail sections through0x006cfe60,0x9476..0x9479are the companion visual controls for that same tab strip, and section0is now bounded more tightly as the chairman or governance slice around the portrait-backed chairman band on0x9480plus the dynamic overview widget0x947f. That widget is no longer just a vague status line: the section-0 refresh binds it through a dedicated stack-built dynamic text path, and the strongest current shared formatter candidate isshell_format_company_governance_and_economy_status_panelat0x004e5cf0, which first renders a five-line company-metric preamble through localized ids1211..1215:Revenuesfrom slot0x2c,Profitsfrom slot0x2b,Load miles hauledfrom slot0x17,Revenue per load milefrom the derivedslot 0x2c / slot 0x17branch, andAverage speedfrom slot0x26rendered through1216%1 m.p.h.. It then splits the governance summary more concretely: no linked chairman emits3045, wholly owned companies emit3046for the scenario-selected chairman or3047for another linked chairman, and investor-owned companies emit the investor-attitude lines3048/3049with one adjective from the table at0x00622170. That branch is no longer using unnamed helpers either:company_get_linked_chairman_profile_record0x00426ef0resolves the linked chairman profile andchairman_profile_owns_all_company_shares0x004768c0is the full-ownership test behind the3046/3047split. The salary side is tighter too: the formatter computes one signed delta from[company+0x14f]and[company+0x0d59], then chooses3050..3052for the scenario-selected chairman or3053..3055for another linked chairman depending on whether that delta is negative, positive, or zero. The bonus line is narrower still: it only appears when the display year matches[company+0x34f], using amount[company+0x353]with3056or3057. It then appends the1218Economy status - %1.tail caption and stages the adjacent selected-company report or list help-title pairs1219/1220Income Statement,1221/1222Balance Sheet,1223/1224Haulage Report,1225/1226Stock Report,1227/1228Train List,1229/1230Station List,1231/1232Industry List, and1233/1234Cargo List. Current evidence still does not recover separateCompanyDetail.winaction controls for that strip undershell_company_detail_window_handle_message, so it currently reads as staged overview text or help content rather than as a closed launcher family. The direct0x947fformatter call is still indirect, but the widget boundary is tighter too: the generic shell helpersshell_control_refresh_matching_dynamic_text_payload0x00540a47andshell_control_release_dynamic_text_payload0x005639d2now show that type0x6fcontrols free or swap one heap-backed text payload and then short-circuit as a special dynamic-text case, which strengthens the reading of0x947fas a display-only overview widget rather than a normal callback control. One adjacent boundary is tighter now too: the broader overview wrapper atshell_render_company_overview_panel_header_and_optional_change_affordance0x004e5a80owns the fallback no-company texts1210,3043, and3888, styles controls0x3f06and0x3f07, and on the narrower selected-company branch appends3044Click to change company name and logo.plus the neighboring1941Changeaffordance before falling through into the shared0x004e5cf0text body. That keeps the name/logo affordance outside the ordinaryCompanyDetail.winaction dispatcher and makes the0x947falignment cleaner. The message-side action band is tighter too:0x94b5grounds territory-access purchase,0x94b6grounds bankruptcy,0x94cf..0x94d2ground bond issue, stock issue, stock buyback, and dividend-rate changes,0x9493routes into the destructive company-clear helper that deactivates the selected company and clears chairman/share links,0x94d6grounds bankruptcy,0x94d7..0x94daground bond issue, stock issue, stock buyback, and dividend-rate changes,0x94dbgrounds merger,0x94dcgrounds resignation, and0x9538grounds chairmanship takeover. The finance-side dialog family is tighter too: the bond-issue lane now has the dedicated modal renderershell_company_detail_render_issue_bond_offer_dialog0x004c3560for underwriter terms968..972, the stock-issue lane hasshell_company_detail_render_issue_stock_offer_dialog0x004c3b50for the staged offer lines975..978, and the buyback lane hasshell_company_detail_render_stock_buyback_offer_dialog0x004c4300for broker lines981..984. The compact summary card on sibling control0x9471is tighter too:shell_format_company_financial_summary_cardat0x004bfb30now clearly rendersCash:,Revenue:, andProfits:from company slots0x0d,0x2c, and0x2b, rather than one looser unnamed finance block. The dividend lane is now split the same way:shell_company_detail_setup_dividend_rate_adjust_controls0x004c4c70binds the paired adjust controls0x99e8and0xc0f9,shell_company_detail_render_change_dividend_rate_dialog0x004c4e30renders localized ids988..990, andshell_company_detail_handle_change_dividend_rate_dialog_message0x004c5140clamps the staged dividend rate againstcompany_compute_board_approved_dividend_rate_ceiling0x00426260and raises localized id991when the board refuses a higher dividend, all before the existing company commit path. All four finance verbs now converge through the shared callback-driven modal openershell_open_custom_modal_dialog_with_callbacks0x004c98a0, which is also reused by the multiplayer staged text-entry lane. The front controls in section0are tighter too:0x948bis a tutorial-guarded escape or back control that shows localized id3724This option is disabled in the tutorial.before falling back to the shell detail-manager escape path,0x9491and0x9492only restyle the paired visuals0x948fand0x9490, and0x9494opens localized id3635Enter the amount that your company's cash should beand writes the accepted value directly into the selected company cash pair. The neighboring debt section is tighter now too: controls0x947dand0x947eno longer read as one-off bond widgets, but as the owners of two repayable bond-slot row bands,0x94e8..0x950fand0x9510..0x9537. Those row controls now clearly converge on the same repayment path in the message dispatcher: they reject unaffordable repayment through localized id2990, open the early-repayment confirmation rooted at2991, and then either commit throughcompany_repay_bond_slot_and_compact_debt_table0x00423d70or package the request through the multiplayer shell transport. The render-side owner is tighter too:shell_company_detail_render_bond_maturity_and_repay_panelformatsDue %1andRepay this bond.for the selected debt slot while the tiny bindershell_company_detail_bind_bond_row_band_for_active_panelswitches between the two row bands. Current0xcbdispatch does not treat0x948f,0x9490,0x94d4, or0x94d5as standalone action cases. The message-side jump table now makes that passive/action split explicit too: in the dispatch byte map rooted at0x004c6640, controls0x94d6..0x94dcmap to cases0x06..0x0c, control0x9538maps to case0x0d, and the neighboring companion rows0x94d4and0x94d5stay on the default path. The refresh-side ownership is tighter too: the helper now explicitly loops over0x94d4..0x9537as the selected-company-owned band and over0x9538..0x959bas the linked-chairman-owned band, and those two loops do not use the same style polarity.0x94d4..0x9537take style0x65when the selected company matches the scenario-selected company and0x87when it differs, while0x9538..0x959btake style0x87when the selected company's linked chairman matches the scenario-selected chairman and0x65otherwise. The selected-company action side is tighter now too: scenario toggle0x006cec78+0x4a8fre-enables bankruptcy0x94d6together with passive companion row0x94d4,+0x4a8bre-enables issue bonds0x94d7together with passive companion row0x94d5,+0x4a87re-enables stock issue and stock buyback0x94d8..0x94d9,+0x4a93re-enables dividend0x94datogether with the same passive companion row0x94d5,+0x4adbre-enables merger0x94db,+0x4acbre-enables resignation0x94dc, and+0x4acfre-enables chairmanship takeover0x9538. That makes0x94d4/0x94d5read more like passive companion or heading widgets than hidden verbs. The constructor boundary is tighter too: currentCompanyDetail.winsetup still only binds explicit callbacks for0x9470,0x9471,0x947d,0x947e, and0x948c..0x948e, not for the wider section-0 row bands. That keeps the remaining0x94d4..0x959bcontent looking more like resource-defined display rows that are gated and restyled by refresh than like individually code-rendered widgets. That leaves the main remaining CompanyDetail-specific shell edge at the exact0x947fformatter binding plus the still-unsplit render-side governance rows inside0x94d4..0x959b. -
Adjacent
LoadScreen.winreport family: the neighboring shell lane around controls0x3ef6..0x4073is now separated fromCompanyDetailinstead of being treated as one more extension of the0x947foverview path. The real outer owner isshell_load_screen_window_construct0x004ea620, which bindsLoadScreen.win, randomizes theLoadScreen%d.imbbackground family, stores the singleton at0x006d10b0, and seeds the first visible page-strip controls. Above the older page-specific work, the real message owner is nowshell_load_screen_window_handle_message0x004e3a80: it owns page id[this+0x78], page-local substate[this+0x7c], page-kind[this+0x80], current company[this+0x88], current chairman profile[this+0x8c], display year[this+0x9c], and the page-local report row latch[this+0x118], then fans back into the shared selectorshell_load_screen_select_page_subject_and_refresh0x004e2c10, the company-step helper0x004e3a00, and narrower page branches such as0x004e45d0. The matching render-side owner is now bounded too:shell_load_screen_render_active_page_panelat0x004ea060formats the common heading and panel frame, then switches on page id[this+0x78]and hands control down into the active page body. That older branch is now demoted to what it actually is:shell_load_screen_profile_stock_holdings_page_handle_message, the page-specific handler beneath the stock-holdings slice. Inside that same family,shell_load_screen_render_profile_stock_holdings_summary_panelat0x004e5300grounds the selected-profile holdings page: it resolves the current chairman profile from[this+0x8c], renders the top summary rows1204Stock Value:,1205Total Assets:, and1206Stock Holdings:, then walks the active company roster and formats one row per positive holding through1201Click to view details on %1.,1207%1 Shares, and1208%1 Value, falling back to1209Nonewhen no positive holdings survive. It also appends3029Click to change player name and portrait.plus the adjacent1941Changeaffordance only when the rendered profile matches the scenario-selected chairman. The earlier pages are tighter now too:0x004e68e0is the selected-company financial ranking page using the active company roster plus1235..1245for revenue, profit, cash, track mileage, and report affordances; and0x004e6ef0is the active-chairman wealth ranking page using the chairman profile collection plus1237,1241,1246..1250for cash, stock, total, and purchasing-power style comparisons. The later sibling renderers are broader than that one holdings page now too:0x004e7670is the selected-company train list page using1235..1267,0x004e8270is the selected-company building list page using1268..1278,0x004e8bb0is the selected-company station list page using1279..1288, and0x004e9460is the map-wide cargo list page using1289..1298over the live candidate collection rather than one company roster. The last broad early-page owner is tighter now too:0x004e9b20is the shared multi-year company report-table renderer for page4Income Statement, page5Balance Sheet, and page6Haulage Report, all driven from0x004ea060with one caller-supplied mode byte and yearly company rows built throughcompany_read_year_or_control_transfer_metric_value. The row families are bounded too: income-statement rows1301..1315, balance-sheet rows2816and1317..1322, and haulage-report rows1323..1335. The only special rows inside that family are now tighter too:0x00425880and0x004258c0provide the negative-cash and positive-cash interest-rate inserts for the%1/%2placeholders in strings2815and2816, so they are no longer anonymous private math blobs. The adjacent early siblings are tighter now too:0x004e5130is the selected-companyStock Datapage wrapper that falls back through1299and otherwise reuses0x004c0160to render theLargest Shareholders,Shares, andPer Share Datafamily;0x004e6ef0is thePlayer Listpage;0x004e5300is thePlayer Detailholdings page; and0x004e51eais theGame Statusbriefing panel that pulls current scenario briefing text from the live scenario text store and appends the1772/1773Briefingaffordance. The active-page renderer at0x004ea060is now tighter too because its 13-byte page descriptor table at0x006220a0has been decoded directly as{ page kind, title string id,0x3ef8backlink page, selected-company-header flag }. The currently grounded rendered title order is:XXX,COMPANY OVERVIEW,COMPANY LIST,INCOME STATEMENT,BALANCE SHEET,HAULAGE REPORT,STOCK DATA,PLAYER LIST,PLAYER DETAIL,GAME STATUS,TRAIN LIST,TRAIN DETAIL,STATION LIST,STATION DETAIL,CARGO LIST, andINDUSTRY LIST. Its live body bindings are now bounded too: page0falls back to1203Unable to display page, page1is the company overview wrapper, page2is the company list page, pages3..5are income statement, balance sheet, and haulage report, page6is stock data, page7is player list, page8is player detail, page9is game status, page0x0ais train list, page0x0bcurrently falls back to1203, page0x0cis station list, page0x0dcurrently falls back to1203, page0x0eis cargo list, and page0x0fis industry list. The row-click path is tighter now too: player-list rows re-enter page8directly, but train, station, and industry rows leaveLoadScreen.winthrough the shell detail-panel manager at0x004ddbd0instead of switching to title-table pages0x0bor0x0d. Page0is tighter now too: its descriptor is kind0, title1200XXX, backlink0, and header flag0, and no current post-constructor selector path has been recovered for it. The descriptor side now also bounds the only known reverse route for the dormant detail titles:0x3ef8is the table-driven backlink affordance, so if page0x0bor0x0dwere ever selected, the known reverse path would return to train-list page0x0aor station-list page0x0crespectively rather than through a separate detail-only owner. The launcher side is tighter too: current groundedshell_open_or_focus_load_screen_pagecallers cover pages1,2,3,4,5,6,7,9,0x0a,0x0c,0x0e, and0x0f, and no current recovered opener or row-click route selects0x0bor0x0d. So theLoadScreen.winfamily now has a much cleaner shape: one outer message owner0x004e3a80, one active-page render owner0x004ea060, and then the narrower page-specific handlers and renderers beneath them. The launcher side is tighter now too:0x004e4ee0is the shared open-or-focus ledger-page owner above this family. Outside sandbox it either re-entersshell_load_screen_select_page_subject_and_refreshon the live runtime at0x006d10a8or allocates that transient runtime, seeds it through0x004e4b10, and enters the visible modal loop; inside sandbox it raises localized id3899The ledger is not available in sandbox mode.instead. That narrows the remainingLoadScreen.wingap again:TRAIN DETAILandSTATION DETAILnow read as dormant title-table entries unless some still-unrecovered nonstandard selector reaches them. The live auto-load boundary is tighter now too: hook-drivenshell_transition_mode(4, 0)now completes old-mode teardown, reconstructs and republishesLoadScreen.win, and returns cleanly, but the later post-transition service ticks still keep[0x006cec78] = 0,[shell_state+0x0c]on the sameLoadScreen.winsingleton, and[LoadScreen.win+0x78] = 0through at least counts2..8. So the next runtime edge is no longer the old mode-4teardown or publish band; it is theLoadScreen.winmessage owner0x004e3a80itself, because later service alone is not promoting the plain load screen into the separate startup-runtime object path. One later runtime probe did not actually reach that edge: the0x004e3a80hook installed, but the run never produced any ready-count, staging, transition, post-transition, or load-screen-message lines, only ordinary shell node-vcall traffic. So that result is now treated as a gate-or-cadence miss rather than as evidence against theLoadScreen.winmessage path itself. The newer shell-state service trace tightens it again: on a successful staged run the later service ticks do execute inmode_id = 4, but the0x004e3a80message hook still stays silent while the state remains frozen in the plainLoadScreen.winshape. So the next runtime boundary is now the shell-runtime prime call0x00538b60beneathshell_state_service_active_mode_frame0x00482160, not the message owner alone. The first direct0x00538b60probe run is not trustworthy yet, though: it stopped immediately after the first shell-state service-entry line, before any ready-count or runtime-prime entry logs. So that result is currently treated as probe validation work, not as a real boundary move inside RT3. The static service branch is conditional too:0x00482160only enters0x00538b60when[shell_state+0xa0] == 0, so silence from the runtime-prime hook does not yet prove the shell stops before that call unless the service-entry logs also show the+0xa0gate open. The newer run now closes that condition:[shell_state+0xa0]is0, and the0x00538b60runtime-prime hook enters and returns cleanly. The newer run closes the next owner too:0x00520620shell_service_frame_cyclealso enters and returns cleanly on the same frozen mode-4path, and the logged fields match its generic branch rather than a startup-promotion lane ([+0x1c] = 0,[+0x28] = 0,flag_56 = 0,[+0x58]pulsed then cleared, and0x006cec78stayed0). So the next runtime boundary under the same shell-state service pass is now one level deeper: the per-object service walker0x0053fda0beneath0x00538b60. The newer run closes that owner too: it enters and returns cleanly while servicing theLoadScreen.winobject itself, withfield_1d = 1,field_5c = 1, and a stable child list under[obj+0x70/+0x74], and its first child-service vcall target at slot+0x18stays0x005595d0. Since0x006cec78still stays0through those clean object-service passes, the next runtime boundary is now the child-service target0x005595d0, not the higher object walker. The newer child-service run narrows that again: the first sixteen0x005595d0calls are stable child lanes under the sameLoadScreen.winparent, with[child+0x86]pointing back to the load-screen object,field_b0 = 0, and a split where earlier children carryflag_68 = 0x03and return4while later siblings carryflag_68 = 0x00and return0. The static body matches that read too:0x005595d0is gated by0x00558670and then spends most of its work in draw or overlay helpers0x54f710,0x54f9f0,0x54fdd0,0x53de00, and0x552560, so it now reads as another presentation-side service lane rather than the missing startup-runtime promotion. The widened allocator-window trace then reconciled the runtime with the static mode-4branch one step further: the first transition-window allocation is0x7c, which matches the static pre-construct0x48302a -> 0x53b070alloc exactly, and the later0x111/0x84/0x3a/0x25...allocations all occur beforeLoadScreen.winconstruct returns, so they now read as constructor-side child or control setup. That means the allocator probe did not disprove the still-silent startup-runtime slice; it simply exhausted its log budget inside the constructor before the post-construct block. The later reset-at-return run is now the decisive one: afterLoadScreen.winconstruct returns there are still no further allocator hits before publish and transition return, which matches the corrected jump-table decode because mode4does not own the0x46c40 -> 0x4336d0 -> 0x438890startup-runtime path. -
Editor breadth: the broader map-editor page owner is now bounded through
map_editor_panel_select_active_section0x004ce070andmap_editor_panel_dispatch_active_section_message0x004cf700, which switch among the grounded setup pages,Cities/Regions,Territories, thePlayersandPlayer Poolsetup slices, the now-groundedBuilding Densitypage, the locomotives-available and industry-availability pages, the economic and special-condition pages, thePort/Warehouse Cargospage, and the later report pages. The mid-editor ownership is materially clearer now too: the chairman-slot editor is thePlayerspage, the available-chairman editor is thePlayer Poolpage, and the former unnamed dual tri-state page now lines up with localized page text997Building Densityplus help text1017and the direct field captions1642Starting Building Density Level:and1644Building Density Growth:. Both controls are now bounded as stored ordinal bytes0/1/2rather than loose labels: the first three-choice control is the map-wide starting-density selector, with its default middle state1matching the documented100%baseline from1643; the second is the paired overall growth selector whose effects later appear in the city-growth side of the simulation.map_editor_city_region_panel_constructandmap_editor_city_region_panel_handle_messageown the city-or-region editing lane with rename and copy-industry-data flows. That copy side is tighter now too: the handler first enters0x00420e00, 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 repeated0x004206b0calls. The no-source companion0x00420ed0now makes that split explicit: it rebuilds the same subcollection and then picks one of two fixed default label-weight sets based on region class dword[region+0x23e], using one all-0.2ffamily for nonzero-class regions and one class-0family that starts with0.3fbefore continuing with repeated0.2fentries. The lower mutator0x004206b0then linearly scans the selected region subcollection by profile label, creates a new profile only when the copied weight is positive, removes an existing profile when the copied weight is non-positive, updates[entry+0x1e]otherwise, and refreshes the region's derived availability-summary bytes[region+0x2f6/+0x2fa/+0x2fe]through0x00420410;map_editor_territory_panel_constructand the adjacent no-source companion0x00420ed0is tighter too: it rebuilds the same collection root[region+0x37f]but then seeds one of two fixed default profile-label sets directly through repeated0x004206b0calls, splitting by region class dword[region+0x23e]. Nonzero-class regions take one all-0.2fdefault set, while class-0 regions take a different set that starts with one0.3fweight before continuing with repeated0.2fentries. That makes0x420ed0the true class-split default-profile companion to the source-cloning helper at0x420e00, rather than just more of the same editor copy path.map_editor_territory_panel_constructandmap_editor_territory_panel_handle_messageown the territory rename and border-remap lane;map_editor_locomotive_availability_panel_constructplusmap_editor_locomotive_availability_panel_handle_messagenow bound the locomotive policy page over0x006ada84;map_editor_industry_availability_panel_constructplusmap_editor_industry_availability_panel_handle_messagedo the same for the industry candidate pool at0x0062b268; andmap_editor_port_warehouse_cargo_panel_constructplusmap_editor_port_warehouse_cargo_panel_handle_messagenow ground the recipe-book page that edits port or warehouse cargo policies through twelve per-book state blocks at[0x006cec78+0x0fe7+index*0x4e1]. Each book now has a shared maximum annual production float atbook+0x3edand five fixed cargo-line entries starting atbook+0x3f1with stride0x30; each line is bounded as a mode dword, annual amount, a supplied-cargo token at+0x08, and a demanded-cargo token at+0x1c. The constructor and handler now make those fields materially tighter too: the row pair shown inSupply OnlyandProduction Demand->Supplyis the+0x08supplied-cargo selector, the row pair shown inDemand OnlyandProduction Demand->Supplyis the+0x1cdemanded-cargo selector, and the single amount field at+0x04is labeledAnnual Demand:only in mode1butAnnual Supply:in modes2/3. The stronger new runtime-side result is now a full chain rather than only the importer:scenario_state_rebuild_port_warehouse_cargo_recipe_runtime_tablesfirst imports those same five lines into one repeated array of identical0xbc-byte runtime descriptors with no row-index special casing, and the candidate-side rebuild pass atstructure_candidate_collection_rebuild_runtime_records_from_scenario_state0x00412d70then projects those descriptors into the live structure collection at0x0062ba8cbeforestructure_candidate_rebuild_cargo_membership_and_scaled_rate_tables0x00411ee0rebuilds the per-cargo runtime summary tables. The current local file-side result is now tighter too: the grounded recipe-book root at0x0fe7is preserved byte-for-byte across the checked map/save scenario pairs, so the loader can safely treat the twelve0x4e1-byte books as preserved scenario payload rather than a drifting save-only band. A conservative summary probe now only reports per-book head signatures, raw cap dwords at+0x3ed, and five raw line summaries rooted at+0x3f1so the file-side structure stays aligned with this grounded ownership. The player-facing line modes remainDisabled,Demand Only,Supply Only, andProduction Demand->Supply, and the fourth mode is tighter now too: current wording around1674,1675, and504plus the downstream scaling path says it is the production-line mode governed by the shared annual production cap, where the entered annual amount stays on the supply side while the demanded side becomes the normalized input branch. The candidate-side accumulator pass reinforces that split by applying the shared production cap only 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_channels0x00412650is 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 the imported low-16 marker rows fail the exact matcher at0x0041e9f0, the resulting0ids will still hit the first summary-bank bucket inside0x00412650, but the semantic meaning of cargo id0itself remains ungrounded. The sibling helperstructure_candidate_supports_or_references_cargo_id0x004129d0then 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 lanes now split cleanly by scenario family while still preserving map->save identity inside each checked pair.Alternate USA.gmpandAutosave.gmsmatch at the raw line-content level: books0..4keep mixed line areas, theirline02slots carry the recurring nonzero mode words0x00110000,0x000b0000,0x000b0000,0x00130000, and0x00180000, and the sameline02slots also carry one recurring supplied token0x000040a0; the neighboringline00/line01slots carry the same recurring demanded token lanes such as0x00010000,0x72470000,0x6f430000,0x694c0000, and0x694d0000.Southern Pacific.gmpandp.gmsalso match at the raw line-content level, but the same rooted line slots stay zero in the checked pair.Spanish Mainline.gmpandg.gmsagain match at the raw line-content level yet carry a distinct nonzero pattern: books0..4keep mixed line areas, line-level supplied tokens include0x00170000,0x00150000,0x00004040, and0x00004000, demanded tokens include0x00010000,0x68430000, and0x6c410000, and the laterline02mode words stabilize at0x00070000then0x00010000. So the loader can now safely treat these raw line lanes as preserved scenario payload with family-specific signatures, even though the exact cargo-id and mode-enum semantics still need separate grounding. One inference is tighter now too: when those demanded-token words are zero in the low 16 bits and printable in the high 16 bits, the byte order reads as short two-letter stems such asGr,Co,Li,Mi,Ch, andAl, which fit the current scenario cargo-name familiesGrain,Corn,Livestock,Milk,Cheese, andAlcoholfromRT3.lng; the runtime probe now exposes those only as probable ASCII stems, not as fully grounded cargo-id decodes. The supplied-token side is now bounded as a separate layout family rather than forced into that same stem model: theAlternate USAfamily uses one stable low-16 marker0x000040a0only inbook00..04.line02, theSouthern Pacificfamily leaves the supplied lanes zero in the checked pair, and theSpanish Mainlinefamily splits between two high-16 numeric tokens0x00170000and0x00150000inbook00/01.line01plus the later low-16 markers0x00004040,0x00004000, and0x00004040inbook02..04.line02. The probe now exposes those conservatively as token-layout classeshigh16-ascii-stem,high16-numeric, andlow16-marker, without claiming that the non-stem numeric or marker families are decoded yet. One more structural layer is stable enough to name conservatively: the checked nonzero recipe rows repeatedly fall into four line-signature classes.Alternate USAbooks0..4all expose onedemand-numeric-entryatline00(0x00010000), onedemand-stem-entryatline01(Gr/Co/Li/Mistems), and onesupply-marker-entryatline02(nonzero mode plus0x000040a0).Spanish Mainlinebooks2..4expose that same three-line pattern withCh/Alstems and the0x00004040/0x00004000marker family, while books0/1only expose the earliersupply-numeric-entryform atline01. So the loader can now distinguish recurring row roles such as demand-stem versus supply-marker without pretending the marker payloads themselves are decoded. The importer-side branch map is tighter now too because localobjdumpover0x00435630shows that only nonzero mode dwords materialize into0xbcruntime descriptors: mode0lines are skipped entirely, mode1enters the demand-only branch, mode3enters the dual demand-plus-supply branch, and every other nonzero mode falls into the supply-side branch. In the checked corpus that means the recurringdemand-numeric-entryanddemand-stem-entryrows inAlternate USAandSpanish Mainlineare preserved scenario-side line records but do not become live runtime descriptors, while the latersupply-marker-entryrows are the ones that actually reach the runtime import path. The runtime probe now exposes that directly asimports_to_runtime_descriptorplus one conservativeruntime_import_branch_kind. The raw token windows beneath those branch labels are tighter now too. The checked mode-zero demand rows preserve string-bearing windows atline+0x1c, and the current probe shows those conservatively as prefixed ASCII previews such as..Grain,..Corn,..Livestock, and..Milk; localobjdumpover0x0041e9f0then shows the importer feeding the corresponding token buffer into an exact cargo-name matcher built over the live cargo collection at0x0062ba8c. By contrast, the importedsupply-marker-entryrows feed nonprintable windows such as.@...fromline+0x08through that same matcher, and the resolver path currently shows no special-case decoding for those marker forms. So the strongest static read is now: the stem-like demand rows preserve cargo-name text but are skipped because their mode is zero, while the nonzero imported marker rows are the live descriptor inputs yet likely fail exact 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. Localobjdumpnow shows0x00412960simply summing the two supply-side floats returned by0x00412650, while0x004129a0returns the single scaled production-output lane directly; neither wrapper checks for cargo id0after the query returns. The broader world-side accumulator at0x0041e7beis tighter in the same way: it calls0x00412650, requires all four returned channels to be positive before continuing, and only then scales those four channel values by one linked-instance count from0x00413940into caller-owned accumulators. 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 cargo-channel consumer, not a dedicated null-cargo branch. The caller side is narrower than before too. The steady-state site bitset ownerplaced_structure_rebuild_candidate_cargo_service_bitsets0x0042c690starts its inner cargo loop at id1and only walks upward through the current live cargo count, so it never intentionally queries cargo id0. The broader placed-structure sweep around0x00452e60tightens the same boundary from above: when the requested cargo id is nonzero it resolves the backing candidate and entersstructure_candidate_supports_or_references_cargo_id, but when the requested id is exactly0it skips that cargo-reference helper entirely and falls through to a different linked-site or station-or-transit gate. Current localobjdumpnow shows that bypass first requiring one subtype latch through the placed-structure vtable+0x70, then resolving the linked site id at[site+0x2a8]through the placed-structure collection0x006cec20, and then forwarding that linked peer into the narrower predicate at0x0047fd50. That narrower helper is tighter than before too: it resolves the linked peer's backing candidate through the peer site id at[peer+0x04], reads candidate class byte[candidate+0x8c], and returns true only for the first three class values0/1/2while rejecting3/4and anything above4. So current local callers treat cargo id0as a nonstandard request bound to one linked-site reachability or classification side path, not one ordinary cargo lane they routinely probe. The vtable-+0x70latch itself is bounded a bit better now too. It still lacks a direct field decode, but every local callsite we checked around0x0040d230,0x0040dba0,0x0040dbf0, and0x0040f670uses that slot only as the precondition for touching[site+0x2a8]and the neighboring linked-site helpers0x0047dda0,0x0047fd50, and0x004138b0. That makes the safest current read a linked-site-bearing or linked-site-capable latch, strongly aligned with the subtype-1construction lane that is the only grounded writer of[site+0x2a8], rather than a broad cargo or route-style predicate. The neighboring maintenance pair tightens that linked-site read further. Localobjdumpnow shows0x0040dba0and0x0040dbf0as complementary tiny helpers that each require the same vtable-+0x70latch, resolve optional linked peer id[site+0x2a8]through0x006cec20, forward that linked peer (or null) into0x0047dda0, and then mirror opposite values into local byte[site+0x42](0for0x0040dba0,1for0x0040dbf0). The route-entry side beneath them is tighter too:0x0047dda0reads route-entry anchor id[peer+0x08], resolves that anchor through0x006cfca8, and only dispatches one of two route-entry vtable calls when0x0048a090(1)reports that all three anchor-slot dwords[entry+0x206],[entry+0x20a], and[entry+0x20e]are still-1. So the strongest current read is no longer just "linked-site capable" in the abstract: this latch consistently fronts the local linked-peer class gate0x0047fd50, the paired[site+0x42]route-entry state toggles, and the later linked-peer collection sweep0x004138b0, which keeps thecargo id 0bypass path firmly on the linked-site route-anchor or classification side rather than on an ordinary cargo lane. One smaller ownership boundary is tighter too: byte[site+0x42]is not private scratch owned only by that pair. Localobjdumpshows tiny direct setters at0x0040cbc0and0x0040cbd0plus a raw getter at0x0040cbf0, so the0x0040dba0/0x0040dbf0pair is writing one shared placed-structure state byte rather than inventing a route-entry-only scratch lane. One caution is tighter now too: there are later mode-gated reads at other addresses that also touch a+0x42byte on their own object layouts, but current local evidence does not yet prove those are the same placed-structure owner family, so the safest current note keeps only the immediate0x0040cbc0/0x0040cbd0/0x0040cbf0/0x0040dba0/0x0040dbf0cluster grounded together. The vtable side sharpens that split too. A local.rdatascan shows0x0040dba0and0x0040dbf0each appearing exactly once, together with0x0040cbf0, in one method table rooted at0x005c8c50; the constructor chain is tighter now too, because0x0040c950installs that same table as one concrete placed-structure specialization above the common base table0x005cb4c0, while0x0040c970tears the same specialization back down to the base before the temporary object is freed. By contrast the raw set or get trio0x0040cbc0/0x0040cbd0/0x0040cbf0also appears in several sibling tables such as0x005c9750and0x005dd1f0. So the strongest current structural read is that byte[site+0x42]belongs to one broader placed-structure virtual interface, while the linked-peer route-entry toggles are one specialization-specific override pair inside that family rather than generic setters used by every sibling. One negative boundary is tighter now too: the raw token words in this recipe block do not look like the already grounded shell-sideAnyCargo/AnyFreight/AnyExpressselector-table ids from0x00621e04/0x00621e10, so the current best read is that these on-disk line tokens are not just copied UI selector ordinals or the same small express-side id family in another wrapper. One broader collection pass also now ties the editor rule side back into runtime filtering:structure_candidate_collection_refresh_cargo_economy_filter_flags0x0041eac0rebuilds per-candidate flag[candidate+0x56]across the live structure collection, and current grounded callers show it rerunning directly off the runtime cargo-economy latch at[0x006cec74+0x25f], which aligns this lane with the editor'sDisable Cargo Economyspecial condition rather than leaving it as a purely editor-owned recipe page. The first common live gate beneath that filter is now bounded too:structure_candidate_is_enabled_for_current_year0x0041e220is the shared year-and-filter check used by the collection refresh and later candidate-selection branches, whilestructure_candidate_rebuild_local_service_metrics0x0041e2b0is a setup-side local service scorer that already consumes the same enabled candidate records through world-grid sampling. One steady-state world-side consumer is now grounded as well:placed_structure_rebuild_candidate_cargo_service_bitsets0x0042c690walks linked placed structures, filters live category-2candidates throughstructure_candidate_is_enabled_for_current_year, and compacts the direct and scaled supply-side channels from0x00412960and0x004129a0into per-cargo bitsets on the placed-structure record. The next site-side owner layer is tighter now too:placed_structure_refresh_linked_candidate_flag40x0042c8f0refreshes the sibling state bit at[site+0x0e6],placed_structure_refresh_candidate_service_state0x0042cdf0ties that flag refresh to the cargo-service bitset rebuild,placed_structure_rebuild_candidate_local_service_tables0x0042ce00then performs the heavier per-site candidate score rebuild over the aligned float and word tables at[site+0x107],[site+0x02], and[site+0x6c], andplaced_structure_refresh_local_service_score_bundle0x0042d580is now the local wrapper that chains that rebuild into the neighboring post-passes before the world-grid owner continues. Those post-passes are tighter too:placed_structure_apply_route_linked_service_caps0x0042cc50is the first route-backed cap pass over the rebuilt local tables,placed_structure_redistribute_local_service_pressure_from_neighbors0x0042c1b0is the neighboring-site redistribution pass, andplaced_structure_clamp_candidate_service_age_table0x0042cb30is the final recent-service clamp over the primary per-candidate word table. Above that refresh lane,placed_structure_query_candidate_local_service_metrics0x0047e240is the first higher-level query,placed_structure_count_candidates_with_local_service_metrics0x0047e330counts how many candidates currently produce that query,placed_structure_get_nth_candidate_id_with_local_service_metrics0x0047e620is the ordinal selector over that same visible candidate family,placed_structure_query_cached_express_service_class_score0x0047e390caches one parallel class score for the express family now strongly aligned withPassengers,Mail, andTroops,placed_structure_refresh_candidate_local_service_comparison_cache_against_peer_site0x0047eb90rebuilds one peer-site comparison cache over the same local-service inputs, andplaced_structure_select_best_candidate_id_by_local_service_score0x0047f910is the best-hit selector above the direct and directional local-service query pair. Those site-side scores now have grounded shell read-side consumers too:shell_station_detail_format_freight_and_express_summary0x00506be0formats the visibleFreight: %1andExpress: %1lines inStationDetail.win, and the same station-detail family now has a deeper candidate-service lane:shell_station_detail_set_active_candidate_service_preview0x00504ae0stores the active(station id, candidate id)pair for the world-side preview scan,shell_station_detail_clear_active_candidate_service_preview0x00504a90tears that pair back down,shell_station_detail_update_candidate_service_entry0x00504ba0is the shell-side entry updater above that preview pair,shell_station_detail_format_candidate_local_service_summary0x00504beausesplaced_structure_query_candidate_local_service_metricstogether with localized ids681,682, and2813to build the visible candidate service text,shell_station_detail_build_to_from_haul_summary_widget0x00505150now grounds the pairedToandFromhauled-traffic strip widgets,shell_station_detail_present_to_from_haul_stats_popup0x00504770owns their click-through annual and lifetimehauled TO/FROM this stationpopup,shell_station_detail_refresh_nearby_structure_jump_rows0x00505470owns the five-row nearby-structure jump lane, andshell_station_detail_refresh_candidate_service_rows0x00505760is now the larger row-list owner that enumerates active candidate-service entries and wiresshell_station_detail_update_candidate_service_entryinto the per-row click path.shell_station_list_format_freight_and_express_availability_summary0x00506e50feeds the station-list summary%1 has %2 freight loads and %3 express loads available for hauling..., and the paired modifier helpershell_station_list_handle_center_or_rename_action0x00506d50owns the visible Shift-center and Ctrl-rename row actions. The report side is clearer as well:0x004d3060is the dedicatedStats - Treesconstructor overmap_editor_tree_stats_report,0x004d3080is the actualGeneral Validationconstructor overmap_editor_general_validation_report, and the same page table also now groundsStats - Cargo,Stats - City/Region,Stats - City Count,Event Variable Values, and the neighboring event-validation page. The remaining open editor edge is therefore mostly the deeper gameplay meaning of those site-side service scores and flag bits, not page ownership. -
Station-detail overlay: the shell-side candidate preview pair now has a grounded world consumer too.
world_render_station_candidate_service_map_overlayat0x0043f640reads the active(station id, candidate id)pair from0x005ee4fcand0x005ee500, scans the placed-structure collection, and then splits the legend by candidate mode. When the active candidate carries a nonzero route-style byte at[candidate+0x46], the overlay uses the heavier helperplaced_structure_query_candidate_directional_route_overlay_summaryat0x0047e690in both directions between the preview station and each scanned site and formats the resulting directional rows as3874Coming To %1and3875Going From %1. When that byte is zero, the same overlay falls back to the direct local-service path throughplaced_structure_query_candidate_local_service_metricsand formats the two legend rows instead as3876Current Supply @ < %1and3877Current Demand @ > %1. Empty directional lanes collapse to3878--None--, and one title lane falls back to literalAll. Current disassembly no longer supports treating3872Already Connected by Another Companyor3873Not Connectedas direct overlay-body emits. -
Station-detail overlay, corrected boundary: the neighboring connection-state note pair now appears to live in a city connection-bonus label formatter, not in
0x0043f640. That formatter is now bounded ascity_site_format_connection_bonus_status_labelat0x004207d0: it directly chooses localized ids3868through3873after consulting the reusable city-peer scancity_connection_bonus_exists_matching_peer_siteat0x00420030. Separately,3879Out of Syncis grounded under the multiplayer preview dataset path instead:multiplayer_preview_dataset_service_launch_state_and_warn_out_of_syncat0x0046b780checks global0x006cd91c, raises theOut of Syncshell status through0x5386e0, and then continues through the wider multiplayer preview launch-state service. So the station-detail overlay currently owns only theComing To,Going From,Current Supply,Current Demand,--None--, andAlllegend lanes. -
Station-detail overlay, ownership side: one reusable site helper is grounded now too.
placed_structure_query_linked_company_idat0x0047efe0resolves the current placed structure's linked instance through0x0062b26cand returns its company id from[instance+0x276]; the adjacent city bonus formatter at0x004207d0compares that id against the active company selector before choosing whether a scanned site should carry3871Connected By Another Companyor3872Already Connected by Another Company. The larger caller boundary is no longer open either: the first bounded announcement owner above this formatter family is nowcompany_evaluate_and_publish_city_connection_bonus_newsat0x00406050, which re-enters the peer-route candidate builder at0x004046a0and later publishes one of the localized city-connection bonus news strings2888,2890, or2921through the shell news path. -
Station-detail overlay, peer-selector side: the city bonus formatter no longer depends only on boolean peer existence. The companion helper
city_connection_bonus_select_first_matching_peer_siteat0x00420280is now grounded as the first-match selector paired withcity_connection_bonus_exists_matching_peer_site: it walks the same city-peer candidate set, applies the same site-class table plus the narrower station-or-transit and linked-instance class-byte flags, and returns one representative matching peer site id instead of a boolean.city_site_format_connection_bonus_status_labelreuses that selector after the note checks so it can recover one linked company context from the selected peer. The remaining open edge here is therefore above this formatter family, not inside the peer-scan pair itself. -
Station-detail overlay, caller side: the reusable bridge between the status formatter and the company news lane is now bounded too.
city_connection_bonus_build_peer_route_candidateat0x004046a0reusescity_connection_bonus_select_first_matching_peer_sitewith both selector flags forced on, samples the selected peer's derived coordinates through0x0047df30and0x0047df50, and then either tries the shared heavy buildercity_connection_try_build_route_with_optional_direct_site_placement0x00402cb0or falls back to the smaller wrappercity_connection_bonus_try_compact_route_builder_from_region_entry0x00404640before handing the result back to the company-side announcement sweep at0x00406050. The score side of that announcement lane is tighter now as well:city_compute_connection_bonus_candidate_weightat0x004010f0provides the per-city opportunity weight,company_query_min_linked_site_distance_to_xyat0x00405920provides the nearest linked-site distance term,company_count_linked_transit_sitesat0x00426590provides one of the company-side caps,company_compute_connection_bonus_value_ladderat0x00425320supplies the bounded company-side value scalar, andcompany_compute_prime_rate_from_issue39_scenario_baselineat0x00424580now bounds the shared prime-rate-side helper that this lane reuses beside the raw issue-0x39total,scenario_state_sum_issue_opinion_terms_rawat0x00436710now bounds the raw additive issue-total helper beneath that term, andcompany_connection_bonus_lane_is_unlockedat0x00427590is the small boolean gate above the ladder. Wider governance and CompanyDetail xrefs now tighten slot0x2binto 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 slot0x09with the Income Statement fuel-cost lane surfaced by tooltip1309. 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 at0x00401c50: the first bankruptcy branch reads as sustained cash-and-debt stress over recent profits and fuel burden, the later fallback branch as a deeper-300000cash / 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 the2882..2886debt headline family, then publishes2887separately 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_news0x00404ce0filters and scores candidate city entries, re-enters the same shared heavy builder throughcity_connection_try_build_route_between_region_entry_pair0x00404c60for the dense pair sweep and the final retry, and then publishes2889%1 has started a new company - the %2or2890%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 whether0x39should 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. -
Station-detail overlay, route-list side: the neighboring helper
placed_structure_append_unique_route_entryat0x0047f010is now grounded as the append-if-missing builder for the six-byte route-entry list rooted at[site+0x462]and[site+0x466]. That matters here because the directional overlay query at0x0047e690consumes the same list, so the remaining uncertainty is no longer list ownership. It is down to the exact semantics of each entry'su32payload.
Next Mapping Passes
- Resolve the owner-side callback roles behind the validated GameSpy packet branches, especially
[route+0x9c],[route+0xa0],[route+0xa4], and[route+0xd4]. - Determine whether any later world-mode branch beneath the frame owner bypasses the shell
controller input path for non-cursor gameplay input, since the current grounded overlay and cursor
helpers still reuse
0x006d4018. - Keep detailed pending-template or transport work scoped to the specific atlas edges that remain unresolved.