update tooltips
This commit is contained in:
parent
a46f8d85a0
commit
88e1b6e7b7
|
|
@ -126,7 +126,7 @@
|
||||||
</section>
|
</section>
|
||||||
</aside>
|
</aside>
|
||||||
<footer>
|
<footer>
|
||||||
<div>pre-alpha 1.5</div>
|
<div>pre-alpha 1.6</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://discord.gg/Eq72HwPqfg">Discord server</a>
|
<a href="https://discord.gg/Eq72HwPqfg">Discord server</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import { createTooltip, tooltipDataToPlain } from "./tooltip.js";
|
||||||
import { emitEvent, listenTo } from "./events.js";
|
import { emitEvent, listenTo } from "./events.js";
|
||||||
import { getPlannerMultiblockType } from "./planner.js";
|
import { getPlannerMultiblockType } from "./planner.js";
|
||||||
import { registerLoadCallback } from "./main.js";
|
import { registerLoadCallback } from "./main.js";
|
||||||
import { lookupFromMetadata, resolveBlockName } from "./ncpf-utils.js";
|
import { lookupFromMetadata, parseRuleAsString, resolveBlockName } from "./ncpf-utils.js";
|
||||||
|
|
||||||
registerLoadCallback(() => {
|
registerLoadCallback(() => {
|
||||||
listenTo("config:end", buildBlockPicker);
|
listenTo("config:end", buildBlockPicker);
|
||||||
|
|
@ -78,7 +78,7 @@ function* getBlockTooltip(metadata) {
|
||||||
}
|
}
|
||||||
if (heatSink.rules) {
|
if (heatSink.rules) {
|
||||||
for (const rule of heatSink.rules) {
|
for (const rule of heatSink.rules) {
|
||||||
yield "Requires " + parseRuleAsTooltip(rule, { configurationHint: metadata.configuration });
|
yield "Requires " + parseRuleAsString(rule, { configurationHint: metadata.configuration });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -99,15 +99,15 @@ function* getBlockTooltip(metadata) {
|
||||||
|
|
||||||
if ("nuclearcraft:overhaul_sfr:fuel_cell" in data.modules) {
|
if ("nuclearcraft:overhaul_sfr:fuel_cell" in data.modules) {
|
||||||
hasAdditionalData = true;
|
hasAdditionalData = true;
|
||||||
yield "Fuel Cell";
|
yield "Fuel cell";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("nuclearcraft:overhaul_sfr:port" in data.modules) {
|
if ("nuclearcraft:overhaul_sfr:port" in data.modules) {
|
||||||
hasAdditionalData = true;
|
hasAdditionalData = true;
|
||||||
if (data.modules["nuclearcraft:overhaul_sfr:port"].output) {
|
if (data.modules["nuclearcraft:overhaul_sfr:port"].output) {
|
||||||
yield "Output Port";
|
yield "Output port";
|
||||||
} else {
|
} else {
|
||||||
yield "Input Port";
|
yield "Input port";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -124,7 +124,7 @@ function* getBlockTooltip(metadata) {
|
||||||
if ("nuclearcraft:overhaul_sfr:neutron_source" in data.modules) {
|
if ("nuclearcraft:overhaul_sfr:neutron_source" in data.modules) {
|
||||||
hasAdditionalData = true;
|
hasAdditionalData = true;
|
||||||
const neutronSource = data.modules["nuclearcraft:overhaul_sfr:neutron_source"];
|
const neutronSource = data.modules["nuclearcraft:overhaul_sfr:neutron_source"];
|
||||||
yield "Neutron Source";
|
yield "Neutron source";
|
||||||
yield `Efficiency: ${neutronSource.efficiency}`;
|
yield `Efficiency: ${neutronSource.efficiency}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,7 +132,7 @@ function* getBlockTooltip(metadata) {
|
||||||
hasAdditionalData = true;
|
hasAdditionalData = true;
|
||||||
const moderator = data.modules["nuclearcraft:overhaul_sfr:moderator"];
|
const moderator = data.modules["nuclearcraft:overhaul_sfr:moderator"];
|
||||||
yield "Moderator";
|
yield "Moderator";
|
||||||
yield `Flux: ${moderator.flux}`;
|
yield `Flux factor: ${moderator.flux}`;
|
||||||
yield `Efficiency: ${moderator.efficiency}`;
|
yield `Efficiency: ${moderator.efficiency}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -147,7 +147,7 @@ function* getBlockTooltip(metadata) {
|
||||||
if ("nuclearcraft:overhaul_sfr:neutron_shield" in data.modules) {
|
if ("nuclearcraft:overhaul_sfr:neutron_shield" in data.modules) {
|
||||||
hasAdditionalData = true;
|
hasAdditionalData = true;
|
||||||
const shield = data.modules["nuclearcraft:overhaul_sfr:neutron_shield"];
|
const shield = data.modules["nuclearcraft:overhaul_sfr:neutron_shield"];
|
||||||
yield "Neutron Shield";
|
yield "Neutron shield";
|
||||||
yield `Efficiency: ${shield.efficiency}`;
|
yield `Efficiency: ${shield.efficiency}`;
|
||||||
yield `Heat per Flux: ${shield.heat_per_flux}`;
|
yield `Heat per Flux: ${shield.heat_per_flux}`;
|
||||||
}
|
}
|
||||||
|
|
@ -162,54 +162,6 @@ function* getBlockTooltip(metadata) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseRuleAsTooltip(rule, props) {
|
|
||||||
switch (rule.type) {
|
|
||||||
case "and":
|
|
||||||
return rule.rules.map(r => parseRuleAsTooltip(r, props)).join(" AND ");
|
|
||||||
|
|
||||||
case "or":
|
|
||||||
return rule.rules.map(r => parseRuleAsTooltip(r, props)).join(" OR ");
|
|
||||||
|
|
||||||
case "between": {
|
|
||||||
const block = resolveBlockName(rule.block, props);
|
|
||||||
if (!block) {
|
|
||||||
console.warn("could not find block %o", rule.block);
|
|
||||||
return "???";
|
|
||||||
}
|
|
||||||
if (rule.min === rule.max) {
|
|
||||||
return `exactly ${rule.min} ${block}`;
|
|
||||||
} else if (rule.max === 6) {
|
|
||||||
return `at least ${rule.min} ${block}`;
|
|
||||||
} else if (rule.min === 0) {
|
|
||||||
return `no more than ${rule.max} ${block}`;
|
|
||||||
} else {
|
|
||||||
return `between ${rule.min} and ${rule.max} ${block}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
case "axial": {
|
|
||||||
const block = resolveBlockName(rule.block, props);
|
|
||||||
if (!block) {
|
|
||||||
console.warn("could not find block %o", rule.block);
|
|
||||||
return "???";
|
|
||||||
}
|
|
||||||
if (rule.min === rule.max) {
|
|
||||||
return `exactly ${rule.min} axial ${block}`;
|
|
||||||
} else if (rule.max === 3) {
|
|
||||||
return `at least ${rule.min} axial ${block}`;
|
|
||||||
} else if (rule.min === 0) {
|
|
||||||
return `no more than ${rule.max} axial ${block}`;
|
|
||||||
} else {
|
|
||||||
return `between ${rule.min} and ${rule.max} axial ${block}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
console.warn("unknown rule: %o", rule);
|
|
||||||
return "???";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getBlockPickerActiveItem() {
|
export function getBlockPickerActiveItem() {
|
||||||
const blockPickerDom = document.getElementById("block-picker-list");
|
const blockPickerDom = document.getElementById("block-picker-list");
|
||||||
return Number(blockPickerDom.dataset.activeItem ?? -1);
|
return Number(blockPickerDom.dataset.activeItem ?? -1);
|
||||||
|
|
|
||||||
|
|
@ -153,3 +153,51 @@ export function lookupFromMetadata(metadata) {
|
||||||
|
|
||||||
return possibleEntries.find(other => checkEquivalence(metadata, other));
|
return possibleEntries.find(other => checkEquivalence(metadata, other));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function parseRuleAsString(rule, props = { configurationHint: null }) {
|
||||||
|
switch (rule.type) {
|
||||||
|
case "and":
|
||||||
|
return rule.rules.map(r => parseRuleAsString(r, props)).join(" AND ");
|
||||||
|
|
||||||
|
case "or":
|
||||||
|
return rule.rules.map(r => parseRuleAsString(r, props)).join(" OR ");
|
||||||
|
|
||||||
|
case "between": {
|
||||||
|
const block = resolveBlockName(rule.block, props);
|
||||||
|
if (!block) {
|
||||||
|
console.warn("could not find block %o", rule.block);
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
if (rule.min === rule.max) {
|
||||||
|
return `exactly ${rule.min} ${block}`;
|
||||||
|
} else if (rule.max === 6) {
|
||||||
|
return `at least ${rule.min} ${block}`;
|
||||||
|
} else if (rule.min === 0) {
|
||||||
|
return `no more than ${rule.max} ${block}`;
|
||||||
|
} else {
|
||||||
|
return `between ${rule.min} and ${rule.max} ${block}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case "axial": {
|
||||||
|
const block = resolveBlockName(rule.block, props);
|
||||||
|
if (!block) {
|
||||||
|
console.warn("could not find block %o", rule.block);
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
if (rule.min === rule.max) {
|
||||||
|
return `exactly ${rule.min} axial ${block}`;
|
||||||
|
} else if (rule.max === 3) {
|
||||||
|
return `at least ${rule.min} axial ${block}`;
|
||||||
|
} else if (rule.min === 0) {
|
||||||
|
return `no more than ${rule.max} axial ${block}`;
|
||||||
|
} else {
|
||||||
|
return `between ${rule.min} and ${rule.max} axial ${block}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
console.warn("unknown rule: %o", rule);
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import { registerLoadCallback } from "./main.js";
|
||||||
import { getBlockPickerActiveItem, getBlockPickerRecipe } from "./block-picker.js";
|
import { getBlockPickerActiveItem, getBlockPickerRecipe } from "./block-picker.js";
|
||||||
import { clearCellMetadata, 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 } from "./ncpf-utils.js";
|
import { checkEquivalence, lookupFromMetadata, parseRuleAsString } from "./ncpf-utils.js";
|
||||||
|
|
||||||
const zoomOptions = [ 0.5, 1, 2, 3, 4, 5 ];
|
const zoomOptions = [ 0.5, 1, 2, 3, 4, 5 ];
|
||||||
const zoomDefault = 2;
|
const zoomDefault = 2;
|
||||||
|
|
@ -352,6 +352,46 @@ export function* getCellTooltip(cell) {
|
||||||
name: recipe.modules["plannerator:display_name"].display_name,
|
name: recipe.modules["plannerator:display_name"].display_name,
|
||||||
atlasIndex: getAtlasIndexFromMetadata(recipe, multiblockType, "ncpf:block_recipes"),
|
atlasIndex: getAtlasIndexFromMetadata(recipe, multiblockType, "ncpf:block_recipes"),
|
||||||
}
|
}
|
||||||
|
if ("nuclearcraft:overhaul_sfr:fuel_stats" in recipe.modules) {
|
||||||
|
const stats = recipe.modules["nuclearcraft:overhaul_sfr:fuel_stats"];
|
||||||
|
|
||||||
|
if (stats.self_priming) {
|
||||||
|
yield "Self-priming";
|
||||||
|
} else {
|
||||||
|
yield "Not primed";
|
||||||
|
}
|
||||||
|
yield {
|
||||||
|
type: "compound",
|
||||||
|
items: [
|
||||||
|
`Criticality: `,
|
||||||
|
{
|
||||||
|
type: "bold",
|
||||||
|
text: `0/${stats.criticality}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("nuclearcraft:overhaul_sfr:moderator" in data.modules) {
|
||||||
|
const moderator = data.modules["nuclearcraft:overhaul_sfr:moderator"];
|
||||||
|
yield `Flux factor: ${moderator.flux}`;
|
||||||
|
yield `Efficiency: ${moderator.efficiency}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("nuclearcraft:overhaul_sfr:reflector" in data.modules) {
|
||||||
|
const reflector = data.modules["nuclearcraft:overhaul_sfr:reflector"];
|
||||||
|
yield `Efficiency: ${reflector.efficiency}`;
|
||||||
|
yield `Reflectivity: ${reflector.reflectivity}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("nuclearcraft:overhaul_sfr:heat_sink" in data.modules) {
|
||||||
|
const heatSink = data.modules["nuclearcraft:overhaul_sfr:heat_sink"];
|
||||||
|
if (heatSink.rules) {
|
||||||
|
for (const rule of heatSink.rules) {
|
||||||
|
yield "Rule not met: " + parseRuleAsString(rule, { configurationHint: metadata.configuration });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -136,41 +136,66 @@ function createTooltipDom(data) {
|
||||||
div.classList.add("tooltip");
|
div.classList.add("tooltip");
|
||||||
for (const row of data) {
|
for (const row of data) {
|
||||||
const rowElem = document.createElement("div");
|
const rowElem = document.createElement("div");
|
||||||
|
rowElem.appendChild(createTooltipNode(row));
|
||||||
if (typeof row === "string") {
|
div.appendChild(rowElem);
|
||||||
rowElem.innerText = row;
|
|
||||||
} else {
|
|
||||||
if (!row.type) {
|
|
||||||
throw row;
|
|
||||||
}
|
}
|
||||||
// TODO: support richer tooltips
|
return div;
|
||||||
switch (row.type) {
|
}
|
||||||
case "italics":
|
|
||||||
rowElem.innerText = row.text;
|
|
||||||
rowElem.classList.add("italics");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "item":
|
function createTooltipNode(tooltip) {
|
||||||
if (row.prefix) {
|
if (typeof tooltip === "string") {
|
||||||
rowElem.appendChild(document.createTextNode(row.prefix));
|
return document.createTextNode(tooltip);
|
||||||
}
|
}
|
||||||
rowElem.appendChild(makeAtlasImage(row.atlasIndex));
|
|
||||||
rowElem.appendChild(document.createTextNode(row.name));
|
if (!tooltip.type) {
|
||||||
rowElem.classList.add("tooltip--item");
|
throw tooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (tooltip.type) {
|
||||||
|
case "plain":
|
||||||
|
return createTooltipNode(tooltip.text);
|
||||||
|
|
||||||
|
case "italics": {
|
||||||
|
const elem = document.createElement("span");
|
||||||
|
elem.classList.add("italics");
|
||||||
|
elem.appendChild(createTooltipNode(tooltip.text));
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "bold": {
|
||||||
|
const elem = document.createElement("span");
|
||||||
|
elem.classList.add("bold");
|
||||||
|
elem.appendChild(createTooltipNode(tooltip.text));
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "item": {
|
||||||
|
const elem = document.createElement("div");
|
||||||
|
if (tooltip.prefix) {
|
||||||
|
elem.appendChild(createTooltipNode(tooltip.prefix));
|
||||||
|
}
|
||||||
|
elem.classList.add("tooltip--item");
|
||||||
|
elem.appendChild(makeAtlasImage(tooltip.atlasIndex));
|
||||||
|
elem.appendChild(createTooltipNode(tooltip.name));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "compound": {
|
||||||
|
const fragment = document.createDocumentFragment();
|
||||||
|
for (const item of tooltip.items) {
|
||||||
|
fragment.appendChild(createTooltipNode(item));
|
||||||
|
}
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
case "meta":
|
case "meta":
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
console.warn("unknown tooltip type", row);
|
console.warn("unknown tooltip type", tooltip);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
return document.createDocumentFragment();
|
||||||
|
|
||||||
div.appendChild(rowElem);
|
|
||||||
}
|
|
||||||
return div;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createAutoTooltipDom(element) {
|
function createAutoTooltipDom(element) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue