@edv4h/usketch-plugin-map 0.5.2 → 0.7.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.
@@ -1,5 +1,6 @@
1
1
  import type { BoundingBox, ShapeData, ShapeDefinition } from "@edv4h/usketch-shared";
2
2
  import { type Cells } from "./autotile.js";
3
+ import type { BaseGenParams } from "./base-terrain.js";
3
4
  export declare const TILEMAP_TYPE = "tilemap";
4
5
  export declare const DEFAULT_TILE = 40;
5
6
  export interface TileMapShapeData extends ShapeData {
@@ -13,8 +14,37 @@ export interface TileMapShapeData extends ShapeData {
13
14
  * subset of `cells`.
14
15
  */
15
16
  handPaint?: Record<string, true>;
17
+ /**
18
+ * Seed for the infinite procedurally-generated base terrain. When set, every
19
+ * unpainted cell is filled by `baseTerrainAt(baseSeed, col, row)`. Stored on the
20
+ * shape (not app-local render config) so the generated world **persists across
21
+ * reloads and syncs to everyone** on the board. `undefined` = no base.
22
+ */
23
+ baseSeed?: number;
24
+ /**
25
+ * Generation version + parameters the base terrain was created with, recorded
26
+ * so the board's world is **frozen**: tuning the defaults or changing the
27
+ * algorithm later won't retroactively alter existing boards. `undefined` on an
28
+ * older seeded shape means v1 (see `resolveBaseGen`). Paired with `baseSeed`.
29
+ */
30
+ baseGen?: BaseGenParams;
16
31
  }
17
32
  export declare function isTileMap(shape: ShapeData): shape is TileMapShapeData;
33
+ /**
34
+ * The tilemap that owns the infinite-terrain seed, chosen **deterministically**
35
+ * (lowest `id`) so every synced client resolves the same seed even if several
36
+ * seeded tilemaps coexist — `getShapes()` insertion order is not guaranteed
37
+ * identical across peers, so we must not rely on "first found". Returns `null`
38
+ * when no tilemap carries a seed.
39
+ */
40
+ export declare function seededTilemap(shapes: Iterable<ShapeData>): TileMapShapeData | null;
41
+ /**
42
+ * The lowest-`id` tilemap on the board (of any kind), or `null` if there are
43
+ * none. Used to pick a **deterministic** stamp target when enabling the infinite
44
+ * base — `resolveTilemap`'s "first in insertion order" isn't stable across synced
45
+ * clients, so two peers could otherwise seed different tilemaps.
46
+ */
47
+ export declare function lowestTilemap(shapes: Iterable<ShapeData>): TileMapShapeData | null;
18
48
  /** Create a new empty tilemap (locked substrate). */
19
49
  export declare function makeTileMap(tile: number): TileMapShapeData;
20
50
  /** Bounds patch to keep x/y/width/height in sync with the painted cells. */
@@ -1 +1 @@
1
- {"version":3,"file":"tilemap-shape.d.ts","sourceRoot":"","sources":["../src/tilemap-shape.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAErF,OAAO,EAAE,KAAK,KAAK,EAAsC,MAAM,eAAe,CAAC;AAG/E,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IAClD,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;CACjC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,gBAAgB,CAErE;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAe1D;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAEnE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,GAAE,MAAqB,GAAG,eAAe,CA8CzF"}
1
+ {"version":3,"file":"tilemap-shape.d.ts","sourceRoot":"","sources":["../src/tilemap-shape.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAErF,OAAO,EAAE,KAAK,KAAK,EAAsC,MAAM,eAAe,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IAClD,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,gBAAgB,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAgBlF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAIlF;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAe1D;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAEnE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,GAAE,MAAqB,GAAG,eAAe,CA8CzF"}
@@ -6,6 +6,41 @@ export const DEFAULT_TILE = 40;
6
6
  export function isTileMap(shape) {
7
7
  return shape.type === TILEMAP_TYPE;
8
8
  }
9
+ /**
10
+ * The tilemap that owns the infinite-terrain seed, chosen **deterministically**
11
+ * (lowest `id`) so every synced client resolves the same seed even if several
12
+ * seeded tilemaps coexist — `getShapes()` insertion order is not guaranteed
13
+ * identical across peers, so we must not rely on "first found". Returns `null`
14
+ * when no tilemap carries a seed.
15
+ */
16
+ export function seededTilemap(shapes) {
17
+ let best = null;
18
+ // Require an INTEGER seed (step:1): synced shape data could carry NaN/Infinity
19
+ // (→ HUD garbage, `fbm(NaN, …)` behaves as seed 0) or a fraction like 1.9,
20
+ // which the HUD shows verbatim but `hash2` truncates to 1 via ToInt32 — the
21
+ // two would disagree. Integer-only keeps the display and the effective seed in
22
+ // sync.
23
+ for (const s of shapes)
24
+ if (isTileMap(s) &&
25
+ s.baseSeed != null &&
26
+ Number.isInteger(s.baseSeed) &&
27
+ (best === null || s.id < best.id))
28
+ best = s;
29
+ return best;
30
+ }
31
+ /**
32
+ * The lowest-`id` tilemap on the board (of any kind), or `null` if there are
33
+ * none. Used to pick a **deterministic** stamp target when enabling the infinite
34
+ * base — `resolveTilemap`'s "first in insertion order" isn't stable across synced
35
+ * clients, so two peers could otherwise seed different tilemaps.
36
+ */
37
+ export function lowestTilemap(shapes) {
38
+ let best = null;
39
+ for (const s of shapes)
40
+ if (isTileMap(s) && (best === null || s.id < best.id))
41
+ best = s;
42
+ return best;
43
+ }
9
44
  /** Create a new empty tilemap (locked substrate). */
10
45
  export function makeTileMap(tile) {
11
46
  const bounds = { x: 0, y: 0, width: 0, height: 0 };
@@ -1 +1 @@
1
- {"version":3,"file":"tilemap-shape.js","sourceRoot":"","sources":["../src/tilemap-shape.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tilemap-shape.js","sourceRoot":"","sources":["../src/tilemap-shape.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  import type { TerrainKey } from "./terrain.js";
2
- export type MapMode = "brush" | "eraser" | "fill" | "region" | "stamp" | "generate" | "base";
2
+ /**
3
+ * All map-tool modes, in canonical order. Exported so a host UI (ActionRing /
4
+ * radial picker / custom toolbar) can enumerate the modes at runtime instead of
5
+ * hardcoding the union. `MapMode` is derived from this array — single source.
6
+ */
7
+ export declare const MAP_MODES: readonly ["brush", "eraser", "fill", "region", "stamp", "generate", "base"];
8
+ export type MapMode = (typeof MAP_MODES)[number];
3
9
  export interface MapToolState {
4
10
  mode: MapMode;
5
11
  terrain: TerrainKey;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-state.d.ts","sourceRoot":"","sources":["../src/tool-state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAE7F,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,UAAU,CAAC;IACpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,eAAe,EAAE,UAAU,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,2DAKzB,CAAC;AAEH,2DAA2D;AAC3D,wBAAgB,eAAe,IAAI,YAAY,CAE9C"}
1
+ {"version":3,"file":"tool-state.d.ts","sourceRoot":"","sources":["../src/tool-state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,SAAS,YACrB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,UAAU,EACV,MAAM,CACG,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,UAAU,CAAC;IACpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,eAAe,EAAE,UAAU,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,2DAKzB,CAAC;AAEH,2DAA2D;AAC3D,wBAAgB,eAAe,IAAI,YAAY,CAE9C"}
@@ -2,6 +2,20 @@
2
2
  // Module-scoped, app-local (not synced).
3
3
  import { useSyncExternalStore } from "react";
4
4
  import { createReactiveStore } from "./reactive-store.js";
5
+ /**
6
+ * All map-tool modes, in canonical order. Exported so a host UI (ActionRing /
7
+ * radial picker / custom toolbar) can enumerate the modes at runtime instead of
8
+ * hardcoding the union. `MapMode` is derived from this array — single source.
9
+ */
10
+ export const MAP_MODES = [
11
+ "brush",
12
+ "eraser",
13
+ "fill",
14
+ "region",
15
+ "stamp",
16
+ "generate",
17
+ "base",
18
+ ];
5
19
  export const toolStateStore = createReactiveStore({
6
20
  mode: "brush",
7
21
  terrain: "grass",
@@ -1 +1 @@
1
- {"version":3,"file":"tool-state.js","sourceRoot":"","sources":["../src/tool-state.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,yCAAyC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkB1D,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAe;IAC/D,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,MAAM;IACf,eAAe,EAAE,EAAE;CACnB,CAAC,CAAC;AAEH,2DAA2D;AAC3D,MAAM,UAAU,eAAe;IAC9B,OAAO,oBAAoB,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;AAC/F,CAAC"}
1
+ {"version":3,"file":"tool-state.js","sourceRoot":"","sources":["../src/tool-state.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,yCAAyC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB,OAAO;IACP,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,UAAU;IACV,MAAM;CACG,CAAC;AAiBX,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAe;IAC/D,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,MAAM;IACf,eAAe,EAAE,EAAE;CACnB,CAAC,CAAC;AAEH,2DAA2D;AAC3D,MAAM,UAAU,eAAe;IAC9B,OAAO,oBAAoB,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;AAC/F,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edv4h/usketch-plugin-map",
3
- "version": "0.5.2",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",