obj/machinery/air_sensor icon = 'icons/obj/stationobjs.dmi' icon_state = "gsensor1" name = "Gas Sensor" req_one_access_txt = "24;10" anchored = 1 var/state = 0 var/bolts = 1 var/id_tag var/frequency = 1439 Mtoollink = 1 settagwhitelist = list("id_tag") var/on = 1 var/output = 3 //Flags: // 1 for pressure // 2 for temperature // Output >= 4 includes gas composition // 4 for oxygen concentration // 8 for toxins concentration // 16 for nitrogen concentration // 32 for carbon dioxide concentration var/datum/radio_frequency/radio_connection update_icon() icon_state = "gsensor[on]" multitool_menu(var/mob/user, var/obj/item/device/multitool/P) return {" Main "} multitool_topic(var/mob/user, var/list/href_list, var/obj/O) . = ..() if(.) return . if("toggle_out_flag" in href_list) var/bitflag_value = text2num(href_list["toggle_out_flag"])//this is a string normally if(!(bitflag_value in list(1, 2, 4, 8, 16, 32))) //Here to prevent breaking the sensors with HREF exploits return 0 if(output&bitflag_value)//the bitflag is on ATM output &= ~bitflag_value else//can't not be off output |= bitflag_value return MT_UPDATE if("toggle_bolts" in href_list) bolts = !bolts if(bolts) visible_message("You hear a quite click as the [src] bolts to the floor", "You hear a quite click") else visible_message("You hear a quite click as the [src]'s floor bolts raise", "You hear a quite click") return MT_UPDATE attackby(var/obj/item/W as obj, var/mob/user as mob) if(istype(W, /obj/item/device/multitool)) update_multitool_menu(user) return 1 if(istype(W, /obj/item/weapon/wrench)) if(bolts) usr << "The [src] is bolted to the floor! You can't detach it like this." return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "\blue You begin to unfasten \the [src]..." if(do_after(user, 40)) user.visible_message("[user] unfastens \the [src].", "\blue You have unfastened \the [src].", "You hear ratchet.") new /obj/item/pipe_gsensor(src.loc) qdel(src) return 1 if(..()) return 1 process() if(on) var/datum/signal/signal = new signal.transmission_method = 1 //radio signal signal.data["tag"] = id_tag signal.data["timestamp"] = world.time var/datum/gas_mixture/air_sample = return_air() if(output&1) signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1),) if(output&2) signal.data["temperature"] = round(air_sample.temperature,0.1) if(output>4) var/total_moles = air_sample.total_moles() if(total_moles > 0) if(output&4) signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1) if(output&8) signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1) if(output&16) signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1) if(output&32) signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1) else signal.data["oxygen"] = 0 signal.data["toxins"] = 0 signal.data["nitrogen"] = 0 signal.data["carbon_dioxide"] = 0 signal.data["sigtype"]="status" radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) proc set_frequency(new_frequency) radio_controller.remove_object(src, frequency) frequency = new_frequency radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) initialize() set_frequency(frequency) New() ..() if(radio_controller) set_frequency(frequency) Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) return ..() /obj/machinery/computer/general_air_control icon = 'icons/obj/computer.dmi' icon_screen = "tank" icon_keyboard = "atmos_key" circuit = "/obj/item/weapon/circuitboard/air_management" req_one_access_txt = "24;10" name = "Computer" var/frequency = 1439 var/show_sensors=1 var/list/sensors = list() Mtoollink = 1 var/list/sensor_information = list() var/datum/radio_frequency/radio_connection attack_hand(mob/user) if(..(user)) return var/html=return_text()+"" user << browse(html,"window=gac") user.set_machine(src) onclose(user, "gac") process() ..() if(!sensors) //warning("[src.type] at [x],[y],[z] has null sensors. Please fix.")//commenting this line out because the admins will get a warning like this every time somebody builds another GAC sensors = list() src.updateUsrDialog() attackby(I as obj, user as mob, params) if(istype(I, /obj/item/device/multitool)) update_multitool_menu(user) if(..()) return 1 receive_signal(datum/signal/signal) if(!signal || signal.encryption) return var/id_tag = signal.data["tag"] if(!id_tag || !sensors || !sensors.Find(id_tag)) return sensor_information[id_tag] = signal.data proc/return_text() var/sensor_data if(show_sensors) if(sensors.len) for(var/id_tag in sensors) var/long_name = sensors[id_tag] var/list/data = sensor_information[id_tag] var/sensor_part = "
[long_name]" if(data) sensor_part += "" if(data["pressure"]) sensor_part += "" if(data["temperature"]) sensor_part += "" if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"]) sensor_part += "" sensor_part += "
Pressure:[data["pressure"]] kPa
Temperature:[data["temperature"]] K
Gas Composition :
    " if(data["oxygen"]) sensor_part += "
  • [data["oxygen"]]% O2
  • " if(data["nitrogen"]) sensor_part += "
  • [data["nitrogen"]]% N
  • " if(data["carbon_dioxide"]) sensor_part += "
  • [data["carbon_dioxide"]]% CO2
  • " if(data["toxins"]) sensor_part += "
  • [data["toxins"]]% Plasma
  • " sensor_part += "
