import { round } from 'common/math'; import { Fragment } from 'inferno'; import { useBackend } from '../backend'; import { AnimatedNumber, Box, Button, Flex, Icon, LabeledList, ProgressBar, Section, Table, Tooltip } from '../components'; import { Window } from '../layouts'; const stats = [ ['good', 'Alive'], ['average', 'Unconscious'], ['bad', 'DEAD'], ]; const abnormalities = [ [ 'hasBorer', 'bad', (occupant) => 'Large growth detected in frontal lobe,' + ' possibly cancerous. Surgical removal is recommended.', ], ['hasVirus', 'bad', (occupant) => 'Viral pathogen detected in blood stream.'], ['blind', 'average', (occupant) => 'Cataracts detected.'], [ 'colourblind', 'average', (occupant) => 'Photoreceptor abnormalities detected.', ], ['nearsighted', 'average', (occupant) => 'Retinal misalignment detected.'], /* VOREStation Add */ [ 'humanPrey', 'average', (occupant) => { return 'Foreign Humanoid(s) detected: ' + occupant.humanPrey; }, ], [ 'livingPrey', 'average', (occupant) => { return 'Foreign Creature(s) detected: ' + occupant.livingPrey; }, ], [ 'objectPrey', 'average', (occupant) => { return 'Foreign Object(s) detected: ' + occupant.objectPrey; }, ], /* VOREStation Add End */ ]; const damages = [ ['Respiratory', 'oxyLoss'], ['Brain', 'brainLoss'], ['Toxin', 'toxLoss'], ['Radiation', 'radLoss'], ['Brute', 'bruteLoss'], ['Genetic', 'cloneLoss'], ['Burn', 'fireLoss'], ['Paralysis', 'paralysis'], ]; const damageRange = { average: [0.25, 0.5], bad: [0.5, Infinity], }; const mapTwoByTwo = (a, c) => { let result = []; for (let i = 0; i < a.length; i += 2) { result.push(c(a[i], a[i + 1], i)); } return result; }; const reduceOrganStatus = (A) => { return A.length > 0 ? A.reduce((a, s) => a === null ? ( s ) : ( {a} {!!s && {s}} ) ) : null; }; const germStatus = (i) => { if (i > 100) { if (i < 300) { return 'mild infection'; } if (i < 400) { return 'mild infection+'; } if (i < 500) { return 'mild infection++'; } if (i < 700) { return 'acute infection'; } if (i < 800) { return 'acute infection+'; } if (i < 900) { return 'acute infection++'; } if (i >= 900) { return 'septic'; } } return ''; }; export const BodyScanner = (props, context) => { const { data } = useBackend(context); const { occupied, occupant = {} } = data; const body = occupied ? ( ) : ( ); return ( {body} ); }; const BodyScannerMain = (props) => { const { occupant } = props; return ( ); }; const BodyScannerMainOccupant = (props, context) => { const { act, data } = useBackend(context); const { occupant } = data; return (
}> {occupant.name} {stats[occupant.stat][1]} °C,  °F {' '} units ( %) {/* VOREStation Add */} {round(data.occupant.weight) + 'lbs, ' + round(data.occupant.weight / 2.20463) + 'kgs'} {/* VOREStation Add End */}
); }; const BodyScannerMainReagents = (props) => { const { occupant } = props; return (
{occupant.reagents ? ( Reagent Amount {occupant.reagents.map((reagent) => ( {reagent.name} {reagent.amount} Units{' '} {reagent.overdose ? OVERDOSING : null} ))}
) : ( No Blood Reagents Detected )}
{occupant.ingested ? ( Reagent Amount {occupant.ingested.map((reagent) => ( {reagent.name} {reagent.amount} Units{' '} {reagent.overdose ? OVERDOSING : null} ))}
) : ( No Stomach Reagents Detected )}
); }; const BodyScannerMainAbnormalities = (props) => { const { occupant } = props; let hasAbnormalities = occupant.hasBorer || occupant.blind || occupant.colourblind || occupant.nearsighted || occupant.hasVirus; /* VOREStation Add */ hasAbnormalities = hasAbnormalities || occupant.humanPrey || occupant.livingPrey || occupant.objectPrey; /* VOREStation Add End */ if (!hasAbnormalities) { return (
No abnormalities found.
); } return (
{abnormalities.map((a, i) => { if (occupant[a[0]]) { return ( {a[2](occupant)} ); } })}
); }; const BodyScannerMainDamage = (props) => { const { occupant } = props; return (
{mapTwoByTwo(damages, (d1, d2, i) => ( {d1[0]}: {!!d2 && d2[0] + ':'} {!!d2 && } ))}
); }; const BodyScannerMainDamageBar = (props) => { return ( {round(props.value, 0)} ); }; const BodyScannerMainOrgansExternal = (props) => { if (props.organs.length === 0) { return (
N/A
); } return (
Name Damage Injuries {props.organs.map((o, i) => ( {o.name} 0 && '0.5rem'} value={o.totalLoss / 100} ranges={damageRange}> {!!o.bruteLoss && ( {round(o.bruteLoss, 0)}  )} {!!o.fireLoss && ( {round(o.fireLoss, 0)} )} {round(o.totalLoss, 0)} {reduceOrganStatus([ o.internalBleeding && 'Internal bleeding', !!o.status.bleeding && 'External bleeding', o.lungRuptured && 'Ruptured lung', o.destroyed && 'Destroyed', !!o.status.broken && o.status.broken, germStatus(o.germ_level), !!o.open && 'Open incision', ])} {reduceOrganStatus([ !!o.status.splinted && 'Splinted', !!o.status.robotic && 'Robotic', !!o.status.dead && DEAD, ])} {reduceOrganStatus( o.implants.map((s) => (s.known ? s.name : 'Unknown object')) )} ))}
); }; const BodyScannerMainOrgansInternal = (props) => { if (props.organs.length === 0) { return (
N/A
); } return (
Name Damage Injuries {props.organs.map((o, i) => ( {o.name} 0 && '0.5rem'} ranges={damageRange}> {round(o.damage, 0)} {reduceOrganStatus([ germStatus(o.germ_level), !!o.inflamed && 'Appendicitis detected.', ])} {reduceOrganStatus([ o.robotic === 1 && 'Robotic', o.robotic === 2 && 'Assisted', !!o.dead && DEAD, ])} ))}
); }; const BodyScannerEmpty = () => { return (

No occupant detected.
); };