rrt/docs/control-loop-atlas/station-detail-overlay.md

14 KiB

Input, Save/Load, and Simulation: Station-detail Overlay

Station-detail overlay

The shell-side candidate preview pair now has a grounded world consumer too. world_render_station_candidate_service_map_overlay at 0x0043f640 reads the active (station id, candidate id) pair from world_store_station_detail_candidate_service_preview_pair_globals 0x0043f620 and world_clear_station_detail_candidate_service_preview_pair_globals 0x0043f610, 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 helper placed_structure_query_candidate_directional_route_overlay_summary at 0x0047e690 in both directions between the preview station and each scanned site and formats the resulting directional rows as 3874 Coming To %1 and 3875 Going From %1. When that byte is zero, the same overlay falls back to the direct local-service path through placed_structure_query_candidate_local_service_metrics and formats the two legend rows instead as 3876 Current Supply @ < %1 and 3877 Current Demand @ > %1. Empty directional lanes collapse to 3878 --None--, and one title lane falls back to literal All. Current disassembly no longer supports treating 3872 Already Connected by Another Company or 3873 Not Connected as direct overlay-body emits.

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 as city_site_format_connection_bonus_status_label at 0x004207d0: it directly chooses localized ids 3868 through 3873 after consulting the reusable city-peer scan city_connection_bonus_exists_matching_peer_site at 0x00420030. Separately, 3879 Out of Sync is grounded under the multiplayer preview dataset path instead: multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync at 0x0046b780 checks global 0x006cd91c, raises the Out of Sync shell status through 0x5386e0, and then continues through the wider multiplayer preview launch-state service. So the station-detail overlay currently owns only the Coming To, Going From, Current Supply, Current Demand, --None--, and All legend lanes.

That formatter boundary is tighter now too. 0x004207d0 returns 0 immediately when preview-global 0x0062be84 is armed, forwards directly into the shared fallback formatter 0x00455860 when subtype dword [this+0x23e] is nonzero, and only otherwise runs its own connection-status path. On that main path it rounds the current normalized city coordinates, samples one world-view-dependent alpha byte through world_view_query_city_label_alpha_byte_from_normalized_xy_and_view_scalars 0x0043ad50, and then tries to resolve one linked station-or-transit site through the active selection or scenario fallback object. When that linked-site path succeeds, the formatter forces a highlighted top color lane with alpha 0xff and appends localized id 207 (Connected); when it does not, it only reuses the sampled byte from 0x0043ad50 when that value is nonzero and below 0xff. The tail also splits cleanly now: one branch returns style code 1, while the other derives one label-priority scalar from [this+0x25e] or the piecewise-scaled [this+0x312] path, clamps that priority to 0x95, resolves the final style through 0x0053de00, and returns style code 3.

Ownership side

One reusable site helper is grounded now too. placed_structure_query_linked_company_id at 0x0047efe0 resolves the current placed structure's linked instance through 0x0062b26c and returns its company id from [instance+0x276]; the adjacent city bonus formatter at 0x004207d0 compares that id against the active company selector before choosing whether a scanned site should carry 3871 Connected By Another Company or 3872 Already Connected by Another Company. The larger caller boundary is no longer open either: the first bounded announcement owner above this formatter family is now company_evaluate_and_publish_city_connection_bonus_news at 0x00406050, which re-enters the peer-route candidate builder at 0x004046a0 and later publishes one of the localized city-connection bonus news strings 2888, 2890, or 2921 through the shell news path.

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_site at 0x00420280 is now grounded as the first-match selector paired with city_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_label reuses 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.

Caller side

The reusable bridge between the status formatter and the company news lane is now bounded too. city_connection_bonus_build_peer_route_candidate at 0x004046a0 reuses city_connection_bonus_select_first_matching_peer_site with both selector flags forced on, rounds both the source-city and selected-peer normalized coordinates through 0x005a10d0, and then first tries the shared heavy builder city_connection_try_build_route_with_optional_direct_site_placement 0x00402cb0 when the caller already supplied a live route-anchor tuple. When that direct attempt does not apply or no peer survives, it falls back to the smaller wrapper city_connection_bonus_try_compact_route_builder_from_region_entry 0x00404640; and when both early attempts fail it builds one mixed 10-byte candidate list from the dense pair store 0x006cfcb4 and the route-entry store 0x006cfca8, marks only route-anchor-eligible class-2 sites through the 0x0048a1c0/0x0048a1a0/0x0048f290 route-anchor tests, and then retries 0x00402cb0 with the best surviving span-ranked candidate. The score side of that announcement lane is tighter now as well: city_compute_connection_bonus_candidate_weight at 0x004010f0 provides the per-city opportunity weight, company_query_min_linked_site_distance_to_xy at 0x00405920 provides the nearest linked-site distance term, company_count_linked_transit_sites at 0x00426590 provides one of the company-side caps, company_compute_connection_bonus_value_ladder at 0x00425320 supplies the bounded company-side value scalar, and company_compute_prime_rate_from_issue39_scenario_baseline at 0x00424580 now bounds the shared prime-rate-side helper that this lane reuses beside the raw issue-0x39 total, scenario_state_sum_issue_opinion_terms_raw at 0x00436710 now bounds the raw additive issue-total helper beneath that term, and company_connection_bonus_lane_is_unlocked at 0x00427590 is the small boolean gate above the ladder. Wider governance and CompanyDetail xrefs now tighten slot 0x2b into the rolling net-profits lane reused by annual finance checks and a per-share/history formatter, while the report-history descriptor table now aligns raw slot 0x09 with the Income Statement fuel-cost lane surfaced by tooltip 1309. The wider result now reads more like recent net profits minus recent fuel burden than a governance-pressure term. That now also sharpens the annual finance lane at 0x00401c50: the first bankruptcy branch reads as sustained cash-and-debt stress over recent profits and fuel burden, the later fallback branch as a deeper -300000 cash / three bad years cleanup trigger, and the later stock-issue branch reads as a price-to-book-versus-coupon approval ladder rather than a generic support vote. The tail is cleaner now too: it compares total retired versus newly issued principal to choose the 2882..2886 debt headline family, then publishes 2887 separately from the accumulated repurchased-share count. The sibling news owner above the same city-pair route family is bounded now too: simulation_try_select_and_publish_company_start_or_city_connection_news 0x00404ce0 filters and scores candidate city entries, re-enters the same shared heavy builder through city_connection_try_build_route_between_region_entry_pair 0x00404c60 for the dense pair sweep and the final retry, and then publishes 2889 %1 has started a new company - the %2 or 2890 %1 has connected %2 to %3. through the shell news path. The remaining open edge on this branch is therefore narrower now: it is mostly whether 0x39 should be read as the narrower city-connection public-opinion lane or as part of a broader management-attitude family, not the ownership of the connection-bonus formatter, peer-route candidate path, or company news gate.

