Compare commits

..

No commits in common. "main" and "alpha/1.7" have entirely different histories.

9 changed files with 41 additions and 84 deletions

View File

@ -1,11 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="GitSharedSettings">
<option name="FORCE_PUSH_PROHIBITED_PATTERNS">
<list />
</option>
<option name="synchronizeBranchProtectionRules" value="false" />
</component>
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" /> <mapping directory="" vcs="Git" />
</component> </component>

View File

@ -1 +0,0 @@
{"addons":[],"configuration":{"nuclearcraft:overhaul_sfr":{"blocks":[{"name":"nuclearcraft:solid_fission_controller","type":"legacy_block"},{"name":"nuclearcraft:fission_vent","type":"legacy_block","blockstate":{"active":false}},{"name":"nuclearcraft:fission_vent","type":"legacy_block","blockstate":{"active":true}},{"name":"nuclearcraft:fission_casing","type":"legacy_block"},{"name":"nuclearcraft:fission_glass","type":"legacy_block"},{"metadata":2,"name":"nuclearcraft:fission_source","type":"legacy_block","blockstate":{"type":"californium"}},{"name":"nuclearcraft:solid_fission_cell","type":"legacy_block","modules":{"ncpf:block_recipes":{"recipes":[{"oredict":"ingotHEU233ZA","type":"oredict"}]}}},{"name":"nuclearcraft:fission_cell_port","type":"legacy_block","blockstate":{"active":false},"modules":{"ncpf:block_recipes":{"recipes":[{"oredict":"ingotHEU233ZA","type":"oredict"}]}}},{"name":"nuclearcraft:fission_cell_port","type":"legacy_block","blockstate":{"active":true},"modules":{"ncpf:block_recipes":{"recipes":[{"oredict":"ingotHEU233ZA","type":"oredict"}]}}},{"name":"nuclearcraft:heavy_water_moderator","type":"legacy_block"},{"metadata":0,"name":"nuclearcraft:fission_shield","type":"legacy_block","blockstate":{"active":false,"type":"boron_silver"}},{"metadata":0,"name":"nuclearcraft:fission_shield","type":"legacy_block","blockstate":{"active":true,"type":"boron_silver"}}],"coolant_recipes":[{"elements":[{"name":"water","type":"legacy_fluid"},{"name":"condensate_water","type":"legacy_fluid"}],"type":"list"}]}},"designs":[{"design":[[[3,3,3,3,3,3,3,3,3],[3,0,1,2,7,8,4,4,3],[3,4,4,4,4,4,4,4,3],[3,4,4,4,4,4,4,4,3],[3,4,4,4,4,4,4,4,3],[3,4,4,4,4,4,4,4,3],[3,3,3,3,3,3,3,3,3]],[[3,5,4,4,4,4,4,4,3],[4,6,-1,-1,-1,6,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[3,4,4,4,4,4,4,4,3]],[[3,4,4,4,4,4,4,4,3],[4,9,-1,-1,-1,9,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[3,4,4,4,4,4,4,4,3]],[[3,4,4,4,4,4,4,4,3],[4,10,-1,-1,-1,10,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[3,4,4,4,4,4,4,4,3]],[[3,4,4,4,4,4,4,4,3],[4,9,-1,-1,-1,9,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[3,4,4,4,4,4,4,4,3]],[[3,4,4,4,4,4,4,4,3],[4,6,9,11,9,6,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[3,4,4,4,4,4,4,4,3]],[[3,4,4,4,4,4,4,4,3],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[3,4,4,4,4,4,4,4,3]],[[3,4,4,4,4,4,4,4,3],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[4,-1,-1,-1,-1,-1,-1,-1,4],[3,4,4,4,4,4,4,4,3]],[[3,3,3,3,3,3,3,3,3],[3,4,4,4,4,4,4,4,3],[3,4,4,4,4,4,4,4,3],[3,4,4,4,4,4,4,4,3],[3,4,4,4,4,4,4,4,3],[3,4,4,4,4,4,4,4,3],[3,3,3,3,3,3,3,3,3]]],"block_recipes":[[[0,0]],[[0,0]],[[0,0]]],"type":"nuclearcraft:overhaul_sfr","coolant_recipe":0,"dimensions":[9,7,9]}],"version":1}

View File

@ -126,7 +126,7 @@
</section> </section>
</aside> </aside>
<footer> <footer>
<div>alpha 1.8</div> <div>alpha 1.7</div>
<div> <div>
<a href="https://discord.gg/Eq72HwPqfg">Discord server</a> <a href="https://discord.gg/Eq72HwPqfg">Discord server</a>
</div> </div>

View File

@ -39,7 +39,7 @@ registerLoadCallback(() => {
}); });
awaitEvent("config:end").then(() => { awaitEvent("config:end").then(() => {
void loadExampleFile("shield test"); void loadExampleFile("Pandora's Fission Reactor");
}); });
queueMicrotask(() => emitEvent("dev-mode:end")); queueMicrotask(() => emitEvent("dev-mode:end"));

View File

@ -18,8 +18,6 @@ export function setDomMetadata(domNode, data) {
export function setCellMetadata(node, key, value) { export function setCellMetadata(node, key, value) {
if (!node.dataset.metadata) { if (!node.dataset.metadata) {
node.dataset.metadata = createMetadata({ [key]: value }).toString(10); node.dataset.metadata = createMetadata({ [key]: value }).toString(10);
} else if (!metadata[Number(node.dataset.metadata)]) {
metadata[Number(node.dataset.metadata)] = { [key]: value };
} else { } else {
metadata[Number(node.dataset.metadata)][key] = value; metadata[Number(node.dataset.metadata)][key] = value;
} }
@ -40,7 +38,6 @@ export function getMetadata(id) {
return metadata[id]; return metadata[id];
} }
export function getCellMetadata(node, key) { export function getCellMetadata(node, key) {
if (!node.dataset.metadata) return null;
return metadata[Number(node.dataset.metadata)][key]; return metadata[Number(node.dataset.metadata)][key];
} }
@ -56,7 +53,6 @@ export function deleteMetadata(id) {
} }
export function clearCellMetadata(node, key) { export function clearCellMetadata(node, key) {
if (!node.dataset.metadata) return; if (!node.dataset.metadata) return;
if (!metadata[Number(node.dataset.metadata)]) return;
delete metadata[Number(node.dataset.metadata)][key]; delete metadata[Number(node.dataset.metadata)][key];
processCellOverlays(node, key, false); processCellOverlays(node, key, false);
} }

View File

@ -3,8 +3,6 @@ import { getAtlasIndexFromMetadata, makeAtlasImage } from "./atlas.js";
export function processCellOverlays(node, key = null, added = null) { export function processCellOverlays(node, key = null, added = null) {
if (key) { if (key) {
node.replaceChildren(...node.querySelectorAll(`:scope > *:not([data-overlay="${key}"])`));
const metadata = getCellMetadata(node, key); const metadata = getCellMetadata(node, key);
const atlasIndex = getAtlasIndexFromMetadata(metadata); const atlasIndex = getAtlasIndexFromMetadata(metadata);
if (atlasIndex && atlasIndex !== -1) { if (atlasIndex && atlasIndex !== -1) {
@ -14,10 +12,15 @@ export function processCellOverlays(node, key = null, added = null) {
node.appendChild(overlayNode); node.appendChild(overlayNode);
} }
if (key === "active" && added) { if (key === "active" && metadata) {
const overlayNode = makeAtlasImage(-1); const overlayNode = makeAtlasImage(-1);
overlayNode.dataset.overlay = key; overlayNode.dataset.overlay = key;
overlayNode.dataset.active = metadata ? "true" : "false"; overlayNode.classList.add("planner--overlay");
node.appendChild(overlayNode);
}
if (key === "active" && !metadata) {
const overlayNode = makeAtlasImage(-1);
overlayNode.dataset.overlay = "inactive";
overlayNode.classList.add("planner--overlay"); overlayNode.classList.add("planner--overlay");
node.appendChild(overlayNode); node.appendChild(overlayNode);
} }

View File

@ -6,7 +6,7 @@ import { initialize3dArray } from "./js-utils.js";
import { recall, save } from "./storage.js"; import { recall, save } from "./storage.js";
import { registerLoadCallback } from "./main.js"; import { registerLoadCallback } from "./main.js";
import { getBlockPickerActiveItem, getBlockPickerRecipe } from "./block-picker.js"; import { getBlockPickerActiveItem, getBlockPickerRecipe } from "./block-picker.js";
import { clearCellMetadata, deleteMetadata, getMetadata, setCellMetadata } from "./metadata.js"; import { clearCellMetadata, getMetadata, setCellMetadata } from "./metadata.js";
import { retainTooltipHover } from "./tooltip.js"; import { retainTooltipHover } from "./tooltip.js";
import { checkEquivalence, lookupFromMetadata, parseRuleAsString } from "./ncpf-utils.js"; import { checkEquivalence, lookupFromMetadata, parseRuleAsString } from "./ncpf-utils.js";
@ -250,14 +250,13 @@ function cellClickEvent(e) {
if (e.target.tile === "-1") return; if (e.target.tile === "-1") return;
e.target.dataset.previewRemove = "yes"; e.target.dataset.previewRemove = "yes";
deleteMetadata(e.target); clearCellMetadata(e.target, "block_recipe");
} else if (e.buttons === 1) { } else if (e.buttons === 1) {
// add // add
if (e.target.dataset.preview === activeItem.toString(10)) return; if (e.target.dataset.preview === activeItem.toString(10)) return;
e.target.dataset.preview = activeItem.toString(10); e.target.dataset.preview = activeItem.toString(10);
e.target.replaceChildren(makeAtlasImage(activeItem)); e.target.replaceChildren(makeAtlasImage(activeItem));
deleteMetadata(e.target);
const pickerRecipe = getBlockPickerRecipe(); const pickerRecipe = getBlockPickerRecipe();
if (pickerRecipe) { if (pickerRecipe) {
setCellMetadata(e.target, "block_recipe", pickerRecipe); setCellMetadata(e.target, "block_recipe", pickerRecipe);

View File

@ -7,14 +7,11 @@ import {
getPlannerMultiblockType getPlannerMultiblockType
} from "./planner.js"; } from "./planner.js";
import { checkEquivalence, findFullEntry, findFullEntryFromAtlasMetadata } from "./ncpf-utils.js"; import { checkEquivalence, findFullEntry, findFullEntryFromAtlasMetadata } from "./ncpf-utils.js";
import { clearCellMetadata, deleteMetadata, getMetadata, setCellMetadata, setDomMetadata } from "./metadata.js"; import { deleteMetadata, getMetadata, setCellMetadata, setDomMetadata } from "./metadata.js";
import { registerLoadCallback } from "./main.js"; import { registerLoadCallback } from "./main.js";
import { getAtlasMetadata } from "./atlas.js"; import { getAtlasMetadata } from "./atlas.js";
import { initialize3dArray } from "./js-utils.js"; import { initialize3dArray } from "./js-utils.js";
const SFR_MODERATOR_MAX_LEN = 3;
const SFR_MODERATOR_REFLECTOR_MAX_LEN = 2;
registerLoadCallback(() => { registerLoadCallback(() => {
listenTo("fileLoad:end", runSolver); listenTo("fileLoad:end", runSolver);
listenTo("planner:cell:change", runSolver); listenTo("planner:cell:change", runSolver);
@ -98,8 +95,7 @@ async function debugBlockSolver(data) {
} }
export async function runSolver() { export async function runSolver() {
const startTime = performance.now() emitEvent("solver:begin")
emitEvent("solver:begin");
const multiblockType = getPlannerMultiblockType(); const multiblockType = getPlannerMultiblockType();
@ -111,7 +107,6 @@ export async function runSolver() {
.map(idx => [idx, getAtlasMetadata(idx)]) .map(idx => [idx, getAtlasMetadata(idx)])
.map(([idx, md]) => [idx, findFullEntry("blocks", md, { configurationHint: multiblockType })])); .map(([idx, md]) => [idx, findFullEntry("blocks", md, { configurationHint: multiblockType })]));
plannerBlocks.forEach(v => v.tile = tileMap[v.tile]); plannerBlocks.forEach(v => v.tile = tileMap[v.tile]);
plannerBlocks.forEach(v => clearCellMetadata(v.dom, "active"));
const plannerBlocksGrid = initialize3dArray(...getPlannerMultiblockSize()); const plannerBlocksGrid = initialize3dArray(...getPlannerMultiblockSize());
plannerBlocks.forEach(b => { plannerBlocks.forEach(b => {
@ -163,7 +158,6 @@ export async function runSolver() {
} }
setCellMetadata(cell.dom, "primer", cell.primer); setCellMetadata(cell.dom, "primer", cell.primer);
}); });
console.log(fuelCells)
await debugBlockSolver("primed"); await debugBlockSolver("primed");
@ -173,70 +167,46 @@ export async function runSolver() {
while (activeCellIndex < activeCells.length) { while (activeCellIndex < activeCells.length) {
const cell = activeCells[activeCellIndex]; const cell = activeCells[activeCellIndex];
if (!cell.axes) return; // ignore bad cells if (!cell.axes) return; // ignore bad cells
Object.keys(sixAxes).map((directionName, i) => { Object.keys(sixAxes).map((name, i) => {
let valid = false; let moderatorSum = 0;
let moderatorPath = []; let moderatorPath = [];
let length = 0;
let reflectMultiplier = 1;
let reflect = false;
let fluxDestination;
for (const block of cell.axes[i]) { for (const block of cell.axes[i]) {
if (!block) break; if (!block) break;
if (block.tile.modules["nuclearcraft:overhaul_sfr:moderator"]) { if (block.tile.modules["nuclearcraft:overhaul_sfr:moderator"]) {
moderatorSum += block.tile.modules["nuclearcraft:overhaul_sfr:moderator"].flux;
moderatorPath.push(block); moderatorPath.push(block);
seenModerators.add(block); seenModerators.add(block);
length += 1; if (!block.flux) {
continue; block.flux = {};
} }
if (block.tile.modules["nuclearcraft:overhaul_sfr:neutron_shield"]) { block.flux[name] = moderatorSum;
length += 1;
continue; continue;
} }
if (block.tile.modules["nuclearcraft:overhaul_sfr:fuel_cell"] || block.tile.modules["nuclearcraft:overhaul_sfr:irradiator"]) { if (block.tile.modules["nuclearcraft:overhaul_sfr:fuel_cell"] || block.tile.modules["nuclearcraft:overhaul_sfr:irradiator"]) {
valid = length <= SFR_MODERATOR_MAX_LEN; block.flux = (block.flux ?? 0) + moderatorSum;
fluxDestination = block;
} }
if (block.tile.modules["nuclearcraft:overhaul_sfr:reflector"]) { if (block.tile.modules["nuclearcraft:overhaul_sfr:reflector"]) {
valid = length <= SFR_MODERATOR_REFLECTOR_MAX_LEN; const backAxis = name.replace(/^[+-]/, s => s === "+" ? "-" : "+");
reflect = true; for (const blockBack of moderatorPath.toReversed()) {
reflectMultiplier = block.tile.modules["nuclearcraft:overhaul_sfr:reflector"].reflectivity; moderatorSum += blockBack.tile.modules["nuclearcraft:overhaul_sfr:moderator"].flux;
console.log(reflectMultiplier) moderatorPath.push(blockBack);
fluxDestination = cell; blockBack.flux[backAxis] = moderatorSum;
}
cell.flux = (cell.flux ?? 0) + moderatorSum;
}
if (block.tile.modules["nuclearcraft:overhaul_sfr:fuel_cell"] && !block.active) {
if (!block.recipe) break; // FIXME
const fuelStats = block.recipe.modules["nuclearcraft:overhaul_sfr:fuel_stats"];
if (fuelStats.criticality <= block.flux) {
block.active = true;
activeCells.push(block);
}
} }
break; break;
} }
if (moderatorPath.length < 1) { if (moderatorPath.length > 0) {
valid = false;
}
if (!valid) return;
moderatorPath[0].active = true; moderatorPath[0].active = true;
let totalFlux = 0;
for (const mod of moderatorPath) {
totalFlux += mod.tile.modules["nuclearcraft:overhaul_sfr:moderator"].flux;
if (!mod.flux) {
mod.flux = {};
}
mod.flux[directionName] = totalFlux;
}
if (reflect) {
totalFlux *= reflectMultiplier;
const backAxis = directionName.replace(/^[+-]/, s => s === "+" ? "-" : "+");
for (const mod of moderatorPath.toReversed()) {
totalFlux += mod.tile.modules["nuclearcraft:overhaul_sfr:moderator"].flux * reflectMultiplier;
mod.flux[backAxis] = totalFlux;
}
}
fluxDestination.flux = (fluxDestination.flux ?? 0) + totalFlux;
if (fluxDestination.tile.modules["nuclearcraft:overhaul_sfr:fuel_cell"] && !fluxDestination.active) {
if (!fluxDestination.recipe) return; // FIXME
const fuelStats = fluxDestination.recipe.modules["nuclearcraft:overhaul_sfr:fuel_stats"];
if (fuelStats.criticality <= fluxDestination.flux) {
fluxDestination.active = true;
activeCells.push(fluxDestination);
}
} }
}); });
@ -279,8 +249,7 @@ export async function runSolver() {
if (n.tile.modules) { if (n.tile.modules) {
return n.tile.modules["nuclearcraft:overhaul_sfr:reflector"] return n.tile.modules["nuclearcraft:overhaul_sfr:reflector"]
|| n.tile.modules["nuclearcraft:overhaul_sfr:irradiator"] || n.tile.modules["nuclearcraft:overhaul_sfr:irradiator"]
|| n.tile.modules["nuclearcraft:overhaul_sfr:casing"] || n.tile.modules["nuclearcraft:overhaul_sfr:casing"];
|| n.tile.modules["nuclearcraft:overhaul_sfr:neutron_shield"];
} }
return false; return false;
}); });
@ -308,9 +277,6 @@ export async function runSolver() {
await debugBlockSolver("heatsinks"); await debugBlockSolver("heatsinks");
} }
const endTime = performance.now()
console.log(`Solver took ${endTime - startTime}ms`);
} }
function checkHeatSinkRule(hs, rule, activeNeighbors) { function checkHeatSinkRule(hs, rule, activeNeighbors) {

View File

@ -271,11 +271,11 @@ input:not([type="checkbox"]):not([type="radio"]):not([type="file"]) {
.planner--cell > .planner--overlay[data-overlay="block_recipe"] { .planner--cell > .planner--overlay[data-overlay="block_recipe"] {
transform: scale(var(--recipe-scale-factor, 0.8)); transform: scale(var(--recipe-scale-factor, 0.8));
} }
#planner .planner--cell > .planner--overlay[data-overlay="active"][data-active="true"] { #planner .planner--cell > .planner--overlay[data-overlay="active"] {
outline-offset: calc(var(--scale-factor) * -1px); outline-offset: calc(var(--scale-factor) * -1px);
outline: calc(var(--scale-factor) * 1px) solid var(--cell-active-outline, #0f08); outline: calc(var(--scale-factor) * 1px) solid var(--cell-active-outline, #0f08);
} }
#planner .planner--cell > .planner--overlay[data-overlay="active"][data-active="false"] { #planner .planner--cell > .planner--overlay[data-overlay="inactive"] {
outline-offset: calc(var(--scale-factor) * -1px); outline-offset: calc(var(--scale-factor) * -1px);
outline: calc(var(--scale-factor) * 1px) solid var(--cell-inactive-outline, #f008); outline: calc(var(--scale-factor) * 1px) solid var(--cell-inactive-outline, #f008);
} }