diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index 18d8bb89b34..29210a4e10d 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -114,7 +114,7 @@ if(computer.active_program == src) computer.alert_call(src, "Crystal delamination in progress!") -/datum/computer_file/program/supermatter_monitor/ui_data() +/datum/computer_file/program/supermatter_monitor/ui_data(mob/user) var/list/data = get_header_data() if(istype(active)) @@ -128,30 +128,9 @@ active = null return - data["active"] = TRUE - data["SM_integrity"] = active.get_integrity_percent() - data["SM_power"] = active.power - data["SM_ambienttemp"] = air.temperature - data["SM_ambientpressure"] = air.return_pressure() - data["SM_bad_moles_amount"] = MOLE_PENALTY_THRESHOLD / active.gasefficency - data["SM_moles"] = 0 - - var/list/gasdata = list() - - if(air.total_moles()) - data["SM_moles"] = air.total_moles() - for(var/gasid in air.gases) - gasdata.Add(list(list( - "name"= air.gases[gasid][GAS_META][META_GAS_NAME], - "amount" = round(100*air.gases[gasid][MOLES]/air.total_moles(),0.01)))) - - else - for(var/gasid in air.gases) - gasdata.Add(list(list( - "name"= air.gases[gasid][GAS_META][META_GAS_NAME], - "amount" = 0))) - - data["gases"] = gasdata + data += active.ui_data() + data["singlecrystal"] = FALSE + else var/list/SMS = list() for(var/obj/machinery/power/supermatter_crystal/S in supermatters) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 07b046825ec..41b4ce7d82e 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -266,11 +266,55 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/immune = HAS_TRAIT(user, TRAIT_SUPERMATTER_MADNESS_IMMUNE) || (user.mind && HAS_TRAIT(user.mind, TRAIT_SUPERMATTER_MADNESS_IMMUNE)) if(isliving(user) && !immune && (get_dist(user, src) < HALLUCINATION_RANGE(power))) . += "You get headaches just from looking at it." - if(isobserver(user)) - if(power > 5) - . += "The supermatter appears active at [power] MeV." - else - . += "The supermatter appears inactive or outputting minimal power." + +// SupermatterMonitor UI for ghosts only. Inherited attack_ghost will call this. +/obj/machinery/power/supermatter_crystal/ui_interact(mob/user, datum/tgui/ui) + if(!isobserver(user)) + return FALSE + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "SupermatterMonitor") + ui.open() + +/obj/machinery/power/supermatter_crystal/ui_data(mob/user) + var/list/data = list() + + var/turf/local_turf = get_turf(src) + + var/datum/gas_mixture/air = local_turf.return_air() + + // singlecrystal set to true eliminates the back sign on the gases breakdown. + data["singlecrystal"] = TRUE + data["active"] = TRUE + data["SM_integrity"] = get_integrity_percent() + data["SM_power"] = power + data["SM_ambienttemp"] = air.temperature + data["SM_ambientpressure"] = air.return_pressure() + data["SM_bad_moles_amount"] = MOLE_PENALTY_THRESHOLD / gasefficency + data["SM_moles"] = 0 + data["SM_uid"] = uid + var/area/active_supermatter_area = get_area(src) + data["SM_area_name"] = active_supermatter_area.name + + var/list/gasdata = list() + + if(air.total_moles()) + data["SM_moles"] = air.total_moles() + for(var/gasid in air.gases) + gasdata.Add(list(list( + "name"= air.gases[gasid][GAS_META][META_GAS_NAME], + "amount" = round(100*air.gases[gasid][MOLES]/air.total_moles(),0.01)))) + + else + for(var/gasid in air.gases) + gasdata.Add(list(list( + "name"= air.gases[gasid][GAS_META][META_GAS_NAME], + "amount" = 0))) + + data["gases"] = gasdata + + return data /obj/machinery/power/supermatter_crystal/proc/get_status() var/turf/local_turf = get_turf(src) @@ -1244,9 +1288,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) icon_state = "psy" layer = FLOAT_LAYER - 1 - /obj/overlay/psy/shard icon_state = "psy_shard" + #undef HALLUCINATION_RANGE #undef GRAVITATIONAL_ANOMALY #undef FLUX_ANOMALY diff --git a/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.js b/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.js index 9502c3cdd6b..6ec5fe5e398 100644 --- a/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.js +++ b/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.js @@ -1,12 +1,5 @@ -import { sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { toFixed } from 'common/math'; -import { useBackend } from '../backend'; -import { Button, LabeledList, ProgressBar, Section, Stack, Table } from '../components'; -import { getGasColor, getGasLabel } from '../constants'; import { NtosWindow } from '../layouts'; - -const logScale = value => Math.log2(16 + Math.max(0, value)) - 4; +import { SupermatterMonitorContent } from './SupermatterMonitor'; export const NtosSupermatterMonitor = (props, context) => { return ( @@ -14,174 +7,8 @@ export const NtosSupermatterMonitor = (props, context) => { width={600} height={350}> - + ); }; - -export const NtosSupermatterMonitorContent = (props, context) => { - const { act, data } = useBackend(context); - const { - active, - SM_integrity, - SM_power, - SM_ambienttemp, - SM_ambientpressure, - SM_moles, - SM_bad_moles_amount, - } = data; - if (!active) { - return ( - - ); - } - const gases = flow([ - gases => gases.filter(gas => gas.amount >= 0.01), - sortBy(gas => -gas.amount), - ])(data.gases || []); - const gasMaxAmount = Math.max(1, ...gases.map(gas => gas.amount)); - return ( - - -
- - - - - - - {toFixed(SM_power) + ' MeV/cm3'} - - - - - {toFixed(SM_ambienttemp) + ' K'} - - - - - {toFixed(SM_moles) + ' moles'} - - - - - {toFixed(SM_ambientpressure) + ' kPa'} - - - -
-
- -
act('PRG_clear')} /> - )}> - - {gases.map(gas => ( - - - {toFixed(gas.amount, 2) + '%'} - - - ))} - -
-
-
- ); -}; - -const SupermatterList = (props, context) => { - const { act, data } = useBackend(context); - const { supermatters = [] } = data; - return ( -
act('PRG_refresh')} /> - )}> - - {supermatters.map(sm => ( - - - {sm.uid + '. ' + sm.area_name} - - - Integrity: - - - - - -
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/SupermatterMonitor.js b/tgui/packages/tgui/interfaces/SupermatterMonitor.js new file mode 100644 index 00000000000..8b42007fad7 --- /dev/null +++ b/tgui/packages/tgui/interfaces/SupermatterMonitor.js @@ -0,0 +1,192 @@ +import { sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { toFixed } from 'common/math'; +import { useBackend } from '../backend'; +import { Button, LabeledList, ProgressBar, Section, Stack, Table } from '../components'; +import { getGasColor, getGasLabel } from '../constants'; +import { Window } from '../layouts'; + +const logScale = (value) => Math.log2(16 + Math.max(0, value)) - 4; + +export const SupermatterMonitor = () => { + return ( + + + + + + ); +}; + +export const SupermatterMonitorContent = (props, context) => { + const { act, data } = useBackend(context); + const { + active, + singlecrystal, + SM_uid, + SM_area_name, + SM_integrity, + SM_power, + SM_ambienttemp, + SM_ambientpressure, + SM_moles, + SM_bad_moles_amount, + } = data; + if (!active) { + return ; + } + const gases = flow([ + (gases) => gases.filter((gas) => gas.amount >= 0.01), + sortBy((gas) => -gas.amount), + ])(data.gases || []); + const gasMaxAmount = Math.max(1, ...gases.map((gas) => gas.amount)); + return ( +
act('PRG_clear')} + /> + )}> + + +
+ + + + + + + {toFixed(SM_power) + ' MeV/cm3'} + + + + + {toFixed(SM_ambienttemp) + ' K'} + + + + + {toFixed(SM_moles) + ' moles'} + + + + + {toFixed(SM_ambientpressure) + ' kPa'} + + + +
+
+ +
+ + {gases.map((gas) => ( + + + {toFixed(gas.amount, 2) + '%'} + + + ))} + +
+
+
+
+ ); +}; + +const SupermatterList = (props, context) => { + const { act, data } = useBackend(context); + const { supermatters = [] } = data; + return ( +
act('PRG_refresh')} + /> + }> + + {supermatters.map((sm) => ( + + {sm.uid + '. ' + sm.area_name} + + Integrity: + + + + + +
+
+ ); +};