The ordinary StationDetail.win caller strip is tighter now too. In the non-scenario, non-class 3/4 branch, shell_station_detail_window_refresh_controls 0x00506610 rebuilds the nearby-site lane first through shell_station_detail_refresh_nearby_structure_jump_rows 0x00505470, then rebuilds the paired hauled-traffic widgets through two calls to shell_station_detail_build_to_from_haul_summary_widget 0x00505150. That hauled-traffic helper does more than publish a heading: it normalizes the incoming float lane into a bounded ten-step fill count, resolves per-step styles through 0x0053de00/0x00552560, and on first build wires the matching 0xb3f6 or 0xb3f7 click target back to shell_station_detail_present_to_from_haul_stats_popup 0x00504770 through 0x00540120. The nearby-site helper has a similarly concrete split now: for each of the fixed five categories it counts entries through 0x0047dc90, emits the descriptive text block through 0x0051b700 -> 0x0053f9c0, and then builds the paired jump-control payload through 0x0053b070 -> 0x0055a040 -> 0x0053f9c0, with text rows under 0xb40a..0xb40e and jump controls under 0xb410..0xb414. So the remaining uncertainty in the ordinary branch is no longer the ownership of those lanes; it is the broader user-facing meaning of later callers above the row callbacks.

Route-list side

The neighboring helper placed_structure_append_unique_route_entry at 0x0047f010 is now grounded as the append-if-missing builder for the six-byte route-entry list rooted at [site+0x462] and [site+0x466]. One tighter boundary closes the overlay-side uncertainty further: the directional overlay query at 0x0047e690 only consumes the leading u16 peer-site key when it walks that list and does not currently read the trailing u32 companion payload at all. So the remaining uncertainty is no longer route-list ownership or overlay dependence on that payload; it is only the broader meaning of the payload for other caller families.

Route-entry and Cache Side

The adjacent helper strip is tighter now too. placed_structure_service_candidate_local_service_comparison_cache_decay_and_row_propagation 0x0047df70 is the recurring age-and-propagation service pass over the paired comparison-cache float tables [site+0x3e] and [site+0x112] with age stamps at [site+0x1e6]; it zeroes stale entries older than 0x1d8800, decays younger ones by the fixed 0x005ce900/0x005ce8f8 scales, and then propagates stronger marked row values back through the three five-float row bands rooted at [site+0x24/+0x28/+0x2c]. The wrapper placed_structure_query_candidate_route_or_local_service_comparison_score 0x0047e9a0 is now bounded too: it delegates to placed_structure_query_candidate_directional_route_overlay_summary 0x0047e690 when the requested candidate carries a grouped routing class, otherwise it uses the simpler local [cell+0x103] lane and the current sample list at [site+0x34/+0x38] before writing back into the same comparison-cache bands. The route-entry strip beneath the linked-peer family is no longer open either: placed_structure_resolve_route_entry_anchor_record 0x0047f310 is the direct resolver over [site+0x08], and placed_structure_route_anchor_matches_or_reaches_route_entry_id 0x0047f250 is the boolean gate above it, first checking a direct match against [site+0x08] and then re-entering 0x0048e050(mode 2, fallback -1) on the resolved route-entry record. The route-link companion route_link_route_entry_reaches_peer_site_route_group 0x0047f2d0 is tighter now too: it reads the peer site's route-entry anchor from [peer+0x08], resolves the current link's own anchor, and re-enters 0x0048e3c0 to test whether the two anchors belong to the same reachable route-side family. One smaller linked-peer-side setter is grounded as well: placed_structure_set_overlay_mark_byte_and_refresh_linked_peer_overlay_if_changed 0x0047f290 updates byte [site+0x5bc] and then re-enters placed_structure_refresh_linked_peer_overlay_when_linked_peer_flagged 0x0040d2d0 when the byte changes.

Terrain-class Side

The nearby linked-instance raster wrappers are no longer anonymous. world_resolve_secondary_raster_class_record_at_float_xy 0x0044e270 is the world-side float-XY lookup over [world+0x2131] plus class table 0x006cfc9c; placed_structure_query_linked_instance_secondary_raster_class_id 0x0047f170 is the raw linked-instance wrapper that returns the shifted class id directly; and the paired record-returning wrappers placed_structure_resolve_linked_instance_secondary_raster_class_record 0x0047f0e0 and placed_structure_resolve_linked_instance_secondary_raster_class_record_via_world_query 0x0047f1f0 now bound the two record-returning lanes used by the later world-side and linked-peer filters. That means the remaining uncertainty in this neighborhood is no longer the route-entry or terrain-class helper ownership; it is the broader user-facing meaning of the later callers that consume those gates.