From 095ab7d97ce1ae55412add1ebe856dd4f9fe3651 Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Wed, 25 Jun 2014 22:08:51 +1200 Subject: [PATCH] Added omni filters - Added omni gas filter - Cleaned up some code in mixer.dm and omni_base.dm --- .../components/omni_devices/_omni_extras.dm | 7 +- .../components/omni_devices/filter.dm | 274 +++++++++++++++++- .../components/omni_devices/mixer.dm | 71 ++--- .../components/omni_devices/omni_base.dm | 17 +- icons/obj/atmospherics/omni_devices.dmi | Bin 11782 -> 11975 bytes nano/templates/omni_filter.tmpl | 82 ++++++ 6 files changed, 395 insertions(+), 56 deletions(-) create mode 100644 nano/templates/omni_filter.tmpl diff --git a/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm b/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm index 9082fc1bd0..ba64adc61e 100644 --- a/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm +++ b/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm @@ -11,7 +11,6 @@ #define ATM_P 6 //Phoron #define ATM_N2O 7 - //-------------------------------------------- // Omni device cached icon list //-------------------------------------------- @@ -52,7 +51,6 @@ var/global/list/omni_icons[] var/mode = 0 var/concentration = 1 var/con_lock = 0 - var/target_pressure = 0 var/transfer_moles = 0 var/datum/gas_mixture/air var/obj/machinery/atmospherics/node @@ -92,10 +90,7 @@ var/global/list/omni_icons[] #define PIPE_COLOR_YELLOW "#ffcc00" #define PIPE_COLOR_PURPLE "#5c1ec0" -var/global/list/pipe_colors = list("Grey" = null, "Red" = PIPE_COLOR_RED, "Blue" = PIPE_COLOR_BLUE, "Cyan" = PIPE_COLOR_CYAN, "Green" = PIPE_COLOR_GREEN, "Yellow" = PIPE_COLOR_YELLOW, "Purple" = PIPE_COLOR_PURPLE) - -/proc/dout(var/string) - world << "\blue DEBUG: [string]" +var/global/list/pipe_colors = list("grey" = null, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE) /proc/dir_name(var/dir = 0) switch(dir) diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index 69e3d76bf5..ff558a13e9 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -1,7 +1,7 @@ //-------------------------------------------- // Gas filter - omni variant //-------------------------------------------- -obj/machinery/atmospherics/omni/filter +/obj/machinery/atmospherics/omni/filter name = "Omni gas filter" icon = 'icons/obj/atmospherics/omni_devices.dmi' icon_state = "" @@ -14,3 +14,275 @@ obj/machinery/atmospherics/omni/filter var/list/filters = new() var/datum/omni_port/input var/datum/omni_port/output + +/obj/machinery/atmospherics/omni/filter/Del() + input = null + output = null + filters.Cut() + ..() + +/obj/machinery/atmospherics/omni/filter/sort_ports() + for(var/datum/omni_port/P in ports) + if(P.update) + if(output == P) + output = null + if(input == P) + input = null + if(filters.Find(P)) + filters -= P + + P.air.volume = 200 + switch(P.mode) + if(ATM_INPUT) + input = P + if(ATM_OUTPUT) + output = P + if(ATM_O2 to ATM_N2O) + filters += P + +/obj/machinery/atmospherics/omni/filter/error_check() + if(!input || !output || !filters) + return 1 + if(filters.len < 1 || filters.len > 2) //requires 1 or 2 filters ~otherwise why are you using a filter? + return 1 + + return 0 + +/obj/machinery/atmospherics/omni/filter/process() + ..() + if(!on) + return 0 + + if(!input || !output) + return + + var/datum/gas_mixture/output_air = output.air //BYOND doesn't like referencing "output.air.return_pressure()" so we need to make a direct reference + var/datum/gas_mixture/input_air = input.air // it's completely happy with them if they're in a loop though i.e. "P.air.return_pressure()"... *shrug* + + var/output_pressure = output_air.return_pressure() + + if(output_pressure >= target_pressure) + return + for(var/datum/omni_port/P in filters) + if(P.air.return_pressure() >= target_pressure) + return + + var/pressure_delta = target_pressure - output_pressure + + if(input_air.return_temperature() > 0) + input.transfer_moles = pressure_delta * output_air.volume / (input_air.return_temperature() * R_IDEAL_GAS_EQUATION) + + if(input.transfer_moles > 0) + var/datum/gas_mixture/removed = input_air.remove(input.transfer_moles) + + if(!removed) + return + + for(var/datum/omni_port/P in filters) + var/datum/gas_mixture/filtered_out = new + filtered_out.temperature = removed.return_temperature() + + switch(P.mode) + if(ATM_O2) + filtered_out.oxygen = removed.oxygen + removed.oxygen = 0 + if(ATM_N2) + filtered_out.nitrogen = removed.nitrogen + removed.nitrogen = 0 + if(ATM_CO2) + filtered_out.carbon_dioxide = removed.carbon_dioxide + removed.carbon_dioxide = 0 + if(ATM_P) + filtered_out.phoron = removed.phoron + removed.phoron = 0 + if(ATM_N2O) + if(removed.trace_gases.len>0) + for(var/datum/gas/sleeping_agent/trace_gas in removed.trace_gases) + if(istype(trace_gas)) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas + else + filtered_out = null + + P.air.merge(filtered_out) + if(P.network) + P.network.update = 1 + + output_air.merge(removed) + if(output.network) + output.network.update = 1 + + input.transfer_moles = 0 + if(input.network) + input.network.update = 1 + + return + +/obj/machinery/atmospherics/omni/filter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) + usr.set_machine(src) + + var/list/data = new() + + data = build_uidata() + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + + if (!ui) + ui = new(user, src, ui_key, "omni_filter.tmpl", name, 330, 330) + ui.set_initial_data(data) + + ui.open() + +/obj/machinery/atmospherics/omni/filter/proc/build_uidata() + var/list/data = new() + + data["power"] = on + data["config"] = configuring + + var/portData[0] + for(var/datum/omni_port/P in ports) + if(!configuring && P.mode == 0) + continue + + var/input = 0 + var/output = 0 + var/filter = 1 + var/f_type = null + switch(P.mode) + if(ATM_INPUT) + input = 1 + filter = 0 + if(ATM_OUTPUT) + output = 1 + filter = 0 + if(ATM_O2 to ATM_N2O) + f_type = mode_send_switch(P.mode) + + portData[++portData.len] = list("dir" = dir_name(P.dir), \ + "input" = input, \ + "output" = output, \ + "filter" = filter, \ + "f_type" = f_type) + + if(portData.len) + data["ports"] = portData + if(output) + data["pressure"] = target_pressure + + return data + +/obj/machinery/atmospherics/omni/filter/proc/mode_send_switch(var/mode = ATM_NONE) + switch(mode) + if(ATM_O2) + return "Oxygen" + if(ATM_N2) + return "Nitrogen" + if(ATM_CO2) + return "Carbon Dioxide" + if(ATM_P) + return "Phoron" //*cough* Plasma *cough* + if(ATM_N2O) + return "Nitrous Oxide" + else + return null + +/obj/machinery/atmospherics/omni/filter/Topic(href, href_list) + if(..()) return + switch(href_list["command"]) + if("power") + if(!configuring) + on = !on + else + on = 0 + if("configure") + configuring = !configuring + if(configuring) + on = 0 + + //only allows config changes when in configuring mode ~otherwise you'll get weird pressure stuff going on + if(configuring && !on) + switch(href_list["command"]) + if("set_pressure") + var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",target_pressure) as num + target_pressure = between(0, new_pressure, 4500) + if("switch_mode") + switch_mode(dir_flag(href_list["dir"]), mode_return_switch(href_list["mode"])) + if("switch_filter") + var/new_filter = input(usr,"Select filter mode:","Change filter",href_list["mode"]) in list("None", "Oxygen", "Nitrogen", "Carbon Dioxide", "Phoron", "Nitrous Oxide") + switch_filter(dir_flag(href_list["dir"]), mode_return_switch(new_filter)) + + update_icon() + nanomanager.update_uis(src) + return + +/obj/machinery/atmospherics/omni/filter/proc/mode_return_switch(var/mode) + switch(mode) + if("Oxygen") + return ATM_O2 + if("Nitrogen") + return ATM_N2 + if("Carbon Dioxide") + return ATM_CO2 + if("Phoron") + return ATM_P + if("Nitrous Oxide") + return ATM_N2O + if("in") + return ATM_INPUT + if("out") + return ATM_OUTPUT + if("None") + return ATM_NONE + else + return null + +/obj/machinery/atmospherics/omni/filter/proc/switch_filter(var/dir, var/mode) + //check they aren't trying to disable the input or output ~this can only happen if they hack the cached tmpl file + for(var/datum/omni_port/P in ports) + if(P.dir == dir) + if(P.mode == ATM_INPUT || P.mode == ATM_OUTPUT) + return + + switch_mode(dir, mode) + +/obj/machinery/atmospherics/omni/filter/proc/switch_mode(var/port, var/mode) + if(mode == null || !port) + return + var/datum/omni_port/target_port = null + var/list/other_ports = new() + + for(var/datum/omni_port/P in ports) + if(P.dir == port) + target_port = P + else + other_ports += P + + var/previous_mode = null + if(target_port) + previous_mode = target_port.mode + target_port.mode = mode + if(target_port.mode != previous_mode) + handle_port_change(target_port) + else + return + else + return + + for(var/datum/omni_port/P in other_ports) + if(P.mode == mode) + var/old_mode = P.mode + P.mode = previous_mode + if(P.mode != old_mode) + handle_port_change(P) + + update_ports() + +/obj/machinery/atmospherics/omni/filter/proc/handle_port_change(var/datum/omni_port/P) + switch(P.mode) + if(ATM_NONE) + initialize_directions &= ~P.dir + P.disconnect() + else + initialize_directions |= P.dir + P.connect() + P.update = 1 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm index 368b8f2167..45d208fbb1 100644 --- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm @@ -13,10 +13,6 @@ var/list/inputs = new() var/datum/omni_port/output -/obj/machinery/atmospherics/omni/mixer/New() - ..() - icon_state = "base" - /obj/machinery/atmospherics/omni/mixer/Del() inputs.Cut() output = null @@ -31,7 +27,6 @@ inputs -= P P.air.volume = 200 - P.target_pressure = 0 switch(P.mode) if(ATM_INPUT) inputs += P @@ -43,13 +38,15 @@ if(output) output.air.volume *= 0.75 * inputs.len - output.target_pressure = target_pressure output.concentration = 1 - if(!output || inputs.len > 3 || inputs.len < 2) - config_error = 1 - else - config_error = 0 +/obj/machinery/atmospherics/omni/mixer/error_check() + if(!output || !inputs) + return 1 + if(inputs.len < 2 || inputs.len > 3) //requires 2 or 3 inputs ~otherwise why are you using a mixer? + return 1 + + return 0 /obj/machinery/atmospherics/omni/mixer/process() ..() @@ -60,13 +57,13 @@ var/output_pressure = output_air.return_pressure() - if(output_pressure >= output.target_pressure * 0.999) + if(output_pressure >= target_pressure * 0.999) //No need to mix if target is already full! - 0.1% margin of error so we minimize processing minor gas volumes return 1 //Calculate necessary moles to transfer using PV=nRT - var/pressure_delta = output.target_pressure - output_pressure + var/pressure_delta = target_pressure - output_pressure for(var/datum/omni_port/P in inputs) if(P.air.return_temperature() > 0) @@ -96,17 +93,15 @@ for(var/datum/omni_port/P in inputs) if(P.transfer_moles > 0) output_air.merge(P.air.remove(P.transfer_moles)) - - for(var/datum/omni_port/P in inputs) - if(P.network && P.transfer_moles) - P.network.update = 1 + if(P.network) + P.network.update = 1 + P.transfer_moles = 0 if(output.network) output.network.update = 1 return 1 - /obj/machinery/atmospherics/omni/mixer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) usr.set_machine(src) @@ -117,7 +112,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) if (!ui) - ui = new(user, src, ui_key, "omni_mixer.tmpl", src.name, 360, 330) + ui = new(user, src, ui_key, "omni_mixer.tmpl", name, 360, 330) ui.set_initial_data(data) ui.open() @@ -135,26 +130,26 @@ var/input = 0 var/output = 0 - if(P.mode == ATM_INPUT) - input = 1 - else if(P.mode == ATM_OUTPUT) - output = 1 + switch(P.mode) + if(ATM_INPUT) + input = 1 + if(ATM_OUTPUT) + output = 1 portData[++portData.len] = list("dir" = dir_name(P.dir), \ "concentration" = P.concentration, \ "input" = input, \ "output" = output, \ - "pressure" = P.target_pressure, \ "con_lock" = P.con_lock) if(portData.len) data["ports"] = portData if(output) - data["pressure"] = output.target_pressure + data["pressure"] = target_pressure return data -/obj/machinery/atmospherics/omni/mixer/Topic(href,href_list) +/obj/machinery/atmospherics/omni/mixer/Topic(href, href_list) if(..()) return switch(href_list["command"]) @@ -168,13 +163,12 @@ if(configuring) on = 0 - //only allows config changes when in configuring mode + //only allows config changes when in configuring mode ~otherwise you'll get weird pressure stuff going on if(configuring && !on) switch(href_list["command"]) if("set_pressure") var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",target_pressure) as num - target_pressure = between(0, new_pressure, 4500) // max(0, min(4500, new_pressure)) - output.target_pressure = target_pressure + target_pressure = between(0, new_pressure, 4500) if("switch_mode") switch_mode(dir_flag(href_list["dir"]), href_list["mode"]) if("switch_con") @@ -187,13 +181,14 @@ return /obj/machinery/atmospherics/omni/mixer/proc/switch_mode(var/port = NORTH, var/mode = ATM_NONE) - switch(mode) - if("in") - mode = ATM_INPUT - if("out") - mode = ATM_OUTPUT - if("none") - mode = ATM_NONE + if(mode != ATM_INPUT && mode != ATM_OUTPUT) + switch(mode) + if("in") + mode = ATM_INPUT + if("out") + mode = ATM_OUTPUT + else + mode = ATM_NONE for(var/datum/omni_port/P in ports) var/old_mode = P.mode @@ -217,13 +212,9 @@ if(ATM_NONE) initialize_directions &= ~P.dir P.disconnect() - if(ATM_INPUT) + else initialize_directions |= P.dir P.connect() - if(ATM_OUTPUT) - initialize_directions |= P.dir - P.connect() - P.update = 1 update_ports() diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 635686a9a7..2fe89e72ad 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -15,8 +15,6 @@ var/icon/icon_off var/icon/icon_error - var/config_error = 0 - var/tag_north = ATM_NONE var/tag_south = ATM_NONE var/tag_east = ATM_NONE @@ -31,9 +29,9 @@ /obj/machinery/atmospherics/omni/New() ..() + icon_state = "base" ports = new() - for(var/d in cardinal) var/datum/omni_port/new_port = new(src, d) switch(d) @@ -51,22 +49,23 @@ build_icons() -/obj/machinery/atmospherics/omni/mixer/update_icon() +/obj/machinery/atmospherics/omni/update_icon() if(stat & NOPOWER) overlays = overlays_off - else if(config_error) + on = 0 + else if(error_check()) overlays = overlays_error on = 0 - else if(inputs.len > 0 && output) - overlays = on ? (overlays_on) : (overlays_off) else - overlays = overlays_off - on = 0 + overlays = on ? (overlays_on) : (overlays_off) underlays = underlays_current return +/obj/machinery/atmospherics/omni/proc/error_check() + return + /obj/machinery/atmospherics/omni/power_change() var/old_stat = stat ..() diff --git a/icons/obj/atmospherics/omni_devices.dmi b/icons/obj/atmospherics/omni_devices.dmi index 666b0279f524d463a8d6f5548eb5d6648cc47607..8b566f57669ac1b90f9ab51282149adf1d6fa08f 100644 GIT binary patch literal 11975 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 literal 11782 zcmbt)cUV(zmu&(FNJj*uh9>xgBz7 zal_{Qw{-76N5Hf`$|WVIT$p|vjeO)_@5*ywDd*|>c36aUDfsJc|I^`+MRJ}*k#OHBh4!}M`%$M_3lUGbGuBsUPfd2>DM#L zM+q94*Y%K3yaINJ_-Bl1s0A!@6Z5jAx zbKc`I?_n5b_i$j#I}?8K=6%n;{P-NVbLQeB5{|_x0_{V^9IdpMK1R+7eX6n&xFM2r z8N0CY=G>3B5njU|B0Z61Wii>=*|VepdQNHO$`l!)F{a7KS{Y}K z)<%mLtq|CBzkF!G7H(2gB>*3Fk+5Fia#XFez*xLA8jOED`EuTjayWe

