@twilite-app/world-gen-engine 0.0.0-stage → 0.1.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.
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Returns a stable unsigned 32-bit hash for a seed, stable node id, and world cell.
3
+ * The hash uses UTF-16 code units and length-framed string fields.
4
+ */
5
+ export declare function hashCoordinate(seed: string, nodeId: string, x: number, y: number): number;
6
+ export declare function coordinateUnit(seed: string, nodeId: string, x: number, y: number): number;
7
+ //# sourceMappingURL=coordinateHash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinateHash.d.ts","sourceRoot":"","sources":["../src/coordinateHash.ts"],"names":[],"mappings":"AAqBA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBzF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzF"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hashCoordinate = hashCoordinate;
4
+ exports.coordinateUnit = coordinateUnit;
5
+ const FNV_OFFSET_BASIS = 0x811c9dc5;
6
+ const FNV_PRIME = 0x01000193;
7
+ const HASH_DOMAIN = 'twilite.worldgen.coordinate.v1';
8
+ function hashString(state, value) {
9
+ let hash = state;
10
+ hash = Math.imul(hash ^ value.length, FNV_PRIME);
11
+ for (let index = 0; index < value.length; index += 1) {
12
+ hash = Math.imul(hash ^ value.charCodeAt(index), FNV_PRIME);
13
+ }
14
+ return hash >>> 0;
15
+ }
16
+ function assertCoordinate(name, value) {
17
+ if (!Number.isSafeInteger(value) || Object.is(value, -0)) {
18
+ throw new RangeError(`${name} must be a safe integer and cannot be -0`);
19
+ }
20
+ }
21
+ /**
22
+ * Returns a stable unsigned 32-bit hash for a seed, stable node id, and world cell.
23
+ * The hash uses UTF-16 code units and length-framed string fields.
24
+ */
25
+ function hashCoordinate(seed, nodeId, x, y) {
26
+ if (seed.length === 0) {
27
+ throw new TypeError('seed must not be empty');
28
+ }
29
+ if (nodeId.length === 0) {
30
+ throw new TypeError('nodeId must not be empty');
31
+ }
32
+ assertCoordinate('x', x);
33
+ assertCoordinate('y', y);
34
+ let hash = hashString(FNV_OFFSET_BASIS, HASH_DOMAIN);
35
+ hash = hashString(hash, seed);
36
+ hash = hashString(hash, nodeId);
37
+ hash = hashString(hash, String(x));
38
+ hash = hashString(hash, String(y));
39
+ return hash >>> 0;
40
+ }
41
+ function coordinateUnit(seed, nodeId, x, y) {
42
+ return hashCoordinate(seed, nodeId, x, y) / 0x1_0000_0000;
43
+ }
44
+ //# sourceMappingURL=coordinateHash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinateHash.js","sourceRoot":"","sources":["../src/coordinateHash.ts"],"names":[],"mappings":";;AAyBA,wCAgBC;AAED,wCAEC;AA7CD,MAAM,gBAAgB,GAAG,UAAU,CAAC;AACpC,MAAM,SAAS,GAAG,UAAU,CAAC;AAC7B,MAAM,WAAW,GAAG,gCAAgC,CAAC;AAErD,SAAS,UAAU,CAAC,KAAa,EAAE,KAAa;IAC9C,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEjD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAa;IACnD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,0CAA0C,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,MAAc,EAAE,CAAS,EAAE,CAAS;IAC/E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;IAClD,CAAC;IACD,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzB,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAEzB,IAAI,IAAI,GAAG,UAAU,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY,EAAE,MAAc,EAAE,CAAS,EAAE,CAAS;IAC/E,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function dualGridMask(northwest: boolean, northeast: boolean, southwest: boolean, southeast: boolean): number;
2
+ //# sourceMappingURL=dualGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dualGrid.d.ts","sourceRoot":"","sources":["../src/dualGrid.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAC1B,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,OAAO,GACjB,MAAM,CAOR"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dualGridMask = dualGridMask;
4
+ function dualGridMask(northwest, northeast, southwest, southeast) {
5
+ return (Number(northwest) |
6
+ (Number(northeast) << 1) |
7
+ (Number(southwest) << 2) |
8
+ (Number(southeast) << 3));
9
+ }
10
+ //# sourceMappingURL=dualGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dualGrid.js","sourceRoot":"","sources":["../src/dualGrid.ts"],"names":[],"mappings":";;AAAA,oCAYC;AAZD,SAAgB,YAAY,CAC1B,SAAkB,EAClB,SAAkB,EAClB,SAAkB,EAClB,SAAkB;IAElB,OAAO,CACL,MAAM,CAAC,SAAS,CAAC;QACjB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { coordinateUnit, hashCoordinate } from './coordinateHash';
2
+ export { dualGridMask } from './dualGrid';
3
+ export type { PathNoisePreset, PathNoiseSettings, VerticalChunk, VerticalChunkRequest, VerticalWorldRecipe, } from './verticalWorld';
4
+ export { DEFAULT_CHUNK_HEIGHT, DEFAULT_CHUNK_WIDTH, DEFAULT_PATH_NOISE, generateVerticalChunk, MAX_CHUNK_HEIGHT, MAX_CHUNK_WIDTH, MAX_WORLD_SEED, MIN_CHUNK_HEIGHT, MIN_CHUNK_WIDTH, resolvePathNoiseSettings, } from './verticalWorld';
5
+ export declare const WORLD_GEN_ENGINE_VERSION = "0.1.0";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,wBAAwB,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WORLD_GEN_ENGINE_VERSION = exports.resolvePathNoiseSettings = exports.MIN_CHUNK_WIDTH = exports.MIN_CHUNK_HEIGHT = exports.MAX_WORLD_SEED = exports.MAX_CHUNK_WIDTH = exports.MAX_CHUNK_HEIGHT = exports.generateVerticalChunk = exports.DEFAULT_PATH_NOISE = exports.DEFAULT_CHUNK_WIDTH = exports.DEFAULT_CHUNK_HEIGHT = exports.dualGridMask = exports.hashCoordinate = exports.coordinateUnit = void 0;
4
+ var coordinateHash_1 = require("./coordinateHash");
5
+ Object.defineProperty(exports, "coordinateUnit", { enumerable: true, get: function () { return coordinateHash_1.coordinateUnit; } });
6
+ Object.defineProperty(exports, "hashCoordinate", { enumerable: true, get: function () { return coordinateHash_1.hashCoordinate; } });
7
+ var dualGrid_1 = require("./dualGrid");
8
+ Object.defineProperty(exports, "dualGridMask", { enumerable: true, get: function () { return dualGrid_1.dualGridMask; } });
9
+ var verticalWorld_1 = require("./verticalWorld");
10
+ Object.defineProperty(exports, "DEFAULT_CHUNK_HEIGHT", { enumerable: true, get: function () { return verticalWorld_1.DEFAULT_CHUNK_HEIGHT; } });
11
+ Object.defineProperty(exports, "DEFAULT_CHUNK_WIDTH", { enumerable: true, get: function () { return verticalWorld_1.DEFAULT_CHUNK_WIDTH; } });
12
+ Object.defineProperty(exports, "DEFAULT_PATH_NOISE", { enumerable: true, get: function () { return verticalWorld_1.DEFAULT_PATH_NOISE; } });
13
+ Object.defineProperty(exports, "generateVerticalChunk", { enumerable: true, get: function () { return verticalWorld_1.generateVerticalChunk; } });
14
+ Object.defineProperty(exports, "MAX_CHUNK_HEIGHT", { enumerable: true, get: function () { return verticalWorld_1.MAX_CHUNK_HEIGHT; } });
15
+ Object.defineProperty(exports, "MAX_CHUNK_WIDTH", { enumerable: true, get: function () { return verticalWorld_1.MAX_CHUNK_WIDTH; } });
16
+ Object.defineProperty(exports, "MAX_WORLD_SEED", { enumerable: true, get: function () { return verticalWorld_1.MAX_WORLD_SEED; } });
17
+ Object.defineProperty(exports, "MIN_CHUNK_HEIGHT", { enumerable: true, get: function () { return verticalWorld_1.MIN_CHUNK_HEIGHT; } });
18
+ Object.defineProperty(exports, "MIN_CHUNK_WIDTH", { enumerable: true, get: function () { return verticalWorld_1.MIN_CHUNK_WIDTH; } });
19
+ Object.defineProperty(exports, "resolvePathNoiseSettings", { enumerable: true, get: function () { return verticalWorld_1.resolvePathNoiseSettings; } });
20
+ exports.WORLD_GEN_ENGINE_VERSION = '0.1.0';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkE;AAAzD,gHAAA,cAAc,OAAA;AAAE,gHAAA,cAAc,OAAA;AACvC,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AAQrB,iDAWyB;AAVvB,qHAAA,oBAAoB,OAAA;AACpB,oHAAA,mBAAmB,OAAA;AACnB,mHAAA,kBAAkB,OAAA;AAClB,sHAAA,qBAAqB,OAAA;AACrB,iHAAA,gBAAgB,OAAA;AAChB,gHAAA,eAAe,OAAA;AACf,+GAAA,cAAc,OAAA;AACd,iHAAA,gBAAgB,OAAA;AAChB,gHAAA,eAAe,OAAA;AACf,yHAAA,wBAAwB,OAAA;AAGb,QAAA,wBAAwB,GAAG,OAAO,CAAC"}
@@ -0,0 +1,59 @@
1
+ export declare const DEFAULT_CHUNK_WIDTH = 9;
2
+ export declare const DEFAULT_CHUNK_HEIGHT = 16;
3
+ export declare const MIN_CHUNK_WIDTH = 4;
4
+ export declare const MAX_CHUNK_WIDTH = 64;
5
+ export declare const MIN_CHUNK_HEIGHT = 4;
6
+ export declare const MAX_CHUNK_HEIGHT = 48;
7
+ export declare const MAX_WORLD_SEED = 4294967295;
8
+ export type PathNoiseSettings = {
9
+ readonly spread: number;
10
+ readonly lengthScale: number;
11
+ readonly smooth: number;
12
+ readonly hyst: number;
13
+ readonly gain: number;
14
+ readonly maxStep: number;
15
+ readonly startFade: number;
16
+ readonly margin: number;
17
+ readonly lowPeriod: number;
18
+ readonly lowAmp: number;
19
+ readonly midPeriod: number;
20
+ readonly midAmp: number;
21
+ readonly highPeriod: number;
22
+ readonly highAmp: number;
23
+ readonly warpAmp: number;
24
+ readonly warpFreq: number;
25
+ readonly widthMin: number;
26
+ readonly widthMax: number;
27
+ readonly widthPeriod: number;
28
+ };
29
+ export type PathNoisePreset = 'default' | 'classic' | 'calm' | 'arcs' | 'winding' | 'jittery' | 'road' | 'straight';
30
+ export type VerticalWorldRecipe = {
31
+ readonly width?: number;
32
+ readonly chunkHeight?: number;
33
+ readonly terrainIds: {
34
+ readonly ground: string;
35
+ readonly path: string;
36
+ };
37
+ readonly pathNoise?: Partial<PathNoiseSettings>;
38
+ readonly preset?: PathNoisePreset;
39
+ };
40
+ export type VerticalChunkRequest = {
41
+ readonly seed: string;
42
+ readonly chunkIndex: number;
43
+ readonly recipe: VerticalWorldRecipe;
44
+ };
45
+ export type VerticalChunk = {
46
+ readonly schemaVersion: 1;
47
+ readonly chunkIndex: number;
48
+ readonly width: number;
49
+ readonly height: number;
50
+ readonly cells: readonly (readonly string[])[];
51
+ };
52
+ export declare const DEFAULT_PATH_NOISE: PathNoiseSettings;
53
+ export declare function resolvePathNoiseSettings(preset?: PathNoisePreset, overrides?: Partial<PathNoiseSettings>): PathNoiseSettings;
54
+ /**
55
+ * Generates one vertical strip chunk. Index 0 is the first chunk at the bottom
56
+ * of the world; each returned cell row is ordered top-to-bottom, as in the prototype.
57
+ */
58
+ export declare function generateVerticalChunk(request: VerticalChunkRequest): VerticalChunk;
59
+ //# sourceMappingURL=verticalWorld.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalWorld.d.ts","sourceRoot":"","sources":["../src/verticalWorld.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,cAAc,aAAc,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,SAAS,GACT,MAAM,GACN,MAAM,GACN,SAAS,GACT,SAAS,GACT,MAAM,GACN,UAAU,CAAC;AAEf,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,iBAoB/B,CAAC;AA+GH,wBAAgB,wBAAwB,CACtC,MAAM,GAAE,eAA2B,EACnC,SAAS,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACzC,iBAAiB,CA4BnB;AAuGD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA2FlF"}
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_PATH_NOISE = exports.MAX_WORLD_SEED = exports.MAX_CHUNK_HEIGHT = exports.MIN_CHUNK_HEIGHT = exports.MAX_CHUNK_WIDTH = exports.MIN_CHUNK_WIDTH = exports.DEFAULT_CHUNK_HEIGHT = exports.DEFAULT_CHUNK_WIDTH = void 0;
4
+ exports.resolvePathNoiseSettings = resolvePathNoiseSettings;
5
+ exports.generateVerticalChunk = generateVerticalChunk;
6
+ exports.DEFAULT_CHUNK_WIDTH = 9;
7
+ exports.DEFAULT_CHUNK_HEIGHT = 16;
8
+ exports.MIN_CHUNK_WIDTH = 4;
9
+ exports.MAX_CHUNK_WIDTH = 64;
10
+ exports.MIN_CHUNK_HEIGHT = 4;
11
+ exports.MAX_CHUNK_HEIGHT = 48;
12
+ exports.MAX_WORLD_SEED = 0xffff_ffff;
13
+ exports.DEFAULT_PATH_NOISE = Object.freeze({
14
+ spread: 0.75,
15
+ lengthScale: 1,
16
+ smooth: 3,
17
+ hyst: 0.3,
18
+ gain: 1.4,
19
+ maxStep: 1,
20
+ startFade: 12,
21
+ margin: 1,
22
+ lowPeriod: 6,
23
+ lowAmp: 1,
24
+ midPeriod: 3,
25
+ midAmp: 0.1,
26
+ highPeriod: 1.7,
27
+ highAmp: 0,
28
+ warpAmp: 0,
29
+ warpFreq: 0.22,
30
+ widthMin: 1,
31
+ widthMax: 1,
32
+ widthPeriod: 14,
33
+ });
34
+ const PATH_NOISE_PRESETS = {
35
+ default: {},
36
+ classic: { spread: 1, smooth: 0, hyst: 0, gain: 2.2, startFade: 1e9 },
37
+ calm: {
38
+ warpAmp: 0.8,
39
+ warpFreq: 0.12,
40
+ lowPeriod: 10,
41
+ midPeriod: 5,
42
+ midAmp: 0.25,
43
+ highAmp: 0,
44
+ gain: 1.8,
45
+ spread: 0.8,
46
+ smooth: 2.5,
47
+ hyst: 0.25,
48
+ },
49
+ arcs: {
50
+ lowPeriod: 14,
51
+ midAmp: 0.2,
52
+ highAmp: 0,
53
+ warpAmp: 0.6,
54
+ gain: 2,
55
+ spread: 1,
56
+ smooth: 3.5,
57
+ hyst: 0.3,
58
+ },
59
+ winding: {
60
+ lowPeriod: 5,
61
+ midAmp: 0.9,
62
+ highPeriod: 1.5,
63
+ highAmp: 0.3,
64
+ warpAmp: 2.4,
65
+ warpFreq: 0.3,
66
+ gain: 3,
67
+ smooth: 1.2,
68
+ hyst: 0.2,
69
+ maxStep: 2,
70
+ spread: 1,
71
+ },
72
+ jittery: {
73
+ midAmp: 0.8,
74
+ highPeriod: 1.3,
75
+ highAmp: 0.8,
76
+ warpAmp: 1.2,
77
+ gain: 3,
78
+ smooth: 0.6,
79
+ hyst: 0.3,
80
+ maxStep: 2,
81
+ spread: 1,
82
+ },
83
+ road: {
84
+ warpAmp: 1,
85
+ warpFreq: 0.15,
86
+ lowPeriod: 9,
87
+ midAmp: 0.3,
88
+ highAmp: 0.05,
89
+ gain: 1.8,
90
+ spread: 0.7,
91
+ smooth: 2.5,
92
+ hyst: 0.25,
93
+ margin: 2,
94
+ widthMin: 2,
95
+ widthMax: 3,
96
+ widthPeriod: 18,
97
+ },
98
+ straight: { warpAmp: 0, midAmp: 0.1, highAmp: 0, gain: 1.4, spread: 0.35, smooth: 3, hyst: 0.3 },
99
+ };
100
+ const NOISE_LIMITS = {
101
+ spread: [0, 1, false],
102
+ lengthScale: [0.3, 4, false],
103
+ smooth: [0, 10, false],
104
+ hyst: [0, 0.45, false],
105
+ gain: [0.2, 6, false],
106
+ maxStep: [1, 4, true],
107
+ startFade: [1, 1e9, false],
108
+ margin: [0, 4, true],
109
+ lowPeriod: [1, 30, false],
110
+ lowAmp: [0, 2, false],
111
+ midPeriod: [0.5, 15, false],
112
+ midAmp: [0, 2, false],
113
+ highPeriod: [0.5, 6, false],
114
+ highAmp: [0, 2, false],
115
+ warpAmp: [0, 4, false],
116
+ warpFreq: [0.02, 1, false],
117
+ widthMin: [1, 9, true],
118
+ widthMax: [1, 9, true],
119
+ widthPeriod: [4, 60, true],
120
+ };
121
+ function assertIntegerInRange(name, value, minimum, maximum) {
122
+ if (!Number.isSafeInteger(value) || Object.is(value, -0) || value < minimum || value > maximum) {
123
+ throw new RangeError(`${name} must be an integer from ${minimum} through ${maximum}`);
124
+ }
125
+ }
126
+ function assertSeed(seed) {
127
+ if (!/^(0|[1-9]\d*)$/.test(seed) || Number(seed) > exports.MAX_WORLD_SEED) {
128
+ throw new RangeError(`seed must be a canonical decimal uint32 string (0-${exports.MAX_WORLD_SEED})`);
129
+ }
130
+ }
131
+ function assertTerrainId(name, value) {
132
+ if (value.trim() !== value || value.length === 0 || value.length > 128) {
133
+ throw new RangeError(`${name} must be a non-empty trimmed identifier up to 128 characters`);
134
+ }
135
+ }
136
+ function resolvePathNoiseSettings(preset = 'default', overrides = {}) {
137
+ const presetSettings = PATH_NOISE_PRESETS[preset];
138
+ if (presetSettings === undefined) {
139
+ throw new RangeError(`Unknown path-noise preset: ${String(preset)}`);
140
+ }
141
+ for (const key of Object.keys(overrides)) {
142
+ if (!Object.hasOwn(exports.DEFAULT_PATH_NOISE, key)) {
143
+ throw new RangeError(`Unknown path-noise setting: ${key}`);
144
+ }
145
+ }
146
+ const settings = { ...exports.DEFAULT_PATH_NOISE, ...presetSettings, ...overrides };
147
+ for (const [key, value] of Object.entries(settings)) {
148
+ const [minimum, maximum, integer] = NOISE_LIMITS[key];
149
+ if (!Number.isFinite(value) ||
150
+ value < minimum ||
151
+ value > maximum ||
152
+ (integer && !Number.isInteger(value))) {
153
+ throw new RangeError(`${key} must be ${integer ? 'an integer' : 'a number'} from ${minimum} through ${maximum}`);
154
+ }
155
+ }
156
+ return settings;
157
+ }
158
+ function noiseHash(seed, channel, index) {
159
+ const numericSeed = Number(seed) >>> 0;
160
+ const lowIndex = index >>> 0;
161
+ const highIndex = Math.floor(index / 0x1_0000_0000);
162
+ let hash = (numericSeed ^ Math.imul(channel + 1, 0x9e3779b1) ^ Math.imul(lowIndex, 0x85ebca6b)) >>> 0;
163
+ if (highIndex > 0) {
164
+ hash = (hash ^ Math.imul(highIndex, 0x27d4eb2d)) >>> 0;
165
+ }
166
+ hash = Math.imul(hash ^ (hash >>> 16), 0x7feb352d);
167
+ hash = Math.imul(hash ^ (hash >>> 15), 0x846ca68b);
168
+ hash = (hash ^ (hash >>> 16)) >>> 0;
169
+ return hash / 0x1_0000_0000;
170
+ }
171
+ function valueNoise1D(seed, channel, position) {
172
+ const index = Math.floor(position);
173
+ const fraction = position - index;
174
+ const smooth = fraction * fraction * fraction * (fraction * (fraction * 6 - 15) + 10);
175
+ const left = noiseHash(seed, channel, index) * 2 - 1;
176
+ const right = noiseHash(seed, channel, index + 1) * 2 - 1;
177
+ return left + (right - left) * smooth;
178
+ }
179
+ function pathNoise(seed, settings, row) {
180
+ const amplitude = settings.lowAmp + settings.midAmp + settings.highAmp;
181
+ if (amplitude <= 0) {
182
+ return 0;
183
+ }
184
+ const warp = valueNoise1D(seed, 10, row * settings.warpFreq) * settings.warpAmp;
185
+ const warpedRow = row + warp;
186
+ const low = valueNoise1D(seed, 11, warpedRow / (settings.lowPeriod * settings.lengthScale));
187
+ const mid = valueNoise1D(seed, 12, warpedRow / (settings.midPeriod * settings.lengthScale));
188
+ const high = valueNoise1D(seed, 13, warpedRow / (settings.highPeriod * settings.lengthScale));
189
+ return (low * settings.lowAmp + mid * settings.midAmp + high * settings.highAmp) / amplitude;
190
+ }
191
+ function smoothCompensation(settings) {
192
+ if (settings.smooth <= 0) {
193
+ return 1;
194
+ }
195
+ const layers = [
196
+ [settings.lowAmp, settings.lowPeriod],
197
+ [settings.midAmp, settings.midPeriod],
198
+ [settings.highAmp, settings.highPeriod],
199
+ ];
200
+ const alpha = 1 / (1 + settings.smooth);
201
+ const beta = 1 - alpha;
202
+ let totalAmplitude = 0;
203
+ let retainedAmplitude = 0;
204
+ for (const [amplitude, period] of layers) {
205
+ if (amplitude === undefined || period === undefined) {
206
+ throw new Error('Invalid internal path-noise layer');
207
+ }
208
+ const angularFrequency = (2 * Math.PI) / Math.max(1.2, period * settings.lengthScale);
209
+ const response = alpha / Math.sqrt(1 - 2 * beta * Math.cos(angularFrequency) + beta * beta);
210
+ totalAmplitude += amplitude;
211
+ retainedAmplitude += amplitude * response * response;
212
+ }
213
+ return retainedAmplitude > 0 ? Math.min(5, Math.max(1, totalAmplitude / retainedAmplitude)) : 1;
214
+ }
215
+ function pathWidth(seed, settings, row) {
216
+ const low = Math.min(settings.widthMin, settings.widthMax);
217
+ const high = Math.max(settings.widthMin, settings.widthMax);
218
+ if (low === high) {
219
+ return low;
220
+ }
221
+ const sample = (valueNoise1D(seed, 20, row / settings.widthPeriod) + 1) / 2;
222
+ const eased = Math.max(0, Math.min(1, (sample - 0.5) * 1.6 + 0.5));
223
+ return Math.round(low + (high - low) * eased);
224
+ }
225
+ function createCells(width, terrainIds, pathColumns, pathWidthValue) {
226
+ const cells = Array.from({ length: width }, () => terrainIds.ground);
227
+ const leftRadius = Math.floor((pathWidthValue - 1) / 2);
228
+ const rightRadius = Math.ceil((pathWidthValue - 1) / 2);
229
+ for (const pathColumn of pathColumns) {
230
+ for (let offset = -leftRadius; offset <= rightRadius; offset += 1) {
231
+ const column = pathColumn + offset;
232
+ if (column >= 0 && column < width) {
233
+ cells[column] = terrainIds.path;
234
+ }
235
+ }
236
+ }
237
+ return cells;
238
+ }
239
+ /**
240
+ * Generates one vertical strip chunk. Index 0 is the first chunk at the bottom
241
+ * of the world; each returned cell row is ordered top-to-bottom, as in the prototype.
242
+ */
243
+ function generateVerticalChunk(request) {
244
+ assertSeed(request.seed);
245
+ assertIntegerInRange('chunkIndex', request.chunkIndex, 0, Number.MAX_SAFE_INTEGER);
246
+ const width = request.recipe.width ?? exports.DEFAULT_CHUNK_WIDTH;
247
+ const height = request.recipe.chunkHeight ?? exports.DEFAULT_CHUNK_HEIGHT;
248
+ assertIntegerInRange('width', width, exports.MIN_CHUNK_WIDTH, exports.MAX_CHUNK_WIDTH);
249
+ assertIntegerInRange('chunkHeight', height, exports.MIN_CHUNK_HEIGHT, exports.MAX_CHUNK_HEIGHT);
250
+ const groundId = request.recipe.terrainIds?.ground;
251
+ const pathId = request.recipe.terrainIds?.path;
252
+ assertTerrainId('terrainIds.ground', groundId);
253
+ assertTerrainId('terrainIds.path', pathId);
254
+ if (groundId === pathId) {
255
+ throw new RangeError('terrainIds.ground and terrainIds.path must be different');
256
+ }
257
+ const settings = resolvePathNoiseSettings(request.recipe.preset, request.recipe.pathNoise);
258
+ if (settings.widthMin > width || settings.widthMax > width) {
259
+ throw new RangeError(`path width must not exceed the world width (${width})`);
260
+ }
261
+ const firstWorldRow = request.chunkIndex * height;
262
+ const lastWorldRow = firstWorldRow + height - 1;
263
+ if (!Number.isSafeInteger(lastWorldRow + 1) || Object.is(lastWorldRow + 1, -0)) {
264
+ throw new RangeError('chunkIndex and chunkHeight exceed the safe world-row range');
265
+ }
266
+ const center = Math.floor((width - 1) / 2);
267
+ const margin = Math.max(0, Math.min(settings.margin, Math.floor((width - 3) / 2)));
268
+ const halfWidth = Math.max(0, Math.min(center - margin, width - 1 - center - margin));
269
+ const baseNoise = pathNoise(request.seed, settings, 0);
270
+ const compensation = smoothCompensation(settings);
271
+ const alpha = 1 / (1 + settings.smooth);
272
+ let column = center;
273
+ let firstSmooth = center;
274
+ let secondSmooth = center;
275
+ const chunkRows = new Array(height);
276
+ for (let rowIndex = 0; rowIndex <= lastWorldRow; rowIndex += 1) {
277
+ const pathColumns = [column];
278
+ const fade = Math.max(0, 1 - (rowIndex + 1) / settings.startFade);
279
+ const shift = Math.tanh(settings.gain *
280
+ compensation *
281
+ (pathNoise(request.seed, settings, rowIndex + 1) - baseNoise * fade));
282
+ const target = center + halfWidth * settings.spread * shift;
283
+ secondSmooth += alpha * (target - secondSmooth);
284
+ firstSmooth += alpha * (secondSmooth - firstSmooth);
285
+ let desiredColumn = column;
286
+ if (Math.abs(firstSmooth - column) > 0.5 + settings.hyst) {
287
+ desiredColumn = Math.round(firstSmooth);
288
+ }
289
+ let step = Math.max(-settings.maxStep, Math.min(settings.maxStep, desiredColumn - column));
290
+ step = Math.max(center - halfWidth, Math.min(center + halfWidth, column + step)) - column;
291
+ const direction = Math.sign(step);
292
+ for (let remaining = Math.abs(step); remaining > 0; remaining -= 1) {
293
+ column += direction;
294
+ pathColumns.push(column);
295
+ }
296
+ if (rowIndex >= firstWorldRow) {
297
+ const outputRow = lastWorldRow - rowIndex;
298
+ chunkRows[outputRow] = createCells(width, request.recipe.terrainIds, pathColumns, pathWidth(request.seed, settings, rowIndex));
299
+ }
300
+ }
301
+ const cells = chunkRows.map((row) => {
302
+ if (row === undefined) {
303
+ throw new Error('Internal error: generated chunk row is missing');
304
+ }
305
+ return row;
306
+ });
307
+ return {
308
+ schemaVersion: 1,
309
+ chunkIndex: request.chunkIndex,
310
+ width,
311
+ height,
312
+ cells,
313
+ };
314
+ }
315
+ //# sourceMappingURL=verticalWorld.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalWorld.js","sourceRoot":"","sources":["../src/verticalWorld.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,26 @@
1
1
  {
2
2
  "name": "@twilite-app/world-gen-engine",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "Pure deterministic primitives for Twilite world generation",
8
+ "license": "UNLICENSED",
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "typecheck": "tsc -p tsconfig.json --noEmit",
17
+ "test": "vitest run"
18
+ },
19
+ "devDependencies": {
20
+ "typescript": "^5.7.2",
21
+ "vitest": "^2.1.8"
22
+ },
23
+ "engines": {
24
+ "node": ">=22"
25
+ }
26
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.