mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-08-26 15:36:15 +01:00
368 lines
10 KiB
Plaintext
368 lines
10 KiB
Plaintext
//
|
|
// Alarm
|
|
//
|
|
|
|
/obj/machinery/alarm
|
|
name = "Air Monitor"
|
|
icon = 'icons/obj/monitors.dmi'
|
|
icon_state = "alarm0"
|
|
anchored = 1.0
|
|
var/skipprocess = 0 //Experimenting
|
|
var/alarm_frequency = "1437"
|
|
var/alarm_zone = null
|
|
var/control_frequency = "1439"
|
|
var/id
|
|
var/locked = 1
|
|
|
|
var/datum/gas_mixture/environment
|
|
var/safe
|
|
var/panic_mode = 0
|
|
var/e_gas = 0
|
|
|
|
/obj/machinery/alarm/New()
|
|
..()
|
|
|
|
if(!alarm_zone)
|
|
var/area/A = get_area(loc)
|
|
if(A.name)
|
|
alarm_zone = A.name
|
|
else
|
|
alarm_zone = "Unregistered"
|
|
|
|
/obj/machinery/alarm/process()
|
|
src.updateDialog()
|
|
|
|
if (panic_mode > 0)
|
|
panic_mode--
|
|
if(panic_mode <= 0)
|
|
unpanic()
|
|
|
|
if (src.skipprocess)
|
|
src.skipprocess--
|
|
return
|
|
|
|
var/turf/location = src.loc
|
|
safe = 2
|
|
|
|
if(stat & (NOPOWER|BROKEN))
|
|
icon_state = "alarmp"
|
|
return
|
|
|
|
use_power(5, ENVIRON)
|
|
|
|
if (!( istype(location, /turf) ))
|
|
return 0
|
|
|
|
environment = location.return_air()
|
|
|
|
if (!istype(environment))
|
|
safe = -1
|
|
return
|
|
|
|
var/environment_pressure = environment.return_pressure()
|
|
|
|
if((environment_pressure < ONE_ATMOSPHERE*0.90) || (environment_pressure > ONE_ATMOSPHERE*1.10))
|
|
//Pressure sensor
|
|
if((environment_pressure < ONE_ATMOSPHERE*0.80) || (environment_pressure > ONE_ATMOSPHERE*1.20))
|
|
safe = 0
|
|
else safe = 1
|
|
|
|
if(safe && ((environment.oxygen < MOLES_O2STANDARD*0.90) || (environment.oxygen > MOLES_O2STANDARD*1.10)))
|
|
//Oxygen Levels Sensor
|
|
if(environment.oxygen < MOLES_O2STANDARD*0.80)
|
|
safe = 0
|
|
else safe = 1
|
|
|
|
if(safe && ((environment.temperature < (T0C)) || (environment.temperature > (T0C+40))))
|
|
//Oxygen Levels Sensor
|
|
if((environment.temperature < (T0C-10)) || (environment.temperature > (T0C+50)))
|
|
safe = 0
|
|
else safe = 1
|
|
|
|
if(safe && (environment.carbon_dioxide > 0.05))
|
|
//CO2 Levels Sensor
|
|
if(environment.carbon_dioxide > 0.1)
|
|
safe = 0
|
|
else safe = 1
|
|
|
|
if(safe && (environment.toxins > 1))
|
|
//Plasma Levels Sensor
|
|
if(environment.toxins > 2)
|
|
safe = 0
|
|
else safe = 1
|
|
|
|
var/tgmoles = 0
|
|
if(environment.trace_gases && environment.trace_gases.len)
|
|
for(var/datum/gas/trace_gas in environment.trace_gases)
|
|
tgmoles += trace_gas.moles
|
|
|
|
if(tgmoles > 1)
|
|
if(tgmoles > 2)
|
|
safe = 0
|
|
else safe = 1
|
|
|
|
src.icon_state = "alarm[!safe]"
|
|
|
|
if(safe == 2) src.skipprocess = 1
|
|
else if(alarm_frequency)
|
|
post_alert(safe)
|
|
|
|
return
|
|
|
|
/obj/machinery/alarm/proc/post_alert(alert_level)
|
|
|
|
var/datum/radio_frequency/frequency = radio_controller.return_frequency(alarm_frequency)
|
|
|
|
if(!frequency) return
|
|
|
|
var/datum/signal/alert_signal = get_free_signal()
|
|
alert_signal.source = src
|
|
alert_signal.transmission_method = 1
|
|
alert_signal.data["zone"] = alarm_zone
|
|
alert_signal.data["type"] = "Atmospheric"
|
|
|
|
if(alert_level==0)
|
|
alert_signal.data["alert"] = "severe"
|
|
else
|
|
alert_signal.data["alert"] = "minor"
|
|
|
|
frequency.post_signal(src, alert_signal)
|
|
|
|
/obj/machinery/alarm/attackby(W as obj, user as mob)
|
|
if (istype(W, /obj/item/wirecutters))
|
|
stat ^= BROKEN
|
|
src.add_fingerprint(user)
|
|
src.visible_message("<span style=\"color:red\">[user] has [(stat & BROKEN) ? "de" : "re"]activated [src]!</span>")
|
|
return
|
|
if (istype(W, /obj/item/card/id) || (istype(W, /obj/item/device/pda2) && W:ID_card))
|
|
if (stat & (BROKEN|NOPOWER))
|
|
boutput(user, "<span style=\"color:red\">The local air monitor has no power!</span>")
|
|
return
|
|
if (src.allowed(usr, req_only_one_required))
|
|
// locked = !locked
|
|
// boutput(user, "You [ locked ? "lock" : "unlock"] the local air monitor.")
|
|
boutput(user, "<span style=\"color:red\">Error: No atmospheric pipe network detected.</span>") // <-- dumb workaround until atmos processing is better
|
|
return
|
|
else
|
|
boutput(user, "<span style=\"color:red\">Access denied.</span>")
|
|
return
|
|
return ..()
|
|
|
|
/obj/machinery/alarm/attack_hand(mob/user)
|
|
if(stat & (NOPOWER|BROKEN))
|
|
return
|
|
user << browse(return_text(user),"window=atmos")
|
|
user.machine = src
|
|
onclose(user, "atmos")
|
|
|
|
/obj/machinery/alarm/proc/return_text(mob/user)
|
|
if ( (get_dist(src, user) > 1 ))
|
|
if (!istype(user, /mob/living/silicon))
|
|
user.machine = null
|
|
user << browse(null, "window=atmos")
|
|
return
|
|
|
|
|
|
var/output = "<B>[name] Interface: </B><BR><HR>"
|
|
if (!istype(environment))
|
|
output += "<FONT color = 'red'>ERROR: Unable to determine environmental status!</FONT><BR><BR>"
|
|
safe = -1
|
|
else
|
|
var/environment_pressure = environment.return_pressure()
|
|
var/total_moles = environment.total_moles()
|
|
|
|
if((environment_pressure < ONE_ATMOSPHERE*0.80) || (environment_pressure > ONE_ATMOSPHERE*1.20))
|
|
output += "<FONT color = 'red'>"
|
|
else if((environment_pressure < ONE_ATMOSPHERE*0.90) || (environment_pressure > ONE_ATMOSPHERE*1.10))
|
|
output += "<FONT color = 'orange'>"
|
|
else
|
|
output += "<FONT color = 'blue'>"
|
|
output += "Pressure: [environment_pressure] kPa</FONT><BR>"
|
|
|
|
if((environment.temperature < (T0C-10)) || (environment.temperature > (T0C+50)))
|
|
output += "<FONT color = 'red'>"
|
|
else if((environment.temperature < (T0C)) || (environment.temperature > (T0C+40)))
|
|
output += "<FONT color = 'orange'>"
|
|
else
|
|
output += "<FONT color = 'blue'>"
|
|
output += "Temperature: [environment.temperature] K</FONT><BR><BR>"
|
|
|
|
output += "<B>Composition:</B><BR>"
|
|
|
|
if(environment.nitrogen < MOLES_N2STANDARD*0.80)
|
|
output += "<FONT color = 'red'>"
|
|
else if((environment.nitrogen < MOLES_N2STANDARD*0.90) || (environment.nitrogen > MOLES_N2STANDARD*1.10))
|
|
output += "<FONT color = 'orange'>"
|
|
else
|
|
output += "<FONT color = 'blue'>"
|
|
if(total_moles > 0)
|
|
output += "N2: [round(100*environment.nitrogen/total_moles,0.01)]%</FONT><BR>"
|
|
else
|
|
output += "N2: N/A</FONT><BR>"
|
|
|
|
if(environment.oxygen < MOLES_O2STANDARD*0.80)
|
|
output += "<FONT color = 'red'>"
|
|
else if((environment.oxygen < MOLES_O2STANDARD*0.90) || (environment.oxygen > MOLES_O2STANDARD*1.10))
|
|
output += "<FONT color = 'orange'>"
|
|
else
|
|
output += "<FONT color = 'blue'>"
|
|
if(total_moles > 0)
|
|
output += "O2: [round(100*environment.oxygen/total_moles,0.01)]%</FONT><BR>"
|
|
else
|
|
output += "O2: N/A</FONT><BR>"
|
|
|
|
if(environment.carbon_dioxide > 0.1)
|
|
output += "<FONT color = 'red'>"
|
|
else if(environment.carbon_dioxide > 0.05)
|
|
output += "<FONT color = 'orange'>"
|
|
else
|
|
output += "<FONT color = 'blue'>"
|
|
if(total_moles > 0)
|
|
output += "CO2: [round(100*environment.carbon_dioxide/total_moles,0.01)]%</FONT><BR>"
|
|
else
|
|
output += "CO2: N/A</FONT><BR><BR>"
|
|
|
|
if(environment.toxins > 2)
|
|
output += "<FONT color = 'red'>WARNING: Toxins detected in environment!<BR>"
|
|
if(total_moles > 0)
|
|
output += "TOX: [round(100*environment.toxins/total_moles,0.01)]%</FONT><BR>"
|
|
else
|
|
output += "TOX: N/A</FONT><BR>"
|
|
else if(environment.toxins > 1)
|
|
output += "<FONT color = 'orange'>WARNING: Toxins detected in environment!<BR>"
|
|
if(total_moles > 0)
|
|
output += "TX: [round(100*environment.toxins/total_moles,0.01)]%</FONT><BR>"
|
|
else
|
|
output += "TX: N/A</FONT><BR>"
|
|
else
|
|
output += ""
|
|
|
|
var/tgmoles = 0
|
|
if(environment.trace_gases && environment.trace_gases.len)
|
|
for(var/datum/gas/trace_gas in environment.trace_gases)
|
|
tgmoles += trace_gas.moles
|
|
|
|
if(tgmoles > 1)
|
|
output += "<FONT color = 'red'>WARNING: unidentified gases present in environment!</FONT><BR>"
|
|
|
|
if(e_gas)
|
|
output += "<FONT color = 'red'>WARNING: Local override engaged, air supply is limited!</FONT><BR>"
|
|
|
|
if(panic_mode > 0)
|
|
var/seconds = panic_mode % 60
|
|
var/minutes = (panic_mode - seconds)/60
|
|
output += "<FONT color = 'red'>WARNING: Scrubbers on panic siphon for next [minutes]:[seconds]!</FONT><BR>"
|
|
|
|
output += "<BR>"
|
|
|
|
output += "Environment Status: "
|
|
|
|
switch(safe)
|
|
if(-1)
|
|
output += "<FONT color = 'maroon'>UNKNOWN</FONT>"
|
|
if(0)
|
|
output += "<FONT color = 'red'>LETHAL</FONT>"
|
|
if(1)
|
|
output += "<FONT color = 'orange'>CAUTION</FONT>"
|
|
else
|
|
output += "<FONT color = 'blue'>OPTIMAL</FONT>"
|
|
|
|
output += "<BR><HR>"
|
|
|
|
output += "<TT>"
|
|
if(locked && (!istype(user, /mob/living/silicon)))
|
|
output += "<I><FONT color = 'gray'>No atmospheric pipe network detected.<BR>Control functions unavailable.</FONT></I>"
|
|
else
|
|
if(!istype(user, /mob/living/silicon))
|
|
output += "<I>Swipe card to lock interface.</I><BR><BR>"
|
|
output += "<A href='?src=\ref[src];toggle_override=1'>Toggle Local Override</A><BR>"
|
|
if(panic_mode > 0)
|
|
output += "<A href='?src=\ref[src];unpanic=1'>Cancel Panic Siphon</A><BR>"
|
|
else
|
|
output += "<A href='?src=\ref[src];panic=1'>Engage Two-Minute Panic Siphon</A> - <FONT color = 'red'>WARNING: Pressure may temporarily drop below safe levels!</FONT><BR>"
|
|
output += "</TT>"
|
|
return output
|
|
|
|
/obj/machinery/alarm/Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
|
|
if(href_list["toggle_override"])
|
|
var/datum/radio_frequency/frequency = radio_controller.return_frequency(control_frequency)
|
|
|
|
if(!frequency) return
|
|
|
|
var/datum/signal/signal = get_free_signal()
|
|
signal.source = src
|
|
signal.transmission_method = 1
|
|
signal.data["tag"] = id
|
|
if(!e_gas)
|
|
signal.data["command"] = "valve_divert"
|
|
else
|
|
signal.data["command"] = "valve_undivert"
|
|
|
|
frequency.post_signal(src, signal)
|
|
|
|
e_gas = !e_gas
|
|
|
|
if(href_list["panic"])
|
|
panic(120)
|
|
|
|
if(href_list["unpanic"])
|
|
unpanic()
|
|
|
|
src.add_fingerprint(usr)
|
|
|
|
/obj/machinery/alarm/power_change()
|
|
if(powered(ENVIRON))
|
|
stat &= ~NOPOWER
|
|
else
|
|
stat |= NOPOWER
|
|
|
|
/obj/machinery/alarm/proc/panic(var/time)
|
|
var/datum/radio_frequency/frequency = radio_controller.return_frequency(control_frequency)
|
|
|
|
if(!frequency) return
|
|
|
|
panic_mode = time
|
|
|
|
var/datum/signal/signal = get_free_signal()
|
|
signal.source = src
|
|
signal.transmission_method = 1
|
|
signal.data["tag"] = id
|
|
signal.data["command"] = "set_siphon"
|
|
|
|
frequency.post_signal(src, signal)
|
|
|
|
signal = get_free_signal()
|
|
signal.source = src
|
|
signal.transmission_method = 1
|
|
signal.data["tag"] = id
|
|
signal.data["command"] = "purge"
|
|
|
|
frequency.post_signal(src, signal)
|
|
|
|
/obj/machinery/alarm/proc/unpanic()
|
|
var/datum/radio_frequency/frequency = radio_controller.return_frequency(control_frequency)
|
|
|
|
if(!frequency) return
|
|
|
|
panic_mode = 0
|
|
|
|
var/datum/signal/signal = get_free_signal()
|
|
signal.source = src
|
|
signal.transmission_method = 1
|
|
signal.data["tag"] = id
|
|
signal.data["command"] = "set_scrubbing"
|
|
|
|
frequency.post_signal(src, signal)
|
|
|
|
signal = get_free_signal()
|
|
signal.source = src
|
|
signal.transmission_method = 1
|
|
signal.data["tag"] = id
|
|
signal.data["command"] = "end_purge"
|
|
|
|
frequency.post_signal(src, signal)
|
|
|