Gp 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 QzZ+zve?#x1&b`S012)g({r~^~ diff --git a/nano/templates/omni_filter.tmpl b/nano/templates/omni_filter.tmpl new file mode 100644 index 0000000000..e1e805f1dd --- /dev/null +++ b/nano/templates/omni_filter.tmpl @@ -0,0 +1,82 @@ +

+
+ {{:~link(power ? 'On' : 'Off', null, {'command' : 'power'}, null, power ? 'selected' : 'redBackground')}} +
+
+ {{:~link('Configure', null, {'command' : 'configure'}, null, config ? 'selected' : null)}} +
+ + {{if config}} + +
+
+
Port
+ {{for ports}} +
{{:dir}} Port
+ {{/for}} +
+
+
Input
+ {{for ports}} +
+ {{:~link(' ', null, {'command' : 'switch_mode', 'mode' : 'in', 'dir' : dir}, null, input ? 'selected' : null)}} +
+ {{/for}} +
+
+
Output
+ {{for ports}} +
+ {{:~link(' ', null, {'command' : 'switch_mode', 'mode' : 'out', 'dir' : dir}, null, output ? 'selected' : null)}} +
+ {{/for}} +
+
+
Filter
+ {{for ports}} +
+ {{:~link(f_type ? f_type : 'None', null, {'command' : 'switch_filter', 'mode' : f_type, 'dir' : dir}, filter ? null : 'disabled', f_type ? 'selected' : null)}} +
+ {{/for}} +
+
+ +
+ Target Output Pressure: {{:~round(pressure)}} kPa +
+
+ {{:~link('Set Target Pressure', null, {'command' : 'set_pressure'})}} +
+ + {{else}} + +
+
+
Port
+ {{for ports}} +
{{:dir}} Port
+ {{/for}} +
+
+
Mode
+ {{for ports}} +
+ {{if input}} + Input + {{else output}} + Output + {{else f_type}} + {{:f_type}} + {{else}} + Disabled + {{/if}} +
+ {{/for}} +
+
+ +
+ Target Output Pressure: {{:~round(pressure)}} kPa +
+ {{/if}} +
\ No newline at end of file