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:
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+};