diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 2b151f04136..a8a0b13b9dc 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -7,11 +7,12 @@ level = 1 var/area_uid - var/id_tag = null + var/id_tag power_channel = ENVIRON var/on = 0 var/pump_direction = 1 //0 = siphoning, 1 = releasing + var/pump_speed = 1 //Used to adjust speed for siphons var/external_pressure_bound = ONE_ATMOSPHERE var/internal_pressure_bound = 0 @@ -38,17 +39,19 @@ assign_uid() id_tag = num2text(uid) if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() + initialize() + broadcast_status() ..() high_volume name = "Large Air Vent" power_channel = EQUIP + New() ..() air_contents.volume = 1000 + update_icon() if(welded) icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld" @@ -65,11 +68,12 @@ process() ..() +// broadcast_status() if(stat & (NOPOWER|BROKEN)) return if (!node) on = 0 - //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0 + if(!on) return 0 @@ -89,7 +93,7 @@ if(pressure_delta > 0) if(air_contents.temperature > 0) - var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_moles = pressure_delta*environment.volume*environment.group_multiplier*pump_speed/(air_contents.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) @@ -107,7 +111,7 @@ if(pressure_delta > 0) if(environment.temperature > 0) - var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_moles = pressure_delta*air_contents.volume*air_contents.group_multiplier*pump_speed/(environment.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) if (isnull(removed)) //in space @@ -120,39 +124,42 @@ return 1 + + + //Radio remote control - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) + proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) - broadcast_status() - if(!radio_connection) - return 0 + proc/broadcast_status() + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + 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" = pump_direction?("release"):("siphon"), - "checks" = pressure_checks, - "internal" = internal_pressure_bound, - "external" = external_pressure_bound, - "timestamp" = world.time, - "sigtype" = "status" - ) + signal.data = list( + "area" = src.area_uid, + "tag" = src.id_tag, + "device" = "AVP", + "power" = on, + "direction" = pump_direction?("release"):("siphon"), + "checks" = pressure_checks, + "internal" = internal_pressure_bound, + "external" = external_pressure_bound, + "timestamp" = world.time, + "sigtype" = "status", + "setting" = pump_speed + ) - radio_connection.post_signal(src, signal, radio_filter_out) + radio_connection.post_signal(src, signal, radio_filter_out) - return 1 + return 1 initialize() @@ -164,6 +171,7 @@ if(frequency) set_frequency(frequency) + receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) return @@ -191,47 +199,29 @@ if("checks_toggle" in signal.data) pressure_checks = (pressure_checks?0:3) - if("direction" in signal.data) + if("direction" in signal) pump_direction = text2num(signal.data["direction"]) if("set_internal_pressure" in signal.data) - internal_pressure_bound = between( - 0, - text2num(signal.data["set_internal_pressure"]), - ONE_ATMOSPHERE*50 - ) + internal_pressure_bound = between(0, text2num(signal.data["set_internal_pressure"]), ONE_ATMOSPHERE*50) if("set_external_pressure" in signal.data) - external_pressure_bound = between( - 0, - text2num(signal.data["set_external_pressure"]), - ONE_ATMOSPHERE*50 - ) + external_pressure_bound = between(0, text2num(signal.data["set_external_pressure"]), ONE_ATMOSPHERE*50) if("adjust_internal_pressure" in signal.data) - internal_pressure_bound = between( - 0, - internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), - ONE_ATMOSPHERE*50 - ) + internal_pressure_bound = between(0, text2num(signal.data["adjust_internal_pressure"]), ONE_ATMOSPHERE*50) if("adjust_external_pressure" in signal.data) - external_pressure_bound = between( - 0, - external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), - ONE_ATMOSPHERE*50 - ) + external_pressure_bound = between(0, text2num(signal.data["adjust_external_pressure"]), ONE_ATMOSPHERE*50) if("init" in signal.data) name = signal.data["init"] return - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon + if("setting" in signal.data) + pump_speed = text2num(signal.data["setting"]) - //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal["command"]]\"\n[signal.debug_print()]") spawn(2) broadcast_status() update_icon() @@ -272,6 +262,7 @@ else user << "\blue You need more welding fuel to complete this task." return 1 + examine() set src in oview(1) ..() diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index f2ce4a8621a..93aa24f5de0 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -8,21 +8,24 @@ level = 1 var/id_tag = null - var/frequency = 1439 - var/datum/radio_frequency/radio_connection var/on = 0 var/scrubbing = 1 //0 = siphoning, 1 = scrubbing var/scrub_CO2 = 1 var/scrub_Toxins = 0 var/scrub_N2O = 0 + var/scrub_rate = 1 var/volume_rate = 120 var/panic = 0 //is this scrubber panicked? var/area_uid + + var/frequency = 1439 + var/datum/radio_frequency/radio_connection var/radio_filter_out var/radio_filter_in + New() var/area/A = get_area(loc) if (A.master) @@ -32,8 +35,8 @@ assign_uid() id_tag = num2text(uid) if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() + initialize() + broadcast_status() ..() update_icon() @@ -85,20 +88,20 @@ process() ..() +// broadcast_status() if(stat & (NOPOWER|BROKEN)) return if (!node) on = 0 - //broadcast_status() + if(!on) return 0 - var/datum/gas_mixture/environment = loc.return_air() if(scrubbing) if((environment.toxins>0) || (environment.carbon_dioxide>0) || (environment.trace_gases.len>0)) - var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles + var/transfer_moles = min(1, volume_rate*scrub_rate/environment.volume)*environment.total_moles //Take a gas sample var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) @@ -136,7 +139,7 @@ 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*scrub_rate/environment.volume) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) @@ -218,6 +221,9 @@ broadcast_status() return //do not update_icon + if("setting" in signal.data) + scrub_rate = text2num(signal.data["setting"]) + // log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") spawn(2) broadcast_status() diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm index b5a656ce352..6c06a16b799 100644 --- a/code/WorkInProgress/Mini/atmos_control.dm +++ b/code/WorkInProgress/Mini/atmos_control.dm @@ -1,24 +1,29 @@ /obj/item/weapon/circuitboard/atmoscontrol - name = "Central Atmospherics Computer Circuitboard" + name = "\improper Central Atmospherics Computer Circuitboard" build_path = "/obj/machinery/computer/security/atmoscontrol" /obj/machinery/computer/atmoscontrol - name = "Central Atmospherics Computer" + name = "\improper Central Atmospherics Computer" icon = 'computer.dmi' icon_state = "computer_generic" density = 1 anchored = 1.0 circuit = "/obj/item/weapon/circuitboard/atmoscontrol" - var/obj/machinery/alarm/current = "" + var/obj/machinery/alarm/current var/overridden = 0 //not set yet, can't think of a good way to do it + req_access = list(access_ce) /obj/machinery/computer/atmoscontrol/attack_hand(mob/user) if(..()) return user.machine = src + if(allowed(user)) + overridden = 1 + else if(!emagged) + overridden = 0 var/dat = "Main Menu
" if(current) - dat += src.specific() + dat += specific() else for(var/obj/machinery/alarm/alarm in world) dat += "" @@ -32,13 +37,23 @@ dat += "[alarm]
" user << browse(dat, "window=atmoscontrol") +/obj/machinery/computer/atmoscontrol/attackby(var/obj/item/I as obj, var/mob/user as mob) + if(istype(I, /obj/item/weapon/card/emag) && !emagged) + user.visible_message("\red \The [user] swipes \a [I] through \the [src], causing the screen to flash!",\ + "\red You swipe your [I] through \the [src], the screen flashing as you gain full control.",\ + "You hear the swipe of a card through a reader, and an electronic warble.") + emagged = 1 + overridden = 1 + return + return ..() + /obj/machinery/computer/atmoscontrol/proc/specific() if(!current) return "" var/dat = "

