import { classes } from 'common/react'; import { uniqBy } from 'common/collections'; import { useBackend, useSharedState } from '../backend'; import { formatSiUnit, formatMoney } from '../format'; import { Flex, Section, Tabs, Box, Button, Fragment, ProgressBar, NumberInput, Icon, Input, Tooltip } from '../components'; import { Window } from '../layouts'; import { createSearch, toTitleCase } from 'common/string'; import { toFixed } from 'common/math'; const MATERIAL_KEYS = { 'steel': 'sheet-metal_3', 'glass': 'sheet-glass_3', 'silver': 'sheet-silver_3', 'graphite': 'sheet-puck_3', 'plasteel': 'sheet-plasteel_3', 'durasteel': 'sheet-durasteel_3', 'verdantium': 'sheet-wavy_3', 'morphium': 'sheet-wavy_3', 'mhydrogen': 'sheet-mythril_3', 'gold': 'sheet-gold_3', 'diamond': 'sheet-diamond', 'supermatter': 'sheet-super_3', 'osmium': 'sheet-silver_3', 'phoron': 'sheet-phoron_3', 'uranium': 'sheet-uranium_3', 'titanium': 'sheet-titanium_3', 'lead': 'sheet-adamantine_3', 'platinum': 'sheet-adamantine_3', 'plastic': 'sheet-plastic_3', }; const COLOR_NONE = 0; const COLOR_AVERAGE = 1; const COLOR_BAD = 2; const COLOR_KEYS = { [COLOR_NONE]: false, [COLOR_AVERAGE]: 'average', [COLOR_BAD]: 'bad', }; const materialArrayToObj = (materials) => { let materialObj = {}; materials.forEach((m) => { materialObj[m.name] = m.amount; }); return materialObj; }; const partBuildColor = (cost, tally, material) => { if (cost > material) { return { color: COLOR_BAD, deficit: cost - material }; } if (tally > material) { return { color: COLOR_AVERAGE, deficit: cost }; } if (cost + tally > material) { return { color: COLOR_AVERAGE, deficit: cost + tally - material }; } return { color: COLOR_NONE, deficit: 0 }; }; const partCondFormat = (materials, tally, part) => { let format = { 'textColor': COLOR_NONE }; Object.keys(part.cost).forEach((mat) => { format[mat] = partBuildColor(part.cost[mat], tally[mat], materials[mat]); if (format[mat].color > format['textColor']) { format['textColor'] = format[mat].color; } }); return format; }; const queueCondFormat = (materials, queue) => { let materialTally = {}; let matFormat = {}; let missingMatTally = {}; let textColors = {}; queue.forEach((part, i) => { textColors[i] = COLOR_NONE; Object.keys(part.cost).forEach((mat) => { materialTally[mat] = materialTally[mat] || 0; missingMatTally[mat] = missingMatTally[mat] || 0; matFormat[mat] = partBuildColor(part.cost[mat], materialTally[mat], materials[mat]); if (matFormat[mat].color !== COLOR_NONE) { if (textColors[i] < matFormat[mat].color) { textColors[i] = matFormat[mat].color; } } else { materialTally[mat] += part.cost[mat]; } missingMatTally[mat] += matFormat[mat].deficit; }); }); return { materialTally, missingMatTally, textColors, matFormat }; }; const searchFilter = (search, allparts) => { let searchResults = []; if (!search.length) { return; } const resultFilter = createSearch(search, (part) => (part.name || '') + (part.desc || '') + (part.searchMeta || '')); Object.keys(allparts).forEach((category) => { allparts[category].filter(resultFilter).forEach((e) => { searchResults.push(e); }); }); searchResults = uniqBy((part) => part.name)(searchResults); return searchResults; }; export const ExosuitFabricator = (props, context) => { const { act, data } = useBackend(context); const queue = data.queue || []; const materialAsObj = materialArrayToObj(data.materials || []); const { materialTally, missingMatTally, textColors } = queueCondFormat(materialAsObj, queue); const [displayMatCost, setDisplayMatCost] = useSharedState(context, 'display_mats', false); const [displayAllMat, setDisplayAllMat] = useSharedState(context, 'display_all_mats', false); return (
setDisplayMatCost(!displayMatCost)} checked={displayMatCost}> Display Material Costs setDisplayAllMat(!displayAllMat)} checked={displayAllMat}> Display All Materials {(data.species_types && ( Species: )) || null} {(data.manufacturers && ( Manufacturer: )) || null}
act('sync_rnd')} />}>
); }; const EjectMaterial = (props, context) => { const { act } = useBackend(context); const { material } = props; const { name, removable, sheets } = material; const [removeMaterials, setRemoveMaterials] = useSharedState(context, 'remove_mats_' + name, 1); if (removeMaterials > 1 && sheets < removeMaterials) { setRemoveMaterials(sheets || 1); } return ( { const newVal = parseInt(val, 10); if (Number.isInteger(newVal)) { setRemoveMaterials(newVal); } }} />