@edv4h/usketch-plugin-map 0.2.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/LICENSE +21 -0
- package/README.md +44 -0
- package/dist/autotile.d.ts +42 -0
- package/dist/autotile.d.ts.map +1 -0
- package/dist/autotile.js +96 -0
- package/dist/autotile.js.map +1 -0
- package/dist/gen-state.d.ts +20 -0
- package/dist/gen-state.d.ts.map +1 -0
- package/dist/gen-state.js +16 -0
- package/dist/gen-state.js.map +1 -0
- package/dist/generate.d.ts +28 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +93 -0
- package/dist/generate.js.map +1 -0
- package/dist/generators/index.d.ts +34 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +138 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/noise.d.ts +6 -0
- package/dist/generators/noise.d.ts.map +1 -0
- package/dist/generators/noise.js +39 -0
- package/dist/generators/noise.js.map +1 -0
- package/dist/generators/rng.d.ts +7 -0
- package/dist/generators/rng.d.ts.map +1 -0
- package/dist/generators/rng.js +31 -0
- package/dist/generators/rng.js.map +1 -0
- package/dist/icons.d.ts +17 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +949 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/lod.d.ts +27 -0
- package/dist/lod.d.ts.map +1 -0
- package/dist/lod.js +73 -0
- package/dist/lod.js.map +1 -0
- package/dist/map-icon-shape.d.ts +14 -0
- package/dist/map-icon-shape.d.ts.map +1 -0
- package/dist/map-icon-shape.js +106 -0
- package/dist/map-icon-shape.js.map +1 -0
- package/dist/map-layer.d.ts +24 -0
- package/dist/map-layer.d.ts.map +1 -0
- package/dist/map-layer.js +167 -0
- package/dist/map-layer.js.map +1 -0
- package/dist/map-tool-id.d.ts +3 -0
- package/dist/map-tool-id.d.ts.map +1 -0
- package/dist/map-tool-id.js +3 -0
- package/dist/map-tool-id.js.map +1 -0
- package/dist/map-tool.d.ts +3 -0
- package/dist/map-tool.d.ts.map +1 -0
- package/dist/map-tool.js +308 -0
- package/dist/map-tool.js.map +1 -0
- package/dist/palette.d.ts +8 -0
- package/dist/palette.d.ts.map +1 -0
- package/dist/palette.js +92 -0
- package/dist/palette.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +137 -0
- package/dist/plugin.js.map +1 -0
- package/dist/range-erase-state.d.ts +9 -0
- package/dist/range-erase-state.d.ts.map +1 -0
- package/dist/range-erase-state.js +12 -0
- package/dist/range-erase-state.js.map +1 -0
- package/dist/range-erase-tool.d.ts +4 -0
- package/dist/range-erase-tool.d.ts.map +1 -0
- package/dist/range-erase-tool.js +58 -0
- package/dist/range-erase-tool.js.map +1 -0
- package/dist/range-erase.d.ts +14 -0
- package/dist/range-erase.d.ts.map +1 -0
- package/dist/range-erase.js +74 -0
- package/dist/range-erase.js.map +1 -0
- package/dist/reactive-store.d.ts +7 -0
- package/dist/reactive-store.d.ts.map +1 -0
- package/dist/reactive-store.js +33 -0
- package/dist/reactive-store.js.map +1 -0
- package/dist/render-config.d.ts +19 -0
- package/dist/render-config.d.ts.map +1 -0
- package/dist/render-config.js +16 -0
- package/dist/render-config.js.map +1 -0
- package/dist/svg-nodes.d.ts +12 -0
- package/dist/svg-nodes.d.ts.map +1 -0
- package/dist/svg-nodes.js +34 -0
- package/dist/svg-nodes.js.map +1 -0
- package/dist/team/enter-banner.d.ts +6 -0
- package/dist/team/enter-banner.d.ts.map +1 -0
- package/dist/team/enter-banner.js +111 -0
- package/dist/team/enter-banner.js.map +1 -0
- package/dist/team/team-layer.d.ts +6 -0
- package/dist/team/team-layer.d.ts.map +1 -0
- package/dist/team/team-layer.js +121 -0
- package/dist/team/team-layer.js.map +1 -0
- package/dist/team/team-map-shape.d.ts +20 -0
- package/dist/team/team-map-shape.d.ts.map +1 -0
- package/dist/team/team-map-shape.js +74 -0
- package/dist/team/team-map-shape.js.map +1 -0
- package/dist/team/team-ops.d.ts +50 -0
- package/dist/team/team-ops.d.ts.map +1 -0
- package/dist/team/team-ops.js +176 -0
- package/dist/team/team-ops.js.map +1 -0
- package/dist/team/team-state.d.ts +9 -0
- package/dist/team/team-state.d.ts.map +1 -0
- package/dist/team/team-state.js +13 -0
- package/dist/team/team-state.js.map +1 -0
- package/dist/terrain.d.ts +15 -0
- package/dist/terrain.d.ts.map +1 -0
- package/dist/terrain.js +309 -0
- package/dist/terrain.js.map +1 -0
- package/dist/tilemap-shape.d.ts +16 -0
- package/dist/tilemap-shape.d.ts.map +1 -0
- package/dist/tilemap-shape.js +77 -0
- package/dist/tilemap-shape.js.map +1 -0
- package/dist/tool-state.d.ts +12 -0
- package/dist/tool-state.d.ts.map +1 -0
- package/dist/tool-state.js +14 -0
- package/dist/tool-state.js.map +1 -0
- package/dist/ui/palette.d.ts +7 -0
- package/dist/ui/palette.d.ts.map +1 -0
- package/dist/ui/palette.js +178 -0
- package/dist/ui/palette.js.map +1 -0
- package/dist/ui/range-erase-palette.d.ts +5 -0
- package/dist/ui/range-erase-palette.d.ts.map +1 -0
- package/dist/ui/range-erase-palette.js +42 -0
- package/dist/ui/range-erase-palette.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { generateId } from "@edv4h/usketch-shared";
|
|
3
|
+
import { cellKey, cellsBounds, parseCellKey } from "../autotile.js";
|
|
4
|
+
import { DEFAULT_TILE } from "../tilemap-shape.js";
|
|
5
|
+
export const TEAM_MAP_TYPE = "team-map";
|
|
6
|
+
export function isTeamMap(shape) {
|
|
7
|
+
return shape.type === TEAM_MAP_TYPE;
|
|
8
|
+
}
|
|
9
|
+
export function makeTeamMap(tile) {
|
|
10
|
+
return {
|
|
11
|
+
id: generateId(),
|
|
12
|
+
type: "team-map",
|
|
13
|
+
x: 0,
|
|
14
|
+
y: 0,
|
|
15
|
+
width: 0,
|
|
16
|
+
height: 0,
|
|
17
|
+
style: { fill: "transparent", stroke: "transparent", strokeWidth: 0, opacity: 1 },
|
|
18
|
+
tile,
|
|
19
|
+
teams: {},
|
|
20
|
+
owner: {},
|
|
21
|
+
locked: true,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
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
|
+
export function createTeamMapShapeDefinition(tile = DEFAULT_TILE) {
|
|
30
|
+
return {
|
|
31
|
+
render: () => _jsx("g", {}),
|
|
32
|
+
renderTarget: "svg",
|
|
33
|
+
getBounds: (data) => {
|
|
34
|
+
const d = data;
|
|
35
|
+
return ownerBounds(d.owner ?? {}, d.tile ?? tile);
|
|
36
|
+
},
|
|
37
|
+
hitTest: () => false,
|
|
38
|
+
resizable: false,
|
|
39
|
+
resize: (data) => data,
|
|
40
|
+
createDefault: (params) => ({ ...makeTeamMap(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, teamId] of Object.entries(d.owner)) {
|
|
50
|
+
const [c, r] = parseCellKey(key);
|
|
51
|
+
next[cellKey(c + dc, r + dr)] = teamId;
|
|
52
|
+
}
|
|
53
|
+
return { owner: next, ...ownerBounds(next, t) };
|
|
54
|
+
},
|
|
55
|
+
serializeForAi: (data) => {
|
|
56
|
+
const d = data;
|
|
57
|
+
return {
|
|
58
|
+
kind: "team-map",
|
|
59
|
+
teamCount: Object.keys(d.teams ?? {}).length,
|
|
60
|
+
ownedCells: Object.keys(d.owner ?? {}).length,
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
debugFields: (data) => {
|
|
64
|
+
const d = data;
|
|
65
|
+
return {
|
|
66
|
+
teams: Object.values(d.teams ?? {})
|
|
67
|
+
.map((t) => t.name)
|
|
68
|
+
.join(", "),
|
|
69
|
+
ownedCells: Object.keys(d.owner ?? {}).length,
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=team-map-shape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-map-shape.js","sourceRoot":"","sources":["../../src/team/team-map-shape.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AAiBxC,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,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,IAAI;KACZ,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,WAAW,CAAC,KAAe,EAAE,IAAY;IACxD,qEAAqE;IACrE,OAAO,WAAW,CAAC,KAA8B,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAI,GAAW,YAAY;IACvE,OAAO;QACN,MAAM,EAAE,GAAG,EAAE,CAAC,aAAK;QACnB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,CAAC,IAAI,EAAe,EAAE;YAChC,MAAM,CAAC,GAAG,IAAwB,CAAC;YACnC,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,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,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAsB,EAAE;YAC1C,MAAM,CAAC,GAAG,IAAwB,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YACpC,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;gBACjC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;YACxC,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,EAAwB,CAAC;QACvE,CAAC;QACD,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,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;aAC7C,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;gBACZ,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;aAC7C,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { BoardStore, CommandRegistry } from "@edv4h/usketch-shared";
|
|
2
|
+
import { type Cells } from "../autotile.js";
|
|
3
|
+
import { type OwnerMap, type TeamInfo, type TeamMapShapeData } from "./team-map-shape.js";
|
|
4
|
+
export interface TeamDeps {
|
|
5
|
+
store: BoardStore;
|
|
6
|
+
commands: CommandRegistry;
|
|
7
|
+
tile: number;
|
|
8
|
+
}
|
|
9
|
+
/** Team id owning the cell at a world point, or null. */
|
|
10
|
+
export declare function teamIdAtWorld(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 + team ids). */
|
|
19
|
+
export declare function ownersEqual(a: OwnerMap, b: OwnerMap): boolean;
|
|
20
|
+
export interface TeamRegionAnchor {
|
|
21
|
+
teamId: string;
|
|
22
|
+
name: string;
|
|
23
|
+
color: string;
|
|
24
|
+
/** Label anchor in world coords (centre of the team's owned-cell bbox). */
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
count: number;
|
|
28
|
+
}
|
|
29
|
+
/** One label anchor per team that owns at least one cell. */
|
|
30
|
+
export declare function teamRegionAnchors(owner: OwnerMap, teams: Record<string, TeamInfo>, tile: number): TeamRegionAnchor[];
|
|
31
|
+
/** The single shared team-map, creating it (live) if none exists yet. */
|
|
32
|
+
export declare function resolveTeamMap(store: BoardStore, tile: number): {
|
|
33
|
+
id: string;
|
|
34
|
+
created: boolean;
|
|
35
|
+
};
|
|
36
|
+
export declare function getTeamMap(store: BoardStore): TeamMapShapeData | undefined;
|
|
37
|
+
/** Create a new team (name + color); returns its id. Undoable. */
|
|
38
|
+
export declare function createTeam(deps: TeamDeps, name: string, color: string): string;
|
|
39
|
+
/** Live owner snapshot (copy) of the team-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: TeamDeps, id: string, prevOwner: OwnerMap): void;
|
|
45
|
+
/**
|
|
46
|
+
* Assign the connected land region (island) under a world point to a team, as
|
|
47
|
+
* one undoable command. No-op if there's no tilemap or the point isn't land.
|
|
48
|
+
*/
|
|
49
|
+
export declare function assignIsland(deps: TeamDeps, x: number, y: number, teamId: string): void;
|
|
50
|
+
//# sourceMappingURL=team-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-ops.d.ts","sourceRoot":"","sources":["../../src/team/team-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,EAGN,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { generateId } from "@edv4h/usketch-shared";
|
|
2
|
+
import { cellKey, parseCellKey, worldToCell } from "../autotile.js";
|
|
3
|
+
import { isTileMap } from "../tilemap-shape.js";
|
|
4
|
+
import { isTeamMap, makeTeamMap, ownerBounds, } from "./team-map-shape.js";
|
|
5
|
+
const MAX_ISLAND_CELLS = 100_000; // safety bound for the flood
|
|
6
|
+
// ── Pure ─────────────────────────────────────────────────────────────────────
|
|
7
|
+
/** Team id owning the cell at a world point, or null. */
|
|
8
|
+
export function teamIdAtWorld(owner, x, y, tile) {
|
|
9
|
+
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 + team 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;
|
|
57
|
+
}
|
|
58
|
+
/** One label anchor per team that owns at least one cell. */
|
|
59
|
+
export function teamRegionAnchors(owner, teams, tile) {
|
|
60
|
+
const acc = new Map();
|
|
61
|
+
for (const [key, teamId] of Object.entries(owner)) {
|
|
62
|
+
const [c, r] = parseCellKey(key);
|
|
63
|
+
const a = acc.get(teamId);
|
|
64
|
+
if (!a)
|
|
65
|
+
acc.set(teamId, { minC: c, minR: r, maxC: c, maxR: r, n: 1 });
|
|
66
|
+
else {
|
|
67
|
+
a.minC = Math.min(a.minC, c);
|
|
68
|
+
a.minR = Math.min(a.minR, r);
|
|
69
|
+
a.maxC = Math.max(a.maxC, c);
|
|
70
|
+
a.maxR = Math.max(a.maxR, r);
|
|
71
|
+
a.n++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const [teamId, a] of acc) {
|
|
76
|
+
const info = teams[teamId];
|
|
77
|
+
if (!info)
|
|
78
|
+
continue;
|
|
79
|
+
out.push({
|
|
80
|
+
teamId,
|
|
81
|
+
name: info.name,
|
|
82
|
+
color: info.color,
|
|
83
|
+
x: ((a.minC + a.maxC + 1) / 2) * tile,
|
|
84
|
+
y: ((a.minR + a.maxR + 1) / 2) * tile,
|
|
85
|
+
count: a.n,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
// ── Store ops ────────────────────────────────────────────────────────────────
|
|
91
|
+
/** The single shared team-map, creating it (live) if none exists yet. */
|
|
92
|
+
export function resolveTeamMap(store, tile) {
|
|
93
|
+
for (const [, s] of store.getShapes()) {
|
|
94
|
+
if (isTeamMap(s))
|
|
95
|
+
return { id: s.id, created: false };
|
|
96
|
+
}
|
|
97
|
+
const tm = makeTeamMap(tile);
|
|
98
|
+
store.addShape(tm);
|
|
99
|
+
return { id: tm.id, created: true };
|
|
100
|
+
}
|
|
101
|
+
export function getTeamMap(store) {
|
|
102
|
+
for (const [, s] of store.getShapes())
|
|
103
|
+
if (isTeamMap(s))
|
|
104
|
+
return s;
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
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 team (name + color); returns its id. Undoable. */
|
|
114
|
+
export function createTeam(deps, name, color) {
|
|
115
|
+
const { id } = resolveTeamMap(deps.store, deps.tile);
|
|
116
|
+
const shape = deps.store.getShape(id);
|
|
117
|
+
const teamId = generateId();
|
|
118
|
+
const prevTeams = { ...(shape?.teams ?? {}) };
|
|
119
|
+
const nextTeams = { ...prevTeams, [teamId]: { name, color } };
|
|
120
|
+
const command = {
|
|
121
|
+
execute: () => deps.store.updateShape(id, { teams: nextTeams }),
|
|
122
|
+
undo: () => deps.store.updateShape(id, { teams: prevTeams }),
|
|
123
|
+
};
|
|
124
|
+
deps.commands.execute(command);
|
|
125
|
+
return teamId;
|
|
126
|
+
}
|
|
127
|
+
/** Live owner snapshot (copy) of the team-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) {
|
|
138
|
+
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);
|
|
145
|
+
const command = {
|
|
146
|
+
execute: () => deps.store.updateShape(id, { owner: nextOwner, ...nextB }),
|
|
147
|
+
undo: () => deps.store.updateShape(id, { owner: prev, ...prevB }),
|
|
148
|
+
};
|
|
149
|
+
deps.commands.execute(command);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Assign the connected land region (island) under a world point to a team, as
|
|
153
|
+
* one undoable command. No-op if there's no tilemap or the point isn't land.
|
|
154
|
+
*/
|
|
155
|
+
export function assignIsland(deps, x, y, teamId) {
|
|
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;
|
|
163
|
+
const { id } = resolveTeamMap(deps.store, deps.tile);
|
|
164
|
+
const prev = currentOwner(deps.store, id);
|
|
165
|
+
const next = { ...prev };
|
|
166
|
+
for (const k of keys)
|
|
167
|
+
next[k] = teamId;
|
|
168
|
+
const prevB = ownerBounds(prev, deps.tile);
|
|
169
|
+
const nextB = ownerBounds(next, deps.tile);
|
|
170
|
+
const command = {
|
|
171
|
+
execute: () => deps.store.updateShape(id, { owner: next, ...nextB }),
|
|
172
|
+
undo: () => deps.store.updateShape(id, { owner: prev, ...prevB }),
|
|
173
|
+
};
|
|
174
|
+
deps.commands.execute(command);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=team-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-ops.js","sourceRoot":"","sources":["../../src/team/team-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type TeamMode = "assign" | "erase" | "island";
|
|
2
|
+
export interface TeamToolState {
|
|
3
|
+
/** Currently selected team id, or null when none is chosen yet. */
|
|
4
|
+
activeTeamId: string | null;
|
|
5
|
+
mode: TeamMode;
|
|
6
|
+
}
|
|
7
|
+
export declare const teamStateStore: import("../reactive-store.js").ReactiveStore<TeamToolState>;
|
|
8
|
+
export declare function useTeamState(): TeamToolState;
|
|
9
|
+
//# sourceMappingURL=team-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-state.d.ts","sourceRoot":"","sources":["../../src/team/team-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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Active team-tool interaction state, shared between the palette and the tool.
|
|
2
|
+
// Module-scoped, app-local (not synced). Team data itself lives in the synced
|
|
3
|
+
// `team-map` shape; this is only which team/mode the local user is editing with.
|
|
4
|
+
import { useSyncExternalStore } from "react";
|
|
5
|
+
import { createReactiveStore } from "../reactive-store.js";
|
|
6
|
+
export const teamStateStore = createReactiveStore({
|
|
7
|
+
activeTeamId: null,
|
|
8
|
+
mode: "assign",
|
|
9
|
+
});
|
|
10
|
+
export function useTeamState() {
|
|
11
|
+
return useSyncExternalStore(teamStateStore.subscribe, teamStateStore.get, teamStateStore.get);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=team-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-state.js","sourceRoot":"","sources":["../../src/team/team-state.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,iFAAiF;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAU3D,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAgB;IAChE,YAAY,EAAE,IAAI;IAClB,IAAI,EAAE,QAAQ;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY;IAC3B,OAAO,oBAAoB,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SvgNode } from "./svg-nodes.js";
|
|
2
|
+
export type TerrainKey = "grass" | "forest" | "water" | "sand" | "mtn" | "path" | "snow" | "swamp" | "lava" | "stone" | "farm" | "flower";
|
|
3
|
+
export interface TerrainDef {
|
|
4
|
+
key: TerrainKey;
|
|
5
|
+
name: string;
|
|
6
|
+
en: string;
|
|
7
|
+
patternWidth: number;
|
|
8
|
+
patternHeight: number;
|
|
9
|
+
nodes: SvgNode[];
|
|
10
|
+
}
|
|
11
|
+
export declare const TERRAINS: readonly TerrainDef[];
|
|
12
|
+
export declare const TERRAIN_KEYS: readonly TerrainKey[];
|
|
13
|
+
export declare function terrainPatternId(key: TerrainKey): string;
|
|
14
|
+
export declare function terrainDarkVar(key: TerrainKey): string;
|
|
15
|
+
//# sourceMappingURL=terrain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terrain.d.ts","sourceRoot":"","sources":["../src/terrain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,MAAM,UAAU,GACnB,OAAO,GACP,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,MAAM,GACN,QAAQ,CAAC;AAEZ,MAAM,WAAW,UAAU;IAC1B,GAAG,EAAE,UAAU,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,QAAQ,EAAE,SAAS,UAAU,EA4SzC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAA+B,CAAC;AAE9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAEtD"}
|