@edv4h/usketch-plugin-map 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/base/base-layer.d.ts.map +1 -1
  2. package/dist/base/base-layer.js +30 -6
  3. package/dist/base/base-layer.js.map +1 -1
  4. package/dist/base/base-map-shape.d.ts +6 -6
  5. package/dist/base/base-map-shape.d.ts.map +1 -1
  6. package/dist/base/base-map-shape.js +6 -28
  7. package/dist/base/base-map-shape.js.map +1 -1
  8. package/dist/base/base-ops.d.ts +16 -23
  9. package/dist/base/base-ops.d.ts.map +1 -1
  10. package/dist/base/base-ops.js +101 -101
  11. package/dist/base/base-ops.js.map +1 -1
  12. package/dist/base/base-state.d.ts +3 -2
  13. package/dist/base/base-state.d.ts.map +1 -1
  14. package/dist/base/base-state.js +4 -3
  15. package/dist/base/base-state.js.map +1 -1
  16. package/dist/base/enter-banner.d.ts.map +1 -1
  17. package/dist/base/enter-banner.js +5 -2
  18. package/dist/base/enter-banner.js.map +1 -1
  19. package/dist/base/territory.d.ts +9 -0
  20. package/dist/base/territory.d.ts.map +1 -0
  21. package/dist/base/territory.js +128 -0
  22. package/dist/base/territory.js.map +1 -0
  23. package/dist/generate.d.ts.map +1 -1
  24. package/dist/generate.js +25 -5
  25. package/dist/generate.js.map +1 -1
  26. package/dist/hud/register-map-hud.d.ts.map +1 -1
  27. package/dist/hud/register-map-hud.js +0 -0
  28. package/dist/hud/register-map-hud.js.map +1 -1
  29. package/dist/index.d.ts +2 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/map-icon-shape.d.ts +3 -0
  34. package/dist/map-icon-shape.d.ts.map +1 -1
  35. package/dist/map-icon-shape.js.map +1 -1
  36. package/dist/map-tool.d.ts.map +1 -1
  37. package/dist/map-tool.js +57 -61
  38. package/dist/map-tool.js.map +1 -1
  39. package/dist/range-erase-state.d.ts +0 -2
  40. package/dist/range-erase-state.d.ts.map +1 -1
  41. package/dist/range-erase-state.js +2 -2
  42. package/dist/range-erase-state.js.map +1 -1
  43. package/dist/range-erase.d.ts +2 -2
  44. package/dist/range-erase.d.ts.map +1 -1
  45. package/dist/range-erase.js +28 -55
  46. package/dist/range-erase.js.map +1 -1
  47. package/dist/tilemap-shape.d.ts +7 -0
  48. package/dist/tilemap-shape.d.ts.map +1 -1
  49. package/dist/tilemap-shape.js +1 -0
  50. package/dist/tilemap-shape.js.map +1 -1
  51. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"base-layer.d.ts","sourceRoot":"","sources":["../../src/base/base-layer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAsGpE,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,UAAU,GACV,EAAE;IACF,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;CACxB,sCA8EA"}
1
+ {"version":3,"file":"base-layer.d.ts","sourceRoot":"","sources":["../../src/base/base-layer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAyGpE,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,UAAU,GACV,EAAE;IACF,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;CACxB,sCAiHA"}
@@ -2,10 +2,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useRef, useState } from "react";
3
3
  import { exposedEdges, parseCellKey } from "../autotile.js";
4
4
  import { blockFactor, downsampleCells, tileDetail } from "../lod.js";
5
+ import { MAP_ICON_TYPE } from "../map-icon-shape.js";
5
6
  import { visibleCellRange, visibleWorldRect } from "../map-layer.js";
6
7
  import { MAP_TOOL_ID } from "../map-tool-id.js";
7
8
  import { useMapToolState } from "../tool-state.js";
8
9
  import { baseRegionAnchors, getBaseMap } from "./base-ops.js";
10
+ import { useBaseState } from "./base-state.js";
11
+ import { computeTerritory } from "./territory.js";
9
12
  const FILL_OPACITY = 0.24;
10
13
  const BORDER_RATIO = 0.16; // border strip thickness, fraction of a tile
11
14
  const BORDER_OPACITY = 0.85;
