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

11 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.

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, samples the selected peer's derived coordinates through 0x0047df30 and 0x0047df50, and then either tries the shared heavy builder city_connection_try_build_route_with_optional_direct_site_placement 0x00402cb0 or falls back to the smaller wrapper city_connection_bonus_try_compact_route_builder_from_region_entry 0x00404640 before handing the result back to the company-side announcement sweep at 0x00406050. 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.

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]. That matters here because the directional overlay query at 0x0047e690 consumes the same list, so the remaining uncertainty is no longer list ownership. It is down to the exact semantics of each entry's u32 payload.

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.