mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-18 19:44:58 +01:00
[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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user