mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-26 18:13:11 +00:00
* to_chat() replacement. * Revert calling target.init_dir() before connecting. * This change was added in https://github.com/PolarisSS13/Polaris/pull/3775 to counteract `dir` not being set prior to New() for dynamically loaded maps. The root cause was /atom/New() not calling _preloader.load(). Undoing the change now that /atom/New() is fixed. * The addition of the init_dir() proc itself however, is useful, because there ARE other times some atmos machinery will want to re-initialize its dir, specifically whenever it is rotated. * init_dir() must be called in the constructor of all atmospherics machines capable of connecting to another. Since it has to happen for ALL machines, lets move that call to /obj/machinery/atmospherics/New() * Rename /obj/machinery/atmospherics initialize() to atmos_init() * These days `initialize()` is used to handle general object initialization that is moved outside of New(). The node connection discovery of atmos machinery needs to happen after all that, and so needs to be in a separate proc. * Make sure to actually call atmos_init during system startup.
294 lines
9.2 KiB
Plaintext
294 lines
9.2 KiB
Plaintext
/obj/machinery/atmospherics/unary/vent_scrubber
|
|
icon = 'icons/atmos/vent_scrubber.dmi'
|
|
icon_state = "map_scrubber_off"
|
|
|
|
name = "Air Scrubber"
|
|
desc = "Has a valve and pump attached to it"
|
|
use_power = 0
|
|
idle_power_usage = 150 //internal circuitry, friction losses and stuff
|
|
power_rating = 7500 //7500 W ~ 10 HP
|
|
|
|
connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SCRUBBER //connects to regular and scrubber pipes
|
|
|
|
level = 1
|
|
|
|
var/area/initial_loc
|
|
var/id_tag = null
|
|
var/frequency = 1439
|
|
var/datum/radio_frequency/radio_connection
|
|
|
|
var/hibernate = 0 //Do we even process?
|
|
var/scrubbing = 1 //0 = siphoning, 1 = scrubbing
|
|
var/list/scrubbing_gas = list("carbon_dioxide", "phoron")
|
|
|
|
var/panic = 0 //is this scrubber panicked?
|
|
|
|
var/area_uid
|
|
var/radio_filter_out
|
|
var/radio_filter_in
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/on
|
|
use_power = 1
|
|
icon_state = "map_scrubber_on"
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/New()
|
|
..()
|
|
air_contents.volume = ATMOS_DEFAULT_VOLUME_FILTER
|
|
|
|
icon = null
|
|
initial_loc = get_area(loc)
|
|
area_uid = initial_loc.uid
|
|
if (!id_tag)
|
|
assign_uid()
|
|
id_tag = num2text(uid)
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/Destroy()
|
|
unregister_radio(src, frequency)
|
|
if(initial_loc)
|
|
initial_loc.air_scrub_info -= id_tag
|
|
initial_loc.air_scrub_names -= id_tag
|
|
return ..()
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0)
|
|
if(!check_icon_cache())
|
|
return
|
|
|
|
overlays.Cut()
|
|
|
|
var/scrubber_icon = "scrubber"
|
|
|
|
var/turf/T = get_turf(src)
|
|
if(!istype(T))
|
|
return
|
|
|
|
if(!powered())
|
|
scrubber_icon += "off"
|
|
else
|
|
scrubber_icon += "[use_power ? "[scrubbing ? "on" : "in"]" : "off"]"
|
|
|
|
overlays += icon_manager.get_atmos_icon("device", , , scrubber_icon)
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/update_underlays()
|
|
if(..())
|
|
underlays.Cut()
|
|
var/turf/T = get_turf(src)
|
|
if(!istype(T))
|
|
return
|
|
if(!T.is_plating() && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe))
|
|
return
|
|
else
|
|
if(node)
|
|
add_underlay(T, node, dir, node.icon_connect_type)
|
|
else
|
|
add_underlay(T,, dir)
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/proc/set_frequency(new_frequency)
|
|
radio_controller.remove_object(src, frequency)
|
|
frequency = new_frequency
|
|
radio_connection = radio_controller.add_object(src, frequency, radio_filter_in)
|
|
|
|
/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" = use_power,
|
|
"scrubbing" = scrubbing,
|
|
"panic" = panic,
|
|
"filter_o2" = ("oxygen" in scrubbing_gas),
|
|
"filter_n2" = ("nitrogen" in scrubbing_gas),
|
|
"filter_co2" = ("carbon_dioxide" in scrubbing_gas),
|
|
"filter_phoron" = ("phoron" in scrubbing_gas),
|
|
"filter_n2o" = ("sleeping_agent" in scrubbing_gas),
|
|
"filter_fuel" = ("volatile_fuel" in scrubbing_gas),
|
|
"sigtype" = "status"
|
|
)
|
|
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/initialize()
|
|
..()
|
|
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()
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/process()
|
|
..()
|
|
|
|
if (hibernate)
|
|
return 1
|
|
|
|
if (!node)
|
|
use_power = 0
|
|
//broadcast_status()
|
|
if(!use_power || (stat & (NOPOWER|BROKEN)))
|
|
return 0
|
|
|
|
var/datum/gas_mixture/environment = loc.return_air()
|
|
|
|
var/power_draw = -1
|
|
if(scrubbing)
|
|
//limit flow rate from turfs
|
|
var/transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.volume) //group_multiplier gets divided out here
|
|
|
|
power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, power_rating)
|
|
else //Just siphon all air
|
|
//limit flow rate from turfs
|
|
var/transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SIPHON_FLOWRATE/environment.volume) //group_multiplier gets divided out here
|
|
|
|
power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating)
|
|
|
|
if(scrubbing && power_draw < 0 && controller_iteration > 10) //99% of all scrubbers
|
|
//Fucking hibernate because you ain't doing shit.
|
|
hibernate = 1
|
|
spawn(rand(100,200)) //hibernate for 10 or 20 seconds randomly
|
|
hibernate = 0
|
|
|
|
if (power_draw >= 0)
|
|
last_power_draw = power_draw
|
|
use_power(power_draw)
|
|
|
|
if(network)
|
|
network.update = 1
|
|
|
|
return 1
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/hide(var/i) //to make the little pipe section invisible, the icon changes.
|
|
update_icon()
|
|
update_underlays()
|
|
|
|
/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 0
|
|
|
|
if(signal.data["power"] != null)
|
|
use_power = text2num(signal.data["power"])
|
|
if(signal.data["power_toggle"] != null)
|
|
use_power = !use_power
|
|
|
|
if(signal.data["panic_siphon"]) //must be before if("scrubbing" thing
|
|
panic = text2num(signal.data["panic_siphon"])
|
|
if(panic)
|
|
use_power = 1
|
|
scrubbing = 0
|
|
else
|
|
scrubbing = 1
|
|
if(signal.data["toggle_panic_siphon"] != null)
|
|
panic = !panic
|
|
if(panic)
|
|
use_power = 1
|
|
scrubbing = 0
|
|
else
|
|
scrubbing = 1
|
|
|
|
if(signal.data["scrubbing"] != null)
|
|
scrubbing = text2num(signal.data["scrubbing"])
|
|
if(scrubbing)
|
|
panic = 0
|
|
if(signal.data["toggle_scrubbing"])
|
|
scrubbing = !scrubbing
|
|
if(scrubbing)
|
|
panic = 0
|
|
|
|
var/list/toggle = list()
|
|
|
|
if(!isnull(signal.data["o2_scrub"]) && text2num(signal.data["o2_scrub"]) != ("oxygen" in scrubbing_gas))
|
|
toggle += "oxygen"
|
|
else if(signal.data["toggle_o2_scrub"])
|
|
toggle += "oxygen"
|
|
|
|
if(!isnull(signal.data["n2_scrub"]) && text2num(signal.data["n2_scrub"]) != ("nitrogen" in scrubbing_gas))
|
|
toggle += "nitrogen"
|
|
else if(signal.data["toggle_n2_scrub"])
|
|
toggle += "nitrogen"
|
|
|
|
if(!isnull(signal.data["co2_scrub"]) && text2num(signal.data["co2_scrub"]) != ("carbon_dioxide" in scrubbing_gas))
|
|
toggle += "carbon_dioxide"
|
|
else if(signal.data["toggle_co2_scrub"])
|
|
toggle += "carbon_dioxide"
|
|
|
|
if(!isnull(signal.data["tox_scrub"]) && text2num(signal.data["tox_scrub"]) != ("phoron" in scrubbing_gas))
|
|
toggle += "phoron"
|
|
else if(signal.data["toggle_tox_scrub"])
|
|
toggle += "phoron"
|
|
|
|
if(!isnull(signal.data["n2o_scrub"]) && text2num(signal.data["n2o_scrub"]) != ("sleeping_agent" in scrubbing_gas))
|
|
toggle += "sleeping_agent"
|
|
else if(signal.data["toggle_n2o_scrub"])
|
|
toggle += "sleeping_agent"
|
|
|
|
if(!isnull(signal.data["fuel_scrub"]) && text2num(signal.data["fuel_scrub"]) != ("volatile_fuel" in scrubbing_gas))
|
|
toggle += "volatile_fuel"
|
|
else if(signal.data["toggle_fuel_scrub"])
|
|
toggle += "volatile_fuel"
|
|
|
|
scrubbing_gas ^= toggle
|
|
|
|
if(signal.data["init"] != null)
|
|
name = signal.data["init"]
|
|
return
|
|
|
|
if(signal.data["status"] != null)
|
|
spawn(2)
|
|
broadcast_status()
|
|
return //do not update_icon
|
|
|
|
// log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
|
|
spawn(2)
|
|
broadcast_status()
|
|
update_icon()
|
|
return
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/power_change()
|
|
var/old_stat = stat
|
|
..()
|
|
if(old_stat != stat)
|
|
update_icon()
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
|
if (!istype(W, /obj/item/weapon/wrench))
|
|
return ..()
|
|
if (!(stat & NOPOWER) && use_power)
|
|
to_chat(user, "<span class='warning'>You cannot unwrench \the [src], turn it off first.</span>")
|
|
return 1
|
|
var/turf/T = src.loc
|
|
if (node && node.level==1 && isturf(T) && !T.is_plating())
|
|
to_chat(user, "<span class='warning'>You must remove the plating first.</span>")
|
|
return 1
|
|
if(!can_unwrench())
|
|
to_chat(user, "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>")
|
|
add_fingerprint(user)
|
|
return 1
|
|
playsound(src, W.usesound, 50, 1)
|
|
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
|
|
if (do_after(user, 40 * W.toolspeed))
|
|
user.visible_message( \
|
|
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
|
"<span class='notice'>You have unfastened \the [src].</span>", \
|
|
"You hear a ratchet.")
|
|
new /obj/item/pipe(loc, make_from=src)
|
|
qdel(src)
|
|
|
|
/obj/machinery/atmospherics/unary/vent_scrubber/examine(mob/user)
|
|
if(..(user, 1))
|
|
user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W"
|
|
else
|
|
user << "You are too far away to read the gauge."
|