From efe17f3d2e3e1b2c2da95161f5effd427697f791 Mon Sep 17 00:00:00 2001 From: Brian Fertig Date: Mon, 7 Sep 2026 18:56:48 -0600 Subject: [PATCH] Add SYSTEM tab and zoom-bloom star art to the map console - New "System" socket in MapWindow: a charted star's chart drawn by the same painter as Current System (no ship/tethers), armed until the player picks that star on the Galaxy tab, then wakes with its map. - Galaxy tab click flow changes: a visited star opens its chart in the System tab (onStarOpen) instead of confirming a jump; uncharted stars are readouts only and a lit lane to an uncharted star pops nothing. - Zoom-bloom star art (GalaxyChart.starArtSpec + GalaxyView blit): diffraction spikes, per-type crowns (granulation, prominences, binary companion, habitable rings, nebula disc, void horizon) and a surface wobble fade in as you zoom; all angles/phases seeded per system. - Star hit-testing now scales with the dot size and includes a crowded cluster dead band so lanes/empty space between stars no longer trigger hover. - New systemChartSnapshot() in SystemChart.js plus tests covering shape, coverage, discovery flags, stats and determinism. - Set Destination dialog (System tab) acknowledges the pick via onSetDestination; destination model is still being defined. - Added spacestation image/video assets for future use. --- assets/images/originals/spacestation-01.png | Bin 0 -> 2547251 bytes assets/images/originals/spacestation-02.png | Bin 0 -> 2252245 bytes assets/images/originals/spacestation-03.png | Bin 0 -> 2745915 bytes assets/videos/ss-land-01.mp4 | Bin 0 -> 2958526 bytes assets/videos/ss-land-02.mp4 | Bin 0 -> 2872396 bytes assets/videos/ss-takeoff-01.mp4 | Bin 0 -> 2514864 bytes data/map.json | 57 +++- dev/star-art.test.mjs | 165 ++++++++++ dev/system-chart.test.mjs | 124 +++++++- js/galaxy/GalaxyChart.js | 291 +++++++++++++++++ js/galaxy/SystemChart.js | 136 ++++++++ js/scenes/GameScene.js | 116 ++++--- js/ui/GalaxyView.js | 331 ++++++++++++++++---- js/ui/MapWindow.js | 175 ++++++++--- 14 files changed, 1226 insertions(+), 169 deletions(-) create mode 100644 assets/images/originals/spacestation-01.png create mode 100644 assets/images/originals/spacestation-02.png create mode 100644 assets/images/originals/spacestation-03.png create mode 100644 assets/videos/ss-land-01.mp4 create mode 100644 assets/videos/ss-land-02.mp4 create mode 100644 assets/videos/ss-takeoff-01.mp4 create mode 100644 dev/star-art.test.mjs diff --git a/assets/images/originals/spacestation-01.png b/assets/images/originals/spacestation-01.png new file mode 100644 index 0000000000000000000000000000000000000000..818cf3c3c225b81f2bf5b571eccbbcc97aad9706 GIT binary patch literal 2547251 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

idE@JZ#dwdc)L?QY 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