" else sensor_part += "[long_name] can not be found!
" sensor_part += "
" sensor_data += sensor_part else sensor_data = "No sensors connected." var/output = {" [name]

[name]

[show_sensors ? "

Sensor Data:

" + sensor_data : ""] "} return output proc set_frequency(new_frequency) radio_controller.remove_object(src, frequency) frequency = new_frequency radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) initialize() set_frequency(frequency) multitool_menu(var/mob/user, var/obj/item/device/multitool/P) var/dat= {" Main Sensors: "} return dat multitool_topic(var/mob/user,var/list/href_list,var/obj/O) . = ..() if(.) return . if("add_sensor" in href_list) // Make a list of all available sensors on the same frequency var/list/sensor_list = list() for(var/obj/machinery/air_sensor/G in machines) if(!isnull(G.id_tag) && G.frequency == frequency) sensor_list|=G.id_tag if(!sensor_list.len) user << "No sensors on this frequency." return MT_ERROR // Have the user pick one of them and name its label var/sensor = input(user, "Select a sensor:", "Sensor Data") as null|anything in sensor_list if(!sensor) return MT_ERROR var/label = reject_bad_name( input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) if(!label) return MT_ERROR // Add the sensor's information to general_air_controler sensors[sensor] = label return MT_UPDATE if("edit_sensor" in href_list) var/list/sensor_list = list() for(var/obj/machinery/air_sensor/G in machines) if(!isnull(G.id_tag) && G.frequency == frequency) sensor_list|=G.id_tag if(!sensor_list.len) user << "No sensors on this frequency." return MT_ERROR var/label = sensors[href_list["edit_sensor"]] var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list if(!sensor) return MT_ERROR sensors.Remove(href_list["edit_sensor"]) sensors[sensor] = label return MT_UPDATE unlinkFrom(var/mob/user, var/obj/O) ..() if("id_tag" in O.vars && (istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))) sensors.Remove(O:id_tag) return 1 return 0 linkMenu(var/obj/O) if(isLinkedWith(O)) return var/dat="" if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) dat += " \[New Sensor\] " return dat canLink(var/obj/O, var/list/context) if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) return O:id_tag isLinkedWith(var/obj/O) if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) return O:id_tag in sensors linkWith(var/mob/user, var/obj/O, var/link/context) sensors[O:id_tag] = reject_bad_name(input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) return 1 large_tank_control circuit = "/obj/item/weapon/circuitboard/large_tank_control" req_one_access_txt = "24;10" settagwhitelist = list("input_tag", "output_tag") var/input_tag var/output_tag var/list/input_info var/list/output_info var/list/input_linkable=list( /obj/machinery/atmospherics/unary/outlet_injector, /obj/machinery/atmospherics/unary/vent_pump ) var/list/output_linkable=list( /obj/machinery/atmospherics/unary/vent_pump ) var/pressure_setting = ONE_ATMOSPHERE * 45 attackby(I as obj, user as mob) if(istype(I, /obj/item/device/multitool)) update_multitool_menu(user) if(..()) return 1 multitool_menu(var/mob/user, var/obj/item/device/multitool/P) var/dat= {" Sensors: "} return dat linkWith(var/mob/user, var/obj/O, var/list/context) if(context["slot"]=="input" && is_type_in_list(O,input_linkable)) input_tag = O:id_tag input_info = null if(istype(O,/obj/machinery/atmospherics/unary/vent_pump)) send_signal(list("tag"=input_tag, "direction"=1, // Release "checks" =0 // No pressure checks. )) return 1 if(context["slot"]=="output" && is_type_in_list(O,output_linkable)) output_tag = O:id_tag output_info = null if(istype(O,/obj/machinery/atmospherics/unary/vent_pump)) send_signal(list("tag"=output_tag, "direction"=0, // Siphon "checks" =2 // Internal pressure checks. )) return 1 unlinkFrom(var/mob/user, var/obj/O) if("id_tag" in O.vars) if(O:id_tag == input_tag) input_tag=null input_info=null return 1 if(O:id_tag == output_tag) output_tag=null output_info=null return 1 return 0 linkMenu(var/obj/O) var/dat="" if(canLink(O,list("slot"="input"))) dat += " \[Link @ Input\] " if(canLink(O,list("slot"="output"))) dat += " \[Link @ Output\] " return dat canLink(var/obj/O, var/list/context) return (context["slot"]=="input" && is_type_in_list(O,input_linkable)) || (context["slot"]=="output" && is_type_in_list(O,output_linkable)) isLinkedWith(var/obj/O) if(O:id_tag == input_tag) return 1 if(O:id_tag == output_tag) return 1 return 0 process() ..() if(!input_info && input_tag) request_device_refresh(input_tag) if(!output_info && output_tag) request_device_refresh(output_tag) return_text() var/output = ..() //if(signal.data) // input_info = signal.data // Attempting to fix intake control -- TLE output += "

Tank Control System


