From 86cd67889b8c4ace8ecf6d3a52b9552322895cbe Mon Sep 17 00:00:00 2001
From: Ael
Date: Wed, 22 Jul 2026 00:45:30 +0200
Subject: [PATCH 1/2] feat: add selectable water cell records
---
.../realm/RealmAccessibilityControls.tsx | 45 ++++-
src/components/realm/RealmMapScreen.css | 33 ++++
src/components/realm/RealmMapScreen.tsx | 95 +++++++++-
src/components/realm/WaterInspectionPanel.css | 1 +
src/components/realm/WaterInspectionPanel.tsx | 150 ++++++++++++++++
src/components/realm/createRealmScene.ts | 92 +++++++++-
src/components/realm/realmInteractionState.ts | 53 +++++-
src/components/realm/realmPickArbitration.ts | 27 +++
.../realm/realmWaterInspectionPresentation.ts | 170 ++++++++++++++++++
src/components/realm/realmWaterLayer.ts | 116 ++++++++++++
tests/realmInteractionState.test.ts | 28 +++
tests/realmPickArbitration.test.ts | 41 +++++
.../realmWaterInspectionPresentation.test.ts | 59 ++++++
tests/realmWaterLayer.test.ts | 37 +++-
14 files changed, 934 insertions(+), 13 deletions(-)
create mode 100644 src/components/realm/WaterInspectionPanel.css
create mode 100644 src/components/realm/WaterInspectionPanel.tsx
create mode 100644 src/components/realm/realmWaterInspectionPresentation.ts
create mode 100644 tests/realmWaterInspectionPresentation.test.ts
diff --git a/src/components/realm/RealmAccessibilityControls.tsx b/src/components/realm/RealmAccessibilityControls.tsx
index 5520c0e5..69c2d433 100644
--- a/src/components/realm/RealmAccessibilityControls.tsx
+++ b/src/components/realm/RealmAccessibilityControls.tsx
@@ -25,6 +25,15 @@ export type RealmNavigatorCastle = Readonly<{
r: number;
}>;
+export type RealmNavigatorWaterBody = Readonly<{
+ bodyId: string;
+ label: string;
+ sourceCellKey: string;
+ mouthCellKey: string;
+ sourceCoord: HexCoord;
+ mouthCoord: HexCoord;
+}>;
+
export type RealmNavigatorCloseReason = 'escape' | 'close-button' | 'camera-preset';
export type RealmNavigatorCoordinateJump = Readonly<{
@@ -43,11 +52,13 @@ export type RealmAccessibilityControlsProps = Readonly<{
id: string;
open: boolean;
castles: readonly RealmNavigatorCastle[];
+ waterBodies?: readonly RealmNavigatorWaterBody[];
ownCastleId?: number;
selectedCastleId?: number;
onRequestOpen: () => void;
onRequestClose: (reason: RealmNavigatorCloseReason) => void;
onActivateCastle: (castle: RealmNavigatorCastle) => void;
+ onActivateWaterCell?: (cellKey: string) => void;
coordinateJump?: RealmNavigatorCoordinateJump;
cameraPresets?: readonly RealmNavigatorCameraPreset[];
/** Player chrome may provide its own PFP launcher while reusing this dialog. */
@@ -75,11 +86,13 @@ export function RealmAccessibilityControls({
id,
open,
castles,
+ waterBodies = [],
ownCastleId,
selectedCastleId,
onRequestOpen,
onRequestClose,
onActivateCastle,
+ onActivateWaterCell,
coordinateJump,
cameraPresets = [],
triggerVisible = true,
@@ -126,6 +139,16 @@ export function RealmAccessibilityControls({
? castles.filter((castle) => searchCopy(castle).includes(query))
: castles;
}, [castles, search]);
+ const visibleWaterBodies = useMemo(() => {
+ const query = search.trim().toLocaleLowerCase();
+ return query
+ ? waterBodies.filter((body) => (
+ `${body.label} ${body.sourceCoord.q},${body.sourceCoord.r} ${body.mouthCoord.q},${body.mouthCoord.r}`
+ .toLocaleLowerCase()
+ .includes(query)
+ ))
+ : waterBodies;
+ }, [search, waterBodies]);
const handleDialogKeyDown = (event: KeyboardEvent) => {
if (event.key !== 'Escape') return;
@@ -164,7 +187,7 @@ export function RealmAccessibilityControls({
)}
+ {visibleWaterBodies.length > 0 && onActivateWaterCell ? (
+
+ PUBLIC WATER
+
+ {visibleWaterBodies.map((body) => (
+ -
+
+
{body.label}
+
source {body.sourceCoord.q},{body.sourceCoord.r} · mouth {body.mouthCoord.q},{body.mouthCoord.r}
+
+
+
+
+
+
+ ))}
+
+
+ ) : null}
+
{coordinateJump ? (