feat(ui): atlas implant panel — system picker, orbital diagram, body nav (#834)

3-level atlas navigation as an implant/map/atlas FULLSCREEN app (D-170 z=20):
system picker (◄ ► cycle, Enter opens orbital) → orbital diagram (star centre,
bodies grouped by orbit_index with moons sub-orbiting parents, stations as
markers, click-to-open body or mini station panel) → body entry (data sheet,
Enter stub for #835 heightmap viewer, Esc back). Composed from the ImplantPanel
component library (D-169).

Wires the panel into hud.tscn, adds an A-key toggle in main.gd, propagates
insert_state via snapshot_consumers. Extends generate-star-map-data.py to emit
per-system orbit_bodies + stations arrays (with currency_zone, atmosphere,
population, terrain_reference, etc.) from systems.db; star_map_data.json
regenerated deterministically.

Per D-191 §6, Phase 3.
This commit is contained in:
2026-04-14 17:24:50 +02:00
parent 521c682175
commit 760953aeba
7 changed files with 45662 additions and 305 deletions
+6
View File
@@ -34,6 +34,7 @@ var _dialogue: DialogueCoordinator # #775: dialogue consumers + signal handlers
@onready var news_ticker = $UILayer/NewsTicker # #592: scrolling headline bar (D-049 z-7)
@onready var star_map = $InsertOverlay/HUD/StarMap # #674: star map insert module (hop-ring view)
@onready var economics_panel = $InsertOverlay/HUD/EconomicsPanel # #824: economics monitor (D-170)
@onready var atlas_panel = $InsertOverlay/HUD/AtlasPanel # #834: atlas implant — system → orbital → body (D-191)
func _ready() -> void:
@@ -93,6 +94,7 @@ func _ready() -> void:
"minimap": minimap,
"star_map": star_map,
"economics_panel": economics_panel,
"atlas_panel": atlas_panel,
},
_screen_flash
)
@@ -172,6 +174,10 @@ func _unhandled_key_input(event: InputEvent) -> void:
if event is InputEventKey and event.keycode == KEY_M:
if star_map:
star_map.toggle_visible()
elif event is InputEventKey and event.keycode == KEY_A:
# #834: A — toggle Atlas implant panel (FULLSCREEN, implant/map/atlas)
if atlas_panel:
atlas_panel.toggle_visible()
elif event is InputEventKey and event.keycode == KEY_N:
# #824: N — toggle Economics Monitor implant panel (E is bound to interact)
if economics_panel:
+4
View File
@@ -18,6 +18,7 @@ var interaction_prompt: Node = null
var minimap: Node = null
var star_map: Node = null
var economics_panel: Node = null # #824: economics monitor (D-181)
var atlas_panel: Node = null # #834: atlas implant panel (D-191)
var _screen_flash_fn: Callable # Callable(color: Color, duration: float)
@@ -39,6 +40,7 @@ func init(refs: Dictionary, screen_flash: Callable) -> SnapshotConsumers:
minimap = refs.get("minimap")
star_map = refs.get("star_map")
economics_panel = refs.get("economics_panel")
atlas_panel = refs.get("atlas_panel")
_screen_flash_fn = screen_flash
return self
@@ -58,6 +60,8 @@ func propagate_insert_state() -> void:
star_map.set_insert_active(insert_state)
if economics_panel:
economics_panel.set_insert_active(insert_state)
if atlas_panel:
atlas_panel.set_insert_active(insert_state)
# D-057: Update interaction list from game state.