" if(input_tag) if(input_info) var/power = (input_info["power"]) var/volume_rate = input_info["volume_rate"] output += {"
Input (Refresh)
State: [power?("Injecting"):("On Hold")]
Rate: [volume_rate] L/sec
"} else output += "ERROR: Can not find input port Search
" if(output_tag) if(output_info) var/power = (output_info["power"]) var/output_pressure = output_info["internal"] output += {"
Output (Refresh)
State: [power?("Open"):("On Hold")]
Max Output Pressure: [output_pressure] kPa
"} else output += "ERROR: Can not find output port Search
" return output receive_signal(datum/signal/signal) if(!signal || signal.encryption) return var/id_tag = signal.data["tag"] if(input_tag == id_tag) input_info = signal.data updateUsrDialog() else if(output_tag == id_tag) output_info = signal.data updateUsrDialog() else ..(signal) proc/request_device_refresh(var/device) send_signal(list("tag"=device, "status")) proc/send_signal(var/list/data) var/datum/signal/signal = new signal.transmission_method = 1 //radio signal signal.source = src signal.data=data signal.data["sigtype"]="command" radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) Topic(href, href_list) if(..()) return 1 add_fingerprint(usr) if(href_list["out_set_pressure"]) var/response=input(usr,"Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num pressure_setting = text2num(response) pressure_setting = between(0, pressure_setting, 50*ONE_ATMOSPHERE) if(!radio_connection) return 0 var/datum/signal/signal = new signal.transmission_method = 1 //radio signal signal.source = src if(href_list["in_refresh_status"]) input_info = null signal.data = list ("tag" = input_tag, "status" = 1) else if(href_list["in_toggle_injector"]) input_info = null signal.data = list ("tag" = input_tag, "power_toggle" = 1) else if(href_list["out_refresh_status"]) output_info = null signal.data = list ("tag" = output_tag, "status" = 1) else if(href_list["out_toggle_power"]) output_info = null signal.data = list ("tag" = output_tag, "power_toggle" = 1) else if(href_list["out_set_pressure"]) output_info = null signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]") /*else testing("Bad Topic() to GAC \"[src.name]\": [href]") return*/ // NOPE. // disabling because it spams when multitool menus are used signal.data["sigtype"] = "command" radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) src.updateUsrDialog() fuel_injection icon = 'icons/obj/computer.dmi' icon_screen = "atmos" circuit = "/obj/item/weapon/circuitboard/injector_control" var/device_tag var/list/device_info var/automation = 0 var/cutoff_temperature = 2000 var/on_temperature = 1200 attackby(I as obj, user as mob, params) if(istype(I, /obj/item/device/multitool)) update_multitool_menu(user) if(..()) return 1 process() if(automation) if(!radio_connection) return 0 var/injecting = 0 for(var/id_tag in sensor_information) var/list/data = sensor_information[id_tag] if(data["temperature"]) if(data["temperature"] >= cutoff_temperature) injecting = 0 break if(data["temperature"] <= on_temperature) injecting = 1 var/datum/signal/signal = new signal.transmission_method = 1 //radio signal signal.source = src signal.data = list( "tag" = device_tag, "power" = injecting, "sigtype"="command" ) radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) ..() return_text() var/output = ..() output += "
Fuel Injection System (Refresh)" if(device_info) var/power = device_info["power"] var/volume_rate = device_info["volume_rate"] output += {""} if(automation) // AUTOFIXED BY fix_string_idiocy.py // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\atmo_control.dm:372: output += "Automated Fuel Injection: Engaged
" output += {" "} // END AUTOFIX else // AUTOFIXED BY fix_string_idiocy.py // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\atmo_control.dm:375: output += "Automated Fuel Injection: Disengaged
" output += {" "} // END AUTOFIX output += "
Status: [power?"Injecting":"On Hold"]
Rate: [volume_rate] L/sec
Automated Fuel Injection: [automation?"Engaged":"Disengaged"]
Injector Controls Locked Out
Injector: Toggle Power Inject (1 Cycle)
" else output += {"

ERROR: Can not find device. Search

"} output += "
" return output receive_signal(datum/signal/signal) if(!signal || signal.encryption) return var/id_tag = signal.data["tag"] if(device_tag == id_tag) device_info = signal.data else ..(signal) Topic(href, href_list) if(..()) return if(href_list["refresh_status"]) device_info = null if(!radio_connection) return 0 var/datum/signal/signal = new signal.transmission_method = 1 //radio signal signal.source = src signal.data = list( "tag" = device_tag, "status", "sigtype"="command" ) radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) if(href_list["toggle_automation"]) automation = !automation if(href_list["toggle_injector"]) device_info = null if(!radio_connection) return 0 var/datum/signal/signal = new signal.transmission_method = 1 //radio signal signal.source = src signal.data = list( "tag" = device_tag, "power_toggle", "sigtype"="command" ) radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) if(href_list["injection"]) if(!radio_connection) return 0 var/datum/signal/signal = new signal.transmission_method = 1 //radio signal signal.source = src signal.data = list( "tag" = device_tag, "inject", "sigtype"="command" ) radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)