[current.name]


" dat += current.return_status() - if(current.remote_control || overridden && current.rcon_setting) - dat += "
[src.return_controls()]" + if(current.remote_control || overridden) + dat += "
[return_controls()]" return dat //a bunch of this is copied from atmos alarms @@ -69,24 +84,53 @@ //if("adjust_threshold") //was a good idea but required very wide window if("set_threshold") var/env = href_list["env"] - var/varname = href_list["var"] - var/datum/tlv/tlv = current.TLV[env] - var/newval = input("Enter [varname] for env", "Alarm triggers", tlv.vars[varname]) as num|null + var/threshold = text2num(href_list["var"]) + var/list/selected = current.TLV[env] + var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound") + var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as num|null if (isnull(newval) || ..() || (current.locked && issilicon(usr))) return if (newval<0) - tlv.vars[varname] = -1.0 + selected[threshold] = -1.0 else if (env=="temperature" && newval>5000) - tlv.vars[varname] = 5000 + selected[threshold] = 5000 else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) - tlv.vars[varname] = 50*ONE_ATMOSPHERE + selected[threshold] = 50*ONE_ATMOSPHERE else if (env!="temperature" && env!="pressure" && newval>200) - tlv.vars[varname] = 200 + selected[threshold] = 200 else newval = round(newval,0.01) - tlv.vars[varname] = newval + selected[threshold] = newval + if(threshold == 1) + if(selected[1] > selected[2]) + selected[2] = selected[1] + if(selected[1] > selected[3]) + selected[3] = selected[1] + if(selected[1] > selected[4]) + selected[4] = selected[1] + if(threshold == 2) + if(selected[1] > selected[2]) + selected[1] = selected[2] + if(selected[2] > selected[3]) + selected[3] = selected[2] + if(selected[2] > selected[4]) + selected[4] = selected[2] + if(threshold == 3) + if(selected[1] > selected[3]) + selected[1] = selected[3] + if(selected[2] > selected[3]) + selected[2] = selected[3] + if(selected[3] > selected[4]) + selected[4] = selected[3] + if(threshold == 4) + if(selected[1] > selected[4]) + selected[1] = selected[4] + if(selected[2] > selected[4]) + selected[2] = selected[4] + if(selected[3] > selected[4]) + selected[3] = selected[4] spawn(1) - src.updateUsrDialog() + updateUsrDialog() return if(href_list["screen"]) @@ -98,14 +142,14 @@ if(href_list["atmos_alarm"]) if (current.alarm_area.atmosalert(2)) - current.post_alert(2) + current.apply_danger_level(2) spawn(1) src.updateUsrDialog() current.update_icon() return if(href_list["atmos_reset"]) if (current.alarm_area.atmosalert(0)) - current.post_alert(0) + current.apply_danger_level(0) spawn(1) src.updateUsrDialog() current.update_icon() @@ -121,17 +165,6 @@ //copypasta from alarm code, changed to work with this without derping hard //---START COPYPASTA---- -#define AALARM_MODE_SCRUBBING 1 -#define AALARM_MODE_VENTING 2 //makes draught -#define AALARM_MODE_PANIC 3 //constantly sucks all air -#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing -#define AALARM_MODE_OFF 5 - -#define AALARM_SCREEN_MAIN 1 -#define AALARM_SCREEN_VENT 2 -#define AALARM_SCREEN_SCRUB 3 -#define AALARM_SCREEN_MODE 4 -#define AALARM_SCREEN_SENSORS 5 /obj/machinery/computer/atmoscontrol/proc/return_controls() var/output = ""//"[alarm_zone] Air [name]
" @@ -151,7 +184,7 @@
"} if (current.mode==AALARM_MODE_PANIC) - output += "PANIC SYPHON ACTIVE
turn syphoning off" + output += "PANIC SYPHON ACTIVE
turn syphoning off" else output += "ACTIVATE PANIC SYPHON IN AREA" if (AALARM_SCREEN_VENT) @@ -243,11 +276,11 @@ Nitrous Oxide Main menu
Air machinery mode for the area: