nc-planner/scripts/configuration.js

93 lines
2.7 KiB
JavaScript

import { buildAtlas } from "./atlas.js";
import { emitEvent } from "./events.js";
import { setState, STATE } from "./state.js";
import { registerLoadCallback } from "./main.js";
import { addEventToButton } from "./dom-utils.js";
import { showOpenFileDialog } from "./files.js";
import { DevError, UserError } from "./errors.js";
export let configuration = {};
registerLoadCallback(() => {
addEventToButton("load-configuration", "click", loadConfiguration);
});
export async function loadConfiguration(event) {
setState(STATE.initialization);
emitEvent("config:load:start");
let configData = null;
if (typeof event === "string") {
configData = await fetch(`./configurations/${event}.ncpf.json`)
.then(data => data.json());
} else if (event.currentTarget?.dataset?.configuration) {
const configuration = event.currentTarget.dataset.configuration;
console.log(configuration);
configData = await fetch(`./configurations/${configuration}.ncpf.json`)
.then(data => data.json());
} else if (event.currentTarget?.tagName === "BUTTON") {
const { data } = await new Promise(resolve => showOpenFileDialog(resolve));
console.log(data);
configData = data;
} else if (event?.target?.files && event.target.files[0]) {
const file = event.target.files[0];
configData = await new Promise(resolve => {
const reader = new FileReader();
reader.addEventListener("load", () => {
resolve(JSON.parse(reader.result));
});
reader.readAsText(file);
});
} else {
throw new DevError("Configuration load failed - unrecognised event");
}
if ((configData.designs ?? []).length > 0) {
throw new UserError("Configuration load failed - contains designs, not a full configuration!");
}
emitEvent("config:load:end");
try {
await processConfiguration(configData);
} catch (e) {
emitEvent("config:fail");
throw e;
}
configuration = configData;
emitEvent("config:end");
}
export async function processConfiguration(data) {
emitEvent("config:process:start");
data = configurationDatafixer(data);
console.log("Configuration: ", data);
try {
await buildAtlas(data);
} catch (e) {
console.error(e);
emitEvent("config:process:fail");
throw e;
}
emitEvent("config:process:end");
}
export function configurationDatafixer(data, options = {}) {
if (!options.dontSetSFRCasingForPorts) {
for (const block of data.configuration["nuclearcraft:overhaul_sfr"].blocks) {
if (block.modules["nuclearcraft:overhaul_sfr:port"] && !block.modules["nuclearcraft:overhaul_sfr:casing"]) {
block.modules["nuclearcraft:overhaul_sfr:casing"] = {
edge: false,
};
}
}
}
return data;
}