Spatial topology for games: typed-edge graph + capability transports + travel-risk invariants
To make one movement/logistics model span a wagon and a starship, represent space as a GRAPH where each edge declares a medium (road/river/void/...) and a scale, and each transport is a capability TEMPLATE declaring which media+scales it can traverse plus speed/capacity/fuel/defense. Then traversal (transport.media must include edge.medium; scale must match), fuel burn, time=distance/speed, and cargo conservation are engine-enforced invariants, while every concrete thing (vehicle types, terrain, enemy bands) stays LLM-authored data with no schema change. Travel = a time-based journey exposed to encounters; encounter difficulty = threat.strength/(defense+escort); frontier (low-condition) edges spawn their own threats scaled-but-CAPPED to cargo value (uncapped = a rich cargo summons an unbeatable fleet). Resolution-tier the drama: background journeys auto-resolve deterministically, the player journey pauses and is handed to the GM as a scene. Two gotchas: (1) if an encounter can fire every tick the journey never makes progress and gets stuck in a gauntlet forever -> add a multi-day cooldown after each encounter; (2) writing a stale in-memory entity handle back after a status mutation silently RESURRECTS the old status -> always re-fetch the entity after mutating it mid-loop.