[READY] Atmos Refactor Part 7 (I think) - Kills signals + TGUIs stuff (#19867)

* I AM NOT A KING. I AM NOT A GOD. I AM LUNACY.

* THE SCOPE CREEP

* This was done in vi. No langserver. Send help.

* Progress

* Some issues fixed

* The code builds, but the maps dont

* CC builds, I doubt anything else does

* Do this now

* Safety

* The map compiles

* THE MAPPING HELL

* Airlock controllers dont work

* Fixed bombs

* AND THATS FIXED

* Phantom edit

* Restores LL I think

* The mapmerge hooks are actually retarded

* Fixes spawners

* Half working air control

* Picky

* Hyper efficient tank monitor

* Sanity

* Laying the framework

* Improved alert console

* Dont think this is actually done anywhere

* Metering

* ONE HUNDRED AND ~~EIGHTY~~ TWENTY SEVEN

* WE ARE READY FOR BOX TO BUILD

* One map done

* Well that was easy

* Another one

* I think this is done

* I should have removed this

* I would make a russian joke but <current event>

* Delta WIP

* Makes delta work

* Early review

* TM safeguard

* oops

* METAAAAAAAAAAAAAAAAAAAAAAAAA

* Fix #4213

* Trailing

* oh for piss sake

* Shutter fix

* Roundstart ATs can go away

* Review pass 1

* What could go wrong

* BOOM BOOM BOOM

* Not needed

* Fix seed vault

* Oops

* Review changes
This commit is contained in:
AffectedArc07
2023-01-03 20:59:35 +00:00
committed by GitHub
parent ad608cf016
commit 1feb9fbd38
88 changed files with 14550 additions and 16680 deletions
+2 -12
View File
@@ -70,16 +70,6 @@
add_fingerprint(user)
return
/obj/item/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here.
visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
sleep(10)
if(!src)
return
if(status)
bombtank.detonate() //if its not a dud, boom (or not boom if you made shitty mix) the ignite proc is below, in this file
else
bombtank.release()
/obj/item/onetankbomb/HasProximity(atom/movable/AM)
if(bombassembly)
bombassembly.HasProximity(AM)
@@ -102,7 +92,7 @@
// ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ----------
/obj/item/tank/proc/bomb_assemble(W,user) //Bomb assembly proc. This turns assembly+tank into a bomb
/obj/item/tank/proc/bomb_assemble(W, user) //Bomb assembly proc. This turns assembly+tank into a bomb
var/obj/item/assembly_holder/S = W
var/mob/M = user
if(!S.secured) //Check if the assembly is secured
@@ -127,7 +117,7 @@
return
/obj/item/tank/proc/detonate() //This happens when a bomb is told to explode
var/fuel_moles = air_contents.toxins + air_contents.oxygen/6
var/fuel_moles = air_contents.toxins + air_contents.oxygen / 6
var/strength = 1
var/turf/ground_zero = get_turf(loc)
+1 -2
View File
@@ -199,6 +199,5 @@
a_right.pulsed(0)
if(a_left && a_left != D) // the right pools might have sent us boom, so `a_left` can be null here
a_left.pulsed(0)
if(master)
master.receive_signal()
return TRUE
+9
View File
@@ -38,11 +38,20 @@
if(tank)
tank.boom(TRUE) // this qdel's `src`
if(istype(locloc, /obj/item/onetankbomb))
var/obj/item/onetankbomb/bomb = locloc
if(bomb?.bombtank)
bomb.bombtank.detonate()
else if(istype(locloc, /obj/item/reagent_containers/glass/beaker))
var/obj/item/reagent_containers/glass/beaker/beakerbomb = locloc
if(beakerbomb)
beakerbomb.heat_beaker()
else if(istype(locloc, /obj/item/grenade/chem_grenade))
var/obj/item/grenade/chem_grenade/CG = locloc
CG.prime()
return TRUE
@@ -11,6 +11,7 @@
return 0
/turf/return_air()
RETURN_TYPE(/datum/gas_mixture)
//Create gas mixture to hold data for passing
var/datum/gas_mixture/GM = new
@@ -99,6 +100,7 @@
air.copy_from(copy)
/turf/simulated/return_air()
RETURN_TYPE(/datum/gas_mixture)
if(air)
return air
+233 -226
View File
@@ -64,10 +64,8 @@
//all air alarms in area are connected via magic
/area
var/obj/machinery/alarm/master_air_alarm
var/list/air_vent_names = list()
var/list/air_scrub_names = list()
var/list/air_vent_info = list()
var/list/air_scrub_info = list()
var/list/obj/machinery/atmospherics/unary/vent_pump/vents = list()
var/list/obj/machinery/atmospherics/unary/vent_scrubber/scrubbers = list()
/obj/machinery/alarm
name = "air alarm"
@@ -85,11 +83,9 @@
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30)
resistance_flags = FIRE_PROOF
siemens_strength = 1
frequency = ATMOS_VENTSCRUB
var/custom_name
var/alarm_id = null
//var/skipprocess = 0 //Experimenting
var/alarm_frequency = ATMOS_FIRE_FREQ
var/remote_control = TRUE
var/rcon_setting = RCON_AUTO
var/rcon_time = 0
@@ -100,13 +96,8 @@
var/AAlarmwires = 31
var/shorted = FALSE
// Waiting on a device to respond.
// Specifies an id_tag. NULL means we aren't waiting.
var/waiting_on_device = null
var/mode = AALARM_MODE_SCRUBBING
var/preset = AALARM_PRESET_HUMAN
var/area_uid
var/area/alarm_area
var/danger_level = ATMOS_ALARM_NONE
var/alarmActivated = 0 // Manually activated (independent from danger level)
@@ -215,19 +206,16 @@
mode = AALARM_MODE_REPLACEMENT
apply_mode()
/obj/machinery/alarm/New(loc, direction, building = 0)
/obj/machinery/alarm/Initialize(mapload, direction, building = 0)
. = ..()
if(building) // Do this first since the Init uses this later on. TODO refactor to just use an Init
if(loc)
src.loc = loc
if(dir)
if(direction)
setDir(direction)
buildstage = 0
wiresexposed = TRUE
set_pixel_offsets_from_dir(-24, 24, -24, 24)
. = ..()
GLOB.air_alarms += src
GLOB.air_alarms = sortAtom(GLOB.air_alarms)
@@ -239,9 +227,6 @@
/obj/machinery/alarm/Destroy()
SStgui.close_uis(wires)
GLOB.air_alarms -= src
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
GLOB.air_alarm_repository.update_cache(src)
QDEL_NULL(wires)
if(alarm_area && alarm_area.master_air_alarm == src)
@@ -252,15 +237,13 @@
/obj/machinery/alarm/proc/first_run()
alarm_area = get_area(src)
area_uid = alarm_area.uid
if(!custom_name)
name = "[alarm_area.name] Air Alarm"
apply_preset(1) // Don't cycle.
apply_preset(AALARM_PRESET_HUMAN) // Don't cycle.
GLOB.air_alarm_repository.update_cache(src)
/obj/machinery/alarm/Initialize(mapload)
. = ..()
set_frequency(frequency)
if(!master_is_operating())
elect_master()
@@ -391,7 +374,10 @@
icon_state = "alarmp"
return
switch(max(danger_level, alarm_area.atmosalm-1))
if(!alarm_area) // We wont have our alarm_area if we aint initialised
return
switch(max(danger_level, alarm_area.atmosalm - 1))
if(ATMOS_ALARM_NONE)
icon_state = "alarm0"
if(ATMOS_ALARM_WARNING)
@@ -408,200 +394,161 @@
underlays += emissive_appearance(icon, "alarm_lightmask")
/obj/machinery/alarm/proc/register_env_machine(m_id, device_type)
var/new_name
if(device_type=="AVP")
new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]"
alarm_area.air_vent_names[m_id] = new_name
else if(device_type=="AScr")
new_name = "[alarm_area.name] Air Scrubber #[alarm_area.air_scrub_names.len+1]"
alarm_area.air_scrub_names[m_id] = new_name
else
return
spawn (10)
send_signal(m_id, list("init" = new_name) )
/obj/machinery/alarm/proc/refresh_all()
for(var/id_tag in alarm_area.air_vent_names)
var/list/I = alarm_area.air_vent_info[id_tag]
if(I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time)
continue
send_signal(id_tag, list("status") )
for(var/id_tag in alarm_area.air_scrub_names)
var/list/I = alarm_area.air_scrub_info[id_tag]
if(I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time)
continue
send_signal(id_tag, list("status") )
/obj/machinery/alarm/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM)
/obj/machinery/alarm/proc/send_signal(target, list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = command
signal.data["tag"] = target
signal.data["sigtype"] = "command"
radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM)
return TRUE
/obj/machinery/alarm/proc/apply_mode()
switch(mode)
if(AALARM_MODE_SCRUBBING)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list(
"power" = TRUE,
"o2_scrub" = (preset == AALARM_PRESET_VOX),
"n2_scrub" = FALSE,
"co2_scrub" = TRUE,
"tox_scrub" = FALSE,
"n2o_scrub" = FALSE,
"scrubbing" = TRUE,
"widenet" = FALSE,
))
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list(
"power" = TRUE,
"checks" = TRUE,
"set_external_pressure" = ONE_ATMOSPHERE
))
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
if(S.stat & (NOPOWER|BROKEN))
continue
S.on = TRUE
S.scrub_O2 = (preset == AALARM_PRESET_VOX)
S.scrub_N2 = FALSE
S.scrub_CO2 = TRUE
S.scrub_Toxins = FALSE
S.scrub_N2O = FALSE
S.scrubbing = TRUE
S.widenet = TRUE
S.update_icon(UPDATE_ICON_STATE)
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
if(P.stat & (NOPOWER|BROKEN))
continue
P.on = TRUE
P.pressure_checks = TRUE
P.internal_pressure_bound = ONE_ATMOSPHERE
P.update_icon(UPDATE_ICON_STATE)
if(AALARM_MODE_CONTAMINATED)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list(
"power" = TRUE,
"co2_scrub" = TRUE,
"tox_scrub" = TRUE,
"n2o_scrub" = TRUE,
"scrubbing" = TRUE,
"widenet" = TRUE,
))
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list(
"power" = TRUE,
"checks" = TRUE,
"set_external_pressure" = ONE_ATMOSPHERE
))
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
if(S.stat & (NOPOWER|BROKEN))
continue
S.on = TRUE
S.scrub_CO2 = TRUE
S.scrub_Toxins = TRUE
S.scrub_N2O = TRUE
S.scrubbing = TRUE
S.widenet = TRUE
S.update_icon(UPDATE_ICON_STATE)
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
if(P.stat & (NOPOWER|BROKEN))
continue
P.on = TRUE
P.pressure_checks = TRUE
P.external_pressure_bound = ONE_ATMOSPHERE
P.update_icon(UPDATE_ICON_STATE)
if(AALARM_MODE_VENTING)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list(
"power" = TRUE,
"widenet" = FALSE,
"scrubbing" = FALSE
))
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list(
"power" = TRUE,
"checks" = TRUE,
"set_external_pressure" = ONE_ATMOSPHERE * 2
))
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
if(S.stat & (NOPOWER|BROKEN))
continue
S.on = TRUE
S.widenet = FALSE
S.scrubbing = FALSE
S.update_icon(UPDATE_ICON_STATE)
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
if(P.stat & (NOPOWER|BROKEN))
continue
P.on = TRUE
P.pressure_checks = TRUE
P.external_pressure_bound = ONE_ATMOSPHERE * 2
P.update_icon(UPDATE_ICON_STATE)
if(AALARM_MODE_REFILL)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list(
"power" = TRUE,
"co2_scrub" = TRUE,
"tox_scrub" = FALSE,
"n2o_scrub" = FALSE,
"scrubbing" = TRUE,
"widenet" = FALSE,
))
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list(
"power" = TRUE,
"checks" = TRUE,
"set_external_pressure" = ONE_ATMOSPHERE * 3
))
if(AALARM_MODE_PANIC,
AALARM_MODE_REPLACEMENT)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list(
"power" = TRUE,
"widenet" = TRUE,
"scrubbing" = FALSE
))
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list(
"power" = FALSE
))
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
if(S.stat & (NOPOWER|BROKEN))
continue
S.on = TRUE
S.scrub_CO2 = TRUE
S.scrub_Toxins = FALSE
S.scrub_N2O = FALSE
S.scrubbing = TRUE
S.widenet = FALSE
S.update_icon(UPDATE_ICON_STATE)
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
if(P.stat & (NOPOWER|BROKEN))
continue
P.on = TRUE
P.pressure_checks = TRUE
P.external_pressure_bound = ONE_ATMOSPHERE * 3
P.update_icon(UPDATE_ICON_STATE)
if(AALARM_MODE_PANIC, AALARM_MODE_REPLACEMENT)
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
if(S.stat & (NOPOWER|BROKEN))
continue
S.on = TRUE
S.widenet = TRUE
S.scrubbing = FALSE
S.update_icon(UPDATE_ICON_STATE)
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
if(P.stat & (NOPOWER|BROKEN))
continue
P.on = FALSE
P.update_icon(UPDATE_ICON_STATE)
if(AALARM_MODE_SIPHON)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list(
"power" = TRUE,
"widenet" = FALSE,
"scrubbing" = FALSE
))
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list(
"power" = FALSE
))
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
if(S.stat & (NOPOWER|BROKEN))
continue
S.on = TRUE
S.widenet = FALSE
S.scrubbing = FALSE
S.update_icon(UPDATE_ICON_STATE)
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
if(P.stat & (NOPOWER|BROKEN))
continue
P.on = FALSE
P.update_icon(UPDATE_ICON_STATE)
if(AALARM_MODE_OFF)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list(
"power" = FALSE
))
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list(
"power" = FALSE
))
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
if(S.stat & (NOPOWER|BROKEN))
continue
S.on = FALSE
S.update_icon(UPDATE_ICON_STATE)
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
if(P.stat & (NOPOWER|BROKEN))
continue
P.on = FALSE
P.update_icon(UPDATE_ICON_STATE)
if(AALARM_MODE_FLOOD)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list(
"power" = FALSE
))
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list(
"power" = TRUE,
"checks" = 2,
"set_internal_pressure" = FALSE
))
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
if(S.stat & (NOPOWER|BROKEN))
continue
S.on = FALSE
S.update_icon(UPDATE_ICON_STATE)
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
if(P.stat & (NOPOWER|BROKEN))
continue
P.on = TRUE
P.pressure_checks = 2
P.internal_pressure_bound = 0
P.update_icon(UPDATE_ICON_STATE)
/obj/machinery/alarm/proc/apply_danger_level()
var/new_area_danger_level = ATMOS_ALARM_NONE
for(var/obj/machinery/alarm/AA in alarm_area)
if(!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
new_area_danger_level = max(new_area_danger_level, AA.danger_level)
if(alarm_area.atmosalert(new_area_danger_level, src)) //if area was in normal state or if area was in alert state
post_alert(new_area_danger_level)
alarm_area.atmosalert(new_area_danger_level, src)
update_icon(UPDATE_ICON_STATE)
/obj/machinery/alarm/proc/post_alert(alert_level)
if(!report_danger_level)
// Don't report the level to computers, but do toggle firedoors
var/area/A = get_area(src)
if(alert_level == ATMOS_ALARM_NONE)
A.air_doors_open()
else if(alert_level != ATMOS_ALARM_NONE)
A.air_doors_close()
return
var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency)
if(!frequency)
return
var/datum/signal/alert_signal = new
alert_signal.source = src
alert_signal.transmission_method = 1
alert_signal.data["zone"] = get_area_name(src, TRUE)
alert_signal.data["type"] = "Atmospheric"
if(alert_level == ATMOS_ALARM_DANGER)
alert_signal.data["alert"] = "severe"
else if(alert_level == ATMOS_ALARM_WARNING)
alert_signal.data["alert"] = "minor"
else if(alert_level == ATMOS_ALARM_NONE)
alert_signal.data["alert"] = "clear"
frequency.post_signal(src, alert_signal)
///////////////
//END HACKING//
///////////////
@@ -741,29 +688,33 @@
data["preset"] = preset
var/list/vents = list()
if(alarm_area.air_vent_names.len)
for(var/id_tag in alarm_area.air_vent_names)
if(length(alarm_area.vents))
for(var/obj/machinery/atmospherics/unary/vent_pump/P as anything in alarm_area.vents)
var/list/vent_info = list()
var/long_name = alarm_area.air_vent_names[id_tag]
var/list/vent_data = alarm_area.air_vent_info[id_tag]
if(!vent_data)
continue
vent_info["id_tag"] = id_tag
vent_info["name"] = sanitize(long_name)
vent_info += vent_data
vent_info["id_tag"] = P.UID()
vent_info["name"] = sanitize(P.name)
vent_info["power"] = P.on
vent_info["direction"] = P.releasing ? "release" : "siphon"
vent_info["checks"] = P.pressure_checks
vent_info["external"] = P.external_pressure_bound
vents += list(vent_info)
data["vents"] = vents
var/list/scrubbers = list()
if(alarm_area.air_scrub_names.len)
for(var/id_tag in alarm_area.air_scrub_names)
var/long_name = alarm_area.air_scrub_names[id_tag]
var/list/scrubber_data = alarm_area.air_scrub_info[id_tag]
if(!scrubber_data)
continue
scrubber_data["id_tag"] = id_tag
scrubber_data["name"] = sanitize(long_name)
scrubbers += list(scrubber_data)
if(length(alarm_area.scrubbers))
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S as anything in alarm_area.scrubbers)
var/list/scrubber_info = list()
scrubber_info["id_tag"] = S.UID()
scrubber_info["name"] = sanitize(S.name)
scrubber_info["power"] = S.on
scrubber_info["scrubbing"] = S.scrubbing
scrubber_info["widenet"] = S.widenet
scrubber_info["filter_o2"] = S.scrub_O2
scrubber_info["filter_n2"] = S.scrub_N2
scrubber_info["filter_co2"] = S.scrub_CO2
scrubber_info["filter_toxins"] = S.scrub_Toxins
scrubber_info["filter_n2o"] = S.scrub_N2O
scrubbers += list(scrubber_info)
data["scrubbers"] = scrubbers
return data
@@ -873,7 +824,8 @@
return
var/device_id = params["id_tag"]
switch(params["cmd"])
var/cmd = params["cmd"]
switch(cmd)
if ("power",
"adjust_external_pressure",
"set_external_pressure",
@@ -888,7 +840,7 @@
"direction")
var/val
if(params["val"])
val=text2num(params["val"])
val = text2num(params["val"])
else
var/newval = input("Enter new value") as num|null
if(isnull(newval))
@@ -900,13 +852,70 @@
newval = 0
val = newval
// For those who read this: This radio BS is what makes air alarms take 10 years to update in the UI
send_signal(device_id, list(params["cmd"] = val))
waiting_on_device = device_id
// Figure out what it is
var/obj/machinery/atmospherics/unary/U = locateUID(device_id)
if(!U)
return
if(!((U in alarm_area.vents) || (U in alarm_area.scrubbers)))
message_admins("<span class='boldannounce'>[key_name_admin(usr)] attempted to href-exploit an air alarm to control another object!!!</span>")
return
// Its a vent. Handle
if(istype(U, /obj/machinery/atmospherics/unary/vent_pump))
var/obj/machinery/atmospherics/unary/vent_pump/V = U
if(V.stat & (NOPOWER|BROKEN))
return
switch(cmd)
if("power")
V.on = val
if("adjust_external_pressure")
V.external_pressure_bound = clamp(V.external_pressure_bound + val, 0, ONE_ATMOSPHERE * 50)
if("set_external_pressure")
V.external_pressure_bound = clamp(val, 0, ONE_ATMOSPHERE * 50)
if("checks")
V.pressure_checks = val
if("direction")
V.releasing = val
V.update_icon(UPDATE_ICON_STATE)
// Its a scrubber. Do the same but ever so slightly similar.
else if(istype(U, /obj/machinery/atmospherics/unary/vent_scrubber))
var/obj/machinery/atmospherics/unary/vent_scrubber/S = U
if(S.stat & (NOPOWER|BROKEN))
return
switch(cmd)
if("power")
S.on = val
if("co2_scrub")
S.scrub_CO2 = val
if("tox_scrub")
S.scrub_Toxins = val
if("n2o_scrub")
S.scrub_N2O = val
if("n2_scrub")
S.scrub_N2 = val
if("o2_scrub")
S.scrub_O2 = val
if("widenet")
S.widenet = val
if("scrubbing")
S.scrubbing = val
S.update_icon(UPDATE_ICON_STATE)
if("set_threshold")
var/env = params["env"]
var/varname = params["var"]
if(!(varname in list("min1", "min2", "max1", "max2"))) // uh oh
message_admins("[key_name_admin(usr)] attempted to href edit vars on [src]!!!")
return
var/datum/tlv/tlv = TLV[env]
var/newval = input("Enter [varname] for [env]", "Alarm triggers", tlv.vars[varname]) as num|null
@@ -925,14 +934,12 @@
tlv.vars[varname] = newval
if("atmos_alarm")
if(alarm_area.atmosalert(ATMOS_ALARM_DANGER, src))
post_alert(ATMOS_ALARM_DANGER)
alarm_area.atmosalert(ATMOS_ALARM_DANGER, src)
alarmActivated = TRUE
update_icon(UPDATE_ICON_STATE)
if("atmos_reset")
if(alarm_area.atmosalert(ATMOS_ALARM_NONE, src, TRUE))
post_alert(ATMOS_ALARM_NONE)
alarm_area.atmosalert(ATMOS_ALARM_NONE, src, TRUE)
alarmActivated = FALSE
update_icon(UPDATE_ICON_STATE)
@@ -44,6 +44,9 @@ Pipelines + Other Objects -> Pipe network
/// Pipe image, not used for all subtypes
var/image/pipe_image
/// ID for automatic linkage of stuff. This is used to assist in connections at mapload. Dont try use it for other stuff
var/autolink_id = null
/obj/machinery/atmospherics/Initialize(mapload)
. = ..()
@@ -74,12 +77,6 @@ Pipelines + Other Objects -> Pipe network
QDEL_NULL(pipe_image) //we have to qdel it, or it might keep a ref somewhere else
return ..()
/obj/machinery/atmospherics/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
// Icons/overlays/underlays
/obj/machinery/atmospherics/update_icon()
if(check_icon_cache())
@@ -5,8 +5,6 @@
//node2 is output port
//node1 is input port
req_one_access_txt = "24;10"
name = "dual-port air vent"
desc = "Has a valve and pump attached to it. There are two ports."
@@ -22,34 +20,11 @@
var/input_pressure_min = 0
var/output_pressure_max = 0
frequency = ATMOS_VENTSCRUB
var/id_tag = null
settagwhitelist = list("id_tag")
var/pressure_checks = 1
//1: Do not pass external_pressure_bound
//2: Do not pass input_pressure_min
//4: Do not pass output_pressure_max
/obj/machinery/atmospherics/binary/dp_vent_pump/New()
..()
if(!id_tag)
assign_uid()
id_tag = num2text(uid)
icon = null
/obj/machinery/atmospherics/binary/dp_vent_pump/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/machinery/atmospherics/binary/dp_vent_pump/atmos_init()
..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume
name = "large dual port air vent"
@@ -152,91 +127,3 @@
air_update_turf()
return 1
/obj/machinery/atmospherics/binary/dp_vent_pump/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"tag" = id_tag,
"device" = "ADVP",
"power" = on,
"direction" = releasing?("release"):("siphon"),
"checks" = pressure_checks,
"input" = input_pressure_min,
"output" = output_pressure_max,
"external" = external_pressure_bound,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
return 1
/obj/machinery/atmospherics/binary/dp_vent_pump/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
if(signal.data["power"] != null)
on = text2num(signal.data["power"])
if(signal.data["power_toggle"] != null)
on = !on
if(signal.data["direction"] != null)
releasing = text2num(signal.data["direction"])
if(signal.data["checks"] != null)
pressure_checks = text2num(signal.data["checks"])
if(signal.data["purge"])
pressure_checks &= ~1
releasing = FALSE
if(signal.data["stabilize"])//the fact that this was "stabalize" shows how many fucks people give about these wonders, none
pressure_checks |= 1
releasing = TRUE
if(signal.data["set_input_pressure"] != null)
input_pressure_min = clamp(
text2num(signal.data["set_input_pressure"]),
0,
ONE_ATMOSPHERE*50
)
if(signal.data["set_output_pressure"] != null)
output_pressure_max = clamp(
text2num(signal.data["set_output_pressure"]),
0,
ONE_ATMOSPHERE*50
)
if(signal.data["set_external_pressure"] != null)
external_pressure_bound = clamp(
text2num(signal.data["set_external_pressure"]),
0,
ONE_ATMOSPHERE*50
)
if(signal.data["status"])
broadcast_status()
return //do not update_icon
broadcast_status()
update_icon()
/obj/machinery/atmospherics/binary/dp_vent_pump/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/multitool))
update_multitool_menu(user)
return 1
return ..()
/obj/machinery/atmospherics/binary/dp_vent_pump/multitool_menu(mob/user, obj/item/multitool/P)
return {"
<ul>
<li><b>Frequency:</b> <a href="?src=[UID()];set_freq=-1">[format_frequency(frequency)] GHz</a> (<a href="?src=[UID()];set_freq=[ATMOS_VENTSCRUB]">Reset</a>)</li>
<li><b>ID Tag:</b> <a href="?src=[UID()];set_id=1">[id_tag]</a></li>
</ul>
"}
@@ -16,17 +16,6 @@
/obj/machinery/atmospherics/binary/passive_gate/detailed_examine()
return "This is a one-way regulator, allowing gas to flow only at a specific pressure and flow rate. If the light is green, it is flowing."
/obj/machinery/atmospherics/binary/passive_gate/atmos_init()
..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/passive_gate/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/machinery/atmospherics/binary/passive_gate/update_icon_state()
icon_state = "[on ? "on" : "off"]"
@@ -68,56 +57,6 @@
parent2.update = 1
return 1
/obj/machinery/atmospherics/binary/passive_gate/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"tag" = id,
"device" = "AGP",
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
return 1
/obj/machinery/atmospherics/binary/passive_gate/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
var/old_on = on //for logging
if("power" in signal.data)
on = text2num(signal.data["power"])
if("power_toggle" in signal.data)
on = !on
if("set_output_pressure" in signal.data)
target_pressure = clamp(
text2num(signal.data["set_output_pressure"]),
0,
ONE_ATMOSPHERE*50
)
if(on != old_on)
investigate_log("was turned [on ? "on" : "off"] by a remote signal", "atmos")
if("status" in signal.data)
broadcast_status()
return //do not update_icon
broadcast_status()
update_icon()
return
/obj/machinery/atmospherics/binary/passive_gate/attack_hand(mob/user)
if(..())
return
@@ -47,12 +47,6 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/binary/pump/AIAltClick(mob/living/silicon/user)
set_max(user)
/obj/machinery/atmospherics/binary/pump/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/machinery/atmospherics/binary/pump/on
icon_state = "map_on"
on = TRUE
@@ -97,60 +91,6 @@ Thus, the two variables affect pump operation are set in New():
parent2.update = 1
return 1
/obj/machinery/atmospherics/binary/pump/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"tag" = id,
"device" = "AGP",
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
return 1
/obj/machinery/atmospherics/binary/pump/atmos_init()
..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/pump/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
var/old_on = on //for logging
if(signal.data["power"])
on = text2num(signal.data["power"])
if(signal.data["power_toggle"])
on = !on
if(signal.data["set_output_pressure"])
target_pressure = clamp(
text2num(signal.data["set_output_pressure"]),
0,
ONE_ATMOSPHERE*50
)
if(on != old_on)
investigate_log("was turned [on ? "on" : "off"] by a remote signal", "atmos")
if(signal.data["status"])
broadcast_status()
return //do not update_icon
broadcast_status()
update_icon()
return
/obj/machinery/atmospherics/binary/pump/attack_hand(mob/user)
if(..())
return
@@ -77,16 +77,6 @@
desc = "A digitally controlled valve."
icon = 'icons/atmos/digital_valve.dmi'
frequency = ATMOS_VENTSCRUB
var/id_tag = null
settagwhitelist = list("id_tag")
/obj/machinery/atmospherics/binary/valve/digital/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/machinery/atmospherics/binary/valve/digital/attack_ai(mob/user)
return attack_hand(user)
@@ -113,48 +103,3 @@
icon_state = "valve[open]nopower"
return
..()
/obj/machinery/atmospherics/binary/valve/digital/atmos_init()
..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/valve/digital/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id_tag))
return 0
switch(signal.data["command"])
if("valve_open")
if(!open)
open()
if("valve_close")
if(open)
close()
if("valve_toggle")
if(open)
close()
else
open()
if("valve_set")
if(signal.data["valve_set"] == 1)
if(!open)
open()
else
if(open)
close()
/obj/machinery/atmospherics/binary/valve/digital/attackby(obj/item/W as obj, mob/user)
if(istype(W, /obj/item/multitool))
update_multitool_menu(user)
return 1
return ..()
/obj/machinery/atmospherics/binary/valve/digital/multitool_menu(mob/user, obj/item/multitool/P)
return {"
<ul>
<li><b>Frequency:</b> <a href="?src=[UID()];set_freq=-1">[format_frequency(frequency)] GHz</a> (<a href="?src=[UID()];set_freq=[ATMOS_VENTSCRUB]">Reset</a>)</li>
<li>[format_tag("ID Tag","id_tag","set_id")]</a></li>
</ul>
"}
@@ -44,20 +44,10 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/binary/volume_pump/AIAltClick(mob/living/silicon/user)
set_max(user)
/obj/machinery/atmospherics/binary/volume_pump/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/machinery/atmospherics/binary/volume_pump/on
on = TRUE
icon_state = "map_on"
/obj/machinery/atmospherics/binary/volume_pump/atmos_init()
..()
set_frequency(frequency)
/obj/machinery/atmospherics/binary/volume_pump/update_icon_state()
if(!powered())
icon_state = "off"
@@ -97,54 +87,6 @@ Thus, the two variables affect pump operation are set in New():
return 1
/obj/machinery/atmospherics/binary/volume_pump/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"tag" = id,
"device" = "APV",
"power" = on,
"transfer_rate" = transfer_rate,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal)
return 1
/obj/machinery/atmospherics/binary/volume_pump/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
var/old_on = on //for logging
if(signal.data["power"])
on = text2num(signal.data["power"])
if(signal.data["power_toggle"])
on = !on
if(signal.data["set_transfer_rate"])
transfer_rate = clamp(
text2num(signal.data["set_transfer_rate"]),
0,
air1.volume
)
if(on != old_on)
investigate_log("was turned [on ? "on" : "off"] by a remote signal", "atmos")
if(signal.data["status"])
broadcast_status()
return //do not update_icon
broadcast_status()
update_icon()
/obj/machinery/atmospherics/binary/volume_pump/attack_hand(mob/user)
if(..())
return
@@ -50,12 +50,6 @@
/obj/machinery/atmospherics/trinary/filter/AIAltClick(mob/living/silicon/user)
set_max(user)
/obj/machinery/atmospherics/trinary/filter/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/machinery/atmospherics/trinary/filter/flipped
icon_state = "mmap"
flipped = TRUE
@@ -163,10 +157,6 @@
return 1
/obj/machinery/atmospherics/trinary/filter/atmos_init()
set_frequency(frequency)
..()
/obj/machinery/atmospherics/trinary/filter/attack_ghost(mob/user)
ui_interact(user)
@@ -110,12 +110,6 @@
var/id = null
/obj/machinery/atmospherics/trinary/tvalve/digital/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/machinery/atmospherics/trinary/tvalve/digital/bypass
icon_state = "map_tvalve1"
state = TVALVE_STATE_SIDE
@@ -150,24 +144,5 @@
return
..()
/obj/machinery/atmospherics/trinary/tvalve/digital/atmos_init()
..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/trinary/tvalve/digital/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id))
return 0
switch(signal.data["command"])
if("valve_open")
go_to_side()
if("valve_close")
go_straight()
if("valve_toggle")
switch_side()
#undef TVALVE_STATE_STRAIGHT
#undef TVALVE_STATE_SIDE
@@ -1,3 +1,5 @@
GLOBAL_LIST_EMPTY(air_injectors)
/obj/machinery/atmospherics/unary/outlet_injector
icon = 'icons/atmos/injector.dmi'
icon_state = "map_injector"
@@ -11,34 +13,25 @@
name = "air injector"
desc = "Has a valve and pump attached to it"
req_one_access_txt = "24;10"
var/injecting = FALSE
var/volume_rate = 50
var/id
Mtoollink = TRUE
settagwhitelist = list("id_tag")
/obj/machinery/atmospherics/unary/outlet_injector/Initialize(mapload)
. = ..()
GLOB.air_injectors += src
/obj/machinery/atmospherics/unary/outlet_injector/Destroy()
GLOB.air_injectors -= src
return ..()
/obj/machinery/atmospherics/unary/outlet_injector/on
on = TRUE
/obj/machinery/atmospherics/unary/outlet_injector/New()
..()
if(id && !id_tag)//I'm not dealing with any more merge conflicts
id_tag = id
/obj/machinery/atmospherics/unary/outlet_injector/detailed_examine()
return "Outputs the pipe's gas into the atmosphere, similar to an air vent. It can be controlled by a nearby atmospherics computer. \
A green light on it means it is on."
/obj/machinery/atmospherics/unary/outlet_injector/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/machinery/atmospherics/unary/outlet_injector/update_icon_state()
if(!powered())
icon_state = "off"
@@ -75,109 +68,21 @@
loc.assume_air(removed)
air_update_turf()
parent.update = 1
parent.update = TRUE
return 1
return TRUE
/obj/machinery/atmospherics/unary/outlet_injector/proc/inject()
if(on || injecting)
return 0
injecting = TRUE
if(air_contents.temperature > 0)
var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
loc.assume_air(removed)
parent.update = 1
flick("inject", src)
/obj/machinery/atmospherics/unary/outlet_injector/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"tag" = id_tag,
"device" = "AO",
"power" = on,
"volume_rate" = volume_rate,
"sigtype" = "status"
)
radio_connection.post_signal(src, signal, RADIO_ATMOSIA)
return 1
/obj/machinery/atmospherics/unary/outlet_injector/atmos_init()
..()
set_frequency(frequency)
/obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"] != "command"))
return 0
if(signal.data["power"] != null)
on = text2num(signal.data["power"])
if(signal.data["power_toggle"] != null)
on = !on
if(signal.data["inject"] != null)
spawn inject()
/obj/machinery/atmospherics/unary/outlet_injector/multitool_act(mob/living/user, obj/item/I)
if(!ismultitool(I))
return
if(signal.data["set_volume_rate"] != null)
var/number = text2num(signal.data["set_volume_rate"])
volume_rate = clamp(number, 0, air_contents.volume)
if(signal.data["status"])
broadcast_status()
return //do not update_icon
//log_admin("DEBUG \[[world.timeofday]\]: outlet_injector/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
//return
broadcast_status()
update_icon()
/*hide(var/i) //to make the little pipe section invisible, the icon changes.
if(node)
if(on)
icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on"
else
icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off"
else
icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]exposed"
on = FALSE
return*/
/obj/machinery/atmospherics/unary/outlet_injector/multitool_menu(mob/user, obj/item/multitool/P)
return {"
<ul>
<li><b>Frequency:</b> <a href="?src=[UID()];set_freq=-1">[format_frequency(frequency)] GHz</a> (<a href="?src=[UID()];set_freq=[ATMOS_VENTSCRUB]">Reset</a>)</li>
<li>[format_tag("ID Tag","id_tag","set_id")]</a></li>
</ul>
"}
var/obj/item/multitool/M = I
M.buffer_uid = UID()
to_chat(user, "<span class='notice'>You save [src] into [M]'s buffer</span>")
/obj/machinery/atmospherics/unary/outlet_injector/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/multitool))
interact(user)
return 1
if(istype(W, /obj/item/wrench))
if(iswrench(W))
if(!(stat & NOPOWER) && on)
to_chat(user, "<span class='danger'>You cannot unwrench this [src], turn if off first.</span>")
return 1
return TRUE
return ..()
/obj/machinery/atmospherics/unary/outlet_injector/interact(mob/user as mob)
update_multitool_menu(user)
/obj/machinery/atmospherics/unary/outlet_injector/hide(i)
update_underlays()
@@ -14,8 +14,8 @@
name = "large passive vent"
volume = 1000
/obj/machinery/atmospherics/unary/passive_vent/New()
..()
/obj/machinery/atmospherics/unary/passive_vent/Initialize(mapload)
. = ..()
air_contents.volume = volume
/obj/machinery/atmospherics/unary/passive_vent/process_atmos()
@@ -30,8 +30,8 @@
name = "Pressure Tank (Air)"
icon_state = "air_map"
/obj/machinery/atmospherics/unary/tank/air/New()
..()
/obj/machinery/atmospherics/unary/tank/air/Initialize(mapload)
. = ..()
icon_state = "air"
air_contents.volume = volume
air_contents.temperature = T20C
@@ -42,8 +42,8 @@
name = "Pressure Tank (Oxygen)"
icon_state = "o2_map"
/obj/machinery/atmospherics/unary/tank/oxygen/New()
..()
/obj/machinery/atmospherics/unary/tank/oxygen/Initialize(mapload)
. = ..()
icon_state = "o2"
air_contents.volume = volume
air_contents.temperature = T20C
@@ -53,8 +53,8 @@
name = "Pressure Tank (Nitrogen)"
icon_state = "n2_map"
/obj/machinery/atmospherics/unary/tank/nitrogen/New()
..()
/obj/machinery/atmospherics/unary/tank/nitrogen/Initialize(mapload)
. = ..()
icon_state = "n2"
air_contents.volume = volume
air_contents.temperature = T20C
@@ -64,8 +64,8 @@
name = "Pressure Tank (Carbon Dioxide)"
icon_state = "co2_map"
/obj/machinery/atmospherics/unary/tank/carbon_dioxide/New()
..()
/obj/machinery/atmospherics/unary/tank/carbon_dioxide/Initialize(mapload)
. = ..()
icon_state = "co2"
air_contents.volume = volume
air_contents.temperature = T20C
@@ -75,8 +75,8 @@
name = "Pressure Tank (Toxins)"
icon_state = "toxins_map"
/obj/machinery/atmospherics/unary/tank/toxins/New()
..()
/obj/machinery/atmospherics/unary/tank/toxins/Initialize(mapload)
. = ..()
icon_state = "toxins"
air_contents.volume = volume
air_contents.temperature = T20C
@@ -86,8 +86,8 @@
name = "Pressure Tank (Nitrous Oxide)"
icon_state = "n2o_map"
/obj/machinery/atmospherics/unary/tank/nitrous_oxide/New()
..()
/obj/machinery/atmospherics/unary/tank/nitrous_oxide/Initialize(mapload)
. = ..()
icon_state = "n2o"
air_contents.volume = volume
air_contents.temperature = T20C
@@ -99,8 +99,8 @@
desc = "A large vessel containing an unknown pressurized gas."
icon_state = "agent_b_map"
/obj/machinery/atmospherics/unary/tank/oxygen_agent_b/New()
..()
/obj/machinery/atmospherics/unary/tank/oxygen_agent_b/Initialize(mapload)
. = ..()
icon_state = "agent_b"
air_contents.volume = volume
air_contents.temperature = T20C
@@ -2,15 +2,15 @@
dir = SOUTH
initialize_directions = SOUTH
layer = TURF_LAYER+0.1
var/id_tag
/// The current air contents of this device
var/datum/gas_mixture/air_contents
/// Our one pipe node (we're unary)
var/obj/machinery/atmospherics/node
/// The pipenet we are plugged into
var/datum/pipeline/parent
/obj/machinery/atmospherics/unary/New()
..()
/obj/machinery/atmospherics/unary/Initialize(mapload)
. = ..()
initialize_directions = dir
air_contents = new
air_contents.volume = 200
@@ -16,9 +16,6 @@
var/open = FALSE
var/area/initial_loc
var/area_uid
req_one_access_txt = "24;10"
var/releasing = TRUE //FALSE = siphoning, TRUE = releasing
@@ -38,12 +35,6 @@
var/welded = FALSE // Added for aliens -- TLE
var/weld_burst_pressure = 50 * ONE_ATMOSPHERE //the (internal) pressure at which welded covers will burst off
frequency = ATMOS_VENTSCRUB
Mtoollink = TRUE
var/radio_filter_out
var/radio_filter_in
connect_types = list(CONNECT_TYPE_NORMAL, CONNECT_TYPE_SUPPLY) //connects to regular and supply pipes
/obj/machinery/atmospherics/unary/vent_pump/detailed_examine()
@@ -60,22 +51,21 @@
on = TRUE
icon_state = "map_vent_in"
/obj/machinery/atmospherics/unary/vent_pump/New()
..()
/obj/machinery/atmospherics/unary/vent_pump/Initialize(mapload)
. = ..()
GLOB.all_vent_pumps += src
icon = null
initial_loc = get_area(loc)
area_uid = initial_loc.uid
if(!id_tag)
assign_uid()
id_tag = num2text(uid)
if(!autolink_id) // Autolink vents are externally managed, and should not show up on the air alarm
initial_loc.vents += src
name = "[initial_loc.name] Vent Pump #[length(initial_loc.vents)]"
/obj/machinery/atmospherics/unary/vent_pump/high_volume
name = "large air vent"
power_channel = EQUIP
/obj/machinery/atmospherics/unary/vent_pump/high_volume/New()
..()
/obj/machinery/atmospherics/unary/vent_pump/high_volume/Initialize(mapload)
. = ..()
air_contents.volume = 1000
/obj/machinery/atmospherics/unary/vent_pump/update_overlays()
@@ -174,118 +164,6 @@
return TRUE
//Radio remote control
/obj/machinery/atmospherics/unary/vent_pump/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
radio_connection = SSradio.add_object(src, frequency,radio_filter_in)
if(frequency != ATMOS_VENTSCRUB)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
name = "vent pump"
else
broadcast_status()
/obj/machinery/atmospherics/unary/vent_pump/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"area" = src.area_uid,
"tag" = src.id_tag,
"device" = "AVP",
"power" = on,
"direction" = releasing?("release"):("siphon"),
"checks" = pressure_checks,
"internal" = internal_pressure_bound,
"external" = external_pressure_bound,
"timestamp" = world.time,
"sigtype" = "status"
)
if(frequency == ATMOS_VENTSCRUB)
if(!initial_loc.air_vent_names[id_tag])
var/new_name = "[initial_loc.name] Vent Pump #[initial_loc.air_vent_names.len+1]"
initial_loc.air_vent_names[id_tag] = new_name
src.name = new_name
initial_loc.air_vent_info[id_tag] = signal.data
radio_connection.post_signal(src, signal, radio_filter_out)
return 1
/obj/machinery/atmospherics/unary/vent_pump/atmos_init()
..()
//some vents work his own special way
radio_filter_in = frequency==ATMOS_VENTSCRUB?(RADIO_FROM_AIRALARM):null
radio_filter_out = frequency==ATMOS_VENTSCRUB?(RADIO_TO_AIRALARM):null
if(frequency)
set_frequency(frequency)
broadcast_status()
/obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal)
if(stat & (NOPOWER|BROKEN))
return
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return FALSE
if("purge" in signal.data)
pressure_checks &= ~1
releasing = FALSE
if("stabalize" in signal.data)
pressure_checks |= 1
releasing = TRUE
if("power" in signal.data)
on = text2num(signal.data["power"])
if("power_toggle" in signal.data)
on = !on
if("checks" in signal.data)
pressure_checks = text2num(signal.data["checks"])
if("checks_toggle" in signal.data)
pressure_checks = (pressure_checks ? 0 : 3)
if("direction" in signal.data)
releasing = text2num(signal.data["direction"])
if("set_internal_pressure" in signal.data)
internal_pressure_bound = clamp(text2num(signal.data["set_internal_pressure"]), 0, ONE_ATMOSPHERE * 50)
if("set_external_pressure" in signal.data)
external_pressure_bound = clamp(text2num(signal.data["set_external_pressure"]), 0, ONE_ATMOSPHERE * 50)
if("reset_external_pressure" in signal.data)
external_pressure_bound = ONE_ATMOSPHERE
if("adjust_internal_pressure" in signal.data)
internal_pressure_bound = clamp(internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), 0, ONE_ATMOSPHERE * 50)
if("adjust_external_pressure" in signal.data)
external_pressure_bound = clamp(external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), 0, ONE_ATMOSPHERE * 50)
if("init" in signal.data)
name = signal.data["init"]
return
if("status" in signal.data)
broadcast_status()
return //do not update_icon
broadcast_status()
update_icon()
/obj/machinery/atmospherics/unary/vent_pump/can_crawl_through()
return !welded
@@ -309,17 +187,23 @@
to_chat(user, "You can't shove that down there when it is closed")
else
to_chat(user, "The vent is welded.")
return 1
if(istype(W, /obj/item/multitool))
update_multitool_menu(user)
return 1
if(istype(W, /obj/item/wrench))
return TRUE
if(iswrench(W))
if(!(stat & NOPOWER) && on)
to_chat(user, "<span class='danger'>You cannot unwrench this [src], turn it off first.</span>")
return 1
return TRUE
return ..()
/obj/machinery/atmospherics/unary/vent_pump/multitool_act(mob/living/user, obj/item/I)
if(!ismultitool(I))
return
var/obj/item/multitool/M = I
M.buffer_uid = UID()
to_chat(user, "<span class='notice'>You save [src] into [M]'s buffer</span>")
/obj/machinery/atmospherics/unary/vent_pump/screwdriver_act(mob/living/user, obj/item/I)
if(welded)
return
@@ -355,7 +239,6 @@
continue
W.forceMove(get_turf(src))
/obj/machinery/atmospherics/unary/vent_pump/examine(mob/user)
. = ..()
if(welded)
@@ -367,40 +250,8 @@
if(old_stat != stat)
update_icon()
/obj/machinery/atmospherics/unary/vent_pump/interact(mob/user as mob)
update_multitool_menu(user)
/obj/machinery/atmospherics/unary/vent_pump/multitool_menu(mob/user, obj/item/multitool/P)
return {"
<ul>
<li><b>Frequency:</b> <a href="?src=[UID()];set_freq=-1">[format_frequency(frequency)] GHz</a> (<a href="?src=[UID()];set_freq=[ATMOS_VENTSCRUB]">Reset</a>)</li>
<li>[format_tag("ID Tag","id_tag","set_id")]</li>
</ul>
"}
/obj/machinery/atmospherics/unary/vent_pump/multitool_topic(mob/user, list/href_list, obj/O)
if("set_id" in href_list)
var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src.id_tag) as null|text), 1, MAX_MESSAGE_LEN)
if(!newid)
return
if(frequency == ATMOS_VENTSCRUB)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
id_tag = newid
broadcast_status()
return TRUE
return ..()
/obj/machinery/atmospherics/unary/vent_pump/Destroy()
GLOB.all_vent_pumps -= src
if(initial_loc)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
initial_loc.vents -= src
return ..()
@@ -2,8 +2,6 @@
icon = 'icons/atmos/vent_scrubber.dmi'
icon_state = "map_scrubber_off"
req_one_access_txt = "24;10"
name = "air scrubber"
desc = "Has a valve and pump attached to it"
layer = GAS_SCRUBBER_LAYER
@@ -16,8 +14,6 @@
var/area/initial_loc
frequency = ATMOS_VENTSCRUB
var/list/turf/simulated/adjacent_turfs = list()
var/scrubbing = TRUE //FALSE = siphoning, TRUE = scrubbing
@@ -32,36 +28,27 @@
var/welded = FALSE
var/area_uid
var/radio_filter_out
var/radio_filter_in
connect_types = list(CONNECT_TYPE_NORMAL, CONNECT_TYPE_SCRUBBER) //connects to regular and scrubber pipes
/obj/machinery/atmospherics/unary/vent_scrubber/on
on = TRUE
icon_state = "map_scrubber"
/obj/machinery/atmospherics/unary/vent_scrubber/New()
..()
/obj/machinery/atmospherics/unary/vent_scrubber/Initialize(mapload)
. = ..()
icon = null
initial_loc = get_area(loc)
area_uid = initial_loc.uid
if(!id_tag)
assign_uid()
id_tag = num2text(uid)
initial_loc.scrubbers += src
name = "[initial_loc.name] Air Scrubber #[length(initial_loc.scrubbers)]"
/obj/machinery/atmospherics/unary/vent_scrubber/detailed_examine()
return "This filters the atmosphere of harmful gas. Filtered gas goes to the pipes connected to it, typically a scrubber pipe. \
It can be controlled from an Air Alarm. It can be configured to drain all air rapidly with a 'panic syphon' from an air alarm."
/obj/machinery/atmospherics/unary/vent_scrubber/Destroy()
if(initial_loc && frequency == ATMOS_VENTSCRUB)
initial_loc.air_scrub_info -= id_tag
initial_loc.air_scrub_names -= id_tag
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
if(initial_loc)
initial_loc.scrubbers -= src
return ..()
/obj/machinery/atmospherics/unary/vent_scrubber/examine(mob/user)
@@ -92,7 +79,7 @@
amount = active_power_usage
if(widenet)
amount += amount*(adjacent_turfs.len*(adjacent_turfs.len/2))
amount += amount * (length(adjacent_turfs) * (length(adjacent_turfs) / 2))
use_power(amount, power_channel)
return 1
@@ -135,56 +122,8 @@
underlays += frame
/obj/machinery/atmospherics/unary/vent_scrubber/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, radio_filter_in)
if(frequency != ATMOS_VENTSCRUB)
initial_loc.air_scrub_info -= id_tag
initial_loc.air_scrub_names -= id_tag
name = "air Scrubber"
else
broadcast_status()
/obj/machinery/atmospherics/unary/vent_scrubber/proc/broadcast_status()
if(!radio_connection)
return 0
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.source = src
signal.data = list(
"area" = area_uid,
"tag" = id_tag,
"device" = "AScr",
"timestamp" = world.time,
"power" = on,
"scrubbing" = scrubbing,
"widenet" = widenet,
"filter_o2" = scrub_O2,
"filter_n2" = scrub_N2,
"filter_co2" = scrub_CO2,
"filter_toxins" = scrub_Toxins,
"filter_n2o" = scrub_N2O,
"sigtype" = "status"
)
if(frequency == ATMOS_VENTSCRUB)
if(!initial_loc.air_scrub_names[id_tag])
var/new_name = "[initial_loc.name] Air Scrubber #[initial_loc.air_scrub_names.len+1]"
initial_loc.air_scrub_names[id_tag] = new_name
src.name = new_name
initial_loc.air_scrub_info[id_tag] = signal.data
radio_connection.post_signal(src, signal, radio_filter_out)
return 1
/obj/machinery/atmospherics/unary/vent_scrubber/atmos_init()
..()
radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null
radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null
if(frequency)
set_frequency(frequency)
src.broadcast_status()
check_turfs()
/obj/machinery/atmospherics/unary/vent_scrubber/process_atmos()
@@ -268,10 +207,10 @@
tile.air_update_turf()
else //Just siphoning all air
if(air_contents.return_pressure()>=50*ONE_ATMOSPHERE)
if(air_contents.return_pressure() >= (50 * ONE_ATMOSPHERE))
return
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
var/transfer_moles = environment.total_moles() * (volume_rate/environment.volume)
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
@@ -285,94 +224,12 @@
/obj/machinery/atmospherics/unary/vent_scrubber/hide(i) //to make the little pipe section invisible, the icon changes.
update_icon()
/obj/machinery/atmospherics/unary/vent_scrubber/receive_signal(datum/signal/signal)
if(stat & (NOPOWER|BROKEN))
return
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"] != "command"))
return FALSE
if("power" in signal.data)
on = text2num(signal.data["power"])
if("power_toggle" in signal.data)
on = !on
if("widenet" in signal.data)
widenet = text2num(signal.data["widenet"])
if("toggle_widenet" in signal.data)
widenet = !widenet
if("scrubbing" in signal.data)
scrubbing = text2num(signal.data["scrubbing"])
if("toggle_scrubbing" in signal.data)
scrubbing = !scrubbing
if("o2_scrub" in signal.data)
scrub_O2 = text2num(signal.data["o2_scrub"])
if("toggle_o2_scrub" in signal.data)
scrub_O2 = !scrub_O2
if("n2_scrub" in signal.data)
scrub_N2 = text2num(signal.data["n2_scrub"])
if("toggle_n2_scrub" in signal.data)
scrub_N2 = !scrub_N2
if("co2_scrub" in signal.data)
scrub_CO2 = text2num(signal.data["co2_scrub"])
if("toggle_co2_scrub" in signal.data)
scrub_CO2 = !scrub_CO2
if("tox_scrub" in signal.data)
scrub_Toxins = text2num(signal.data["tox_scrub"])
if("toggle_tox_scrub" in signal.data)
scrub_Toxins = !scrub_Toxins
if("n2o_scrub" in signal.data)
scrub_N2O = text2num(signal.data["n2o_scrub"])
if("toggle_n2o_scrub" in signal.data)
scrub_N2O = !scrub_N2O
if("init" in signal.data)
name = signal.data["init"]
return
if("status" in signal.data)
broadcast_status()
return //do not update_icon
broadcast_status()
update_icon()
/obj/machinery/atmospherics/unary/vent_scrubber/power_change()
var/old_stat = stat
..()
if(old_stat != stat)
update_icon()
/obj/machinery/atmospherics/unary/vent_scrubber/multitool_menu(mob/user, obj/item/multitool/P)
return {"
<ul>
<li><b>Frequency:</b> <a href="?src=[UID()];set_freq=-1">[format_frequency(frequency)] GHz</a> (<a href="?src=[UID()];set_freq=[ATMOS_VENTSCRUB]">Reset</a>)</li>
<li>[format_tag("ID Tag","id_tag", "set_id")]</li>
</ul>
"}
/obj/machinery/atmospherics/unary/vent_scrubber/multitool_topic(mob/user, list/href_list, obj/O)
if("set_id" in href_list)
var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src:id_tag) as null|text),1,MAX_MESSAGE_LEN)
if(!newid)
return
if(frequency == ATMOS_VENTSCRUB)
initial_loc.air_scrub_info -= id_tag
initial_loc.air_scrub_names -= id_tag
id_tag = newid
broadcast_status()
return TRUE
return ..()
/obj/machinery/atmospherics/unary/vent_scrubber/can_crawl_through()
return !welded
@@ -386,14 +243,11 @@
pipe_image.plane = ABOVE_HUD_PLANE
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE)
/obj/machinery/atmospherics/unary/vent_scrubber/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/multitool))
update_multitool_menu(user)
return 1
/obj/machinery/atmospherics/unary/vent_scrubber/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/wrench))
if(!(stat & NOPOWER) && on)
to_chat(user, "<span class='danger'>You cannot unwrench this [src], turn it off first.</span>")
return 1
return TRUE
return ..()
@@ -1,31 +1,29 @@
GLOBAL_LIST_EMPTY(gas_meters)
/obj/machinery/atmospherics/meter
name = "gas flow meter"
desc = "It measures something."
desc = "A gas flow meter"
icon = 'icons/obj/meter.dmi'
icon_state = "meterX"
layer = GAS_PUMP_LAYER
var/obj/machinery/atmospherics/pipe/target = null
anchored = TRUE
max_integrity = 150
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 40, ACID = 0)
power_channel = ENVIRON
frequency = ATMOS_DISTRO_FREQ
var/id_tag
use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 5
req_one_access_txt = "24;10"
Mtoollink = TRUE
settagwhitelist = list("id_tag")
var/obj/machinery/atmospherics/pipe/target = null
/obj/machinery/atmospherics/meter/Initialize(mapload)
. = ..()
GLOB.gas_meters += src
target = locate(/obj/machinery/atmospherics/pipe) in loc
/obj/machinery/atmospherics/meter/Destroy()
target = null
GLOB.gas_meters -= src
return ..()
/obj/machinery/atmospherics/meter/detailed_examine()
@@ -42,23 +40,6 @@
return
update_icon(UPDATE_ICON_STATE)
var/env_pressure = environment.return_pressure()
if(frequency)
var/datum/radio_frequency/radio_connection = SSradio.return_frequency(frequency)
if(!radio_connection) return
var/datum/signal/signal = new
signal.source = src
signal.transmission_method = 1
signal.data = list(
"tag" = id_tag,
"device" = "AM",
"pressure" = round(env_pressure),
"sigtype" = "status"
)
radio_connection.post_signal(src, signal)
/obj/machinery/atmospherics/meter/update_icon_state()
if(!target)
@@ -89,51 +70,32 @@
else
icon_state = "meter4"
/obj/machinery/atmospherics/meter/proc/status()
var/t = ""
if(target)
var/datum/gas_mixture/environment = target.return_air()
if(environment)
t += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]&deg;K ([round(environment.temperature-T0C,0.01)]&deg;C)"
else
t += "The sensor error light is blinking."
else
t += "The connect error light is blinking."
return t
/obj/machinery/atmospherics/meter/examine(mob/user)
var/t = "A gas flow meter. "
. = ..()
if(get_dist(user, src) > 3 && !(isAI(user) || istype(user, /mob/dead)))
t += "<span class='boldnotice'>You are too far away to read it.</span>"
. += "<span class='boldnotice'>You are too far away to read it.</span>"
else if(stat & (NOPOWER|BROKEN))
t += "<span class='danger'>The display is off.</span>"
. += "<span class='danger'>The display is off.</span>"
else if(target)
var/datum/gas_mixture/environment = target.return_air()
if(environment)
t += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]&deg;C)"
. += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]&deg;C)"
else
t += "The sensor error light is blinking."
. += "The sensor error light is blinking."
else
t += "The connect error light is blinking."
. = list(t)
. += "The connect error light is blinking."
/obj/machinery/atmospherics/meter/Click()
if(isAI(usr)) // ghosts can call ..() for examine
usr.examinate(src)
return 1
return TRUE
return ..()
/obj/machinery/atmospherics/meter/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/multitool))
update_multitool_menu(user)
return 1
if(!istype(W, /obj/item/wrench))
if(!iswrench(W))
return ..()
playsound(loc, W.usesound, 50, 1)
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
@@ -154,10 +116,11 @@
if(current_size >= STAGE_FIVE)
deconstruct()
/obj/machinery/atmospherics/meter/multitool_menu(mob/user, obj/item/multitool/P)
return {"
<b>Main</b>
<ul>
<li><b>Frequency:</b> <a href="?src=[UID()];set_freq=-1">[format_frequency(frequency)] GHz</a> (<a href="?src=[UID()];set_freq=[initial(frequency)]">Reset</a>)</li>
<li>[format_tag("ID Tag","id_tag")]</li>
</ul>"}
/obj/machinery/atmospherics/meter/multitool_act(mob/living/user, obj/item/I)
if(!ismultitool(I))
return
var/obj/item/multitool/M = I
M.buffer_uid = UID()
to_chat(user, "<span class='notice'>You save [src] into [M]'s buffer</span>")
@@ -31,13 +31,14 @@
var/obj/item/pipe_meter/PM = new (T)
meter.transfer_fingerprints_to(PM)
qdel(meter)
. = ..()
// if we're somehow by ourself
if(parent && !QDELETED(parent) && parent.members.len == 1 && parent.members[1] == src)
qdel(parent)
parent = null
return ..()
/obj/machinery/atmospherics/pipe/returnPipenet(obj/machinery/atmospherics/A)
return parent
@@ -69,6 +70,7 @@
air_update_turf()
/obj/machinery/atmospherics/pipe/return_air()
RETURN_TYPE(/datum/gas_mixture)
if(!parent)
return 0
return parent.air
@@ -270,6 +270,7 @@ GLOBAL_DATUM_INIT(canister_icon_container, /datum/canister_icons, new())
can_label = FALSE
/obj/machinery/atmospherics/portable/canister/return_air()
RETURN_TYPE(/datum/gas_mixture)
return air_contents
/obj/machinery/atmospherics/portable/canister/proc/return_temperature()
@@ -93,6 +93,7 @@
return
/obj/machinery/atmospherics/portable/pump/return_air()
RETURN_TYPE(/datum/gas_mixture)
return air_contents
/obj/machinery/atmospherics/portable/pump/replace_tank(mob/living/user, close_valve)
@@ -97,6 +97,7 @@
tile.air_update_turf()
/obj/machinery/atmospherics/portable/scrubber/return_air()
RETURN_TYPE(/datum/gas_mixture)
return air_contents
/obj/machinery/atmospherics/portable/scrubber/attack_ai(mob/user)
+3
View File
@@ -0,0 +1,3 @@
// This file exists so that this PR cannot be testmerged at the same time as 19951
// If it were to be TM'd at the same time, a lot of things would break
// Remove this file before full merge
+1 -1
View File
@@ -73,5 +73,5 @@
// simply don't be moved
return FALSE
disconnect()
LateInitialize()
LateInitialize() // who the fuck did this
return ..()