28 lines
1.4 KiB
JavaScript
28 lines
1.4 KiB
JavaScript
'use strict';
|
|
importScripts('build-meta.js');
|
|
importScripts('puzzle-patterns.js');
|
|
importScripts(`puzzle-core.js?v=${BendBuildMeta.APP_VERSION}-${BendBuildMeta.GENERATOR_VERSION}`);
|
|
|
|
const uniquenessCache = new Map();
|
|
self.onmessage = ({data}) => {
|
|
const {id, action='generate', chunks, seed, level, originX, originY, generationOptions, generatorVersion} = data;
|
|
try {
|
|
if (generatorVersion !== BendPuzzle.GENERATOR_VERSION) throw new Error('Generator version mismatch');
|
|
if (action === 'verify') {
|
|
const signature = BendPuzzle.puzzleSignature(data.puzzle);
|
|
const cacheKey = JSON.stringify([signature, data.limits || null]);
|
|
let result = uniquenessCache.get(cacheKey);
|
|
if (!result) {
|
|
result = BendPuzzle.verifyPuzzleUniqueness(data.puzzle, data.limits || null);
|
|
uniquenessCache.set(cacheKey, result);
|
|
if (uniquenessCache.size > 256) uniquenessCache.delete(uniquenessCache.keys().next().value);
|
|
}
|
|
self.postMessage({id, result, generatorVersion: BendPuzzle.GENERATOR_VERSION});
|
|
return;
|
|
}
|
|
const puzzle = BendPuzzle.generatePuzzle(chunks, seed, level, originX, originY, generationOptions || null);
|
|
self.postMessage({id, puzzle, generatorVersion: BendPuzzle.GENERATOR_VERSION});
|
|
} catch (error) {
|
|
self.postMessage({id, error: error?.message || String(error), generatorVersion: BendPuzzle.GENERATOR_VERSION});
|
|
}
|
|
};
|