@edv4h/usketch-plugin-map 0.7.0 → 0.8.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/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/infinite-terrain.d.ts +34 -0
- package/dist/infinite-terrain.d.ts.map +1 -0
- package/dist/infinite-terrain.js +64 -0
- package/dist/infinite-terrain.js.map +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +21 -35
- package/dist/plugin.js.map +1 -1
- package/dist/use-infinite-terrain.d.ts +19 -0
- package/dist/use-infinite-terrain.d.ts.map +1 -0
- package/dist/use-infinite-terrain.js +45 -0
- package/dist/use-infinite-terrain.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export { BASE_MAP_TYPE, type BaseInfo, type BaseMapShapeData, } from "./base/base-map-shape.js";
|
|
2
2
|
export { type BaseToolState, baseStateStore, useBaseState } from "./base/base-state.js";
|
|
3
3
|
export { computeTerritory, type Territory } from "./base/territory.js";
|
|
4
|
+
export { type BaseGenParams, baseTerrainAt, DEFAULT_BASE_GEN } from "./base-terrain.js";
|
|
4
5
|
export { type GenState, genStateStore, useGenState, type WorldRect } from "./gen-state.js";
|
|
6
|
+
export { resolveTilemap } from "./generate.js";
|
|
5
7
|
export { GENERATORS, type GenContext, type GenParam, type MapGenerator, } from "./generators/index.js";
|
|
6
8
|
export { ICONS, type IconCategory, type IconDef } from "./icons.js";
|
|
9
|
+
export { DEFAULT_INFINITE_SEED, disableInfiniteTerrain, type EnableInfiniteTerrainOptions, enableInfiniteTerrain, getInfiniteSeed, isInfiniteTerrainEnabled, setInfiniteSeed, } from "./infinite-terrain.js";
|
|
7
10
|
export { MAP_ICON_TYPE, type MapIconShapeData } from "./map-icon-shape.js";
|
|
8
11
|
export { MAP_TOOL_ID } from "./map-tool-id.js";
|
|
9
12
|
export type { ColorMode } from "./palette.js";
|
|
@@ -12,6 +15,7 @@ export { type RangeEraseTargets, rangeEraseStore, useRangeEraseTargets, } from "
|
|
|
12
15
|
export type { ReactiveStore } from "./reactive-store.js";
|
|
13
16
|
export { type LineStyle, type MapRenderConfig, renderConfigStore, } from "./render-config.js";
|
|
14
17
|
export { TERRAINS, type TerrainDef, type TerrainKey } from "./terrain.js";
|
|
15
|
-
export { DEFAULT_TILE, TILEMAP_TYPE, type TileMapShapeData } from "./tilemap-shape.js";
|
|
18
|
+
export { DEFAULT_TILE, isTileMap, lowestTilemap, makeTileMap, seededTilemap, TILEMAP_TYPE, type TileMapShapeData, } from "./tilemap-shape.js";
|
|
16
19
|
export { MAP_MODES, type MapMode, type MapToolState, toolStateStore, useMapToolState, } from "./tool-state.js";
|
|
20
|
+
export { type InfiniteTerrainControls, useInfiniteTerrain, } from "./use-infinite-terrain.js";
|
|
17
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,gBAAgB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,KAAK,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,gBAAgB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,KAAK,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK3F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACN,UAAU,EACV,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,YAAY,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAMpE,OAAO,EACN,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,4BAA4B,EACjC,qBAAqB,EACrB,eAAe,EACf,wBAAwB,EACxB,eAAe,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACN,KAAK,iBAAiB,EACtB,eAAe,EACf,oBAAoB,GACpB,MAAM,wBAAwB,CAAC;AAMhC,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACN,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,iBAAiB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACN,YAAY,EACZ,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,KAAK,gBAAgB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,SAAS,EACT,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,cAAc,EACd,eAAe,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,uBAAuB,EAC5B,kBAAkB,GAClB,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
export { BASE_MAP_TYPE, } from "./base/base-map-shape.js";
|
|
2
2
|
export { baseStateStore, useBaseState } from "./base/base-state.js";
|
|
3
3
|
export { computeTerritory } from "./base/territory.js";
|
|
4
|
+
export { baseTerrainAt, DEFAULT_BASE_GEN } from "./base-terrain.js";
|
|
4
5
|
export { genStateStore, useGenState } from "./gen-state.js";
|
|
6
|
+
// NOTE: `resolveTilemap` returns the FIRST tilemap in iteration order (or creates
|
|
7
|
+
// one) — NOT deterministic across synced peers when several tilemaps exist. For
|
|
8
|
+
// deterministic selection use `seededTilemap` / `lowestTilemap`, or the
|
|
9
|
+
// `enableInfiniteTerrain` API which already picks deterministically.
|
|
10
|
+
export { resolveTilemap } from "./generate.js";
|
|
5
11
|
export { GENERATORS, } from "./generators/index.js";
|
|
6
12
|
export { ICONS } from "./icons.js";
|
|
13
|
+
// ── Infinite base terrain public API (#946 / #937 follow-up) ──
|
|
14
|
+
// Enable/disable/seed the infinite base terrain from a host's own UI without the
|
|
15
|
+
// Control HUD. Same logic the HUD toggle runs; the seed lives on the tilemap
|
|
16
|
+
// shape (synced/persisted), so these take a BoardStore. Use the functions for
|
|
17
|
+
// imperative control, or `useInfiniteTerrain(store)` for a reactive React binding.
|
|
18
|
+
export { DEFAULT_INFINITE_SEED, disableInfiniteTerrain, enableInfiniteTerrain, getInfiniteSeed, isInfiniteTerrainEnabled, setInfiniteSeed, } from "./infinite-terrain.js";
|
|
7
19
|
export { MAP_ICON_TYPE } from "./map-icon-shape.js";
|
|
8
20
|
export { MAP_TOOL_ID } from "./map-tool-id.js";
|
|
9
21
|
export { createMapPlugin } from "./plugin.js";
|
|
10
22
|
export { rangeEraseStore, useRangeEraseTargets, } from "./range-erase-state.js";
|
|
11
23
|
export { renderConfigStore, } from "./render-config.js";
|
|
12
24
|
export { TERRAINS } from "./terrain.js";
|
|
13
|
-
export { DEFAULT_TILE, TILEMAP_TYPE } from "./tilemap-shape.js";
|
|
25
|
+
export { DEFAULT_TILE, isTileMap, lowestTilemap, makeTileMap, seededTilemap, TILEMAP_TYPE, } from "./tilemap-shape.js";
|
|
14
26
|
export { MAP_MODES, toolStateStore, useMapToolState, } from "./tool-state.js";
|
|
27
|
+
export { useInfiniteTerrain, } from "./use-infinite-terrain.js";
|
|
15
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,GAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAsB,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAkB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAiB,aAAa,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EACN,UAAU,GAIV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAmC,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,aAAa,EAAyB,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AACrE,OAAO,EAEN,eAAe,EACf,oBAAoB,GACpB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAGN,iBAAiB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAoC,MAAM,cAAc,CAAC;AAC1E,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,GAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAsB,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAkB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAsB,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAiB,aAAa,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAC;AAC3F,kFAAkF;AAClF,gFAAgF;AAChF,wEAAwE;AACxE,qEAAqE;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACN,UAAU,GAIV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAmC,MAAM,YAAY,CAAC;AACpE,iEAAiE;AACjE,iFAAiF;AACjF,6EAA6E;AAC7E,8EAA8E;AAC9E,mFAAmF;AACnF,OAAO,EACN,qBAAqB,EACrB,sBAAsB,EAEtB,qBAAqB,EACrB,eAAe,EACf,wBAAwB,EACxB,eAAe,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAyB,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AACrE,OAAO,EAEN,eAAe,EACf,oBAAoB,GACpB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAGN,iBAAiB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAoC,MAAM,cAAc,CAAC;AAC1E,OAAO,EACN,YAAY,EACZ,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,GAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,SAAS,EAGT,cAAc,EACd,eAAe,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEN,kBAAkB,GAClB,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { BoardStore } from "@edv4h/usketch-shared";
|
|
2
|
+
/** Seed used when enabling without an explicit one (matches the HUD default). */
|
|
3
|
+
export declare const DEFAULT_INFINITE_SEED = 12345;
|
|
4
|
+
export interface EnableInfiniteTerrainOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Seed for the world. Rounded to an integer. Omitted → keep the current seed if
|
|
7
|
+
* already enabled, else {@link DEFAULT_INFINITE_SEED}.
|
|
8
|
+
*/
|
|
9
|
+
seed?: number;
|
|
10
|
+
/** Tile size for a tilemap created on a blank board. Default {@link DEFAULT_TILE}. */
|
|
11
|
+
tile?: number;
|
|
12
|
+
}
|
|
13
|
+
/** The board's effective infinite-terrain seed, or `null` when disabled. */
|
|
14
|
+
export declare function getInfiniteSeed(store: BoardStore): number | null;
|
|
15
|
+
/** Whether the infinite base terrain is enabled on the board. */
|
|
16
|
+
export declare function isInfiniteTerrainEnabled(store: BoardStore): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Enable (or re-seed) the infinite base terrain — the same operation the HUD
|
|
19
|
+
* toggle runs. Stamps `baseSeed` + a frozen `baseGen` onto the deterministically
|
|
20
|
+
* chosen tilemap: an already-seeded one, else the lowest-id tilemap, else a freshly
|
|
21
|
+
* created one on a blank board. Persists + syncs (it's shape data). Returns the
|
|
22
|
+
* integer seed applied. Throws `RangeError` on a non-finite seed or a non-finite /
|
|
23
|
+
* non-positive `tile`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function enableInfiniteTerrain(store: BoardStore, opts?: EnableInfiniteTerrainOptions): number;
|
|
26
|
+
/** Disable the infinite base terrain (clears `baseSeed` on every seeded tilemap). */
|
|
27
|
+
export declare function disableInfiniteTerrain(store: BoardStore): void;
|
|
28
|
+
/**
|
|
29
|
+
* Set the seed: a number enables/re-seeds, `null` disables — the "reactive setter"
|
|
30
|
+
* ergonomics requested in #946 (`set({ seed })` / `set({ seed: null })`), backed by
|
|
31
|
+
* the functions above so behaviour is identical to the HUD.
|
|
32
|
+
*/
|
|
33
|
+
export declare function setInfiniteSeed(store: BoardStore, seed: number | null): void;
|
|
34
|
+
//# sourceMappingURL=infinite-terrain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infinite-terrain.d.ts","sourceRoot":"","sources":["../src/infinite-terrain.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWxD,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAE3C,MAAM,WAAW,4BAA4B;IAC5C;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAEhE;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAEnE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE,4BAAiC,GACrC,MAAM,CAyBR;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAM9D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAG5E"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { DEFAULT_BASE_GEN } from "./base-terrain.js";
|
|
2
|
+
import { resolveTilemap } from "./generate.js";
|
|
3
|
+
import { DEFAULT_TILE, isTileMap, lowestTilemap, seededTilemap, } from "./tilemap-shape.js";
|
|
4
|
+
/** Seed used when enabling without an explicit one (matches the HUD default). */
|
|
5
|
+
export const DEFAULT_INFINITE_SEED = 12345;
|
|
6
|
+
/** The board's effective infinite-terrain seed, or `null` when disabled. */
|
|
7
|
+
export function getInfiniteSeed(store) {
|
|
8
|
+
return seededTilemap(store.getShapes().values())?.baseSeed ?? null;
|
|
9
|
+
}
|
|
10
|
+
/** Whether the infinite base terrain is enabled on the board. */
|
|
11
|
+
export function isInfiniteTerrainEnabled(store) {
|
|
12
|
+
return getInfiniteSeed(store) != null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Enable (or re-seed) the infinite base terrain — the same operation the HUD
|
|
16
|
+
* toggle runs. Stamps `baseSeed` + a frozen `baseGen` onto the deterministically
|
|
17
|
+
* chosen tilemap: an already-seeded one, else the lowest-id tilemap, else a freshly
|
|
18
|
+
* created one on a blank board. Persists + syncs (it's shape data). Returns the
|
|
19
|
+
* integer seed applied. Throws `RangeError` on a non-finite seed or a non-finite /
|
|
20
|
+
* non-positive `tile`.
|
|
21
|
+
*/
|
|
22
|
+
export function enableInfiniteTerrain(store, opts = {}) {
|
|
23
|
+
const raw = opts.seed ?? getInfiniteSeed(store) ?? DEFAULT_INFINITE_SEED;
|
|
24
|
+
const seed = Math.trunc(Number(raw));
|
|
25
|
+
if (!Number.isFinite(seed)) {
|
|
26
|
+
throw new RangeError(`enableInfiniteTerrain: seed must be a finite number, got ${String(raw)}`);
|
|
27
|
+
}
|
|
28
|
+
// Validate the tile size — it feeds cell math (move/viewport divide by tile), so
|
|
29
|
+
// a non-finite/non-positive value would later cause NaN/÷0 cells.
|
|
30
|
+
const tile = opts.tile ?? DEFAULT_TILE;
|
|
31
|
+
if (!Number.isFinite(tile) || tile <= 0) {
|
|
32
|
+
throw new RangeError(`enableInfiniteTerrain: tile must be a finite positive number, got ${String(opts.tile)}`);
|
|
33
|
+
}
|
|
34
|
+
// Deterministic target so every synced client agrees (see seededTilemap). Reuse
|
|
35
|
+
// the target's own recorded gen if present so re-enabling keeps the same world
|
|
36
|
+
// even after the default gen advances.
|
|
37
|
+
const target = seededTilemap(store.getShapes().values()) ?? lowestTilemap(store.getShapes().values());
|
|
38
|
+
const id = target?.id ?? resolveTilemap(store, tile).id;
|
|
39
|
+
store.updateShape(id, {
|
|
40
|
+
baseSeed: seed,
|
|
41
|
+
baseGen: target?.baseGen ?? DEFAULT_BASE_GEN,
|
|
42
|
+
});
|
|
43
|
+
return seed;
|
|
44
|
+
}
|
|
45
|
+
/** Disable the infinite base terrain (clears `baseSeed` on every seeded tilemap). */
|
|
46
|
+
export function disableInfiniteTerrain(store) {
|
|
47
|
+
for (const [id, s] of store.getShapes()) {
|
|
48
|
+
if (isTileMap(s) && s.baseSeed != null) {
|
|
49
|
+
store.updateShape(id, { baseSeed: undefined });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Set the seed: a number enables/re-seeds, `null` disables — the "reactive setter"
|
|
55
|
+
* ergonomics requested in #946 (`set({ seed })` / `set({ seed: null })`), backed by
|
|
56
|
+
* the functions above so behaviour is identical to the HUD.
|
|
57
|
+
*/
|
|
58
|
+
export function setInfiniteSeed(store, seed) {
|
|
59
|
+
if (seed == null)
|
|
60
|
+
disableInfiniteTerrain(store);
|
|
61
|
+
else
|
|
62
|
+
enableInfiniteTerrain(store, { seed });
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=infinite-terrain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infinite-terrain.js","sourceRoot":"","sources":["../src/infinite-terrain.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACN,YAAY,EACZ,SAAS,EACT,aAAa,EACb,aAAa,GAEb,MAAM,oBAAoB,CAAC;AAE5B,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAY3C,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,KAAiB;IAChD,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC;AACpE,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,wBAAwB,CAAC,KAAiB;IACzD,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACpC,KAAiB,EACjB,IAAI,GAAiC,EAAE;IAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,qBAAqB,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,4DAA4D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,iFAAiF;IACjF,kEAAkE;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,UAAU,CACnB,qEAAqE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;IACH,CAAC;IACD,gFAAgF;IAChF,+EAA+E;IAC/E,uCAAuC;IACvC,MAAM,MAAM,GACX,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IACxF,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;IACxD,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE;QACrB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,gBAAgB;KACf,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACb,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IACvD,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YACxC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAA+B,CAAC,CAAC;QAC7E,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAiB,EAAE,IAAmB;IACrE,IAAI,IAAI,IAAI,IAAI;QAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC;;QAC3C,qBAAqB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAgB1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,gBAAgB;IAChC,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;OAIG;IACH,YAAY,CAAC,EAAE,UAAU,CAAC;CAC1B;AAMD,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,aAAa,CAmK7E"}
|
package/dist/plugin.js
CHANGED
|
@@ -2,10 +2,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { BaseAreaLayer } from "./base/base-layer.js";
|
|
3
3
|
import { BASE_MAP_TYPE, createBaseMapShapeDefinition } from "./base/base-map-shape.js";
|
|
4
4
|
import { EnterBanner } from "./base/enter-banner.js";
|
|
5
|
-
import { DEFAULT_BASE_GEN } from "./base-terrain.js";
|
|
6
5
|
import { genStateStore } from "./gen-state.js";
|
|
7
|
-
import { resolveTilemap } from "./generate.js";
|
|
8
6
|
import { registerMapHud } from "./hud/register-map-hud.js";
|
|
7
|
+
import { disableInfiniteTerrain, enableInfiniteTerrain, getInfiniteSeed, isInfiniteTerrainEnabled, } from "./infinite-terrain.js";
|
|
9
8
|
import { MAP_ICON_TYPE, mapIconShapeDefinition } from "./map-icon-shape.js";
|
|
10
9
|
import { MapTerrainLayer } from "./map-layer.js";
|
|
11
10
|
import { createMapToolDefinition } from "./map-tool.js";
|
|
@@ -13,7 +12,7 @@ import { MAP_TOOL_ID } from "./map-tool-id.js";
|
|
|
13
12
|
import { createRangeEraseToolDefinition, RANGE_ERASE_TOOL_ID } from "./range-erase-tool.js";
|
|
14
13
|
import { renderConfigStore } from "./render-config.js";
|
|
15
14
|
import { TERRAINS } from "./terrain.js";
|
|
16
|
-
import { createTileMapShapeDefinition, DEFAULT_TILE,
|
|
15
|
+
import { createTileMapShapeDefinition, DEFAULT_TILE, TILEMAP_TYPE } from "./tilemap-shape.js";
|
|
17
16
|
const TERRAIN_LAYER_ID = "usketch-map:terrain";
|
|
18
17
|
const BASE_LAYER_ID = "usketch-map:base";
|
|
19
18
|
const ENTER_BANNER_ID = "usketch-map:enter-banner";
|
|
@@ -60,10 +59,6 @@ export function createMapPlugin(options = {}) {
|
|
|
60
59
|
// ── Controls: all map operations live on the Control HUD (no bespoke
|
|
61
60
|
// on-canvas palette). Toggle the HUD with the backtick key. ──
|
|
62
61
|
const unregisterMapHud = registerMapHud(ctx, tile);
|
|
63
|
-
// The infinite-terrain seed is read from the seeded tilemap shape (board
|
|
64
|
-
// data — persisted + synced), not from app-local render config. Chosen
|
|
65
|
-
// deterministically so the HUD agrees with the renderer and across clients.
|
|
66
|
-
const currentBaseSeed = () => seededTilemap(ctx.store.getShapes().values())?.baseSeed ?? null;
|
|
67
62
|
// ── Tweaks as declarative HUD settings ──
|
|
68
63
|
const unregisterHud = ctx.hud.registerSettings({
|
|
69
64
|
id: "usketch-map:tweaks",
|
|
@@ -108,9 +103,9 @@ export function createMapPlugin(options = {}) {
|
|
|
108
103
|
// infinite/seed live on the tilemap SHAPE (persisted + synced), not on the
|
|
109
104
|
// app-local render config — so the generated world survives reload.
|
|
110
105
|
if (name === "infinite")
|
|
111
|
-
return
|
|
106
|
+
return getInfiniteSeed(ctx.store) != null;
|
|
112
107
|
if (name === "seed")
|
|
113
|
-
return
|
|
108
|
+
return getInfiniteSeed(ctx.store) ?? genStateStore.get().seed;
|
|
114
109
|
return renderConfigStore.get()[name];
|
|
115
110
|
},
|
|
116
111
|
set: (name, value) => {
|
|
@@ -125,42 +120,33 @@ export function createMapPlugin(options = {}) {
|
|
|
125
120
|
emptyTerrain: value === "none" ? null : value,
|
|
126
121
|
});
|
|
127
122
|
else if (name === "infinite") {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
//
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
// Freeze the generation contract on the shape. Reuse the target's own
|
|
140
|
-
// recorded gen if it has one (so an off→on toggle keeps the same world
|
|
141
|
-
// even after the default advances); else stamp the current default.
|
|
142
|
-
ctx.store.updateShape(id, {
|
|
143
|
-
baseSeed: seed,
|
|
144
|
-
baseGen: target?.baseGen ?? DEFAULT_BASE_GEN,
|
|
123
|
+
// Drive the public API (single source of truth for the enable logic —
|
|
124
|
+
// deterministic tilemap target, frozen baseGen, integer seed). Default
|
|
125
|
+
// to the gen UI's seed when turning on a board that has none yet.
|
|
126
|
+
if (value === true || value === "true") {
|
|
127
|
+
// Prefer the current/gen seed, but fall back to the API default when
|
|
128
|
+
// it's junk (enableInfiniteTerrain rejects non-finite seeds) so toggling
|
|
129
|
+
// ON always works, even on a corrupt store or bad init order.
|
|
130
|
+
const genSeed = getInfiniteSeed(ctx.store) ?? Math.trunc(Number(genStateStore.get().seed));
|
|
131
|
+
enableInfiniteTerrain(ctx.store, {
|
|
132
|
+
seed: Number.isFinite(genSeed) ? genSeed : undefined,
|
|
133
|
+
tile,
|
|
145
134
|
});
|
|
146
135
|
}
|
|
147
136
|
else {
|
|
148
|
-
|
|
149
|
-
if (isTileMap(s) && s.baseSeed != null)
|
|
150
|
-
ctx.store.updateShape(id, { baseSeed: undefined });
|
|
137
|
+
disableInfiniteTerrain(ctx.store);
|
|
151
138
|
}
|
|
152
139
|
}
|
|
153
140
|
else if (name === "seed") {
|
|
154
|
-
// Coerce to a finite integer (matches step:1); ignore junk
|
|
155
|
-
// value can't turn baseSeed into NaN → NaN elevations everywhere.
|
|
141
|
+
// Coerce to a finite integer (matches step:1); ignore junk.
|
|
156
142
|
const seed = Math.trunc(Number(value));
|
|
157
143
|
if (!Number.isFinite(seed))
|
|
158
144
|
return;
|
|
159
|
-
// Remember on the gen store, and re-seed
|
|
145
|
+
// Remember on the gen store, and re-seed only when already enabled (the
|
|
146
|
+
// seed field shouldn't turn the infinite terrain on by itself).
|
|
160
147
|
genStateStore.set({ seed });
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
ctx.store.updateShape(id, { baseSeed: seed });
|
|
148
|
+
if (isInfiniteTerrainEnabled(ctx.store))
|
|
149
|
+
enableInfiniteTerrain(ctx.store, { seed });
|
|
164
150
|
}
|
|
165
151
|
},
|
|
166
152
|
// Re-read on look-and-feel changes (renderConfig) AND shape mutations (the
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BoardStore } from "@edv4h/usketch-shared";
|
|
2
|
+
import { type EnableInfiniteTerrainOptions } from "./infinite-terrain.js";
|
|
3
|
+
export interface InfiniteTerrainControls {
|
|
4
|
+
/** Current effective seed, or `null` when disabled. Reactive. */
|
|
5
|
+
seed: number | null;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
/** Enable / re-seed; returns the applied integer seed. */
|
|
8
|
+
enable: (opts?: EnableInfiniteTerrainOptions) => number;
|
|
9
|
+
disable: () => void;
|
|
10
|
+
/** Number enables/re-seeds, `null` disables. */
|
|
11
|
+
setSeed: (seed: number | null) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Subscribe a component to the board's infinite-terrain seed and get controls to
|
|
15
|
+
* change it. Re-renders when the seed changes (incl. edits from another client),
|
|
16
|
+
* not on pan/zoom — it listens to shape mutations only.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useInfiniteTerrain(store: BoardStore): InfiniteTerrainControls;
|
|
19
|
+
//# sourceMappingURL=use-infinite-terrain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-infinite-terrain.d.ts","sourceRoot":"","sources":["../src/use-infinite-terrain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAEN,KAAK,4BAA4B,EAIjC,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,uBAAuB;IACvC,iEAAiE;IACjE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,4BAA4B,KAAK,MAAM,CAAC;IACxD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gDAAgD;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,uBAAuB,CAoC7E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
import { disableInfiniteTerrain, enableInfiniteTerrain, getInfiniteSeed, setInfiniteSeed, } from "./infinite-terrain.js";
|
|
3
|
+
import { isTileMap } from "./tilemap-shape.js";
|
|
4
|
+
/**
|
|
5
|
+
* Subscribe a component to the board's infinite-terrain seed and get controls to
|
|
6
|
+
* change it. Re-renders when the seed changes (incl. edits from another client),
|
|
7
|
+
* not on pan/zoom — it listens to shape mutations only.
|
|
8
|
+
*/
|
|
9
|
+
export function useInfiniteTerrain(store) {
|
|
10
|
+
const seed = useSyncExternalStore((onChange) => store.onMutation((e) => {
|
|
11
|
+
// Only recompute the seed when something could actually change it — not on
|
|
12
|
+
// every edit (tile painting fires shape:updated on the tilemap constantly,
|
|
13
|
+
// changing cells/bounds but not baseSeed).
|
|
14
|
+
if (e.type === "shape:updated") {
|
|
15
|
+
const { before, after } = e.payload;
|
|
16
|
+
if (isTileMap(after)) {
|
|
17
|
+
const prev = isTileMap(before) ? before.baseSeed : undefined;
|
|
18
|
+
if (prev !== after.baseSeed)
|
|
19
|
+
onChange(); // baseSeed actually changed
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else if (e.type === "shape:added") {
|
|
23
|
+
// A new tilemap affects the effective seed only if it already carries one.
|
|
24
|
+
const seededAdded = e.payload.ids.some((id) => {
|
|
25
|
+
const s = store.getShape(id);
|
|
26
|
+
return s != null && isTileMap(s) && s.baseSeed != null;
|
|
27
|
+
});
|
|
28
|
+
if (seededAdded)
|
|
29
|
+
onChange();
|
|
30
|
+
}
|
|
31
|
+
else if (e.type === "shape:removed") {
|
|
32
|
+
// The removed shapes are already gone (can't inspect); a removed seeded
|
|
33
|
+
// tilemap can change the effective seed, so recompute conservatively.
|
|
34
|
+
onChange();
|
|
35
|
+
}
|
|
36
|
+
}), () => getInfiniteSeed(store), () => getInfiniteSeed(store));
|
|
37
|
+
return {
|
|
38
|
+
seed,
|
|
39
|
+
enabled: seed != null,
|
|
40
|
+
enable: (opts) => enableInfiniteTerrain(store, opts),
|
|
41
|
+
disable: () => disableInfiniteTerrain(store),
|
|
42
|
+
setSeed: (s) => setInfiniteSeed(store, s),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=use-infinite-terrain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-infinite-terrain.js","sourceRoot":"","sources":["../src/use-infinite-terrain.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACN,sBAAsB,EAEtB,qBAAqB,EACrB,eAAe,EACf,eAAe,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAa/C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IACnD,MAAM,IAAI,GAAG,oBAAoB,CAChC,CAAC,QAAQ,EAAE,EAAE,CACZ,KAAK,CAAC,UAAU,CAAC,CAAC,CAAa,EAAE,EAAE;QAClC,2EAA2E;QAC3E,2EAA2E;QAC3E,2CAA2C;QAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAChC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC;YACpC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7D,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ;oBAAE,QAAQ,EAAE,CAAC,CAAC,4BAA4B;YACtE,CAAC;QACF,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACrC,2EAA2E;YAC3E,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;YACxD,CAAC,CAAC,CAAC;YACH,IAAI,WAAW;gBAAE,QAAQ,EAAE,CAAC;QAC7B,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACvC,wEAAwE;YACxE,sEAAsE;YACtE,QAAQ,EAAE,CAAC;QACZ,CAAC;IACF,CAAC,CAAC,EACH,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,EAC5B,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAC5B,CAAC;IACF,OAAO;QACN,IAAI;QACJ,OAAO,EAAE,IAAI,IAAI,IAAI;QACrB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC;QACpD,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC;QAC5C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;KACzC,CAAC;AACH,CAAC"}
|