@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.
- package/README.md +34 -0
- package/dist/autotile.d.ts +22 -0
- package/dist/autotile.d.ts.map +1 -1
- package/dist/autotile.js +46 -0
- package/dist/autotile.js.map +1 -1
- package/dist/base-terrain.d.ts +58 -0
- package/dist/base-terrain.d.ts.map +1 -0
- package/dist/base-terrain.js +107 -0
- package/dist/base-terrain.js.map +1 -0
- package/dist/generators/noise.d.ts +3 -1
- package/dist/generators/noise.d.ts.map +1 -1
- package/dist/generators/noise.js +8 -3
- package/dist/generators/noise.js.map +1 -1
- package/dist/generators/rng.d.ts +6 -1
- package/dist/generators/rng.d.ts.map +1 -1
- package/dist/generators/rng.js +7 -1
- package/dist/generators/rng.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/map-layer.d.ts.map +1 -1
- package/dist/map-layer.js +107 -9
- package/dist/map-layer.js.map +1 -1
- package/dist/map-tool.d.ts.map +1 -1
- package/dist/map-tool.js +93 -30
- package/dist/map-tool.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +73 -2
- package/dist/plugin.js.map +1 -1
- package/dist/tilemap-shape.d.ts +30 -0
- package/dist/tilemap-shape.d.ts.map +1 -1
- package/dist/tilemap-shape.js +35 -0
- package/dist/tilemap-shape.js.map +1 -1
- package/dist/tool-state.d.ts +7 -1
- package/dist/tool-state.d.ts.map +1 -1
- package/dist/tool-state.js +14 -0
- package/dist/tool-state.js.map +1 -1
- package/package.json +1 -1
package/dist/tilemap-shape.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/tilemap-shape.js
CHANGED
|
@@ -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":";AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAc,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"tilemap-shape.js","sourceRoot":"","sources":["../src/tilemap-shape.tsx"],"names":[],"mappings":"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"}
|
package/dist/tool-state.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import type { TerrainKey } from "./terrain.js";
|
|
2
|
-
|
|
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;
|
package/dist/tool-state.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/tool-state.js
CHANGED
|
@@ -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",
|
package/dist/tool-state.js.map
CHANGED
|
@@ -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;
|
|
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"}
|