Atmos machine update

Takes a pass at updating ATMOSPHERICS to take advantage of the new powernet changes.

Also removes var/on definitions from many atmos machines. Machines generally shouldn't
be doing "on" things if they aren't using power, and most players don't expect a machine
to use power if it isn't "on," so I guess this is fair game.

Also, further refactoring.
This commit is contained in:
mwerezak
2015-01-01 16:29:23 -05:00
parent 73f9617cef
commit f9344a5a2d
25 changed files with 729 additions and 823 deletions

View File

@@ -22,14 +22,12 @@
level = 1
use_power = 1
use_power = 0
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 7500 //This also doubles as a measure of how powerful the pump is, in Watts. 7500 W ~ 10 HP
var/last_power_draw = 0
power_rating = 7500 //7500 W ~ 10 HP
connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_SCRUBBER //connects to regular, supply and scrubbers pipes
var/on = 0
var/pump_direction = 1 //0 = siphoning, 1 = releasing
var/external_pressure_bound = EXTERNAL_PRESSURE_BOUND
@@ -77,7 +75,7 @@
if(!powered())
vent_icon += "off"
else
vent_icon += "[on ? "[pump_direction ? "out" : "in"]" : "off"]"
vent_icon += "[use_power ? "[pump_direction ? "out" : "in"]" : "off"]"
overlays += icon_manager.get_atmos_icon("device", , , vent_icon)
@@ -106,10 +104,10 @@
/obj/machinery/atmospherics/binary/dp_vent_pump/process()
..()
if(stat & (NOPOWER|BROKEN) || !on)
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_power_draw = 0
last_flow_rate = 0
last_power_draw = 0
last_flow_rate = 0
if(stat & (NOPOWER|BROKEN) || !use_power)
return 0
var/datum/gas_mixture/environment = loc.return_air()
@@ -122,35 +120,25 @@
if(pressure_delta > 0.5)
if(pump_direction) //internal -> external
if (node1 && (environment.temperature || air1.temperature))
var/output_volume = environment.volume * environment.group_multiplier
var/air_temperature = environment.temperature? environment.temperature : air1.temperature
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
power_draw = pump_gas(src, air1, environment, transfer_moles, active_power_usage)
var/transfer_moles = calculate_transfer_moles(air1, environment)
power_draw = pump_gas(src, air1, environment, transfer_moles, power_rating)
if(power_draw >= 0 && network1)
network1.update = 1
else //external -> internal
if (node2 && (environment.temperature || air2.temperature))
var/output_volume = air2.volume + (network2? network2.volume : 0)
var/air_temperature = air2.temperature? air2.temperature : environment.temperature
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
var/transfer_moles = calculate_transfer_moles(environment, air2, (network2)? network2.volume : 0)
//limit flow rate from turfs
transfer_moles = min(transfer_moles, environment.total_moles*air2.volume/environment.volume) //group_multiplier gets divided out here
power_draw = pump_gas(src, environment, air2, transfer_moles, active_power_usage)
power_draw = pump_gas(src, environment, air2, transfer_moles, power_rating)
if(power_draw >= 0 && network2)
network2.update = 1
if (power_draw < 0)
last_power_draw = 0
last_flow_rate = 0
//update_use_power(0)
use_power = 0 //don't force update - easier on CPU
else
last_power_draw = handle_power_draw(power_draw)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
return 1
@@ -191,7 +179,7 @@
signal.data = list(
"tag" = id,
"device" = "ADVP",
"power" = on,
"power" = use_power,
"direction" = pump_direction?("release"):("siphon"),
"checks" = pressure_checks,
"input" = input_pressure_min,
@@ -223,10 +211,10 @@
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
if(signal.data["power"])
on = text2num(signal.data["power"])
use_power = text2num(signal.data["power"])
if(signal.data["power_toggle"])
on = !on
use_power = !use_power
if(signal.data["direction"])
pump_direction = text2num(signal.data["direction"])

View File

@@ -14,7 +14,7 @@
use_power = 0
var/on = 0 //doesn't actually use power. this is just whether the valve is open or not
var/unlocked = 0 //If 0, then the valve is locked closed, otherwise it is open(-able, it's a one-way valve so it closes if gas would flow backwards).
var/target_pressure = ONE_ATMOSPHERE
var/max_pressure_setting = 15000 //kPa
var/set_flow_rate = ATMOS_DEFAULT_VOLUME_PUMP * 2.5
@@ -32,7 +32,7 @@
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5
/obj/machinery/atmospherics/binary/passive_gate/update_icon()
icon_state = (on && flowing)? "on" : "off"
icon_state = (unlocked && flowing)? "on" : "off"
/obj/machinery/atmospherics/binary/passive_gate/update_underlays()
if(..())
@@ -48,8 +48,10 @@
/obj/machinery/atmospherics/binary/passive_gate/process()
..()
if(!on)
last_flow_rate = 0
last_flow_rate = 0
if(!unlocked)
return 0
var/output_starting_pressure = air2.return_pressure()
@@ -73,30 +75,22 @@
//Figure out how much gas to transfer to meet the target pressure.
switch (regulate_mode)
if (REGULATE_INPUT)
var/air_temperature = (air1.temperature > 0)? air1.temperature : air2.temperature
var/input_volume = air1.volume + (network1? network1.volume : 0)
transfer_moles = min(transfer_moles, pressure_delta*input_volume/(air_temperature * R_IDEAL_GAS_EQUATION))
transfer_moles = min(transfer_moles, calculate_transfer_moles(air2, air1, pressure_delta, (network1)? network1.volume : 0))
if (REGULATE_OUTPUT)
var/air_temperature = (air2.temperature > 0)? air2.temperature : air1.temperature
var/output_volume = air2.volume + (network2? network2.volume : 0)
transfer_moles = min(transfer_moles, pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION))
transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta, (network2)? network2.volume : 0))
//pump_gas() will return a negative number if no flow occurred
returnval = pump_gas(src, air1, air2, transfer_moles, available_power=0) //available_power=0 means we only move gas if it would flow naturally
if (returnval < 0)
flowing = 0
last_flow_rate = 0
else
if (returnval >= 0)
if(network1)
network1.update = 1
if(network2)
network2.update = 1
if (!last_flow_rate)
flowing = 0
if (last_flow_rate)
flowing = 1
update_icon()
@@ -120,7 +114,7 @@
signal.data = list(
"tag" = id,
"device" = "AGP",
"power" = on,
"power" = unlocked,
"target_output" = target_pressure,
"regulate_mode" = regulate_mode,
"set_flow_rate" = set_flow_rate,
@@ -141,10 +135,10 @@
return 0
if("power" in signal.data)
on = text2num(signal.data["power"])
unlocked = text2num(signal.data["power"])
if("power_toggle" in signal.data)
on = !on
unlocked = !unlocked
if("set_target_pressure" in signal.data)
target_pressure = between(
@@ -188,7 +182,7 @@
var/data[0]
data = list(
"on" = on,
"on" = unlocked,
"pressure_set" = round(target_pressure*100), //Nano UI can't handle rounded non-integers, apparently.
"max_pressure" = max_pressure_setting,
"input_pressure" = round(air1.return_pressure()*100),
@@ -213,7 +207,7 @@
if(..()) return
if(href_list["toggle_valve"])
on = !on
unlocked = !unlocked
if(href_list["regulate_mode"])
switch(href_list["regulate_mode"])
@@ -247,7 +241,7 @@
/obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (on)
if (unlocked)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/datum/gas_mixture/int_air = return_air()

View File

@@ -20,18 +20,16 @@ Thus, the two variables affect pump operation are set in New():
name = "gas pump"
desc = "A pump"
var/on = 0
var/target_pressure = ONE_ATMOSPHERE
//var/max_volume_transfer = 10000
use_power = 1
use_power = 0
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 7500 //This also doubles as a measure of how powerful the pump is, in Watts. 7500 W ~ 10 HP
power_rating = 7500 //7500 W ~ 10 HP
var/last_power_draw = 0 //for UI
var/max_pressure_setting = 15000 //kPa
var/frequency = 0
var/id = null
var/datum/radio_frequency/radio_connection
@@ -43,14 +41,14 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/binary/pump/on
icon_state = "map_on"
on = 1
use_power = 1
/obj/machinery/atmospherics/binary/pump/update_icon()
if(!powered())
icon_state = "off"
else
icon_state = "[on ? "on" : "off"]"
icon_state = "[use_power ? "on" : "off"]"
/obj/machinery/atmospherics/binary/pump/update_underlays()
if(..())
@@ -65,10 +63,10 @@ Thus, the two variables affect pump operation are set in New():
update_underlays()
/obj/machinery/atmospherics/binary/pump/process()
if((stat & (NOPOWER|BROKEN)) || !on)
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_power_draw = 0
last_flow_rate = 0
last_power_draw = 0
last_flow_rate = 0
if((stat & (NOPOWER|BROKEN)) || !use_power)
return
var/power_draw = -1
@@ -76,22 +74,13 @@ Thus, the two variables affect pump operation are set in New():
if(pressure_delta > 0.01 && air1.temperature > 0)
//Figure out how much gas to transfer to meet the target pressure.
var/air_temperature = (air2.temperature > 0)? air2.temperature : air1.temperature
var/output_volume = air2.volume + (network2? network2.volume : 0)
//get the number of moles that would have to be transfered to bring sink to the target pressure
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
power_draw = pump_gas(src, air1, air2, transfer_moles, active_power_usage)
if (power_draw < 0)
//update_use_power(0)
use_power = 0 //don't force update - easier on CPU
last_power_draw = 0
last_flow_rate = 0
else
last_power_draw = handle_power_draw(power_draw)
var/transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta, (network2)? network2.volume : 0)
power_draw = pump_gas(src, air1, air2, transfer_moles, power_rating)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
if(network1)
network1.update = 1
@@ -119,7 +108,7 @@ Thus, the two variables affect pump operation are set in New():
signal.data = list(
"tag" = id,
"device" = "AGP",
"power" = on,
"power" = use_power,
"target_output" = target_pressure,
"sigtype" = "status"
)
@@ -134,14 +123,14 @@ Thus, the two variables affect pump operation are set in New():
// this is the data which will be sent to the ui
var/data[0]
data = list(
"on" = on,
"on" = use_power,
"pressure_set" = round(target_pressure*100), //Nano UI can't handle rounded non-integers, apparently.
"max_pressure" = max_pressure_setting,
"last_flow_rate" = round(last_flow_rate*10),
"last_power_draw" = round(last_power_draw),
"max_power_draw" = active_power_usage,
"max_power_draw" = power_rating,
)
// update the ui if it exists, returns null if no ui is passed/found
@@ -152,7 +141,7 @@ Thus, the two variables affect pump operation are set in New():
ui = new(user, src, ui_key, "gas_pump.tmpl", name, 470, 290)
ui.set_initial_data(data) // when the ui is first opened this is the data it will use
ui.open() // open the new ui window
ui.set_auto_update(1) // auto update every Master Controller tick
ui.set_auto_update(1) // auto update every Master Controller tick
/obj/machinery/atmospherics/binary/pump/initialize()
..()
@@ -165,12 +154,12 @@ Thus, the two variables affect pump operation are set in New():
if(signal.data["power"])
if(text2num(signal.data["power"]))
on = 1
use_power = 1
else
on = 0
use_power = 0
if("power_toggle" in signal.data)
on = !on
use_power = !use_power
if(signal.data["set_output_pressure"])
target_pressure = between(
@@ -190,7 +179,7 @@ Thus, the two variables affect pump operation are set in New():
return
/obj/machinery/atmospherics/binary/pump/attack_hand(user as mob)
if(..())
if(..())
return
src.add_fingerprint(usr)
if(!src.allowed(user))
@@ -201,11 +190,11 @@ Thus, the two variables affect pump operation are set in New():
return
/obj/machinery/atmospherics/binary/pump/Topic(href,href_list)
if(..()) return
if(..()) return
if(href_list["power"])
on = !on
use_power = !use_power
switch(href_list["set_press"])
if ("min")
target_pressure = 0
@@ -214,10 +203,10 @@ Thus, the two variables affect pump operation are set in New():
if ("set")
var/new_pressure = input(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure control",src.target_pressure) as num
src.target_pressure = between(0, new_pressure, max_pressure_setting)
usr.set_machine(src)
src.add_fingerprint(usr)
src.update_icon()
/obj/machinery/atmospherics/binary/pump/power_change()
@@ -229,7 +218,7 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (!(stat & NOPOWER) && on)
if (!(stat & NOPOWER) && use_power)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/datum/gas_mixture/int_air = return_air()
@@ -246,4 +235,4 @@ Thus, the two variables affect pump operation are set in New():
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
del(src)

View File

@@ -6,14 +6,14 @@
name = "high power gas pump"
desc = "A pump. Has double the power rating of the standard gas pump."
active_power_usage = 15000 //This also doubles as a measure of how powerful the pump is, in Watts. 15000 W ~ 20 HP
power_rating = 15000 //15000 W ~ 20 HP
/obj/machinery/atmospherics/binary/pump/high_power/on
on = 1
use_power = 1
icon_state = "map_on"
/obj/machinery/atmospherics/binary/pump/high_power/update_icon()
if(!powered())
icon_state = "off"
else
icon_state = "[on ? "on" : "off"]"
icon_state = "[use_power ? "on" : "off"]"

View File

@@ -11,7 +11,7 @@
use_power = 1
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 7500 //This also doubles as a measure of how powerful the filter is, in Watts. 7500 W ~ 10 HP
power_rating = 7500 //7500 W ~ 10 HP
var/max_flow_rate = 200
var/set_flow_rate = 200
@@ -69,14 +69,11 @@
var/power_draw = -1
if (transfer_moles > MINUMUM_MOLES_TO_FILTER)
power_draw = filter_gas_multi(src, filtering_outputs, input_air, output_air, transfer_moles, active_power_usage)
power_draw = filter_gas_multi(src, filtering_outputs, input_air, output_air, transfer_moles, power_rating)
if (power_draw < 0)
//update_use_power(0)
use_power = 0 //don't force update - easier on CPU
last_flow_rate = 0
else
handle_power_draw(power_draw)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
if(input.network)
input.network.update = 1
@@ -106,7 +103,7 @@
/obj/machinery/atmospherics/omni/filter/proc/build_uidata()
var/list/data = new()
data["power"] = on
data["power"] = use_power
data["config"] = configuring
var/portData[0]
@@ -162,16 +159,16 @@
switch(href_list["command"])
if("power")
if(!configuring)
on = !on
use_power = !use_power
else
on = 0
use_power = 0
if("configure")
configuring = !configuring
if(configuring)
on = 0
use_power = 0
//only allows config changes when in configuring mode ~otherwise you'll get weird pressure stuff going on
if(configuring && !on)
if(configuring && !use_power)
switch(href_list["command"])
if("set_flow_rate")
var/new_flow_rate = input(usr,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",set_flow_rate) as num

View File

@@ -7,7 +7,7 @@
use_power = 1
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 3700 //This also doubles as a measure of how powerful the mixer is, in Watts. 3700 W ~ 5 HP
power_rating = 3700 //3700 W ~ 5 HP
var/list/inputs = new()
var/datum/omni_port/output
@@ -108,14 +108,11 @@
var/power_draw = -1
if (transfer_moles > MINUMUM_MOLES_TO_FILTER)
power_draw = mix_gas(src, mixing_inputs, output.air, transfer_moles, active_power_usage)
power_draw = mix_gas(src, mixing_inputs, output.air, transfer_moles, power_rating)
if (power_draw < 0)
//update_use_power(0)
use_power = 0 //don't force update - easier on CPU
last_flow_rate = 0
else
handle_power_draw(power_draw)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
for(var/datum/omni_port/P in inputs)
if(P.concentration && P.network)
@@ -144,7 +141,7 @@
/obj/machinery/atmospherics/omni/mixer/proc/build_uidata()
var/list/data = new()
data["power"] = on
data["power"] = use_power
data["config"] = configuring
var/portData[0]
@@ -180,16 +177,16 @@
switch(href_list["command"])
if("power")
if(!configuring)
on = !on
use_power = !use_power
else
on = 0
use_power = 0
if("configure")
configuring = !configuring
if(configuring)
on = 0
use_power = 0
//only allows config changes when in configuring mode ~otherwise you'll get weird pressure stuff going on
if(configuring && !on)
if(configuring && !use_power)
switch(href_list["command"])
if("set_flow_rate")
var/new_flow_rate = input(usr,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",set_flow_rate) as num

View File

@@ -9,7 +9,6 @@
initialize_directions = 0
level = 1
var/on = 0
var/configuring = 0
//var/target_pressure = ONE_ATMOSPHERE //a base type as abstract as this should NOT be making these kinds of assumptions
@@ -53,7 +52,7 @@
else if(error_check())
overlays = overlays_error
else
overlays = on ? (overlays_on) : (overlays_off)
overlays = use_power ? (overlays_on) : (overlays_off)
underlays = underlays_current
@@ -63,12 +62,13 @@
return
/obj/machinery/atmospherics/omni/process()
if(error_check())
on = 0
last_power_draw = 0
last_flow_rate = 0
if((stat & (NOPOWER|BROKEN)) || !on)
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_flow_rate = 0
if(error_check())
use_power = 0
if((stat & (NOPOWER|BROKEN)) || !use_power)
return 0
return 1

View File

@@ -8,7 +8,7 @@
use_power = 1
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 7500 //This also doubles as a measure of how powerful the filter is, in Watts. 7500 W ~ 10 HP
power_rating = 7500 //This also doubles as a measure of how powerful the filter is, in Watts. 7500 W ~ 10 HP
var/temp = null // -- TLE
@@ -66,10 +66,10 @@
if(!powered())
icon_state += "off"
else if(node2 && node3 && node1)
icon_state += on ? "on" : "off"
icon_state += use_power ? "on" : "off"
else
icon_state += "off"
on = 0
use_power = 0
/obj/machinery/atmospherics/trinary/filter/update_underlays()
if(..())
@@ -98,9 +98,11 @@
/obj/machinery/atmospherics/trinary/filter/process()
..()
if((stat & (NOPOWER|BROKEN)) || !on)
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_flow_rate = 0
last_power_draw = 0
last_flow_rate = 0
if((stat & (NOPOWER|BROKEN)) || !use_power)
return
//Figure out the amount of moles to transfer
@@ -108,7 +110,7 @@
var/power_draw = -1
if (transfer_moles > MINUMUM_MOLES_TO_FILTER)
power_draw = filter_gas(src, filtered_out, air1, air2, air3, transfer_moles, active_power_usage)
power_draw = filter_gas(src, filtered_out, air1, air2, air3, transfer_moles, power_rating)
if(network2)
network2.update = 1
@@ -119,12 +121,9 @@
if(network1)
network1.update = 1
if (power_draw < 0)
//update_use_power(0)
use_power = 0 //don't force update - easier on CPU
last_flow_rate = 0
else
handle_power_draw(power_draw)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
return 1
@@ -179,7 +178,7 @@
current_filter_type = "ERROR - Report this bug to the admin, please!"
dat += {"
<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Power: </b><a href='?src=\ref[src];power=1'>[use_power?"On":"Off"]</a><br>
<b>Filtering: </b>[current_filter_type]<br><HR>
<h4>Set Filter Type:</h4>
<A href='?src=\ref[src];filterset=0'>Phoron</A><BR>
@@ -193,16 +192,7 @@
[src.set_flow_rate]L/s | <a href='?src=\ref[src];set_flow_rate=1'>Change</a><BR>
<B>Flow rate: </B>[round(last_flow_rate, 0.1)]L/s
"}
/*
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD>[dat]","window=atmo_filter")
onclose(user, "atmo_filter")
return
if (src.temp)
dat = text("<TT>[]</TT><BR><BR><A href='?src=\ref[];temp=1'>Clear Screen</A>", src.temp, src)
//else
// src.on != src.on
*/
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_filter")
onclose(user, "atmo_filter")
return
@@ -235,7 +225,7 @@
var/new_flow_rate = input(usr,"Enter new flow rate (0-[air1.volume]L/s)","Flow Rate Control",src.set_flow_rate) as num
src.set_flow_rate = max(0, min(air1.volume, new_flow_rate))
if(href_list["power"])
on=!on
use_power=!use_power
src.update_icon()
src.updateUsrDialog()
/*

View File

@@ -8,7 +8,7 @@
use_power = 1
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 3700 //This also doubles as a measure of how powerful the mixer is, in Watts. 3700 W ~ 5 HP
power_rating = 3700 //This also doubles as a measure of how powerful the mixer is, in Watts. 3700 W ~ 5 HP
var/set_flow_rate = ATMOS_DEFAULT_VOLUME_MIXER
var/list/mixing_inputs
@@ -30,10 +30,10 @@
if(!powered())
icon_state += "off"
else if(node2 && node3 && node1)
icon_state += on ? "on" : "off"
icon_state += use_power ? "on" : "off"
else
icon_state += "off"
on = 0
use_power = 0
/obj/machinery/atmospherics/trinary/mixer/update_underlays()
if(..())
@@ -68,17 +68,17 @@
air1.volume = ATMOS_DEFAULT_VOLUME_MIXER
air2.volume = ATMOS_DEFAULT_VOLUME_MIXER
air3.volume = ATMOS_DEFAULT_VOLUME_MIXER * 1.5
if (!mixing_inputs)
mixing_inputs = list(src.air1 = node1_concentration, src.air2 = node2_concentration)
/obj/machinery/atmospherics/trinary/mixer/process()
..()
//For some reason this doesn't work even in initialize(), so it goes here.
if (!mixing_inputs)
mixing_inputs = list(src.air1 = node1_concentration, src.air2 = node2_concentration)
last_power_draw = 0
last_flow_rate = 0
if((stat & (NOPOWER|BROKEN)) || !on)
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_flow_rate = 0
if((stat & (NOPOWER|BROKEN)) || !use_power)
return
//Figure out the amount of moles to transfer
@@ -86,7 +86,7 @@
var/power_draw = -1
if (transfer_moles > MINUMUM_MOLES_TO_FILTER)
power_draw = mix_gas(src, mixing_inputs, air3, transfer_moles, active_power_usage)
power_draw = mix_gas(src, mixing_inputs, air3, transfer_moles, power_rating)
if(network1 && mixing_inputs[air1])
network1.update = 1
@@ -97,12 +97,9 @@
if(network3)
network3.update = 1
if (power_draw < 0)
//update_use_power(0)
use_power = 0 //don't force update - easier on CPU
last_flow_rate = 0
else
handle_power_draw(power_draw)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
return 1
@@ -133,7 +130,7 @@
user << "\red Access denied."
return
usr.set_machine(src)
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[use_power?"On":"Off"]</a><br>
<b>Set Flow Rate Limit: </b>
[set_flow_rate]L/s | <a href='?src=\ref[src];set_press=1'>Change</a>
<br>
@@ -161,7 +158,7 @@
/obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list)
if(..()) return
if(href_list["power"])
on = !on
use_power = !use_power
if(href_list["set_press"])
var/max_flow_rate = min(air1.volume, air2.volume)
var/new_flow_rate = input(usr,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",src.set_flow_rate) as num

View File

@@ -1,9 +1,7 @@
obj/machinery/atmospherics/trinary
dir = SOUTH
initialize_directions = SOUTH|NORTH|WEST
use_power = 1
var/on = 0
use_power = 0
var/datum/gas_mixture/air1
var/datum/gas_mixture/air2

View File

@@ -13,12 +13,10 @@
var/heatsink_temperature = T20C //the constant temperature resevoir into which the freezer pumps heat. Probably the hull of the station or something.
var/internal_volume = 600 //L
var/on = 0
use_power = 0
idle_power_usage = 5 //5 Watts for thermostat related circuitry
active_power_usage //50 kW. The power rating of the freezer
var/max_power_usage = 20000 //power rating when the usage is turned up to 100
var/max_power_rating = 20000 //power rating when the usage is turned up to 100
var/power_setting = 100
var/set_temperature = T20C //thermostat
@@ -37,7 +35,7 @@
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
active_power_usage = max_power_usage * (power_setting/100)
power_rating = max_power_rating * (power_setting/100)
/obj/machinery/atmospherics/unary/freezer/initialize()
if(node) return
@@ -54,7 +52,7 @@
/obj/machinery/atmospherics/unary/freezer/update_icon()
if(src.node)
if(src.on && cooling)
if(src.use_power && cooling)
icon_state = "freezer_1"
else
icon_state = "freezer"
@@ -71,7 +69,7 @@
/obj/machinery/atmospherics/unary/freezer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
// this is the data which will be sent to the ui
var/data[0]
data["on"] = on ? 1 : 0
data["on"] = use_power ? 1 : 0
data["gasPressure"] = round(air_contents.return_pressure())
data["gasTemperature"] = round(air_contents.temperature)
data["minGasTemperature"] = 0
@@ -101,9 +99,8 @@
/obj/machinery/atmospherics/unary/freezer/Topic(href, href_list)
if (href_list["toggleStatus"])
src.on = !src.on
src.use_power = !src.use_power
update_icon()
update_use_power(on)
if(href_list["temp"])
var/amount = text2num(href_list["temp"])
if(amount > 0)
@@ -119,31 +116,30 @@
/obj/machinery/atmospherics/unary/freezer/process()
..()
if(stat & (NOPOWER|BROKEN) || !on)
if(stat & (NOPOWER|BROKEN) || !use_power)
cooling = 0
update_use_power(0)
update_icon()
return
if (network && air_contents.temperature > set_temperature)
cooling = 1
update_use_power(2)
var/heat_transfer = max( -air_contents.get_thermal_energy_change(set_temperature - 5), 0 )
//Assume the heat is being pumped into the hull which is fixed at heatsink_temperature
//not /really/ proper thermodynamics but whatever
var/cop = FREEZER_PERF_MULT * air_contents.temperature/heatsink_temperature //heatpump coefficient of performance from thermodynamics -> power used = heat_transfer/cop
heat_transfer = min(heat_transfer, cop * active_power_usage) //limit heat transfer by available power
heat_transfer = min(heat_transfer, cop * power_rating) //limit heat transfer by available power
var/removed = -air_contents.add_thermal_energy(-heat_transfer) //remove the heat
if (debug)
visible_message("[src]: Removing [removed] W.")
use_power(power_rating)
network.update = 1
else
cooling = 0
update_use_power(1)
update_icon()
@@ -171,14 +167,14 @@
bin_rating /= bin_count
manip_rating /= manip_count
active_power_usage = initial(active_power_usage)*cap_rating //more powerful
power_rating = initial(power_rating)*cap_rating //more powerful
heatsink_temperature = initial(heatsink_temperature)/((manip_rating+bin_rating)/2) //more efficient
air_contents.volume = max(initial(internal_volume) - 200, 0) + 200*bin_rating
set_power_level(power_setting)
/obj/machinery/atmospherics/unary/freezer/proc/set_power_level(var/new_power_setting)
power_setting = new_power_setting
active_power_usage = max_power_usage * (power_setting/100)
power_rating = max_power_rating * (power_setting/100)
//dismantling code. copied from autolathe
/obj/machinery/atmospherics/unary/freezer/attackby(var/obj/item/O as obj, var/mob/user as mob)

View File

@@ -14,12 +14,10 @@
var/max_temperature = T20C + 680
var/internal_volume = 600 //L
var/on = 0
use_power = 0
idle_power_usage = 5 //5 Watts for thermostat related circuitry
active_power_usage //50 kW. The power rating of the heater
var/max_power_usage = 20000 //power rating when the usage is turned up to 100
var/max_power_rating = 20000 //power rating when the usage is turned up to 100
var/power_setting = 100
var/heating = 0 //mainly for icon updates
@@ -36,7 +34,7 @@
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
active_power_usage = max_power_usage * (power_setting/100)
power_rating = max_power_rating * (power_setting/100)
/obj/machinery/atmospherics/unary/heater/initialize()
if(node) return
@@ -53,7 +51,7 @@
/obj/machinery/atmospherics/unary/heater/update_icon()
if(src.node)
if(src.on && src.heating)
if(src.use_power && src.heating)
icon_state = "heater_1"
else
icon_state = "heater"
@@ -65,21 +63,19 @@
/obj/machinery/atmospherics/unary/heater/process()
..()
if(stat & (NOPOWER|BROKEN) || !on)
if(stat & (NOPOWER|BROKEN) || !use_power)
heating = 0
update_use_power(0)
update_icon()
return
if (network && air_contents.total_moles && air_contents.temperature < set_temperature)
update_use_power(2)
air_contents.add_thermal_energy(active_power_usage * HEATER_PERF_MULT)
air_contents.add_thermal_energy(power_rating * HEATER_PERF_MULT)
use_power(power_rating)
heating = 1
network.update = 1
else
heating = 0
update_use_power(1)
update_icon()
@@ -92,7 +88,7 @@
/obj/machinery/atmospherics/unary/heater/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
// this is the data which will be sent to the ui
var/data[0]
data["on"] = on ? 1 : 0
data["on"] = use_power ? 1 : 0
data["gasPressure"] = round(air_contents.return_pressure())
data["gasTemperature"] = round(air_contents.temperature)
data["minGasTemperature"] = 0
@@ -120,8 +116,7 @@
/obj/machinery/atmospherics/unary/heater/Topic(href, href_list)
if (href_list["toggleStatus"])
src.on = !src.on
update_use_power(on)
src.use_power = !src.use_power
update_icon()
if(href_list["temp"])
var/amount = text2num(href_list["temp"])
@@ -154,14 +149,14 @@
cap_rating /= cap_count
bin_rating /= bin_count
max_power_usage = initial(max_power_usage)*cap_rating
max_power_rating = initial(max_power_rating)*cap_rating
max_temperature = max(initial(max_temperature) - T20C, 0)*((bin_rating*2 + cap_rating)/3) + T20C
air_contents.volume = max(initial(internal_volume) - 200, 0) + 200*bin_rating
set_power_level(power_setting)
/obj/machinery/atmospherics/unary/heater/proc/set_power_level(var/new_power_setting)
power_setting = new_power_setting
active_power_usage = max_power_usage * (power_setting/100)
power_rating = max_power_rating * (power_setting/100)
//dismantling code. copied from autolathe
/obj/machinery/atmospherics/unary/heater/attackby(var/obj/item/O as obj, var/mob/user as mob)

View File

@@ -5,17 +5,15 @@
/obj/machinery/atmospherics/unary/outlet_injector
icon = 'icons/atmos/injector.dmi'
icon_state = "map_injector"
use_power = 1
layer = 3
name = "air injector"
desc = "Passively injects air into its surroundings. Has a valve attached to it that can control flow rate."
use_power = 1
use_power = 0
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 15000 //This also doubles as a measure of how powerful the pump is, in Watts. 15000 W ~ 20 HP
power_rating = 15000 //15000 W ~ 20 HP
var/on = 0
var/injecting = 0
var/volume_rate = 50 //flow rate limit
@@ -34,7 +32,7 @@
if(!powered())
icon_state = "off"
else
icon_state = "[on ? "on" : "off"]"
icon_state = "[use_power ? "on" : "off"]"
/obj/machinery/atmospherics/unary/outlet_injector/update_underlays()
if(..())
@@ -52,11 +50,11 @@
/obj/machinery/atmospherics/unary/outlet_injector/process()
..()
injecting = 0
if((stat & (NOPOWER|BROKEN)) || !on)
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_flow_rate = 0
last_power_draw = 0
last_flow_rate = 0
if((stat & (NOPOWER|BROKEN)) || !use_power)
return
var/power_draw = -1
@@ -64,14 +62,11 @@
if(environment && air_contents.temperature > 0)
var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit
power_draw = pump_gas(src, air_contents, environment, transfer_moles, active_power_usage)
power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating)
if (power_draw < 0)
//update_use_power(0)
use_power = 0 //don't force update - easier on CPU
last_flow_rate = 0
else
handle_power_draw(power_draw)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
if(network)
network.update = 1
@@ -79,7 +74,7 @@
return 1
/obj/machinery/atmospherics/unary/outlet_injector/proc/inject()
if(on || injecting || (stat & NOPOWER))
if(injecting || (stat & NOPOWER))
return 0
var/datum/gas_mixture/environment = loc.return_air()
@@ -89,7 +84,7 @@
injecting = 1
if(air_contents.temperature > 0)
var/power_used = pump_gas(src, air_contents, environment, air_contents.total_moles, active_power_usage)
var/power_used = pump_gas(src, air_contents, environment, air_contents.total_moles, power_rating)
use_power(power_used)
if(network)
@@ -114,7 +109,7 @@
signal.data = list(
"tag" = id,
"device" = "AO",
"power" = on,
"power" = use_power,
"volume_rate" = volume_rate,
"sigtype" = "status"
)
@@ -133,12 +128,10 @@
return 0
if(signal.data["power"])
on = text2num(signal.data["power"])
update_use_power(on)
use_power = text2num(signal.data["power"])
if(signal.data["power_toggle"])
on = !on
update_use_power(on)
use_power = !use_power
if(signal.data["inject"])
spawn inject()

View File

@@ -15,9 +15,9 @@
name = "Air Vent"
desc = "Has a valve and pump attached to it"
use_power = 1
use_power = 0
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 7500 //This also doubles as a measure of how powerful the pump is, in Watts. 7500 W ~ 10 HP
power_rating = 7500 //7500 W ~ 10 HP
connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY //connects to regular and supply pipes
@@ -26,11 +26,8 @@
var/area_uid
var/id_tag = null
var/on = 0
var/pump_direction = 1 //0 = siphoning, 1 = releasing
var/last_power_draw = 0
var/external_pressure_bound = EXTERNAL_PRESSURE_BOUND
var/internal_pressure_bound = INTERNAL_PRESSURE_BOUND
@@ -53,14 +50,14 @@
var/radio_filter_in
/obj/machinery/atmospherics/unary/vent_pump/on
on = 1
use_power = 1
icon_state = "map_vent_out"
/obj/machinery/atmospherics/unary/vent_pump/siphon
pump_direction = 0
/obj/machinery/atmospherics/unary/vent_pump/siphon/on
on = 1
use_power = 1
icon_state = "map_vent_in"
/obj/machinery/atmospherics/unary/vent_pump/New()
@@ -82,7 +79,7 @@
/obj/machinery/atmospherics/unary/vent_pump/high_volume
name = "Large Air Vent"
power_channel = EQUIP
active_power_usage = 15000 //15 kW ~ 20 HP
power_rating = 15000 //15 kW ~ 20 HP
/obj/machinery/atmospherics/unary/vent_pump/high_volume/New()
..()
@@ -91,7 +88,7 @@
/obj/machinery/atmospherics/unary/vent_pump/engine
name = "Engine Core Vent"
power_channel = ENVIRON
active_power_usage = 15000 //15 kW ~ 20 HP
power_rating = 15000 //15 kW ~ 20 HP
/obj/machinery/atmospherics/unary/vent_pump/engine/New()
..()
@@ -101,7 +98,7 @@
if(!check_icon_cache())
return
if (!node)
on = 0
use_power = 0
overlays.Cut()
@@ -119,7 +116,7 @@
else if(!powered())
vent_icon += "off"
else
vent_icon += "[on ? "[pump_direction ? "out" : "in"]" : "off"]"
vent_icon += "[use_power ? "[pump_direction ? "out" : "in"]" : "off"]"
overlays += icon_manager.get_atmos_icon("device", , , vent_icon)
@@ -144,7 +141,7 @@
/obj/machinery/atmospherics/unary/vent_pump/proc/can_pump()
if(stat & (NOPOWER|BROKEN))
return 0
if(!on)
if(!use_power)
return 0
if(welded)
return 0
@@ -153,12 +150,12 @@
/obj/machinery/atmospherics/unary/vent_pump/process()
..()
last_power_draw = 0
last_flow_rate = 0
if (!node)
on = 0
use_power = 0
if(!can_pump())
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_power_draw = 0
last_flow_rate = 0
return 0
var/datum/gas_mixture/environment = loc.return_air()
@@ -171,29 +168,18 @@
if((environment.temperature || air_contents.temperature) && pressure_delta > 0.5)
if(pump_direction) //internal -> external
var/output_volume = environment.volume * environment.group_multiplier
var/air_temperature = environment.temperature? environment.temperature : air_contents.temperature
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
//src.visible_message("DEBUG >>> [src]: output_volume = [output_volume]L; air_temperature = [air_temperature]K; transfer_moles = [transfer_moles] mol")
power_draw = pump_gas(src, air_contents, environment, transfer_moles, active_power_usage)
var/transfer_moles = calculate_transfer_moles(air_contents, environment)
power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating)
else //external -> internal
var/output_volume = air_contents.volume + (network? network.volume : 0)
var/air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
var/transfer_moles = calculate_transfer_moles(environment, air_contents, (network)? network.volume : 0)
//limit flow rate from turfs
transfer_moles = min(transfer_moles, environment.total_moles*air_contents.volume/environment.volume) //group_multiplier gets divided out here
power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating)
power_draw = pump_gas(src, environment, air_contents, transfer_moles, active_power_usage)
if (power_draw < 0)
last_power_draw = 0
last_flow_rate = 0
//update_use_power(0)
use_power = 0 //don't force update - easier on CPU
else
last_power_draw = handle_power_draw(power_draw)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
if(network)
network.update = 1
@@ -236,7 +222,7 @@
"area" = src.area_uid,
"tag" = src.id_tag,
"device" = "AVP",
"power" = on,
"power" = use_power,
"direction" = pump_direction?("release"):("siphon"),
"checks" = pressure_checks,
"internal" = internal_pressure_bound,
@@ -283,10 +269,10 @@
pump_direction = 1
if(signal.data["power"] != null)
on = text2num(signal.data["power"])
use_power = text2num(signal.data["power"])
if(signal.data["power_toggle"] != null)
on = !on
use_power = !use_power
if(signal.data["checks"] != null)
if (signal.data["checks"] == "default")
@@ -392,7 +378,7 @@
/obj/machinery/atmospherics/unary/vent_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (!(stat & NOPOWER) && on)
if (!(stat & NOPOWER) && use_power)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc

View File

@@ -4,10 +4,9 @@
name = "Air Scrubber"
desc = "Has a valve and pump attached to it"
use_power = 1
use_power = 0
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 7500 //This also doubles as a measure of how powerful the pump is, in Watts. 7500 W ~ 10 HP
var/last_power_draw = 0
power_rating = 7500 //7500 W ~ 10 HP
connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SCRUBBER //connects to regular and scrubber pipes
@@ -18,7 +17,6 @@
var/frequency = 1439
var/datum/radio_frequency/radio_connection
var/on = 0
var/scrubbing = 1 //0 = siphoning, 1 = scrubbing
var/list/scrubbing_gas = list("carbon_dioxide")
@@ -29,7 +27,7 @@
var/radio_filter_in
/obj/machinery/atmospherics/unary/vent_scrubber/on
on = 1
use_power = 1
icon_state = "map_scrubber_on"
/obj/machinery/atmospherics/unary/vent_scrubber/New()
@@ -63,7 +61,7 @@
if(!powered())
scrubber_icon += "off"
else
scrubber_icon += "[on ? "[scrubbing ? "on" : "in"]" : "off"]"
scrubber_icon += "[use_power ? "[scrubbing ? "on" : "in"]" : "off"]"
overlays += icon_manager.get_atmos_icon("device", , , scrubber_icon)
@@ -98,7 +96,7 @@
"tag" = id_tag,
"device" = "AScr",
"timestamp" = world.time,
"power" = on,
"power" = use_power,
"scrubbing" = scrubbing,
"panic" = panic,
"filter_co2" = ("carbon_dioxide" in scrubbing_gas),
@@ -124,13 +122,14 @@
/obj/machinery/atmospherics/unary/vent_scrubber/process()
..()
last_power_draw = 0
last_flow_rate = 0
if (!node)
on = 0
use_power = 0
//broadcast_status()
if(!on || (stat & (NOPOWER|BROKEN)))
update_use_power(0) //we got here because a player turned a pump off - definitely want to update.
last_flow_rate = 0
last_power_draw = 0
if(!use_power || (stat & (NOPOWER|BROKEN)))
return 0
var/datum/gas_mixture/environment = loc.return_air()
@@ -140,20 +139,16 @@
//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, active_power_usage)
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, active_power_usage)
power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating)
if (power_draw < 0)
//update_use_power(0)
use_power = 0 //don't force update. Sure, we will continue to use power even though we're not pumping anything, but it is easier on the CPU
last_power_draw = 0
last_flow_rate = 0
else
last_power_draw = handle_power_draw(power_draw)
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
if(network)
network.update = 1
@@ -171,21 +166,21 @@
return 0
if(signal.data["power"] != null)
on = text2num(signal.data["power"])
use_power = text2num(signal.data["power"])
if(signal.data["power_toggle"] != null)
on = !on
use_power = !use_power
if(signal.data["panic_siphon"]) //must be before if("scrubbing" thing
panic = text2num(signal.data["panic_siphon"] != null)
if(panic)
on = 1
use_power = 1
scrubbing = 0
else
scrubbing = 1
if(signal.data["toggle_panic_siphon"] != null)
panic = !panic
if(panic)
on = 1
use_power = 1
scrubbing = 0
else
scrubbing = 1
@@ -238,7 +233,7 @@
/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) && on)
if (!(stat & NOPOWER) && use_power)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc