[MIRROR] Changed Supermatter Internal Math + UI Additions [MDB IGNORE] (#16603)

* Changed Supermatter Internal Math + UI Additions

* merge conflicts

Co-authored-by: vincentiusvin <54709710+vincentiusvin@users.noreply.github.com>
Co-authored-by: tastyfish <crazychris32@gmail.com>
This commit is contained in:
SkyratBot
2022-10-03 08:21:09 +02:00
committed by GitHub
parent 67d96fc4a5
commit 7144fe758c
21 changed files with 1542 additions and 1148 deletions
@@ -8,18 +8,105 @@
requires_ntnet = TRUE
transfer_access = list(ACCESS_CONSTRUCTION)
size = 5
tgui_id = "NtosSupermatterMonitor"
tgui_id = "NtosSupermatter"
program_icon = "radiation"
alert_able = TRUE
var/last_status = SUPERMATTER_INACTIVE
var/list/supermatters
var/obj/machinery/power/supermatter_crystal/active // Currently selected supermatter crystal.
/// List of supermatters that we are going to send the data of.
var/list/obj/machinery/power/supermatter_crystal/supermatters = list()
/// The supermatter which will send a notification to us if it's delamming.
var/obj/machinery/power/supermatter_crystal/focused_supermatter
/datum/computer_file/program/supermatter_monitor/Destroy()
clear_signals()
active = null
/datum/computer_file/program/supermatter_monitor/on_start(mob/living/user)
. = ..()
refresh()
/// Apparently destroy calls this [/datum/computer_file/Destroy]. Here just to clean our references.
/datum/computer_file/program/supermatter_monitor/kill_program(forced = FALSE)
for(var/supermatter in supermatters)
clear_supermatter(supermatter)
return ..()
/// Refreshes list of active supermatter crystals
/datum/computer_file/program/supermatter_monitor/proc/refresh()
for(var/supermatter in supermatters)
clear_supermatter(supermatter)
var/turf/user_turf = get_turf(ui_host())
if(!user_turf)
return
for(var/obj/machinery/power/supermatter_crystal/sm in GLOB.machines)
//Exclude Syndicate owned, Delaminating, not within coverage, not on a tile.
if (!sm.include_in_cims || !isturf(sm.loc) || !(is_station_level(sm.z) || is_mining_level(sm.z) || sm.z == user_turf.z))
continue
supermatters += sm
RegisterSignal(sm, COMSIG_PARENT_QDELETING, .proc/clear_supermatter)
/datum/computer_file/program/supermatter_monitor/ui_static_data(mob/user)
var/list/data = list()
data["gas_metadata"] = sm_gas_data()
return data
/datum/computer_file/program/supermatter_monitor/ui_data(mob/user)
var/list/data = get_header_data()
data["sm_data"] = list()
for (var/obj/machinery/power/supermatter_crystal/sm as anything in supermatters)
data["sm_data"] += list(sm.sm_ui_data())
data["focus_uid"] = focused_supermatter?.uid
return data
/datum/computer_file/program/supermatter_monitor/ui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("PRG_refresh")
refresh()
return TRUE
if("PRG_focus")
for (var/obj/machinery/power/supermatter_crystal/sm in supermatters)
if(sm.uid == params["focus_uid"])
if(focused_supermatter == sm)
unfocus_supermatter(sm)
else
focus_supermatter(sm)
return TRUE
/// Sends an SM delam alert to the computer if our focused supermatter is delaminating.
/// [var/obj/machinery/power/supermatter_crystal/focused_supermatter].
/datum/computer_file/program/supermatter_monitor/proc/send_alert()
SIGNAL_HANDLER
if(!computer.get_ntnet_status())
return
computer.alert_call(src, "Crystal delamination in progress!")
alert_pending = TRUE
/datum/computer_file/program/supermatter_monitor/proc/clear_supermatter(obj/machinery/power/supermatter_crystal/sm)
SIGNAL_HANDLER
supermatters -= sm
if(focused_supermatter == sm)
unfocus_supermatter()
UnregisterSignal(sm, COMSIG_PARENT_QDELETING)
/datum/computer_file/program/supermatter_monitor/proc/focus_supermatter(obj/machinery/power/supermatter_crystal/sm)
if(sm == focused_supermatter)
return
if(focused_supermatter)
unfocus_supermatter()
RegisterSignal(sm, COMSIG_SUPERMATTER_DELAM_ALARM, .proc/send_alert)
focused_supermatter = sm
/datum/computer_file/program/supermatter_monitor/proc/unfocus_supermatter()
if(!focused_supermatter)
return
UnregisterSignal(focused_supermatter, COMSIG_SUPERMATTER_DELAM_ALARM)
focused_supermatter = null
/datum/computer_file/program/supermatter_monitor/proc/get_status()
. = SUPERMATTER_INACTIVE
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
. = max(., S.get_status())
/datum/computer_file/program/supermatter_monitor/process_tick(delta_time)
..()
var/new_status = get_status()
@@ -29,153 +116,3 @@
program_icon_state = "smmon_[last_status]"
if(istype(computer))
computer.update_appearance()
/datum/computer_file/program/supermatter_monitor/on_start(mob/living/user)
. = ..(user)
if(!(active in GLOB.machines))
active = null
refresh()
/datum/computer_file/program/supermatter_monitor/kill_program(forced = FALSE)
for(var/supermatter in supermatters)
clear_supermatter(supermatter)
supermatters = null
..()
// Refreshes list of active supermatter crystals
/datum/computer_file/program/supermatter_monitor/proc/refresh()
for(var/supermatter in supermatters)
clear_supermatter(supermatter)
supermatters = list()
var/turf/user_turf = get_turf(ui_host())
if(!user_turf)
return
for(var/obj/machinery/power/supermatter_crystal/crystal in GLOB.machines)
//Exclude Syndicate owned, Delaminating, not within coverage, not on a tile.
if (!crystal.include_in_cims || !isturf(crystal.loc) || !(is_station_level(crystal.z) || is_mining_level(crystal.z) || crystal.z == user_turf.z))
continue
supermatters.Add(crystal)
RegisterSignal(crystal, COMSIG_PARENT_QDELETING, .proc/react_to_del)
/datum/computer_file/program/supermatter_monitor/proc/get_status()
. = SUPERMATTER_INACTIVE
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
. = max(., S.get_status())
/**
* Sets up the signal listener for Supermatter delaminations.
*
* Unregisters any old listners for SM delams, and then registers one for the SM refered
* to in the `active` variable. This proc is also used with no active SM to simply clear
* the signal and exit.
*/
/datum/computer_file/program/supermatter_monitor/proc/set_signals()
if(active)
RegisterSignal(active, COMSIG_SUPERMATTER_DELAM_ALARM, .proc/send_alert, override = TRUE)
RegisterSignal(active, COMSIG_SUPERMATTER_DELAM_START_ALARM, .proc/send_start_alert, override = TRUE)
/**
* Removes the signal listener for Supermatter delaminations from the selected supermatter.
*
* Pretty much does what it says.
*/
/datum/computer_file/program/supermatter_monitor/proc/clear_signals()
if(active)
UnregisterSignal(active, COMSIG_SUPERMATTER_DELAM_ALARM)
UnregisterSignal(active, COMSIG_SUPERMATTER_DELAM_START_ALARM)
/**
* Sends an SM delam alert to the computer.
*
* Triggered by a signal from the selected supermatter, this proc sends a notification
* to the computer if the program is either closed or minimized. We do not send these
* notifications to the comptuer if we're the active program, because engineers fixing
* the supermatter probably don't need constant beeping to distract them.
*/
/datum/computer_file/program/supermatter_monitor/proc/send_alert()
SIGNAL_HANDLER
if(!computer.get_ntnet_status())
return
if(computer.active_program != src)
computer.alert_call(src, "Crystal delamination in progress!")
alert_pending = TRUE
/**
* Sends an SM delam start alert to the computer.
*
* Triggered by a signal from the selected supermatter at the start of a delamination,
* this proc sends a notification to the computer if this program is the active one.
* We do this so that people carrying a tablet with NT CIMS open but with the NTOS window
* closed will still get one audio alert. This is not sent to computers with the program
* minimized or closed to avoid double-notifications.
*/
/datum/computer_file/program/supermatter_monitor/proc/send_start_alert()
SIGNAL_HANDLER
if(!computer.get_ntnet_status())
return
if(computer.active_program == src)
computer.alert_call(src, "Crystal delamination in progress!")
/datum/computer_file/program/supermatter_monitor/ui_data(mob/user)
var/list/data = get_header_data()
if(istype(active))
var/turf/T = get_turf(active)
if(!T)
active = null
refresh()
return
var/datum/gas_mixture/air = T.return_air()
if(!air)
active = null
return
data += active.ui_data()
data["singlecrystal"] = FALSE
else
var/list/SMS = list()
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
var/area/A = get_area(S)
if(A)
SMS.Add(list(list(
"area_name" = A.name,
"integrity" = S.get_integrity_percent(),
"uid" = S.uid
)))
data["active"] = FALSE
data["supermatters"] = SMS
return data
/datum/computer_file/program/supermatter_monitor/ui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("PRG_clear")
clear_signals()
active = null
return TRUE
if("PRG_refresh")
refresh()
return TRUE
if("PRG_set")
var/newuid = text2num(params["target"])
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
if(S.uid == newuid)
active = S
set_signals()
return TRUE
/datum/computer_file/program/supermatter_monitor/proc/react_to_del(datum/source)
SIGNAL_HANDLER
clear_supermatter(source)
/datum/computer_file/program/supermatter_monitor/proc/clear_supermatter(matter)
supermatters -= matter
if(matter == active)
active = null
UnregisterSignal(matter, COMSIG_PARENT_QDELETING)