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.