@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
108 lines (76 loc) • 2.57 kB
JavaScript
import TaskGroup from "../core/process/task/TaskGroup.js";
import { GridTaskGenerator } from "./grid/GridTaskGenerator.js";
export class GridTaskGroup extends GridTaskGenerator {
/**
*
* @type {GridTaskGenerator[]}
*/
children = [];
/**
*
* @param {GridTaskGenerator[]} children
* @returns {GridTaskGroup}
*/
static from(children) {
const r = new GridTaskGroup();
children.forEach(r.addGenerator, r);
return r;
}
/**
*
* @param {GridTaskGenerator} generator
*/
addGenerator(generator) {
this.children.push(generator);
}
/**
*
* @param {EntityComponentDataset} ecd
* @param {GridData} grid
* @param {number} seed
* @returns {TaskGroup}
*/
build(grid, ecd, seed) {
/**
*
* @type {(TaskGroup|Task)[]}
*/
const tasks = [];
const generators = this.children;
const generator_count = generators.length;
//generate tasks
for (let i = 0; i < generator_count; i++) {
const generator = generators[i];
const task = generator.build(grid, ecd, seed);
tasks[i] = task;
}
//assign dependencies
for (let i = 0; i < generator_count; i++) {
const generator = generators[i];
const task = tasks[i];
const dependencies = generator.dependencies;
const dependencyCount = dependencies.length;
for (let j = 0; j < dependencyCount; j++) {
const dependency = dependencies[j];
const dependencyIndex = generators.indexOf(dependency);
if (dependencyIndex === -1) {
throw new Error(`Dependency ${j}(name='${dependency.name}') of task generator [${i}] (name='${generator.name}') is not found`);
}
const dependencyTask = tasks[dependencyIndex];
task.addDependency(dependencyTask);
}
catchGeneratorErrors(generator, task);
}
return new TaskGroup(tasks, 'Grid Generator');
}
}
/**
*
* @param {GridTaskGenerator} generator
* @param {TaskGroup} task
*/
function catchGeneratorErrors(generator, task) {
task.promise().catch(reason => {
console.error(`Generator '${generator.name}' failed. Task status: ${task.getVerboseStatusMessage()}`);
});
}