fix(ui-map): repaint fog as layered overpaint; rename to visibleHyperspace
Tests · UI / test (push) Waiting to run
Tests · UI / test (push) Waiting to run
The Phase 29 fog overlay rendered as a handful of random arc segments instead of a clean union of holes around LOCAL planets — Pixi v8's `Graphics.cut()` does not reliably subtract multiple overlapping circles from a base path. Replaced the cut-based approach with a layered overpaint: a fog-tinted rectangle fills the world, then opaque background- coloured circles are painted on top for every visibility circle. The natural rendering order unions overlapping circles for free — no geometry, no `cut()` quirks, one extra fill per circle. Renamed the toggle from `visibilityFog` to `visibleHyperspace` across the store, i18n strings, popover, tests, and docs. The overlay still implements the visual "fog" effect at the renderer level (FOG_COLOR, setVisibilityFog, getMapFog); the toggle is named after the player-facing concept it controls — the portion of the map that is visible (intelligence/scan coverage) — rather than the obscured part. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -306,7 +306,7 @@ test("visibility fog toggles between the LOCAL-planet circle list and an empty o
|
||||
expect(initialFog[1].radius).toBe(300);
|
||||
|
||||
await page.getByTestId("map-toggles-trigger").click();
|
||||
await page.getByTestId("map-toggles-visibility-fog").click();
|
||||
await page.getByTestId("map-toggles-visible-hyperspace").click();
|
||||
|
||||
// The effect re-run is async; wait for the fog payload to clear
|
||||
// instead of reading it on the next tick.
|
||||
@@ -315,7 +315,7 @@ test("visibility fog toggles between the LOCAL-planet circle list and an empty o
|
||||
);
|
||||
|
||||
// Toggling back on rebuilds the fog circles for the same planets.
|
||||
await page.getByTestId("map-toggles-visibility-fog").click();
|
||||
await page.getByTestId("map-toggles-visible-hyperspace").click();
|
||||
await page.waitForFunction(
|
||||
() => window.__galaxyDebug!.getMapFog!().circles.length === 2,
|
||||
);
|
||||
|
||||
@@ -58,7 +58,7 @@ describe("MapTogglesControl", () => {
|
||||
expect(ui.getByTestId("map-toggles-uninhabited-planets")).toBeChecked();
|
||||
expect(ui.getByTestId("map-toggles-unidentified-planets")).toBeChecked();
|
||||
expect(ui.getByTestId("map-toggles-unreachable-planets")).toBeChecked();
|
||||
expect(ui.getByTestId("map-toggles-visibility-fog")).toBeChecked();
|
||||
expect(ui.getByTestId("map-toggles-visible-hyperspace")).toBeChecked();
|
||||
expect(ui.getByTestId("map-toggles-wrap-torus")).toBeChecked();
|
||||
expect(ui.getByTestId("map-toggles-wrap-no-wrap")).not.toBeChecked();
|
||||
});
|
||||
|
||||
@@ -113,7 +113,7 @@ describe("GameStateStore.mapToggles persistence", () => {
|
||||
await a.init({ client: makeFakeClient(3), cache, gameId: GAME_ID });
|
||||
await a.setMapToggle("hyperspaceGroups", false);
|
||||
await a.setMapToggle("battleMarkers", false);
|
||||
await a.setMapToggle("visibilityFog", false);
|
||||
await a.setMapToggle("visibleHyperspace", false);
|
||||
a.dispose();
|
||||
|
||||
listMyGamesSpy.mockResolvedValue([makeGameSummary(3)]);
|
||||
@@ -121,7 +121,7 @@ describe("GameStateStore.mapToggles persistence", () => {
|
||||
await b.init({ client: makeFakeClient(3), cache, gameId: GAME_ID });
|
||||
expect(b.mapToggles.hyperspaceGroups).toBe(false);
|
||||
expect(b.mapToggles.battleMarkers).toBe(false);
|
||||
expect(b.mapToggles.visibilityFog).toBe(false);
|
||||
expect(b.mapToggles.visibleHyperspace).toBe(false);
|
||||
// Untouched flags retain defaults.
|
||||
expect(b.mapToggles.bombingMarkers).toBe(true);
|
||||
b.dispose();
|
||||
@@ -141,7 +141,7 @@ describe("GameStateStore.mapToggles persistence", () => {
|
||||
expect(store.mapToggles.hyperspaceGroups).toBe(false);
|
||||
expect(store.mapToggles.battleMarkers).toBe(true);
|
||||
expect(store.mapToggles.bombingMarkers).toBe(true);
|
||||
expect(store.mapToggles.visibilityFog).toBe(true);
|
||||
expect(store.mapToggles.visibleHyperspace).toBe(true);
|
||||
store.dispose();
|
||||
});
|
||||
});
|
||||
@@ -153,7 +153,7 @@ describe("GameStateStore.mapToggles new-turn reset", () => {
|
||||
...DEFAULT_MAP_TOGGLES,
|
||||
hyperspaceGroups: false,
|
||||
battleMarkers: false,
|
||||
visibilityFog: false,
|
||||
visibleHyperspace: false,
|
||||
},
|
||||
lastResetTurn: 4,
|
||||
});
|
||||
|
||||
@@ -273,7 +273,7 @@ describe("computeFogCircles", () => {
|
||||
planets: [makePlanet({ number: 1, kind: "local", x: 100, y: 100 })],
|
||||
});
|
||||
expect(
|
||||
computeFogCircles(report, toggles({ visibilityFog: false })),
|
||||
computeFogCircles(report, toggles({ visibleHyperspace: false })),
|
||||
).toEqual([]);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user