From 40e5d511d5af8aeb74377bf9b2568d2e968caf0a Mon Sep 17 00:00:00 2001 From: Cody Brittain Date: Fri, 22 Dec 2023 15:03:41 -0500 Subject: [PATCH] Improve cryo tubes (#17919) * Improve cryo tubes * JS --> TSX * Fix lack of type * Cryo tube improvements * Update code/game/machinery/cryo.dm Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com> --------- Co-authored-by: Cody Brittain Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com> --- code/game/machinery/cryo.dm | 260 ++++++++++------- .../mob/living/carbon/human/human_helpers.dm | 5 + .../Chemistry-Reagents-Medicine.dm | 30 +- .../GeneralCamo - Cryo Pod buff.yml | 50 ++++ icons/obj/cryogenics.dmi | Bin 30471 -> 31285 bytes icons/obj/cryogenics_split.dmi | Bin 5537 -> 10031 bytes tgui/packages/tgui/interfaces/CryoTube.tsx | 271 ++++++++++++++++++ 7 files changed, 505 insertions(+), 111 deletions(-) create mode 100644 html/changelogs/GeneralCamo - Cryo Pod buff.yml create mode 100644 tgui/packages/tgui/interfaces/CryoTube.tsx diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index deb23de93a5..0846794407a 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -22,7 +22,7 @@ icon_state = "pod_preview" density = TRUE anchored = TRUE - layer = 2.8 + layer = ABOVE_ALL_MOB_LAYER interact_offline = TRUE var/on = 0 @@ -37,17 +37,28 @@ var/current_heat_capacity = 50 -/obj/machinery/atmospherics/unary/cryo_cell/New() - ..() + var/temperature_warning_threshold = 170 + var/temperature_danger_threshold = T0C + + var/fast_stasis_mult = 0.8 + var/slow_stasis_mult = 1.25 + var/current_stasis_mult = 1 + + var/global/list/screen_overlays + +/obj/machinery/atmospherics/unary/cryo_cell/Initialize() + . = ..() icon = 'icons/obj/cryogenics_split.dmi' + generate_overlays() update_icon() - initialize_directions = dir + atmos_init() /obj/machinery/atmospherics/unary/cryo_cell/Destroy() - var/turf/T = loc + var/turf/T = src.loc T.contents += contents if(beaker) beaker.forceMove(get_step(loc, SOUTH)) //Beaker is carefully ejected from the wreckage of the cryotube + beaker = null return ..() /obj/machinery/atmospherics/unary/cryo_cell/atmos_init() @@ -58,10 +69,32 @@ node = target break +/obj/machinery/atmospherics/unary/cryo_cell/examine(mob/user, distance, is_adjacent) + . = ..() + if(is_adjacent) + if(beaker) + to_chat(user, SPAN_NOTICE("It is loaded with a beaker.")) + if(occupant) + occupant.examine(arglist(args)) + +/obj/machinery/atmospherics/unary/cryo_cell/proc/generate_overlays(force = FALSE) + if(LAZYLEN(screen_overlays) && !force) + return + LAZYINITLIST(screen_overlays) + screen_overlays["cryo-off"] = make_screen_overlay(icon, "lights_off") + screen_overlays["cryo-off-top"] = make_screen_overlay(icon, "lights_off_top") + screen_overlays["cryo-safe"] = make_screen_overlay(icon, "lights_safe") + screen_overlays["cryo-safe-top"] = make_screen_overlay(icon, "lights_safe_top") + screen_overlays["cryo-warn"] = make_screen_overlay(icon, "lights_warn") + screen_overlays["cryo-warn-top"] = make_screen_overlay(icon, "lights_warn_top") + screen_overlays["cryo-danger"] = make_screen_overlay(icon, "lights_danger") + screen_overlays["cryo-danger-top"] = make_screen_overlay(icon, "lights_danger_top") + /obj/machinery/atmospherics/unary/cryo_cell/process() ..() if(!node) return + if(!on) return @@ -76,66 +109,73 @@ if(abs(temperature_archived-air_contents.temperature) > 1) network.update = 1 + update_icon() return 1 /obj/machinery/atmospherics/unary/cryo_cell/relaymove(mob/user as mob) - if(user != occupant) //Put this in because apparently if you open the ui and press a button, you're counted as user and can trigger relaymove, this checks if you're inside, and if you aren't it ignores you for the purposes of the relaymove. - Risingvaliant - return - if(user.stat) - return - go_out() - return + if(src.occupant == user && !user.stat) + go_out() /obj/machinery/atmospherics/unary/cryo_cell/attack_hand(mob/user) ui_interact(user) -/** - * The ui_interact proc is used to open and update Nano UIs - * If ui_interact is not used then the UI will not update correctly - * ui_interact is currently defined for /atom/movable (which is inherited by /obj and /mob) - * - * @param user /mob The mob who is interacting with this ui - * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") - * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui - * - * @return nothing - */ -/obj/machinery/atmospherics/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/machinery/atmospherics/unary/cryo_cell/ui_interact(mob/user, datum/tgui/ui = null) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CryoTube", "Cryo Cell") + ui.open() - if(user == occupant || user.stat) - return - - // this is the data which will be sent to the ui +/obj/machinery/atmospherics/unary/cryo_cell/ui_data(mob/user) var/list/data = list() data["isOperating"] = on - data["hasOccupant"] = occupant ? 1 : 0 + data["hasOccupant"] = occupant ? TRUE : FALSE var/list/occupantData = list() - if (occupant) + if(occupant) occupantData["name"] = occupant.name - occupantData["stat"] = occupant.stat - occupantData["bodyTemperature"] = occupant.bodytemperature - occupantData["brain_activity"] = occupant.get_brain_status() - occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL) - occupantData["blood_o2"] = occupant.get_blood_oxygenation() - occupantData["blood_pressure"] = occupant.get_blood_pressure() - occupantData["cloneLoss"] = occupant.getCloneLoss() + var/displayed_stat = occupant.stat + var/blood_oxygenation = occupant.get_blood_oxygenation() + if(HAS_FLAG(occupant.status_flags, FAKEDEATH)) + displayed_stat = DEAD + blood_oxygenation = min(blood_oxygenation, BLOOD_VOLUME_SURVIVE) + var/pulse_result + if(occupant.should_have_organ(BP_HEART)) + var/obj/item/organ/internal/heart/heart = occupant.internal_organs_by_name[BP_HEART] + if(!heart) + pulse_result = 0 + else if(BP_IS_ROBOTIC(heart)) + pulse_result = -2 + else if(occupant.status_flags & FAKEDEATH) + pulse_result = 0 + else + pulse_result = occupant.get_pulse(GETPULSE_TOOL) + else + pulse_result = -1 + + if(pulse_result == ">250") + pulse_result = -3 + + occupantData["stat"] = displayed_stat occupantData["bruteLoss"] = occupant.getBruteLoss() - occupantData["fireLoss"] = occupant.getFireLoss() - occupantData["toxLoss"] = occupant.getToxLoss() - occupantData["oxyLoss"] = occupant.getOxyLoss() - occupantData["cryostasis"] = "[occupant.stasis_value]" - data["occupant"] = occupantData + occupantData["cloneLoss"] = occupant.getCloneLoss() + occupantData["bodyTemperature"] = occupant.bodytemperature + occupantData["brainActivity"] = occupant.get_brain_result() + occupantData["pulse"] = text2num(pulse_result) + occupantData["cryostasis"] = occupant.stasis_value + occupantData["bloodPressure"] = occupant.get_blood_pressure() + occupantData["bloodPressureLevel"] = occupant.get_blood_pressure_alert() + occupantData["bloodOxygenation"] = blood_oxygenation + data["occupant"] = occupantData; data["cellTemperature"] = round(air_contents.temperature) data["cellTemperatureStatus"] = "good" - if(air_contents.temperature > T0C) // if greater than 273.15 kelvin (0 celcius) + if(air_contents.temperature >= temperature_danger_threshold) data["cellTemperatureStatus"] = "bad" - else if(air_contents.temperature > 225) + else if(air_contents.temperature >= temperature_warning_threshold) data["cellTemperatureStatus"] = "average" - data["isBeakerLoaded"] = beaker ? 1 : 0 + data["isBeakerLoaded"] = beaker ? TRUE : FALSE data["beakerLabel"] = null data["beakerVolume"] = 0 if(beaker) @@ -143,46 +183,62 @@ for(var/_R in beaker.reagents.reagent_volumes) data["beakerVolume"] += REAGENT_VOLUME(beaker.reagents, _R) - // update the ui if it exists, returns null if no ui is passed/found - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 410) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + data["fastStasisMult"] = fast_stasis_mult + data["slowStasisMult"] = slow_stasis_mult + data["currentStasisMult"] = current_stasis_mult + + return data + +/obj/machinery/atmospherics/unary/cryo_cell/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return -/obj/machinery/atmospherics/unary/cryo_cell/Topic(href, href_list) if(usr == occupant) - return 0 // don't update UIs attached to this object + return - if(..()) - return 0 // don't update UIs attached to this object + . = TRUE - if(href_list["switchOn"]) - on = 1 - update_icon() + switch(action) + if("switchOn") + on = TRUE + update_icon() - if(href_list["switchOff"]) - on = 0 - update_icon() + if("switchOff") + on = FALSE + update_icon() - if(href_list["ejectBeaker"]) - if(beaker) - beaker.forceMove(get_step(loc, SOUTH)) - beaker = null + if("ejectBeaker") + if(beaker) + beaker.forceMove(get_step(loc, SOUTH)) + beaker = null - if(href_list["ejectOccupant"]) - if(!occupant || isslime(usr) || ispAI(usr)) - return 0 // don't update UIs attached to this object - go_out() + if("ejectOccupant") + if(!occupant || isslime(usr) || ispAI(usr)) + return + go_out() + + if("goFast") + current_stasis_mult = fast_stasis_mult + update_icon() + + if("goRegular") + current_stasis_mult = 1 + update_icon() + + if("goSlow") + current_stasis_mult = slow_stasis_mult + update_icon() + + else + return FALSE add_fingerprint(usr) - return 1 // update UIs attached to this object /obj/machinery/atmospherics/unary/cryo_cell/attackby(var/obj/item/G as obj, var/mob/user as mob) if(istype(G, /obj/item/reagent_containers/glass)) if(beaker) - to_chat(user, "A beaker is already loaded into the machine.") + FEEDBACK_FAILURE(user, "A beaker is already loaded into the machine!") return TRUE beaker = G @@ -243,51 +299,51 @@ /obj/machinery/atmospherics/unary/cryo_cell/update_icon() cut_overlays() - var/list/ovr = list() icon_state = "pod[on]" var/image/I + if(panel_open) + add_overlay("pod_panel") + I = image(icon, "pod[on]_top") - I.layer = 5 // this needs to be fairly high so it displays over most things, but it needs to be under lighting (at 10) I.pixel_z = 32 - ovr += I + add_overlay(I) if(occupant) var/image/pickle = image(occupant.icon, occupant.icon_state) pickle.overlays = occupant.overlays - pickle.pixel_z = 18 - pickle.layer = 5 - ovr += pickle + pickle.pixel_z = 11 + add_overlay(pickle) I = image(icon, "lid[on]") - I.layer = 5 - ovr += I + add_overlay(I) I = image(icon, "lid[on]_top") - I.layer = 5 I.pixel_z = 32 - ovr += I + add_overlay(I) - add_overlay(ovr) + if(powered()) + var/warn_state = "off" + if(on) + warn_state = "safe" + if(air_contents.temperature >= temperature_danger_threshold) + warn_state = "danger" + else if(air_contents.temperature >= temperature_warning_threshold) + warn_state = "warn" + add_overlay(screen_overlays["cryo-[warn_state]"]) + I = screen_overlays["cryo-[warn_state]-top"] + I.pixel_z = 32 + add_overlay(I) /obj/machinery/atmospherics/unary/cryo_cell/proc/process_occupant() if(air_contents.total_moles < 10) return if(occupant) - if(occupant.stat == 2) + if(occupant.stat == DEAD) return occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity()) occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise occupant.set_stat(UNCONSCIOUS) - if(occupant.bodytemperature < T0C) - //severe damage should heal waaay slower without proper chemicals - if(occupant.bodytemperature < 225) - if(!occupant.is_diona()) - var/heal_brute = occupant.getBruteLoss() ? min(1, 20/occupant.getBruteLoss()) : 0 - var/heal_fire = occupant.getFireLoss() ? min(1, 20/occupant.getFireLoss()) : 0 - occupant.heal_organ_damage(heal_brute,heal_fire) - else - occupant.adjustFireLoss(3)//Cryopods kill diona. This damage combines with the normal cold temp damage, and their disabled regen var/has_cryo = REAGENT_VOLUME(occupant.reagents, /singleton/reagent/cryoxadone) >= 1 var/has_clonexa = REAGENT_VOLUME(occupant.reagents, /singleton/reagent/clonexadone) >= 1 var/has_cryo_medicine = has_cryo || has_clonexa @@ -306,19 +362,10 @@ /obj/machinery/atmospherics/unary/cryo_cell/proc/expel_gas() if(air_contents.total_moles < 1) return -// var/datum/gas_mixture/expel_gas = new -// var/remove_amount = air_contents.total_moles()/50 -// expel_gas = air_contents.remove(remove_amount) - - // Just have the gas disappear to nowhere. - //expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed - //loc.assume_air(expel_gas) /obj/machinery/atmospherics/unary/cryo_cell/proc/go_out() - if(!( occupant )) + if(!(occupant)) return - //for(var/obj/O in src) - // O.forceMove(loc) if (occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE @@ -404,6 +451,15 @@ if(loc) return loc.return_air() +/obj/machinery/atmospherics/unary/cryo_cell/RefreshParts() + ..() + var/man_rating = 0 + for(var/obj/item/stock_parts/P in component_parts) + if(ismanipulator(P)) + man_rating += P.rating + fast_stasis_mult = max(1 - (man_rating * 0.06), 0.66) + slow_stasis_mult = min(1 + (man_rating * 0.06), 1.5) + /datum/data/function/proc/reset() return diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index de48d82eff2..4ef930a1eed 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -261,6 +261,11 @@ else . = 80 * (1 - bodytemperature / species.cold_level_3) . = max(20, .) + if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) + var/obj/machinery/atmospherics/unary/cryo_cell/cryo = loc + if(cryo.current_stasis_mult) + var/gcf_stasis_mult = cryo.current_stasis_mult + . = . * gcf_stasis_mult return round(.) // Martial Art Helpers diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index c508adb1889..63459eb7167 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -223,12 +223,18 @@ /singleton/reagent/cryoxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_CRYO, 1) - if(M.bodytemperature < 170) + if(M.bodytemperature < 170 && !M.is_diona()) M.add_chemical_effect(CE_PULSE, -2) + M.add_chemical_effect(CE_OXYGENATED, 1) M.adjustCloneLoss(-100 * removed) - M.adjustOxyLoss(-10 * removed) - M.heal_organ_damage(10 * removed, 10 * removed) - M.adjustToxLoss(-10 * removed) + M.heal_organ_damage(30 * removed, 30 * removed) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/internal/I in H.internal_organs) + if(!BP_IS_ROBOTIC(I)) + I.heal_damage(20*removed) + else if(M.is_diona() && M.bodytemperature < 170) + M.adjustFireLoss(5 * removed)//Cryopods kill diona. This damage combines with the normal cold temp damage, and their disabled regen /singleton/reagent/clonexadone name = "Clonexadone" @@ -241,12 +247,18 @@ /singleton/reagent/clonexadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_CRYO, 1) - if(M.bodytemperature < 170) + if(M.bodytemperature < 170 && !M.is_diona()) M.add_chemical_effect(CE_PULSE, -2) - M.adjustCloneLoss(-100 * removed) - M.adjustOxyLoss(-30 * removed) - M.heal_organ_damage(30 * removed, 30 * removed) - M.adjustToxLoss(-30 * removed) + M.add_chemical_effect(CE_OXYGENATED, 2) + M.adjustCloneLoss(-300 * removed) + M.heal_organ_damage(50 * removed, 50 * removed) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/internal/I in H.internal_organs) + if(!BP_IS_ROBOTIC(I)) + I.heal_damage(30*removed) + else if(M.is_diona() && M.bodytemperature < 170) + M.adjustFireLoss(15 * removed)//Cryopods kill diona. This damage combines with the normal cold temp damage, and their disabled regen /* Painkillers */ diff --git a/html/changelogs/GeneralCamo - Cryo Pod buff.yml b/html/changelogs/GeneralCamo - Cryo Pod buff.yml new file mode 100644 index 00000000000..ed1cc587394 --- /dev/null +++ b/html/changelogs/GeneralCamo - Cryo Pod buff.yml @@ -0,0 +1,50 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: GeneralCamo + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Ported the cryo tubes to use tgui." + - tweak: "Replaced the cryo tube sprites. Credit to Remission, cuddleandtea, and SierraKomodo of baystation12." + - rscdel: "Cryo tubes no longer heal without chemicals; putting someone inside without cryo chems will kill them." + - balance: "Buffed cryoxadone to heal 30 brute damage per metabolism tick from 10." + - balance: "Buffed clonexadone to heal 50 brute damage per metabolism tick from 30." + - balance: "Buffed clonexadone to heal 300 clone damage per metabolism tick from 100." + - rscadd: "Cryoxadone and clonexadone now heal internal organ damage." + - rscdel: "Cryoxadone and clonexadone no longer heal toxin or oxygen damage; both now provide an oxygenation effect in place of healing oxygen damage." + - rscdel: "Cryo tubes no longer show toxin, oxygen, or burn damage, as it cannot heal these types of damage." + - rscadd: "Added metabolism-boosted and stasis-boosted modes on the cryo tubes. Both will trade off stasis level or metabolism respectively, in favor of the alternative stat." \ No newline at end of file diff --git a/icons/obj/cryogenics.dmi b/icons/obj/cryogenics.dmi index ae4681657c115eb0e4fb935678c4ce62ff84459a..7961e14889f266c3654f2edf266817fdac441320 100644 GIT binary patch delta 16736 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%0Dj@`_X{&iyO2B6LoC1PK>=iGUKq0g-ys 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 D#9g)q delta 15916 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 IzB}gs00`5OmH+?% diff --git a/tgui/packages/tgui/interfaces/CryoTube.tsx b/tgui/packages/tgui/interfaces/CryoTube.tsx new file mode 100644 index 00000000000..bed2a448f7a --- /dev/null +++ b/tgui/packages/tgui/interfaces/CryoTube.tsx @@ -0,0 +1,271 @@ +import { Fragment } from 'inferno'; +import { Window } from '../layouts'; +import { useBackend } from '../backend'; +import { AnimatedNumber, Box, Button, Flex, Icon, LabeledList, ProgressBar, Section } from '../components'; +import { BooleanLike } from 'common/react'; + +export type CryoData = { + isOperating: BooleanLike; + hasOccupant: BooleanLike; + cellTemperature: number; + cellTemperatureStatus: string; + occupant: Occupant; + isBeakerLoaded: BooleanLike; + currentStasisMult: number; + fastStasisMult: number; + slowStasisMult: number; +}; + +export type BeakerData = { + isBeakerLoaded: BooleanLike; + beakerLabel: string; + beakerVolume: number; +}; + +type Occupant = { + name: string; + stat: number; + bruteLoss: string; + cloneLoss: string; + bodyTemperature: number; + brainActivity: number; + pulse: number; + cryostasis: number; + bloodPressure: number; + bloodPressureLevel: number; + bloodOxygenation: number; +}; + +const damageTypes = [ + { + label: 'Physical Damage', + type: 'bruteLoss', + }, + { + label: 'Genetic Damage', + type: 'cloneLoss', + }, +]; + +const statNames = [ + ['good', 'Conscious'], + ['average', 'Unconscious'], + ['bad', 'DEAD'], +]; + +const progressClass = (value) => { + if (value <= 50) { + return 'bad'; + } else if (value <= 90) { + return 'average'; + } else { + return 'green'; + } +}; + +export const CryoTube = (props, context) => { + const { act, data } = useBackend(context); + return ( + + + + + + ); +}; + +export const CryoContent = (props, context) => { + const { act, data } = useBackend(context); + return ( + +

act('ejectOccupant')} + disabled={!data.hasOccupant}> + Eject + + }> + {data.hasOccupant ? ( + + + {data.occupant.name || 'Unknown'} + + + {statNames[data.occupant.stat][1]} + + + + {brainText(data.occupant.brainActivity)} + + + {data.occupant.pulse} BPM + + + {data.occupant.bloodPressure} + + + + + {'%'} + + + + + {' K'} + + + + {'x'} + + + {damageTypes.map((damageType) => ( + + + + + + ))} + + ) : ( + + + +
+ No occupant detected. +
+
+ )} +
+
act('ejectBeaker')} + disabled={!data.isBeakerLoaded}> + Eject Beaker + + }> + + + + + + K + + + + + + + + + + + + +
+ + ); +}; + +const CryoBeaker = (props, context) => { + const { act, data } = useBackend(context); + if (data.isBeakerLoaded) { + return ( + + {data.beakerLabel ? ( + data.beakerLabel + ) : ( + No label + )} + + {data.beakerVolume ? ( + Math.round(v) + ' units remaining'} + /> + ) : ( + 'Beaker is empty' + )} + + + ); + } else { + return No beaker loaded; + } +}; + +const brainText = (value) => { + switch (value) { + case 0: + return 'None, patient is braindead'; + case -1: + return 'ERROR - Non-Standard Biology'; + default: + return value.toString().concat('%'); + } +}; + +const getPressureClass = (tpressure) => { + switch (tpressure) { + case 1: + return 'red'; + case 2: + return 'green'; + case 3: + return 'good'; + case 4: + return 'red'; + default: + return 'teal'; + } +};