@edv4h/usketch-plugin-map 0.11.1 → 0.13.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.
- package/dist/base/base-icon-layer.d.ts +9 -0
- package/dist/base/base-icon-layer.d.ts.map +1 -0
- package/dist/base/base-icon-layer.js +55 -0
- package/dist/base/base-icon-layer.js.map +1 -0
- package/dist/base/base-icon.d.ts +15 -0
- package/dist/base/base-icon.d.ts.map +1 -0
- package/dist/base/base-icon.js +22 -0
- package/dist/base/base-icon.js.map +1 -0
- package/dist/base/base-layer.d.ts +1 -1
- package/dist/base/base-layer.d.ts.map +1 -1
- package/dist/base/base-layer.js +29 -124
- package/dist/base/base-layer.js.map +1 -1
- package/dist/base/base-map-shape.d.ts +4 -0
- package/dist/base/base-map-shape.d.ts.map +1 -1
- package/dist/base/base-map-shape.js.map +1 -1
- package/dist/base/base-ops.d.ts +42 -0
- package/dist/base/base-ops.d.ts.map +1 -1
- package/dist/base/base-ops.js +110 -1
- package/dist/base/base-ops.js.map +1 -1
- package/dist/base/enter-banner.d.ts +4 -1
- package/dist/base/enter-banner.d.ts.map +1 -1
- package/dist/base/enter-banner.js +6 -42
- package/dist/base/enter-banner.js.map +1 -1
- package/dist/base/territory-style.d.ts +49 -38
- package/dist/base/territory-style.d.ts.map +1 -1
- package/dist/base/territory-style.js +8 -26
- package/dist/base/territory-style.js.map +1 -1
- package/dist/hud/register-map-hud.d.ts.map +1 -1
- package/dist/hud/register-map-hud.js +29 -20
- package/dist/hud/register-map-hud.js.map +1 -1
- package/dist/icon-render.d.ts.map +1 -1
- package/dist/icon-render.js +6 -1
- package/dist/icon-render.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/map-tool.d.ts.map +1 -1
- package/dist/map-tool.js +17 -48
- package/dist/map-tool.js.map +1 -1
- package/dist/plugin.d.ts +4 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +26 -18
- package/dist/plugin.js.map +1 -1
- package/dist/tool-state.d.ts +1 -3
- package/dist/tool-state.d.ts.map +1 -1
- package/dist/tool-state.js +1 -10
- package/dist/tool-state.js.map +1 -1
- package/package.json +4 -3
- package/dist/icons.d.ts +0 -17
- package/dist/icons.d.ts.map +0 -1
- package/dist/icons.js +0 -949
- package/dist/icons.js.map +0 -1
- package/dist/map-icon-layer.d.ts +0 -9
- package/dist/map-icon-layer.d.ts.map +0 -1
- package/dist/map-icon-layer.js +0 -55
- package/dist/map-icon-layer.js.map +0 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BoardStore, RenderMode } from "@edv4h/usketch-shared";
|
|
2
|
+
/** Distinct id so it doesn't collide with the terrain layer's wobble filter. */
|
|
3
|
+
export declare const BASE_ICON_WOBBLE_FILTER_ID = "uskmap-base-icon-wobble";
|
|
4
|
+
export declare function BaseIconLayer({ store, renderMode: _renderMode, tile: defaultTile, }: {
|
|
5
|
+
store: BoardStore;
|
|
6
|
+
renderMode?: RenderMode;
|
|
7
|
+
tile: number;
|
|
8
|
+
}): import("react").JSX.Element | null;
|
|
9
|
+
//# sourceMappingURL=base-icon-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-icon-layer.d.ts","sourceRoot":"","sources":["../../src/base/base-icon-layer.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWpE,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,4BAA4B,CAAC;AAEpE,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,UAAU,EAAE,WAAW,EACvB,IAAI,EAAE,WAAW,GACjB,EAAE;IACF,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACb,sCAuEA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { parseCellKey } from "../autotile.js";
|
|
4
|
+
import { renderIconAt } from "../icon-render.js";
|
|
5
|
+
import { visibleCellRange, visibleWorldRect } from "../map-layer.js";
|
|
6
|
+
import { terrainCssVars } from "../palette.js";
|
|
7
|
+
import { renderConfigStore } from "../render-config.js";
|
|
8
|
+
import { effectiveBaseIcon } from "./base-icon.js";
|
|
9
|
+
import { getBaseMap } from "./base-ops.js";
|
|
10
|
+
/** Distinct id so it doesn't collide with the terrain layer's wobble filter. */
|
|
11
|
+
export const BASE_ICON_WOBBLE_FILTER_ID = "uskmap-base-icon-wobble";
|
|
12
|
+
export function BaseIconLayer({ store, renderMode: _renderMode, tile: defaultTile, }) {
|
|
13
|
+
// RAF-coalesced re-render on board + render-config changes (same as terrain).
|
|
14
|
+
const [, force] = useState(0);
|
|
15
|
+
const rafRef = useRef(0);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const rerender = () => {
|
|
18
|
+
cancelAnimationFrame(rafRef.current);
|
|
19
|
+
rafRef.current = requestAnimationFrame(() => force((n) => n + 1));
|
|
20
|
+
};
|
|
21
|
+
const u1 = store.subscribe(rerender);
|
|
22
|
+
const u2 = renderConfigStore.subscribe(rerender);
|
|
23
|
+
return () => {
|
|
24
|
+
u1();
|
|
25
|
+
u2();
|
|
26
|
+
cancelAnimationFrame(rafRef.current);
|
|
27
|
+
};
|
|
28
|
+
}, [store]);
|
|
29
|
+
const base = getBaseMap(store);
|
|
30
|
+
if (!base)
|
|
31
|
+
return null;
|
|
32
|
+
const tile = base.tile ?? defaultTile;
|
|
33
|
+
const cfg = renderConfigStore.get();
|
|
34
|
+
const vp = store.getViewport();
|
|
35
|
+
const cssVars = terrainCssVars(cfg.colorMode, cfg.strokeScale);
|
|
36
|
+
const visible = visibleWorldRect(store);
|
|
37
|
+
const range = visibleCellRange(visible, tile);
|
|
38
|
+
const nodes = [];
|
|
39
|
+
for (const [baseId, info] of Object.entries(base.bases)) {
|
|
40
|
+
if (!info.beaconCell)
|
|
41
|
+
continue;
|
|
42
|
+
const [c, r] = parseCellKey(info.beaconCell);
|
|
43
|
+
// Cull to the visible cell range when known (bases are sparse, so this keeps
|
|
44
|
+
// a huge panned world cheap).
|
|
45
|
+
if (range && (c < range.c0 || c > range.c1 || r < range.r0 || r > range.r1))
|
|
46
|
+
continue;
|
|
47
|
+
const node = renderIconAt(effectiveBaseIcon(info), c, r, tile, `base-${baseId}-`);
|
|
48
|
+
if (node)
|
|
49
|
+
nodes.push(node);
|
|
50
|
+
}
|
|
51
|
+
if (nodes.length === 0)
|
|
52
|
+
return null;
|
|
53
|
+
return (_jsx("div", { style: { position: "absolute", inset: 0, pointerEvents: "none", overflow: "hidden" }, children: _jsxs("svg", { width: "100%", height: "100%", style: { display: "block", overflow: "visible" }, children: [_jsx("defs", { children: _jsxs("filter", { id: BASE_ICON_WOBBLE_FILTER_ID, children: [_jsx("feTurbulence", { type: "fractalNoise", baseFrequency: "0.014", numOctaves: "2", seed: "7", result: "n" }), _jsx("feDisplacementMap", { in: "SourceGraphic", in2: "n", scale: "2.1", xChannelSelector: "R", yChannelSelector: "G" })] }) }), _jsx("g", { style: cssVars, transform: `translate(${vp.x} ${vp.y}) scale(${vp.zoom})`, filter: cfg.lineStyle === "wobble" ? `url(#${BASE_ICON_WOBBLE_FILTER_ID})` : undefined, children: nodes })] }) }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=base-icon-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-icon-layer.js","sourceRoot":"","sources":["../../src/base/base-icon-layer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BaseInfo } from "./base-map-shape.js";
|
|
2
|
+
/**
|
|
3
|
+
* Radius → default settlement icon, ascending by `maxRadius`. The last entry is
|
|
4
|
+
* the cap (its `maxRadius` is Infinity), so every radius resolves. Keys are ICONS
|
|
5
|
+
* entries; the tiers are intentionally coarse (tent → town → castle).
|
|
6
|
+
*/
|
|
7
|
+
export declare const BASE_ICON_TIERS: readonly {
|
|
8
|
+
maxRadius: number;
|
|
9
|
+
icon: string;
|
|
10
|
+
}[];
|
|
11
|
+
/** Default icon for a base of the given radius (its settlement tier). */
|
|
12
|
+
export declare function baseIconFor(radius: number): string;
|
|
13
|
+
/** The icon a base actually shows: its explicit override, else the radius tier. */
|
|
14
|
+
export declare function effectiveBaseIcon(info: Pick<BaseInfo, "radius" | "icon">): string;
|
|
15
|
+
//# sourceMappingURL=base-icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-icon.d.ts","sourceRoot":"","sources":["../../src/base/base-icon.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAIzE,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,MAAM,CAEjF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Radius → default settlement icon, ascending by `maxRadius`. The last entry is
|
|
3
|
+
* the cap (its `maxRadius` is Infinity), so every radius resolves. Keys are ICONS
|
|
4
|
+
* entries; the tiers are intentionally coarse (tent → town → castle).
|
|
5
|
+
*/
|
|
6
|
+
export const BASE_ICON_TIERS = [
|
|
7
|
+
{ maxRadius: 8, icon: "tent" }, // 開拓地 / 野営
|
|
8
|
+
{ maxRadius: 16, icon: "town" }, // 町
|
|
9
|
+
{ maxRadius: Number.POSITIVE_INFINITY, icon: "castle" }, // 都市 / 城
|
|
10
|
+
];
|
|
11
|
+
/** Default icon for a base of the given radius (its settlement tier). */
|
|
12
|
+
export function baseIconFor(radius) {
|
|
13
|
+
for (const t of BASE_ICON_TIERS)
|
|
14
|
+
if (radius <= t.maxRadius)
|
|
15
|
+
return t.icon;
|
|
16
|
+
return BASE_ICON_TIERS[BASE_ICON_TIERS.length - 1].icon;
|
|
17
|
+
}
|
|
18
|
+
/** The icon a base actually shows: its explicit override, else the radius tier. */
|
|
19
|
+
export function effectiveBaseIcon(info) {
|
|
20
|
+
return info.icon ?? baseIconFor(info.radius);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=base-icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-icon.js","sourceRoot":"","sources":["../../src/base/base-icon.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAmD;IAC9E,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW;IAC3C,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI;IACrC,EAAE,SAAS,EAAE,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS;CAClE,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,MAAc;IACzC,KAAK,MAAM,CAAC,IAAI,eAAe;QAAE,IAAI,MAAM,IAAI,CAAC,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IAC1E,OAAO,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,IAAuC;IACxE,OAAO,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { BoardStore, RenderMode } from "@edv4h/usketch-shared";
|
|
2
2
|
import type { ResolvedTerritoryStyle } from "./territory-style.js";
|
|
3
|
-
export declare function BaseAreaLayer({ store, renderMode, style, }: {
|
|
3
|
+
export declare function BaseAreaLayer({ store, renderMode: _renderMode, style, }: {
|
|
4
4
|
store: BoardStore;
|
|
5
5
|
renderMode?: RenderMode;
|
|
6
6
|
style: ResolvedTerritoryStyle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-layer.d.ts","sourceRoot":"","sources":["../../src/base/base-layer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base-layer.d.ts","sourceRoot":"","sources":["../../src/base/base-layer.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAOpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,UAAU,EAAE,WAAW,EACvB,KAAK,GACL,EAAE;IACF,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,EAAE,sBAAsB,CAAC;CAC9B,sCA+EA"}
|
package/dist/base/base-layer.js
CHANGED
|
@@ -1,74 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
|
-
import { exposedEdges, parseCellKey } from "../autotile.js";
|
|
4
|
-
import { blockFactor, downsampleCells, tileDetail } from "../lod.js";
|
|
5
|
-
import { visibleCellRange, visibleWorldRect } from "../map-layer.js";
|
|
6
3
|
import { MAP_TOOL_ID } from "../map-tool-id.js";
|
|
7
4
|
import { useMapToolState } from "../tool-state.js";
|
|
8
|
-
import { baseRegionAnchors, getBaseMap } from "./base-ops.js";
|
|
5
|
+
import { baseRegionAnchors, baseRegions, getBaseMap } from "./base-ops.js";
|
|
9
6
|
import { useBaseState } from "./base-state.js";
|
|
10
7
|
import { computeTerritory } from "./territory.js";
|
|
11
|
-
|
|
12
|
-
function renderFull(owner, bases, tile, visible, style) {
|
|
13
|
-
const nodes = [];
|
|
14
|
-
const asCells = owner; // exposedEdges only compares values
|
|
15
|
-
const bt = style.border.ratio * tile;
|
|
16
|
-
const range = visibleCellRange(visible, tile);
|
|
17
|
-
const emit = (c, r) => {
|
|
18
|
-
const baseId = owner[`${c},${r}`];
|
|
19
|
-
if (!baseId)
|
|
20
|
-
return;
|
|
21
|
-
const color = bases[baseId]?.color;
|
|
22
|
-
if (!color)
|
|
23
|
-
return;
|
|
24
|
-
const x = c * tile;
|
|
25
|
-
const y = r * tile;
|
|
26
|
-
nodes.push(_jsx("rect", { x: x, y: y, width: tile, height: tile, fill: color, fillOpacity: style.fillOpacity }, `${c},${r}:f`));
|
|
27
|
-
const edge = exposedEdges(asCells, c, r);
|
|
28
|
-
const strip = (sx, sy, sw, sh, k) => (_jsx("rect", { x: sx, y: sy, width: sw, height: sh, fill: color, fillOpacity: style.border.opacity }, k));
|
|
29
|
-
if (edge.n)
|
|
30
|
-
nodes.push(strip(x, y, tile, bt, `${c},${r}:n`));
|
|
31
|
-
if (edge.s)
|
|
32
|
-
nodes.push(strip(x, y + tile - bt, tile, bt, `${c},${r}:s`));
|
|
33
|
-
if (edge.w)
|
|
34
|
-
nodes.push(strip(x, y, bt, tile, `${c},${r}:w`));
|
|
35
|
-
if (edge.e)
|
|
36
|
-
nodes.push(strip(x + tile - bt, y, bt, tile, `${c},${r}:e`));
|
|
37
|
-
};
|
|
38
|
-
if (range) {
|
|
39
|
-
for (let r = range.r0; r <= range.r1; r++)
|
|
40
|
-
for (let c = range.c0; c <= range.c1; c++)
|
|
41
|
-
emit(c, r);
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
for (const key of Object.keys(owner)) {
|
|
45
|
-
const [c, r] = parseCellKey(key);
|
|
46
|
-
emit(c, r);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return nodes;
|
|
50
|
-
}
|
|
51
|
-
/** Coarse tier: flat translucent blocks (downsampled by owning base). */
|
|
52
|
-
function renderCoarse(owner, bases, tile, screenTilePx, visible, fillOpacity) {
|
|
53
|
-
const factor = blockFactor(screenTilePx);
|
|
54
|
-
const bt = factor * tile;
|
|
55
|
-
const nodes = [];
|
|
56
|
-
for (const [bk, baseId] of Object.entries(downsampleCells(owner, factor))) {
|
|
57
|
-
const color = bases[baseId]?.color;
|
|
58
|
-
if (!color)
|
|
59
|
-
continue;
|
|
60
|
-
const [bc, br] = parseCellKey(bk);
|
|
61
|
-
const x = bc * bt;
|
|
62
|
-
const y = br * bt;
|
|
63
|
-
if (visible &&
|
|
64
|
-
(x > visible.right || y > visible.bottom || x + bt < visible.left || y + bt < visible.top)) {
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
nodes.push(_jsx("rect", { x: x, y: y, width: bt, height: bt, fill: color, fillOpacity: fillOpacity }, bk));
|
|
68
|
-
}
|
|
69
|
-
return nodes;
|
|
70
|
-
}
|
|
71
|
-
export function BaseAreaLayer({ store, renderMode, style, }) {
|
|
8
|
+
export function BaseAreaLayer({ store, renderMode: _renderMode, style, }) {
|
|
72
9
|
const tool = useMapToolState();
|
|
73
10
|
const baseState = useBaseState();
|
|
74
11
|
const [, force] = useState(0);
|
|
@@ -84,10 +21,10 @@ export function BaseAreaLayer({ store, renderMode, style, }) {
|
|
|
84
21
|
cancelAnimationFrame(rafRef.current);
|
|
85
22
|
};
|
|
86
23
|
}, [store]);
|
|
87
|
-
// By default territory
|
|
24
|
+
// By default territory is only shown while editing bases (map tool + base
|
|
88
25
|
// submode) — mirrors the EnterBanner indicator gating. Hosts can opt into
|
|
89
|
-
// `show: "always"
|
|
90
|
-
//
|
|
26
|
+
// `show: "always"`. Check mode first so base-mode gating skips the shape scan
|
|
27
|
+
// in getBaseMap on every non-base-mode re-render.
|
|
91
28
|
const inBaseMode = store.getActiveToolId() === MAP_TOOL_ID && tool.mode === "base";
|
|
92
29
|
if (style.show === "base-mode" && !inBaseMode)
|
|
93
30
|
return null;
|
|
@@ -99,67 +36,35 @@ export function BaseAreaLayer({ store, renderMode, style, }) {
|
|
|
99
36
|
const territory = computeTerritory(store, tile, new Set(baseState.excludeTerrains));
|
|
100
37
|
if (Object.keys(territory).length === 0)
|
|
101
38
|
return null;
|
|
39
|
+
const regionRender = style.region.render;
|
|
40
|
+
const labelRender = style.label.render;
|
|
41
|
+
if (!regionRender && !labelRender)
|
|
42
|
+
return null; // headless: nothing to draw
|
|
102
43
|
const vp = store.getViewport();
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const anchors = detail === "full" && style.label.enabled ? baseRegionAnchors(territory, base.bases, tile) : [];
|
|
112
|
-
// Radius rings around each base's beacon CELL. Full detail only; radius + colour
|
|
113
|
-
// come from the base registry (no icon shapes involved anymore).
|
|
114
|
-
const rings = [];
|
|
115
|
-
if (detail === "full" && style.ring.enabled) {
|
|
116
|
-
for (const [baseId, info] of Object.entries(base.bases)) {
|
|
117
|
-
if (!info.beaconCell)
|
|
118
|
-
continue;
|
|
119
|
-
const [col, row] = parseCellKey(info.beaconCell);
|
|
120
|
-
rings.push(_jsx("circle", { cx: (col + 0.5) * tile, cy: (row + 0.5) * tile, r: info.radius * tile, fill: "none", stroke: info.color, strokeWidth: style.ring.strokeWidth, strokeDasharray: style.ring.dash, opacity: style.ring.opacity, vectorEffect: "non-scaling-stroke" }, `ring-${baseId}`));
|
|
44
|
+
// Area: host draws each region in WORLD coords; the layer applies the viewport
|
|
45
|
+
// transform (so it gets follow + z-order + gating for free).
|
|
46
|
+
const worldNodes = [];
|
|
47
|
+
if (regionRender) {
|
|
48
|
+
for (const region of baseRegions(territory, base.bases, tile)) {
|
|
49
|
+
const node = regionRender(region);
|
|
50
|
+
if (node != null)
|
|
51
|
+
worldNodes.push(_jsx("g", { children: node }, `region-${region.baseId}`));
|
|
121
52
|
}
|
|
122
53
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
return null;
|
|
132
|
-
return (_jsx("div", { style: {
|
|
133
|
-
position: "absolute",
|
|
134
|
-
left,
|
|
135
|
-
top,
|
|
136
|
-
transform: "translate(-50%,-50%)",
|
|
137
|
-
pointerEvents: "none",
|
|
138
|
-
}, children: custom }, a.baseId));
|
|
139
|
-
}
|
|
140
|
-
return (_jsxs("div", { style: {
|
|
54
|
+
// Labels: host draws the content; the layer positions it at the region centre
|
|
55
|
+
// (screen coords, so it stays crisp + constant size).
|
|
56
|
+
const anchors = labelRender ? baseRegionAnchors(territory, base.bases, tile) : [];
|
|
57
|
+
return (_jsxs("div", { style: { position: "absolute", inset: 0, pointerEvents: "none", overflow: "hidden" }, children: [worldNodes.length > 0 ? (_jsx("svg", { width: "100%", height: "100%", style: { display: "block", overflow: "visible" }, children: _jsx("g", { transform: `translate(${vp.x} ${vp.y}) scale(${vp.zoom})`, children: worldNodes }) })) : null, anchors.map((a) => {
|
|
58
|
+
const content = labelRender?.(a);
|
|
59
|
+
if (content == null)
|
|
60
|
+
return null;
|
|
61
|
+
return (_jsx("div", { style: {
|
|
141
62
|
position: "absolute",
|
|
142
|
-
left,
|
|
143
|
-
top,
|
|
63
|
+
left: a.x * vp.zoom + vp.x,
|
|
64
|
+
top: a.y * vp.zoom + vp.y,
|
|
144
65
|
transform: "translate(-50%,-50%)",
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
gap: 5,
|
|
148
|
-
padding: "3px 9px",
|
|
149
|
-
background: "rgba(255,255,255,.9)",
|
|
150
|
-
border: `2px solid ${a.color}`,
|
|
151
|
-
borderRadius: 20,
|
|
152
|
-
font: "700 12px system-ui, sans-serif",
|
|
153
|
-
color: "#1c1c1c",
|
|
154
|
-
whiteSpace: "nowrap",
|
|
155
|
-
boxShadow: "0 2px 8px rgba(0,0,0,.14)",
|
|
156
|
-
}, children: [_jsx("span", { style: {
|
|
157
|
-
width: 10,
|
|
158
|
-
height: 10,
|
|
159
|
-
borderRadius: "50%",
|
|
160
|
-
background: a.color,
|
|
161
|
-
flex: "none",
|
|
162
|
-
} }), a.name] }, a.baseId));
|
|
66
|
+
pointerEvents: "none",
|
|
67
|
+
}, children: content }, a.baseId));
|
|
163
68
|
})] }));
|
|
164
69
|
}
|
|
165
70
|
//# sourceMappingURL=base-layer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-layer.js","sourceRoot":"","sources":["../../src/base/base-layer.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"base-layer.js","sourceRoot":"","sources":["../../src/base/base-layer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,10 @@ export interface BaseInfo {
|
|
|
8
8
|
/** The single beacon: the grid cell (`cellKey("c,r")`) whose centre seeds this
|
|
9
9
|
* base's core disk. Undefined until the user places a beacon in base mode. */
|
|
10
10
|
beaconCell?: string;
|
|
11
|
+
/** Optional landmark-icon override (an ICONS key). When unset, the base shows
|
|
12
|
+
* the icon DERIVED from its `radius` tier (see base-icon.ts) — so a base is
|
|
13
|
+
* always its own landmark, no separate stamped icon needed. */
|
|
14
|
+
icon?: string;
|
|
11
15
|
}
|
|
12
16
|
export declare const DEFAULT_BASE_RADIUS = 5;
|
|
13
17
|
export interface BaseMapShapeData extends ShapeData {
|
|
@@ -1 +1 @@
|
|
|
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;mFAC+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
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;mFAC+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;oEAEgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;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 +1 @@
|
|
|
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;
|
|
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;AAgBxC,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"}
|
package/dist/base/base-ops.d.ts
CHANGED
|
@@ -19,6 +19,42 @@ export interface BaseRegionAnchor {
|
|
|
19
19
|
}
|
|
20
20
|
/** One label anchor per base that owns at least one cell. */
|
|
21
21
|
export declare function baseRegionAnchors(territory: Territory, bases: Record<string, BaseInfo>, tile: number): BaseRegionAnchor[];
|
|
22
|
+
/** A whole base region + the geometry a host needs to draw it (for the
|
|
23
|
+
* `territory.region.render` hook). Superset of BaseRegionAnchor. */
|
|
24
|
+
export interface TerritoryRegion {
|
|
25
|
+
baseId: string;
|
|
26
|
+
name: string;
|
|
27
|
+
color: string;
|
|
28
|
+
/** Owned cell keys (`"c,r"`). */
|
|
29
|
+
cells: string[];
|
|
30
|
+
tile: number;
|
|
31
|
+
/** World bbox enclosing the owned cells. */
|
|
32
|
+
bounds: {
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
};
|
|
38
|
+
/** Region centre in world coords (same point as BaseRegionAnchor). */
|
|
39
|
+
anchor: {
|
|
40
|
+
x: number;
|
|
41
|
+
y: number;
|
|
42
|
+
};
|
|
43
|
+
count: number;
|
|
44
|
+
/** Beacon cell + radius, for drawing the radius ring (beacon may be unset). */
|
|
45
|
+
beaconCell?: string;
|
|
46
|
+
radius: number;
|
|
47
|
+
/** SVG path (world coords) tracing the region's EXPOSED border edges — a
|
|
48
|
+
* neighbour not owned by the same base. Handy for a custom border stroke;
|
|
49
|
+
* empty when the region has no cells. */
|
|
50
|
+
outline: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Group the derived territory into one region per base, carrying the full geometry
|
|
54
|
+
* (cells, bbox, centre, beacon ring, exposed-edge path) a host needs to draw it.
|
|
55
|
+
* Like baseRegionAnchors, but the whole region — powers `territory.region.render`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function baseRegions(territory: Territory, bases: Record<string, BaseInfo>, tile: number): TerritoryRegion[];
|
|
22
58
|
/** The single shared base-map, creating it (live) if none exists yet. */
|
|
23
59
|
export declare function resolveBaseMap(store: BoardStore, tile: number): {
|
|
24
60
|
id: string;
|
|
@@ -33,6 +69,12 @@ export declare function createBase(deps: BaseDeps, name: string, color: string):
|
|
|
33
69
|
* is missing or is already beaconed at `cell`.
|
|
34
70
|
*/
|
|
35
71
|
export declare function setBeacon(deps: BaseDeps, cell: string, baseId: string): void;
|
|
72
|
+
/** Set the active base's territory radius (in tiles). Clamped to >= 1. Undoable.
|
|
73
|
+
* No-op if the base is missing or the radius is unchanged. */
|
|
74
|
+
export declare function setBaseRadius(deps: BaseDeps, baseId: string, radius: number): void;
|
|
75
|
+
/** Override the base's landmark icon (an ICONS key), or `null` to fall back to the
|
|
76
|
+
* radius-derived tier. Undoable. No-op if the base is missing or unchanged. */
|
|
77
|
+
export declare function setBaseIcon(deps: BaseDeps, baseId: string, icon: string | null): void;
|
|
36
78
|
/**
|
|
37
79
|
* Remove a base from the registry (its derived territory disappears). Undoable.
|
|
38
80
|
* No-op if the base doesn't exist.
|
|
@@ -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;AAG7F,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;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAqB5E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiB/D"}
|
|
1
|
+
{"version":3,"file":"base-ops.d.ts","sourceRoot":"","sources":["../../src/base/base-ops.ts"],"names":[],"mappings":"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"}
|
package/dist/base/base-ops.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { generateId } from "@edv4h/usketch-shared";
|
|
2
|
-
import { cellKey, parseCellKey, worldToCell } from "../autotile.js";
|
|
2
|
+
import { cellKey, exposedEdges, parseCellKey, worldToCell } from "../autotile.js";
|
|
3
3
|
import { DEFAULT_BASE_RADIUS, isBaseMap, makeBaseMap, } from "./base-map-shape.js";
|
|
4
4
|
// ── Pure ─────────────────────────────────────────────────────────────────────
|
|
5
5
|
/** Base id owning the cell at a world point, or null. */
|
|
@@ -39,6 +39,70 @@ export function baseRegionAnchors(territory, bases, tile) {
|
|
|
39
39
|
}
|
|
40
40
|
return out;
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Group the derived territory into one region per base, carrying the full geometry
|
|
44
|
+
* (cells, bbox, centre, beacon ring, exposed-edge path) a host needs to draw it.
|
|
45
|
+
* Like baseRegionAnchors, but the whole region — powers `territory.region.render`.
|
|
46
|
+
*/
|
|
47
|
+
export function baseRegions(territory, bases, tile) {
|
|
48
|
+
const acc = new Map();
|
|
49
|
+
for (const [key, baseId] of Object.entries(territory)) {
|
|
50
|
+
const [c, r] = parseCellKey(key);
|
|
51
|
+
const a = acc.get(baseId);
|
|
52
|
+
if (!a)
|
|
53
|
+
acc.set(baseId, { cells: [key], minC: c, minR: r, maxC: c, maxR: r });
|
|
54
|
+
else {
|
|
55
|
+
a.cells.push(key);
|
|
56
|
+
a.minC = Math.min(a.minC, c);
|
|
57
|
+
a.minR = Math.min(a.minR, r);
|
|
58
|
+
a.maxC = Math.max(a.maxC, c);
|
|
59
|
+
a.maxR = Math.max(a.maxR, r);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const asCells = territory; // exposedEdges only compares values
|
|
63
|
+
const out = [];
|
|
64
|
+
for (const [baseId, a] of acc) {
|
|
65
|
+
const info = bases[baseId];
|
|
66
|
+
if (!info)
|
|
67
|
+
continue;
|
|
68
|
+
// Exposed-edge path: a segment per owned-cell side whose neighbour isn't this
|
|
69
|
+
// same base (so region-vs-region and region-vs-empty both count as a border).
|
|
70
|
+
let outline = "";
|
|
71
|
+
for (const key of a.cells) {
|
|
72
|
+
const [c, r] = parseCellKey(key);
|
|
73
|
+
const x = c * tile;
|
|
74
|
+
const y = r * tile;
|
|
75
|
+
const e = exposedEdges(asCells, c, r);
|
|
76
|
+
if (e.n)
|
|
77
|
+
outline += `M${x} ${y}L${x + tile} ${y}`;
|
|
78
|
+
if (e.s)
|
|
79
|
+
outline += `M${x} ${y + tile}L${x + tile} ${y + tile}`;
|
|
80
|
+
if (e.w)
|
|
81
|
+
outline += `M${x} ${y}L${x} ${y + tile}`;
|
|
82
|
+
if (e.e)
|
|
83
|
+
outline += `M${x + tile} ${y}L${x + tile} ${y + tile}`;
|
|
84
|
+
}
|
|
85
|
+
out.push({
|
|
86
|
+
baseId,
|
|
87
|
+
name: info.name,
|
|
88
|
+
color: info.color,
|
|
89
|
+
cells: a.cells,
|
|
90
|
+
tile,
|
|
91
|
+
bounds: {
|
|
92
|
+
x: a.minC * tile,
|
|
93
|
+
y: a.minR * tile,
|
|
94
|
+
width: (a.maxC - a.minC + 1) * tile,
|
|
95
|
+
height: (a.maxR - a.minR + 1) * tile,
|
|
96
|
+
},
|
|
97
|
+
anchor: { x: ((a.minC + a.maxC + 1) / 2) * tile, y: ((a.minR + a.maxR + 1) / 2) * tile },
|
|
98
|
+
count: a.cells.length,
|
|
99
|
+
beaconCell: info.beaconCell,
|
|
100
|
+
radius: info.radius,
|
|
101
|
+
outline,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
42
106
|
// ── Store ops ────────────────────────────────────────────────────────────────
|
|
43
107
|
/** The single shared base-map, creating it (live) if none exists yet. */
|
|
44
108
|
export function resolveBaseMap(store, tile) {
|
|
@@ -103,6 +167,51 @@ export function setBeacon(deps, cell, baseId) {
|
|
|
103
167
|
};
|
|
104
168
|
deps.commands.execute(command);
|
|
105
169
|
}
|
|
170
|
+
/** Set the active base's territory radius (in tiles). Clamped to >= 1. Undoable.
|
|
171
|
+
* No-op if the base is missing or the radius is unchanged. */
|
|
172
|
+
export function setBaseRadius(deps, baseId, radius) {
|
|
173
|
+
const { id } = resolveBaseMap(deps.store, deps.tile);
|
|
174
|
+
const shape = deps.store.getShape(id);
|
|
175
|
+
const base = shape?.bases[baseId];
|
|
176
|
+
if (!shape || !base)
|
|
177
|
+
return;
|
|
178
|
+
if (!Number.isFinite(radius))
|
|
179
|
+
return; // guard "" / undefined from a number input
|
|
180
|
+
const r = Math.max(1, Math.round(radius));
|
|
181
|
+
if (base.radius === r)
|
|
182
|
+
return;
|
|
183
|
+
const prevBases = shape.bases;
|
|
184
|
+
const nextBases = { ...prevBases, [baseId]: { ...base, radius: r } };
|
|
185
|
+
const command = {
|
|
186
|
+
execute: () => deps.store.updateShape(id, { bases: nextBases }),
|
|
187
|
+
undo: () => deps.store.updateShape(id, { bases: prevBases }),
|
|
188
|
+
};
|
|
189
|
+
deps.commands.execute(command);
|
|
190
|
+
}
|
|
191
|
+
/** Override the base's landmark icon (an ICONS key), or `null` to fall back to the
|
|
192
|
+
* radius-derived tier. Undoable. No-op if the base is missing or unchanged. */
|
|
193
|
+
export function setBaseIcon(deps, baseId, icon) {
|
|
194
|
+
const { id } = resolveBaseMap(deps.store, deps.tile);
|
|
195
|
+
const shape = deps.store.getShape(id);
|
|
196
|
+
const base = shape?.bases[baseId];
|
|
197
|
+
if (!shape || !base)
|
|
198
|
+
return;
|
|
199
|
+
const next = icon ?? undefined;
|
|
200
|
+
if (base.icon === next)
|
|
201
|
+
return;
|
|
202
|
+
const nextInfo = { ...base };
|
|
203
|
+
if (next === undefined)
|
|
204
|
+
delete nextInfo.icon;
|
|
205
|
+
else
|
|
206
|
+
nextInfo.icon = next;
|
|
207
|
+
const prevBases = shape.bases;
|
|
208
|
+
const nextBases = { ...prevBases, [baseId]: nextInfo };
|
|
209
|
+
const command = {
|
|
210
|
+
execute: () => deps.store.updateShape(id, { bases: nextBases }),
|
|
211
|
+
undo: () => deps.store.updateShape(id, { bases: prevBases }),
|
|
212
|
+
};
|
|
213
|
+
deps.commands.execute(command);
|
|
214
|
+
}
|
|
106
215
|
/**
|
|
107
216
|
* Remove a base from the registry (its derived territory disappears). Undoable.
|
|
108
217
|
* No-op if the base doesn't exist.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-ops.js","sourceRoot":"","sources":["../../src/base/base-ops.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"base-ops.js","sourceRoot":"","sources":["../../src/base/base-ops.ts"],"names":[],"mappings":"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"}
|