Make locomotive context save-native

This commit is contained in:
Jan Petykiewicz 2026-04-16 12:18:13 -07:00
commit b060c42fa2
18 changed files with 1240 additions and 83 deletions

View file

@ -51,25 +51,20 @@ recovered locomotives-page `real_packed_v1` record that lands in the explicit
`blocked_unmapped_world_descriptor` bucket. The next recovered descriptor band is now partially
executable too: descriptors `454..456` (`All Steam/Diesel/Electric Locos Avail.`) now lower
through checked-in metadata into keyed `world_flags`, while the wider locomotive availability/cost
scalar bands are now split more cleanly: the recovered locomotive availability bands can import as
full scalar overrides through an overlay-backed `RuntimeState.locomotive_catalog` into
`RuntimeState.named_locomotive_availability`, while save-slice-only imports of those rows still
block explicitly when catalog context is missing. The runtime still carries the save-owned named
locomotive availability table directly too:
checked-in save-slice documents can populate `RuntimeState.named_locomotive_availability`, and
imported runtime effects can mutate that map through the ordinary event-service path without
needing full Trainbuy or live-locomotive parity. A parallel event-owned named locomotive cost map
now exists too: recovered locomotive-cost descriptors from bands `352..451` and `475..500` can
import through the same overlay-backed locomotive catalog into
`RuntimeState.named_locomotive_cost`, and the remaining recovered scalar world families now execute
too: cargo-production slots `230..240` lower into `cargo_production_overrides`, and descriptor
`453` lowers into `world_restore.territory_access_cost`. Explicit unmapped world-condition and
world-descriptor frontier buckets still remain where current checked-in metadata stops, with the
main scalar residue now being missing-catalog locomotive rows rather than unknown world-side
families. Shell purchase-flow, Trainbuy refresh, cached locomotive-rating recomputation, and
selected-profile parity remain out of scope. Mixed supported/unsupported real rows still stay
parity-only. The PE32 hook remains useful as capture and integration tooling, but it is no longer
the main execution milestone.
scalar bands are now save-native too. Raw `.smp` inspection/export reconstructs the persisted
`[world+0x66b6]` locomotive name table and derives a minimal `RuntimeState.locomotive_catalog`, so
standalone save-slice imports can now lower recovered locomotive availability and locomotive-cost
rows directly into `RuntimeState.named_locomotive_availability` and
`RuntimeState.named_locomotive_cost` without needing overlay snapshots when the save carries enough
catalog context. The remaining recovered scalar world families execute too: cargo-production slots
`230..240` lower into `cargo_production_overrides`, and descriptor `453` lowers into
`world_restore.territory_access_cost`. Explicit unmapped world-condition and world-descriptor
frontier buckets still remain where current checked-in metadata stops, and
`blocked_missing_locomotive_catalog_context` is now reserved for intentionally incomplete save-side
catalog context instead of the normal save-slice path. Shell purchase-flow, Trainbuy refresh,
cached locomotive-rating recomputation, and selected-profile parity remain out of scope. Mixed
supported/unsupported real rows still stay parity-only. The PE32 hook remains useful as capture and
integration tooling, but it is no longer the main execution milestone.
## Project Docs