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 (
);
}
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 (
);
}
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 (
);
}
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 (
);
};