@@ -71,6 +74,7 @@ function renderCoarse(owner, bases, tile, screenTilePx, visible) {
71
74
  }
72
75
  export function BaseAreaLayer({ store, renderMode, }) {
73
76
  const tool = useMapToolState();
77
+ const baseState = useBaseState();
74
78
  const [, force] = useState(0);
75
79
  const rafRef = useRef(0);
76
80
  useEffect(() => {
@@ -91,19 +95,39 @@ export function BaseAreaLayer({ store, renderMode, }) {
91
95
  if (!inBaseMode)
92
96
  return null;
93
97
  const base = getBaseMap(store);
94
- if (!base || Object.keys(base.owner).length === 0)
98
+ if (!base)
99
+ return null;
100
+ const tile = base.tile;
101
+ // Territory is DERIVED from beacons + terrain paint (memoised in territory.ts).
102
+ const territory = computeTerritory(store, tile, new Set(baseState.excludeTerrains));
103
+ if (Object.keys(territory).length === 0)
95
104
  return null;
96
105
  const vp = store.getViewport();
97
106
  const visible = visibleWorldRect(store);
98
- const tile = base.tile;
99
107
  const screenTilePx = tile * vp.zoom;
100
108
  const detail = tileDetail(screenTilePx, renderMode);
101
109
  const cells = detail === "full"
102
- ? renderFull(base.owner, base.bases, tile, visible)
103
- : renderCoarse(base.owner, base.bases, tile, screenTilePx, visible);
110
+ ? renderFull(territory, base.bases, tile, visible)
111
+ : renderCoarse(territory, base.bases, tile, screenTilePx, visible);
104
112
  // Labels: HTML chips at screen coords (crisp, constant size). Hidden when coarse.
105
- const anchors = detail === "full" ? baseRegionAnchors(base.owner, base.bases, tile) : [];
106
- return (_jsxs("div", { style: { position: "absolute", inset: 0, pointerEvents: "none", overflow: "hidden" }, children: [_jsx("svg", { width: "100%", height: "100%", style: { display: "block", overflow: "visible" }, children: _jsx("g", { transform: `translate(${vp.x} ${vp.y}) scale(${vp.zoom})`, children: cells }) }), anchors.map((a) => (_jsxs("div", { style: {
113
+ const anchors = detail === "full" ? baseRegionAnchors(territory, base.bases, tile) : [];
114
+ // Radius rings for beacon icons. Full detail only; radius comes from the base.
115
+ const rings = [];
116
+ if (detail === "full") {
117
+ for (const [, s] of store.getShapes()) {
118
+ if (s.type !== MAP_ICON_TYPE)
119
+ continue;
120
+ const meta = s.meta;
121
+ if (!meta?.baseId)
122
+ continue;
123
+ const info = base.bases[meta.baseId];
124
+ if (!info)
125
+ continue;
126
+ const color = info.color;
127
+ rings.push(_jsx("circle", { cx: s.x + s.width / 2, cy: s.y + s.height / 2, r: info.radius * tile, fill: "none", stroke: color, strokeWidth: 2, strokeDasharray: "8 6", opacity: 0.7, vectorEffect: "non-scaling-stroke" }, `ring-${s.id}`));
128
+ }
129
+ }
130
+ return (_jsxs("div", { style: { position: "absolute", inset: 0, pointerEvents: "none", overflow: "hidden" }, children: [_jsx("svg", { width: "100%", height: "100%", style: { display: "block", overflow: "visible" }, children: _jsxs("g", { transform: `translate(${vp.x} ${vp.y}) scale(${vp.zoom})`, children: [cells, rings] }) }), anchors.map((a) => (_jsxs("div", { style: {
107
131
  position: "absolute",
108
132
  left: a.x * vp.zoom + vp.x,
109
133
  top: a.y * vp.zoom + vp.y,
@@ -1 +1 @@
1
- {"version":3,"file":"base-layer.js","sourceRoot":"","sources":["../../src/base/base-layer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-layer.js","sourceRoot":"","sources":["../../src/base/base-layer.tsx"],"names":[],"mappings":"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"}
@@ -1,20 +1,20 @@
1
- import type { BoundingBox, ShapeData, ShapeDefinition } from "@edv4h/usketch-shared";
1
+ import type { ShapeData, ShapeDefinition } from "@edv4h/usketch-shared";
2
2
  export declare const BASE_MAP_TYPE = "base-map";
3
3
  export interface BaseInfo {
4
4
  name: string;
5
5
  color: string;
6
+ /** Territory radius in tiles around the beacon (the core is always owned). */
7
+ radius: number;
8
+ /** The single beacon: the map-icon whose position seeds this base's core. */
9
+ beaconIconId?: string;
6
10
  }
7
- /** cellKey("c,r") → baseId (sparse ownership map). */
8
- export type OwnerMap = Record<string, string>;
11
+ export declare const DEFAULT_BASE_RADIUS = 5;
9
12
  export interface BaseMapShapeData extends ShapeData {
10
13
  type: "base-map";
11
14
  tile: number;
12
15
  bases: Record<string, BaseInfo>;
13
- owner: OwnerMap;
14
16
  }
15
17
  export declare function isBaseMap(shape: ShapeData): shape is BaseMapShapeData;
16
18
  export declare function makeBaseMap(tile: number): BaseMapShapeData;
17
- /** Bounds of all owned cells (keys are cellKeys). */
18
- export declare function ownerBounds(owner: OwnerMap, tile: number): BoundingBox;
19
19
  export declare function createBaseMapShapeDefinition(tile?: number): ShapeDefinition;
20
20
  //# sourceMappingURL=base-map-shape.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-map-shape.d.ts","sourceRoot":"","sources":["../../src/base/base-map-shape.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKrF,eAAO,MAAM,aAAa,aAAa,CAAC;AAExC,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,sDAAsD;AACtD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,KAAK,EAAE,QAAQ,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,gBAAgB,CAErE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAc1D;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAGtE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,GAAE,MAAqB,GAAG,eAAe,CA2CzF"}
1
+ {"version":3,"file":"base-map-shape.d.ts","sourceRoot":"","sources":["../../src/base/base-map-shape.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAe,SAAS,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIrF,eAAO,MAAM,aAAa,aAAa,CAAC;AAExC,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAChC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,gBAAgB,CAErE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAa1D;AAED,wBAAgB,4BAA4B,CAAC,IAAI,GAAE,MAAqB,GAAG,eAAe,CA4BzF"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { generateId } from "@edv4h/usketch-shared";
3
- import { cellKey, cellsBounds, parseCellKey } from "../autotile.js";
4
3
  import { DEFAULT_TILE } from "../tilemap-shape.js";
5
4
  export const BASE_MAP_TYPE = "base-map";
5
+ export const DEFAULT_BASE_RADIUS = 5;
6
6
  export function isBaseMap(shape) {
7
7
  return shape.type === BASE_MAP_TYPE;
8
8
  }
@@ -17,56 +17,34 @@ export function makeBaseMap(tile) {
17
17
  style: { fill: "transparent", stroke: "transparent", strokeWidth: 0, opacity: 1 },
18
18
  tile,
19
19
  bases: {},
20
- owner: {},
21
20
  locked: true,
22
21
  };
23
22
  }
24
- /** Bounds of all owned cells (keys are cellKeys). */
25
- export function ownerBounds(owner, tile) {
26
- // cellsBounds only reads keys, so the value type is irrelevant here.
27
- return cellsBounds(owner, tile);
28
- }
29
23
  export function createBaseMapShapeDefinition(tile = DEFAULT_TILE) {
30
24
  return {
31
25
  render: () => _jsx("g", {}),
32
26
  renderTarget: "svg",
33
- getBounds: (data) => {
34
- const d = data;
35
- return ownerBounds(d.owner ?? {}, d.tile ?? tile);
36
- },
27
+ // The registry itself has no geometry; the territory (derived) is drawn by
28
+ // the BaseAreaLayer, not this substrate.
29
+ getBounds: () => ({ x: 0, y: 0, width: 0, height: 0 }),
37
30
  hitTest: () => false,
38
31
  resizable: false,
39
32
  resize: (data) => data,
40
33
  createDefault: (params) => ({ ...makeBaseMap(tile), id: params.id }),
41
- move: (data, dx, dy) => {
42
- const d = data;
43
- const t = d.tile ?? tile;
44
- const dc = Math.round(dx / t);
45
- const dr = Math.round(dy / t);
46
- if (dc === 0 && dr === 0)
47
- return {};
48
- const next = {};
49
- for (const [key, baseId] of Object.entries(d.owner)) {
50
- const [c, r] = parseCellKey(key);
51
- next[cellKey(c + dc, r + dr)] = baseId;
52
- }
53
- return { owner: next, ...ownerBounds(next, t) };
54
- },
55
34
  serializeForAi: (data) => {
56
35
  const d = data;
57
36
  return {
58
37
  kind: "base-map",
59
38
  baseCount: Object.keys(d.bases ?? {}).length,
60
- ownedCells: Object.keys(d.owner ?? {}).length,
39
+ bases: Object.values(d.bases ?? {}).map((b) => b.name),
61
40
  };
62
41
  },
63
42
  debugFields: (data) => {
64
43
  const d = data;
65
44
  return {
66
45
  bases: Object.values(d.bases ?? {})
67
- .map((t) => t.name)
46
+ .map((b) => b.name)
68
47
  .join(", "),
69
- ownedCells: Object.keys(d.owner ?? {}).length,
70
48
  };
71
49
  },
72
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"base-map-shape.js","sourceRoot":"","sources":["../../src/base/base-map-shape.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-map-shape.js","sourceRoot":"","sources":["../../src/base/base-map-shape.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AAWxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAQrC,MAAM,UAAU,SAAS,CAAC,KAAgB;IACzC,OAAO,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO;QACN,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI,EAAE,UAAU;QAChB,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QACjF,IAAI;QACJ,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,IAAI;KACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAI,GAAW,YAAY;IACvE,OAAO;QACN,MAAM,EAAE,GAAG,EAAE,CAAC,aAAK;QACnB,YAAY,EAAE,KAAK;QACnB,2EAA2E;QAC3E,yCAAyC;QACzC,SAAS,EAAE,GAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK;QACpB,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,CAAC,IAAI,EAAa,EAAE,CAAC,IAAI;QACjC,aAAa,EAAE,CAAC,MAAM,EAAa,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;QAC/E,cAAc,EAAE,CAAC,IAAI,EAA2B,EAAE;YACjD,MAAM,CAAC,GAAG,IAAwB,CAAC;YACnC,OAAO;gBACN,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;gBAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aACtD,CAAC;QACH,CAAC;QACD,WAAW,EAAE,CAAC,IAAI,EAA2B,EAAE;YAC9C,MAAM,CAAC,GAAG,IAAwB,CAAC;YACnC,OAAO;gBACN,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;qBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAClB,IAAI,CAAC,IAAI,CAAC;aACZ,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -1,22 +1,13 @@
1
1
  import type { BoardStore, CommandRegistry } from "@edv4h/usketch-shared";
2
- import { type Cells } from "../autotile.js";
3
- import { type BaseInfo, type BaseMapShapeData, type OwnerMap } from "./base-map-shape.js";
2
+ import { type BaseInfo, type BaseMapShapeData } from "./base-map-shape.js";
3
+ import type { Territory } from "./territory.js";
4
4
  export interface BaseDeps {
5
5
  store: BoardStore;
6
6
  commands: CommandRegistry;
7
7
  tile: number;
8
8
  }
9
9
  /** Base id owning the cell at a world point, or null. */
10
- export declare function baseIdAtWorld(owner: OwnerMap, x: number, y: number, tile: number): string | null;
11
- /**
12
- * Connected land region (4-neighbour) starting at a cell — all cells reachable
13
- * without crossing water/empty. `terrainCells` is the tilemap's cells; a cell is
14
- * land when it exists and isn't "water". Returns the cell keys (empty if the
15
- * start isn't land).
16
- */
17
- export declare function landRegionFrom(terrainCells: Cells, startCol: number, startRow: number): string[];
18
- /** Shallow equality of two ownership maps (same keys + base ids). */
19
- export declare function ownersEqual(a: OwnerMap, b: OwnerMap): boolean;
10
+ export declare function baseIdAtWorld(territory: Territory, x: number, y: number, tile: number): string | null;
20
11
  export interface BaseRegionAnchor {
21
12
  baseId: string;
22
13
  name: string;
@@ -27,24 +18,26 @@ export interface BaseRegionAnchor {
27
18
  count: number;
28
19
  }
29
20
  /** One label anchor per base that owns at least one cell. */
30
- export declare function baseRegionAnchors(owner: OwnerMap, bases: Record<string, BaseInfo>, tile: number): BaseRegionAnchor[];
21
+ export declare function baseRegionAnchors(territory: Territory, bases: Record<string, BaseInfo>, tile: number): BaseRegionAnchor[];
31
22
  /** The single shared base-map, creating it (live) if none exists yet. */
32
23
  export declare function resolveBaseMap(store: BoardStore, tile: number): {
33
24
  id: string;
34
25
  created: boolean;
35
26
  };
36
27
  export declare function getBaseMap(store: BoardStore): BaseMapShapeData | undefined;
37
- /** Create a new base (name + color); returns its id. Undoable. */
28
+ /** Create a new base (name + colour, default radius); returns its id. Undoable. */
38
29
  export declare function createBase(deps: BaseDeps, name: string, color: string): string;
39
- /** Live owner snapshot (copy) of the base-map. */
40
- export declare function currentOwner(store: BoardStore, id: string): OwnerMap;
41
- /** Live update (non-undoable) used during a paint stroke. */
42
- export declare function applyOwner(store: BoardStore, id: string, owner: OwnerMap, tile: number): void;
43
- /** Commit an owner change as one undoable command (undo restores `prevOwner`). */
44
- export declare function commitOwner(deps: BaseDeps, id: string, prevOwner: OwnerMap): void;
45
30
  /**
46
- * Assign the connected land region (island) under a world point to a base, as
47
- * one undoable command. No-op if there's no tilemap or the point isn't land.
31
+ * Make `iconId` the (single) beacon of `baseId`. Enforces 1:1 — the base's prior
32
+ * beacon icon and any other base that referenced `iconId` are detached. Records
33
+ * `meta.baseId` on the involved icons for the radius ring. Undoable. No-op if the
34
+ * base or icon is missing, or the icon is already this base's beacon.
35
+ */
36
+ export declare function setBeacon(deps: BaseDeps, iconId: string, baseId: string): void;
37
+ /**
38
+ * Remove a base from the registry (its derived territory disappears). Also clears
39
+ * `meta.baseId` on the base's beacon icon, if any — the icon itself is kept.
40
+ * Undoable. No-op if the base doesn't exist.
48
41
  */
49
- export declare function assignIsland(deps: BaseDeps, x: number, y: number, baseId: string): void;
42
+ export declare function deleteBase(deps: BaseDeps, baseId: string): void;
50
43
  //# sourceMappingURL=base-ops.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-ops.d.ts","sourceRoot":"","sources":["../../src/base/base-ops.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAW,eAAe,EAAa,MAAM,uBAAuB,CAAC;AAE7F,OAAO,EAAE,KAAK,KAAK,EAAsC,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EACN,KAAK,QAAQ,EACb,KAAK,gBAAgB,EAGrB,KAAK,QAAQ,EAEb,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACb;AAID,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhG;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBhG;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAK7D;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACd;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/B,IAAI,EAAE,MAAM,GACV,gBAAgB,EAAE,CA+BpB;AAID,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAOhG;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAG1E;AAOD,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAY9E;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,CAGpE;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7F;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,IAAI,CAYjF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBvF"}
1
+ {"version":3,"file":"base-ops.d.ts","sourceRoot":"","sources":["../../src/base/base-ops.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAW,eAAe,EAAa,MAAM,uBAAuB,CAAC;AAI7F,OAAO,EACN,KAAK,QAAQ,EACb,KAAK,gBAAgB,EAIrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACb;AAID,yDAAyD;AACzD,wBAAgB,aAAa,CAC5B,SAAS,EAAE,SAAS,EACpB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,GACV,MAAM,GAAG,IAAI,CAGf;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACd;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAChC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/B,IAAI,EAAE,MAAM,GACV,gBAAgB,EAAE,CA+BpB;AAID,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAOhG;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAG1E;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAe9E;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA6C9E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoC/D"}
@@ -1,64 +1,17 @@
1
1
  import { generateId } from "@edv4h/usketch-shared";
2
2
  import { cellKey, parseCellKey, worldToCell } from "../autotile.js";
3
- import { isTileMap } from "../tilemap-shape.js";
4
- import { isBaseMap, makeBaseMap, ownerBounds, } from "./base-map-shape.js";
5
- const MAX_ISLAND_CELLS = 100_000; // safety bound for the flood
3
+ import { MAP_ICON_TYPE } from "../map-icon-shape.js";
4
+ import { DEFAULT_BASE_RADIUS, isBaseMap, makeBaseMap, } from "./base-map-shape.js";
6
5
  // ── Pure ─────────────────────────────────────────────────────────────────────
7
6
  /** Base id owning the cell at a world point, or null. */
8
- export function baseIdAtWorld(owner, x, y, tile) {
7
+ export function baseIdAtWorld(territory, x, y, tile) {
9
8
  const [c, r] = worldToCell(x, y, tile);
10
- return owner[cellKey(c, r)] ?? null;
11
- }
12
- /**
13
- * Connected land region (4-neighbour) starting at a cell — all cells reachable
14
- * without crossing water/empty. `terrainCells` is the tilemap's cells; a cell is
15
- * land when it exists and isn't "water". Returns the cell keys (empty if the
16
- * start isn't land).
17
- */
18
- export function landRegionFrom(terrainCells, startCol, startRow) {
19
- const isLand = (c, r) => {
20
- const t = terrainCells[cellKey(c, r)];
21
- return t !== undefined && t !== "water";
22
- };
23
- if (!isLand(startCol, startRow))
24
- return [];
25
- const out = [];
26
- const seen = new Set();
27
- const stack = [[startCol, startRow]];
28
- while (stack.length) {
29
- // Cap hit → the region is too large to own atomically; abort rather than
30
- // assign only a truncated part of the landmass.
31
- if (out.length >= MAX_ISLAND_CELLS)
32
- return [];
33
- const next = stack.pop();
34
- if (!next)
35
- break;
36
- const [c, r] = next;
37
- const key = cellKey(c, r);
38
- if (seen.has(key))
39
- continue;
40
- if (!isLand(c, r))
41
- continue;
42
- seen.add(key);
43
- out.push(key);
44
- stack.push([c + 1, r], [c - 1, r], [c, r + 1], [c, r - 1]);
45
- }
46
- return out;
47
- }
48
- /** Shallow equality of two ownership maps (same keys + base ids). */
49
- export function ownersEqual(a, b) {
50
- const ak = Object.keys(a);
51
- if (ak.length !== Object.keys(b).length)
52
- return false;
53
- for (const k of ak)
54
- if (a[k] !== b[k])
55
- return false;
56
- return true;
9
+ return territory[cellKey(c, r)] ?? null;
57
10
  }
58
11
  /** One label anchor per base that owns at least one cell. */
59
- export function baseRegionAnchors(owner, bases, tile) {
12
+ export function baseRegionAnchors(territory, bases, tile) {
60
13
  const acc = new Map();
61
- for (const [key, baseId] of Object.entries(owner)) {
14
+ for (const [key, baseId] of Object.entries(territory)) {
62
15
  const [c, r] = parseCellKey(key);
63
16
  const a = acc.get(baseId);
64
17
  if (!a)
@@ -94,9 +47,9 @@ export function resolveBaseMap(store, tile) {
94
47
  if (isBaseMap(s))
95
48
  return { id: s.id, created: false };
96
49
  }
97
- const tm = makeBaseMap(tile);
98
- store.addShape(tm);
99
- return { id: tm.id, created: true };
50
+ const bm = makeBaseMap(tile);
51
+ store.addShape(bm);
52
+ return { id: bm.id, created: true };
100
53
  }
101
54
  export function getBaseMap(store) {
102
55
  for (const [, s] of store.getShapes())
@@ -104,19 +57,16 @@ export function getBaseMap(store) {
104
57
  return s;
105
58
  return undefined;
106
59
  }
107
- function findTilemap(store) {
108
- for (const [, s] of store.getShapes())
109
- if (isTileMap(s))
110
- return s;
111
- return undefined;
112
- }
113
- /** Create a new base (name + color); returns its id. Undoable. */
60
+ /** Create a new base (name + colour, default radius); returns its id. Undoable. */
114
61
  export function createBase(deps, name, color) {
115
62
  const { id } = resolveBaseMap(deps.store, deps.tile);
116
63
  const shape = deps.store.getShape(id);
117
64
  const baseId = generateId();
118
65
  const prevBases = { ...(shape?.bases ?? {}) };
119
- const nextBases = { ...prevBases, [baseId]: { name, color } };
66
+ const nextBases = {
67
+ ...prevBases,
68
+ [baseId]: { name, color, radius: DEFAULT_BASE_RADIUS },
69
+ };
120
70
  const command = {
121
71
  execute: () => deps.store.updateShape(id, { bases: nextBases }),
122
72
  undo: () => deps.store.updateShape(id, { bases: prevBases }),
@@ -124,52 +74,102 @@ export function createBase(deps, name, color) {
124
74
  deps.commands.execute(command);
125
75
  return baseId;
126
76
  }
127
- /** Live owner snapshot (copy) of the base-map. */
128
- export function currentOwner(store, id) {
129
- const s = store.getShape(id);
130
- return s ? { ...s.owner } : {};
131
- }
132
- /** Live update (non-undoable) used during a paint stroke. */
133
- export function applyOwner(store, id, owner, tile) {
134
- store.updateShape(id, { owner, ...ownerBounds(owner, tile) });
135
- }
136
- /** Commit an owner change as one undoable command (undo restores `prevOwner`). */
137
- export function commitOwner(deps, id, prevOwner) {
77
+ /**
78
+ * Make `iconId` the (single) beacon of `baseId`. Enforces 1:1 — the base's prior
79
+ * beacon icon and any other base that referenced `iconId` are detached. Records
80
+ * `meta.baseId` on the involved icons for the radius ring. Undoable. No-op if the
81
+ * base or icon is missing, or the icon is already this base's beacon.
82
+ */
83
+ export function setBeacon(deps, iconId, baseId) {
84
+ const { id } = resolveBaseMap(deps.store, deps.tile);
138
85
  const shape = deps.store.getShape(id);
139
- const nextOwner = { ...(shape?.owner ?? {}) };
140
- if (ownersEqual(prevOwner, nextOwner))
141
- return; // no change → no undo entry
142
- const prev = prevOwner;
143
- const prevB = ownerBounds(prev, deps.tile);
144
- const nextB = ownerBounds(nextOwner, deps.tile);
86
+ const base = shape?.bases[baseId];
87
+ if (!shape || !base)
88
+ return;
89
+ const icon = deps.store.getShape(iconId);
90
+ if (!icon || icon.type !== MAP_ICON_TYPE)
91
+ return;
92
+ if (base.beaconIconId === iconId)
93
+ return; // no change
94
+ const prevBases = shape.bases;
95
+ const prevBeaconId = base.beaconIconId;
96
+ // New registry: set this base's beacon, and clear `iconId` from any other base.
97
+ const nextBases = {};
98
+ for (const [bid, info] of Object.entries(prevBases)) {
99
+ if (bid === baseId)
100
+ nextBases[bid] = { ...info, beaconIconId: iconId };
101
+ else if (info.beaconIconId === iconId)
102
+ nextBases[bid] = { ...info, beaconIconId: undefined };
103
+ else
104
+ nextBases[bid] = info;
105
+ }
106
+ // Icon meta edits: link the new beacon; unlink the base's previous beacon.
107
+ const edits = [
108
+ { id: iconId, prev: icon.meta, next: { ...icon.meta, baseId } },
109
+ ];
110
+ if (prevBeaconId && prevBeaconId !== iconId) {
111
+ const prevIcon = deps.store.getShape(prevBeaconId);
112
+ if (prevIcon) {
113
+ edits.push({
114
+ id: prevBeaconId,
115
+ prev: prevIcon.meta,
116
+ next: { ...prevIcon.meta, baseId: undefined },
117
+ });
118
+ }
119
+ }
145
120
  const command = {
146
- execute: () => deps.store.updateShape(id, { owner: nextOwner, ...nextB }),
147
- undo: () => deps.store.updateShape(id, { owner: prev, ...prevB }),
121
+ execute: () => {
122
+ deps.store.updateShape(id, { bases: nextBases });
123
+ for (const e of edits)
124
+ deps.store.updateShape(e.id, { meta: e.next });
125
+ },
126
+ undo: () => {
127
+ deps.store.updateShape(id, { bases: prevBases });
128
+ for (const e of edits)
129
+ deps.store.updateShape(e.id, { meta: e.prev });
130
+ },
148
131
  };
149
132
  deps.commands.execute(command);
150
133
  }
151
134
  /**
152
- * Assign the connected land region (island) under a world point to a base, as
153
- * one undoable command. No-op if there's no tilemap or the point isn't land.
135
+ * Remove a base from the registry (its derived territory disappears). Also clears
136
+ * `meta.baseId` on the base's beacon icon, if any — the icon itself is kept.
137
+ * Undoable. No-op if the base doesn't exist.
154
138
  */
155
- export function assignIsland(deps, x, y, baseId) {
156
- const tilemap = findTilemap(deps.store);
157
- if (!tilemap)
158
- return;
159
- const [c, r] = worldToCell(x, y, tilemap.tile ?? deps.tile);
160
- const keys = landRegionFrom(tilemap.cells, c, r);
161
- if (keys.length === 0)
162
- return;
139
+ export function deleteBase(deps, baseId) {
163
140
  const { id } = resolveBaseMap(deps.store, deps.tile);
164
- const prev = currentOwner(deps.store, id);
165
- const next = { ...prev };
166
- for (const k of keys)
167
- next[k] = baseId;
168
- const prevB = ownerBounds(prev, deps.tile);
169
- const nextB = ownerBounds(next, deps.tile);
141
+ const shape = deps.store.getShape(id);
142
+ const base = shape?.bases[baseId];
143
+ if (!shape || !base)
144
+ return;
145
+ const prevBases = shape.bases;
146
+ const nextBases = {};
147
+ for (const [bid, info] of Object.entries(prevBases)) {
148
+ if (bid !== baseId)
149
+ nextBases[bid] = info;
150
+ }
151
+ const edits = [];
152
+ if (base.beaconIconId) {
153
+ const icon = deps.store.getShape(base.beaconIconId);
154
+ if (icon && icon.type === MAP_ICON_TYPE) {
155
+ edits.push({
156
+ id: base.beaconIconId,
157
+ prev: icon.meta,
158
+ next: { ...icon.meta, baseId: undefined },
159
+ });
160
+ }
161
+ }
170
162
  const command = {
171
- execute: () => deps.store.updateShape(id, { owner: next, ...nextB }),
172
- undo: () => deps.store.updateShape(id, { owner: prev, ...prevB }),
163
+ execute: () => {
164
+ deps.store.updateShape(id, { bases: nextBases });
165
+ for (const e of edits)
166
+ deps.store.updateShape(e.id, { meta: e.next });
167
+ },
168
+ undo: () => {
169
+ deps.store.updateShape(id, { bases: prevBases });
170
+ for (const e of edits)
171
+ deps.store.updateShape(e.id, { meta: e.prev });
172
+ },
173
173
  };
174
174
  deps.commands.execute(command);
175
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-ops.js","sourceRoot":"","sources":["../../src/base/base-ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-ops.js","sourceRoot":"","sources":["../../src/base/base-ops.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- export type BaseMode = "assign" | "erase" | "island";
1
+ import type { TerrainKey } from "../terrain.js";
2
2
  export interface BaseToolState {
3
3
  /** Currently selected base id, or null when none is chosen yet. */
4
4
  activeBaseId: string | null;
5
- mode: BaseMode;
5
+ /** Terrains that block territory growth (e.g. water). Global for all bases. */
6
+ excludeTerrains: TerrainKey[];
6
7
  }
7
8
  export declare const baseStateStore: import("../reactive-store.js").ReactiveStore<BaseToolState>;
8
9
  export declare function useBaseState(): BaseToolState;
@@ -1 +1 @@
1
- {"version":3,"file":"base-state.d.ts","sourceRoot":"","sources":["../../src/base/base-state.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,aAAa;IAC7B,mEAAmE;IACnE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,QAAQ,CAAC;CACf;AAED,eAAO,MAAM,cAAc,6DAGzB,CAAC;AAEH,wBAAgB,YAAY,IAAI,aAAa,CAE5C"}
1
+ {"version":3,"file":"base-state.d.ts","sourceRoot":"","sources":["../../src/base/base-state.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC7B,mEAAmE;IACnE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+EAA+E;IAC/E,eAAe,EAAE,UAAU,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,6DAGzB,CAAC;AAEH,wBAAgB,YAAY,IAAI,aAAa,CAE5C"}