Dev console finds materials by display name from the real material table (t82)

This commit is contained in:
2026-10-29 17:47:21 -04:00
parent ece650a8bc
commit f7c989db6c
3 changed files with 41 additions and 5 deletions
+11 -5
View File
@@ -26,7 +26,13 @@ function devError(text) { return Object.assign([text], { error: true }); }
function devName(text) { return text.toLowerCase().replace(/\s+/g, ''); }
function devGiveable(id) { return id !== EMPTY && PH[id] !== PH_GAS && (PH[id] !== PH_SOLID || !!YLD[id]); }
function devMaterialList(text = '') {
return Object.entries(DEV_MATERIALS).filter(([key, id]) => devGiveable(id) && (devName(key).includes(devName(text)) || devName(MD[id].name).includes(devName(text))));
const keys = new Map(Object.entries(DEV_MATERIALS).map(([key, id]) => [id, key]));
const list = [], name = devName(text);
for (let id = 1; id < NMAT; id++) {
const key = keys.get(id) || '';
if (devGiveable(id) && (devName(key).includes(name) || devName(MD[id].name).includes(name))) list.push([key, id]);
}
return list;
}
// Edit distance is only used on a console error, never in the simulation tick.
function devDistance(a, b) {
@@ -83,12 +89,12 @@ function devComplete(text, previous) {
const DEV_MATERIALS = { EMPTY, GRASS, DIRT, LDIRT, SAND, GRAVEL, CLAY, STONE, GRANITE, BASALT, WOOD, LEAVES, COALV, COAL, CUV, CUORE, FEV, FEORE, ASH, SLAG, BRICK, GLASS, COPPER, IRON, STEEL, WATER, MAGMA, MCU, MFE, MST, MGL, STEAM, SMOKE, FIRE, BELTL, BELTR, SHAFT, GATE, HULL, SPRING, RSTONE, RGRAN, RBAS, LCLAY, LWOOD, RBRICK, CULLET, SCRCU, SCRFE, SCRST, BARCU, BARFE, BARST, ACORN, CHARCOAL, SNOW, ICE, SNV, SNORE, TIN, MSN, SCRSN, BARSN, ZNV, ZNORE, ZINC, MZN, SCRZN, BARZN, AGV, AGORE, SILVER, MAG, SCRAG, BARAG, AUV, AUORE, GOLD, MAU, SCRAU, BARAU, BRONZE, MBZ, SCRBZ, BARBZ, BRASS, MBS, SCRBS, BARBS, DOCKW, MSLAG, PIPE, BARGL, CUTST, BARSB, GRINDER, SAWB, PLANK, PRESSB, GREENB, BARBR, RACKB };
function devMaterial(name) {
name = devName(name);
const ids = Object.entries(DEV_MATERIALS);
const internal = ids.find(([key]) => devName(key) === name);
const internal = Object.entries(DEV_MATERIALS).find(([key]) => devName(key) === name);
if (internal) return internal[1];
const ids = devMaterialList();
const exact = ids.filter(([, id]) => devName(MD[id].name) === name);
const matches = [...new Set((exact.length ? exact : ids.filter(([key, id]) => devName(key).startsWith(name) || devName(MD[id].name).startsWith(name))).map(([, id]) => id))];
return matches.length === 1 ? matches[0] : matches.length ? `Ambiguous material: ${matches.map(id => MD[id].name + ' (' + ids.find(([, m]) => m === id)[0] + ')').join(', ')}.` : 'Unknown material. Did you mean: ' + devSuggestions(name) + '? Use materials to list names.';
return matches.length === 1 ? matches[0] : matches.length ? `Ambiguous material: ${matches.map(id => { const key = ids.find(([, m]) => m === id)[0]; return MD[id].name + (key ? ' (' + key + ')' : ''); }).join(', ')}.` : 'Unknown material. Did you mean: ' + devSuggestions(name) + '? Use materials to list names.';
}
function devCommand(text, cursor) {
if (typeof text !== 'string' || !text.trim()) return ['Type help to list commands.'];
@@ -105,7 +111,7 @@ function devCommand(text, cursor) {
return ['Usage: ' + def[0], 'Example: ' + def[1]];
}
if (cmd === 'materials') {
const lines = devMaterialList(args.join(' ')).map(([key, id]) => MD[id].name + ' (' + key + ')');
const lines = devMaterialList(args.join(' ')).map(([key, id]) => MD[id].name + (key ? ' (' + key + ')' : ''));
return lines.length ? lines : ['No matching materials.'];
}
if (cmd === 'clear') return args.length ? usage() : Object.assign([], { clear: true });