From 9801dfa9a9bb9109205fbe42b505ae4cfd66d23d Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Fri, 5 Sep 2014 00:18:33 +0800 Subject: [PATCH] NewPipe -Supply and scrubber pipes can be run in parallel without connecting to each other -Supply pipes will only connect to supply pipes, vents and Universal Pipe Adapters(UPAs) -Scrubber pipes will only connect to scrubber pipes, scrubbers and UPAs -Supply and scrubber pipes are offset along the x and y axes to prevent sprite overlap -UPAs will connect to regular, scrubber and supply pipes, as well as anything else that connects to a regular pipe. UPAs will be used to interface between the supply/scrubber loops and atmos --- code/ATMOSPHERICS/_atmos_setup.dm | 121 ++++-- code/ATMOSPHERICS/atmospherics.dm | 52 ++- .../binary_devices/binary_atmos_base.dm | 16 +- .../components/omni_devices/omni_base.dm | 16 +- .../components/portables_connector.dm | 10 +- .../trinary_devices/trinary_base.dm | 29 +- code/ATMOSPHERICS/components/tvalve.dm | 32 +- .../components/unary/unary_base.dm | 10 +- .../components/unary/vent_pump.dm | 39 +- .../components/unary/vent_scrubber.dm | 18 +- code/ATMOSPHERICS/components/valve.dm | 20 +- code/ATMOSPHERICS/pipes.dm | 361 +++++++++++++++--- code/game/machinery/pipe/construction.dm | 261 ++++++++++++- code/game/machinery/pipe/pipe_dispenser.dm | 11 + icons/atmos/manifold.dmi | Bin 1097 -> 2102 bytes icons/atmos/pipe_underlays.dmi | Bin 1070 -> 2580 bytes icons/atmos/pipes.dmi | Bin 1433 -> 3578 bytes icons/obj/pipe-item.dmi | Bin 24744 -> 25353 bytes 18 files changed, 822 insertions(+), 174 deletions(-) diff --git a/code/ATMOSPHERICS/_atmos_setup.dm b/code/ATMOSPHERICS/_atmos_setup.dm index 5f105c8e6c..c11b51dbc3 100644 --- a/code/ATMOSPHERICS/_atmos_setup.dm +++ b/code/ATMOSPHERICS/_atmos_setup.dm @@ -1,7 +1,7 @@ //-------------------------------------------- // Pipe colors // -// Add them here and to the pipe_colors list +// Add them here and to the pipe_colors list // to automatically add them to all relevant // atmospherics devices. //-------------------------------------------- @@ -37,11 +37,12 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ var/list/pipe_icons[] var/list/manifold_icons[] var/list/device_icons[] - var/list/underlays_down[] - var/list/underlays_exposed[] - var/list/underlays_intact[] - var/list/pipe_underlays_exposed[] - var/list/pipe_underlays_intact[] + var/list/underlays[] + //var/list/underlays_down[] + //var/list/underlays_exposed[] + //var/list/underlays_intact[] + //var/list/pipe_underlays_exposed[] + //var/list/pipe_underlays_intact[] var/list/omni_icons[] /datum/pipe_icon_manager/New() @@ -64,16 +65,18 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ return device_icons[state] if("omni") return omni_icons[state] - if("underlay_intact") - return underlays_intact[dir + color] - if("underlay_exposed") - return underlays_exposed[dir + color] - if("underlay_down") - return underlays_down[dir + color] - if("pipe_underlay_exposed") - return pipe_underlays_exposed[dir + color] - if("pipe_underlay_intact") - return pipe_underlays_intact[dir + color] + if("underlay") + return underlays[state + dir + color] + //if("underlay_intact") + // return underlays_intact[state + dir + color] + // if("underlay_exposed") + // return underlays_exposed[state + dir + color] + // if("underlay_down") + // return underlays_down[state + dir + color] + // if("pipe_underlay_exposed") + // return pipe_underlays_exposed[state + dir + color] + // if("pipe_underlay_intact") + // return pipe_underlays_intact[state + dir + color] /datum/pipe_icon_manager/proc/check_icons() if(!pipe_icons) @@ -84,13 +87,14 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ gen_device_icons() if(!omni_icons) gen_omni_icons() - if(!underlays_intact || !underlays_down || !underlays_exposed || !pipe_underlays_exposed || !pipe_underlays_intact) + //if(!underlays_intact || !underlays_down || !underlays_exposed || !pipe_underlays_exposed || !pipe_underlays_intact) + if(!underlays) gen_underlay_icons() /datum/pipe_icon_manager/proc/gen_pipe_icons() if(!pipe_icons) pipe_icons = new() - + var/icon/pipe = new('icons/atmos/pipes.dmi') for(var/state in pipe.IconStates()) @@ -109,7 +113,7 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ /datum/pipe_icon_manager/proc/gen_manifold_icons() if(!manifold_icons) manifold_icons = new() - + var/icon/pipe = new('icons/atmos/manifold.dmi') for(var/state in pipe.IconStates()) @@ -118,7 +122,7 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ manifold_icons[state] = I continue - if(state == "core" || state == "4way") + if(findtext(state, "core") || findtext(state, "4way")) var/image/I = image('icons/atmos/manifold.dmi', icon_state = state) manifold_icons[state] = I for(var/pipe_color in pipe_colors) @@ -129,7 +133,7 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ /datum/pipe_icon_manager/proc/gen_device_icons() if(!device_icons) device_icons = new() - + var/icon/device device = new('icons/atmos/vent_pump.dmi') @@ -147,14 +151,37 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ /datum/pipe_icon_manager/proc/gen_omni_icons() if(!omni_icons) omni_icons = new() - + var/icon/omni = new('icons/atmos/omni_devices.dmi') - + for(var/state in omni.IconStates()) if(!state || findtext(state, "map")) continue omni_icons[state] = image('icons/atmos/omni_devices.dmi', icon_state = state) + +/datum/pipe_icon_manager/proc/gen_underlay_icons() + + if(!underlays) + underlays = new() + + var/icon/pipe = new('icons/atmos/pipe_underlays.dmi') + + for(var/state in pipe.IconStates()) + if(state == "") + continue + + var/cache_name = state + + for(var/D in cardinal) + var/image/I = image('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D) + underlays[cache_name + "[D]"] = I + for(var/pipe_color in pipe_colors) + I = image('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D) + I.color = pipe_colors[pipe_color] + underlays[state + "[D]" + "[pipe_colors[pipe_color]]"] = I + +/* /datum/pipe_icon_manager/proc/gen_underlay_icons() if(!underlays_intact) underlays_intact = new() @@ -168,11 +195,11 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ pipe_underlays_intact = new() var/icon/pipe = new('icons/atmos/pipe_underlays.dmi') - + for(var/state in pipe.IconStates()) if(state == "") continue - + for(var/D in cardinal) var/image/I = image('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D) switch(state) @@ -186,6 +213,26 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ pipe_underlays_exposed["[D]"] = I if("pipe_intact") pipe_underlays_intact["[D]"] = I + if("intact-supply") + underlays_intact["[D]"] = I + if("exposed-supply") + underlays_exposed["[D]"] = I + if("down-supply") + underlays_down["[D]"] = I + if("pipe_exposed-supply") + pipe_underlays_exposed["[D]"] = I + if("pipe_intact-supply") + pipe_underlays_intact["[D]"] = I + if("intact-scrubbers") + underlays_intact["[D]"] = I + if("exposed-scrubbers") + underlays_exposed["[D]"] = I + if("down-scrubbers") + underlays_down["[D]"] = I + if("pipe_exposed-scrubbers") + pipe_underlays_exposed["[D]"] = I + if("pipe_intact-scrubbers") + pipe_underlays_intact["[D]"] = I for(var/pipe_color in pipe_colors) I = image('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D) I.color = pipe_colors[pipe_color] @@ -199,4 +246,26 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_ if("pipe_exposed") pipe_underlays_exposed["[D]" + pipe_colors[pipe_color]] = I if("pipe_intact") - pipe_underlays_intact["[D]" + pipe_colors[pipe_color]] = I \ No newline at end of file + pipe_underlays_intact["[D]" + pipe_colors[pipe_color]] = I + if("intact-supply") + underlays_intact["[D]" + pipe_colors[pipe_color]] = I + if("exposed-supply") + underlays_exposed["[D]" + pipe_colors[pipe_color]] = I + if("down-supply") + underlays_down["[D]" + pipe_colors[pipe_color]] = I + if("pipe_exposed-supply") + pipe_underlays_exposed["[D]" + pipe_colors[pipe_color]] = I + if("pipe_intact-supply") + pipe_underlays_intact["[D]" + pipe_colors[pipe_color]] = I + if("intact-scrubbers") + underlays_intact["[D]" + pipe_colors[pipe_color]] = I + if("exposed-scrubbers") + underlays_exposed["[D]" + pipe_colors[pipe_color]] = I + if("down-scrubbers") + underlays_down["[D]" + pipe_colors[pipe_color]] = I + if("pipe_exposed-scrubbers") + pipe_underlays_exposed["[D]" + pipe_colors[pipe_color]] = I + if("pipe_intact-scrubbers") + pipe_underlays_intact["[D]" + pipe_colors[pipe_color]] = I + +*/ \ No newline at end of file diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index a33b79158e..43d7d0fe4c 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -16,19 +16,25 @@ Pipelines + Other Objects -> Pipe network power_channel = ENVIRON var/nodealert = 0 + layer = 2.4 //under wires with their 2.44 + + var/connect_types[] = list(1) //1=regular, 2=supply, 3=scrubber + var/connected_to = 1 //same as above, currently not used for anything + var/icon_connect_type = "" //"-supply" or "-scrubbers" + var/initialize_directions = 0 var/pipe_color - + var/global/datum/pipe_icon_manager/icon_manager /obj/machinery/atmospherics/New() if(!icon_manager) icon_manager = new() - + if(!pipe_color) pipe_color = color color = null - + if(!pipe_color_check(pipe_color)) pipe_color = null ..() @@ -38,14 +44,17 @@ Pipelines + Other Objects -> Pipe network return ..() -/obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction) +/obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) if(node) if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) - underlays += icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) + //underlays += icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) + underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else - underlays += icon_manager.get_atmos_icon("underlay_intact", direction, color_cache_name(node)) + //underlays += icon_manager.get_atmos_icon("underlay_intact", direction, color_cache_name(node)) + underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else - underlays += icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) + //underlays += icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) + underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "exposed" + icon_connect_type) /obj/machinery/atmospherics/proc/update_underlays() if(check_icon_cache()) @@ -53,20 +62,45 @@ Pipelines + Other Objects -> Pipe network else return 0 +obj/machinery/atmospherics/proc/check_connect_types(obj/machinery/atmospherics/atmos1, obj/machinery/atmospherics/atmos2) + var/i + var/list1[] = atmos1.connect_types + var/list2[] = atmos2.connect_types + for(i=1,i<=list1.len,i++) + var/j + for(j=1,j<=list2.len,j++) + if(list1[i] == list2[j]) + var/n = list1[i] + return n + return 0 + +obj/machinery/atmospherics/proc/check_connect_types_construction(obj/machinery/atmospherics/atmos1, obj/item/pipe/pipe2) + var/i + var/list1[] = atmos1.connect_types + var/list2[] = pipe2.connect_types + for(i=1,i<=list1.len,i++) + var/j + for(j=1,j<=list2.len,j++) + if(list1[i] == list2[j]) + var/n = list1[i] + return n + return 0 + + /obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0) if(!istype(icon_manager)) if(!safety) //to prevent infinite loops icon_manager = new() check_icon_cache(1) return 0 - + return 1 /obj/machinery/atmospherics/proc/color_cache_name(var/obj/machinery/atmospherics/node) //Don't use this for standard pipes if(!istype(node)) return null - + return node.pipe_color /obj/machinery/atmospherics/process() diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 52f57b2958..649972297a 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -67,13 +67,21 @@ obj/machinery/atmospherics/binary for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) if(target.initialize_directions & get_dir(target,src)) - node1 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) if(target.initialize_directions & get_dir(target,src)) - node2 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node2 = target + break update_icon() update_underlays() diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 5a64a517ca..eb5fbe7abe 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -28,7 +28,7 @@ /obj/machinery/atmospherics/omni/New() ..() icon_state = "base" - + ports = new() for(var/d in cardinal) var/datum/omni_port/new_port = new(src, d) @@ -44,7 +44,7 @@ if(new_port.mode > 0) initialize_directions |= d ports += new_port - + build_icons() /obj/machinery/atmospherics/omni/update_icon() @@ -173,7 +173,7 @@ if(ATM_O2 to ATM_N2O) ic_on += "_filter" ic_off += "_out" - + ic_on = icon_manager.get_atmos_icon("omni", , , ic_on) ic_off = icon_manager.get_atmos_icon("omni", , , ic_off) @@ -238,8 +238,12 @@ continue for(var/obj/machinery/atmospherics/target in get_step(src, P.dir)) if(target.initialize_directions & get_dir(target,src)) - P.node = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + P.node = target + break for(var/datum/omni_port/P in ports) P.update = 1 @@ -285,7 +289,7 @@ P.node = null P.update = 1 break - + update_ports() return null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 75d32718fa..4bfd61a0a2 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -81,8 +81,12 @@ for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) if(target.initialize_directions & get_dir(target,src)) - node = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node = target + break update_icon() update_underlays() @@ -123,7 +127,7 @@ if(reference==node) del(network) node = null - + update_underlays() return null diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 655e58ea38..822c9a4d6d 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -2,7 +2,7 @@ obj/machinery/atmospherics/trinary dir = SOUTH initialize_directions = SOUTH|NORTH|WEST use_power = 1 - + var/on = 0 var/datum/gas_mixture/air1 @@ -82,18 +82,29 @@ obj/machinery/atmospherics/trinary for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) if(target.initialize_directions & get_dir(target,src)) - node1 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) if(target.initialize_directions & get_dir(target,src)) - node2 = target - break - + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node2 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect)) if(target.initialize_directions & get_dir(target,src)) - node3 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node3 = target + break update_icon() update_underlays() @@ -163,7 +174,7 @@ obj/machinery/atmospherics/trinary else if(reference==node3) del(network3) node3 = null - + update_underlays() return null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index 603feb0294..a3555f5322 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -37,12 +37,12 @@ if(!istype(T)) return add_underlay(T, node1, turn(dir, -180)) - + if(istype(src, /obj/machinery/atmospherics/tvalve/mirrored)) add_underlay(T, node2, turn(dir, 90)) else add_underlay(T, node2, turn(dir, -90)) - + add_underlay(T, node3, dir) /obj/machinery/atmospherics/tvalve/hide(var/i) @@ -202,17 +202,29 @@ for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) if(target.initialize_directions & get_dir(target,src)) - node1 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) if(target.initialize_directions & get_dir(target,src)) - node2 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node2 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,node3_dir)) if(target.initialize_directions & get_dir(target,src)) - node3 = target - break - + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node3 = target + break + update_icon() update_underlays() @@ -407,7 +419,7 @@ if(target.initialize_directions & get_dir(target,src)) node3 = target break - + update_icon() update_underlays() diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index 2c5f63f607..8af26e51eb 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/unary dir = SOUTH initialize_directions = SOUTH - layer = TURF_LAYER+0.1 + //layer = TURF_LAYER+0.1 var/datum/gas_mixture/air_contents @@ -46,8 +46,12 @@ for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) if(target.initialize_directions & get_dir(target,src)) - node = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node = target + break update_icon() update_underlays() diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 7e409f859d..0a9eb3ce80 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -18,7 +18,9 @@ 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 pump is, in Watts. 7500 W ~ 10 HP - + + connect_types = list(1,2) //connects to regular and supply pipes + var/area/initial_loc level = 1 var/area_uid @@ -64,7 +66,7 @@ /obj/machinery/atmospherics/unary/vent_pump/New() ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP - + icon = null initial_loc = get_area(loc) if (initial_loc.master) @@ -87,13 +89,13 @@ air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 800 /obj/machinery/atmospherics/unary/vent_pump/update_icon(var/safety = 0) - if(!check_icon_cache()) + if(!check_icon_cache()) return if (!node) on = 0 overlays.Cut() - + var/vent_icon = "vent" var/turf/T = get_turf(src) @@ -102,7 +104,7 @@ if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) vent_icon += "h" - + if(welded) vent_icon += "weld" else if(!powered()) @@ -121,7 +123,10 @@ if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) return else - add_underlay(T, node, dir) + if(node) + add_underlay(T, node, dir, node.icon_connect_type) + else + add_underlay(T,, dir) /obj/machinery/atmospherics/unary/vent_pump/hide() update_icon() @@ -138,7 +143,7 @@ /obj/machinery/atmospherics/unary/vent_pump/process() ..() - + if (!node) on = 0 if(!can_pump()) @@ -150,27 +155,27 @@ var/datum/gas_mixture/environment = loc.return_air() var/power_draw = -1 - + //Figure out the target pressure difference var/pressure_delta = get_pressure_delta(environment) //src.visible_message("DEBUG >>> [src]: pressure_delta = [pressure_delta]") if((environment.temperature || air_contents.temperature) && pressure_delta > 0.5) - if(pump_direction) //internal -> external + 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) 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) - + //limit flow rate from turfs transfer_moles = min(transfer_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) if (power_draw < 0) @@ -182,13 +187,13 @@ last_power_draw = handle_power_draw(power_draw) if(network) network.update = 1 - + return 1 /obj/machinery/atmospherics/unary/vent_pump/proc/get_pressure_delta(datum/gas_mixture/environment) var/pressure_delta = DEFAULT_PRESSURE_DELTA var/environment_pressure = environment.return_pressure() - + if(pump_direction) //internal -> external if(pressure_checks & PRESSURE_CHECK_EXTERNAL) pressure_delta = min(pressure_delta, external_pressure_bound - environment_pressure) //increasing the pressure here @@ -199,7 +204,7 @@ pressure_delta = min(pressure_delta, environment_pressure - external_pressure_bound) //decreasing the pressure here if(pressure_checks & PRESSURE_CHECK_INTERNAL) pressure_delta = min(pressure_delta, internal_pressure_bound - air_contents.return_pressure()) //increasing the pressure here - + return pressure_delta //Radio remote control @@ -282,7 +287,7 @@ if(signal.data["checks_toggle"] != null) pressure_checks = (pressure_checks?0:3) - + if(signal.data["direction"] != null) pump_direction = text2num(signal.data["direction"]) @@ -325,7 +330,7 @@ if(signal.data["init"] != null) name = signal.data["init"] return - + if(signal.data["status"] != null) spawn(2) broadcast_status() diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 300a8a09ff..0e719addc9 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -9,6 +9,8 @@ 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 + connect_types = list(1,3) //connects to regular and scrubber pipes + level = 1 var/area/initial_loc @@ -29,7 +31,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/New() ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_FILTER - + icon = null initial_loc = get_area(loc) if (initial_loc.master) @@ -70,7 +72,10 @@ if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) return else - add_underlay(T, node, dir) + 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) @@ -130,7 +135,7 @@ 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, active_power_usage) else //Just siphon all air //limit flow rate from turfs @@ -145,14 +150,15 @@ last_flow_rate = 0 else last_power_draw = handle_power_draw(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)) @@ -186,7 +192,7 @@ scrubbing = !scrubbing var/list/toggle = list() - + 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"]) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 75282275eb..a57458d2e0 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -163,15 +163,23 @@ for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) if(target.initialize_directions & get_dir(target,src)) - node1 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) if(target.initialize_directions & get_dir(target,src)) - node2 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node2 = target + break build_network() - + update_icon() update_underlays() @@ -230,7 +238,7 @@ name = "digital valve" desc = "A digitally controlled valve." icon = 'icons/atmos/digital_valve.dmi' - + var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index ea031592da..9d5d0c91ed 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -6,7 +6,7 @@ var/volume = 0 force = 20 - layer = 2.4 //under wires with their 2.44 + //layer = 2.4 //under wires with their 2.44 use_power = 0 var/alert_pressure = 80*ONE_ATMOSPHERE @@ -105,6 +105,7 @@ pipe_color = new_color update_icon() +/* /obj/machinery/atmospherics/pipe/add_underlay(var/obj/machinery/atmospherics/node, var/direction) if(istype(src, /obj/machinery/atmospherics/pipe/tank)) //todo: move tanks to unary devices return ..() @@ -117,6 +118,7 @@ underlays += icon_manager.get_atmos_icon("pipe_underlay_exposed", direction, pipe_color) else return null +*/ /obj/machinery/atmospherics/pipe/color_cache_name(var/obj/machinery/atmospherics/node) if(istype(src, /obj/machinery/atmospherics/pipe/tank)) @@ -134,7 +136,7 @@ /obj/machinery/atmospherics/pipe/simple icon = 'icons/atmos/pipes.dmi' - icon_state = "" + icon_state = "" name = "pipe" desc = "A one meter section of regular pipe" @@ -253,9 +255,9 @@ del(meter) del(src) else if(node1 && node2) - overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "intact") + overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "intact" + icon_connect_type) else - overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "exposed[node1?1:0][node2?1:0]") + overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "exposed[node1?1:0][node2?1:0]" + icon_connect_type) /obj/machinery/atmospherics/pipe/simple/update_underlays() return @@ -274,12 +276,20 @@ for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) if(target.initialize_directions & get_dir(target,src)) - node1 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) if(target.initialize_directions & get_dir(target,src)) - node2 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node2 = target + break if(!node1 && !node2) del(src) @@ -305,16 +315,26 @@ return null -/obj/machinery/atmospherics/pipe/simple/visible - icon_state = "intact" +/obj/machinery/atmospherics/pipe/simple/visible + icon_state = "intact" level = 2 /obj/machinery/atmospherics/pipe/simple/visible/scrubbers name = "Scrubbers pipe" + desc = "A one meter section of scrubbers pipe" + icon = 'icons/obj/pipes_scrubbers.dmi' + connect_types = list(3) + layer = 2.38 + icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED /obj/machinery/atmospherics/pipe/simple/visible/supply name = "Air supply pipe" + desc = "A one meter section of supply pipe" + icon = 'icons/obj/pipes_supply.dmi' + connect_types = list(2) + layer = 2.39 + icon_connect_type = "-supply" color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/simple/visible/yellow @@ -329,19 +349,131 @@ /obj/machinery/atmospherics/pipe/simple/visible/purple color = PIPE_COLOR_PURPLE -/obj/machinery/atmospherics/pipe/simple/hidden - icon_state = "intact" +/obj/machinery/atmospherics/pipe/simple/hidden + icon_state = "intact" level = 1 alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers name = "Scrubbers pipe" + desc = "A one meter section of scrubbers pipe" + icon = 'icons/obj/pipes_scrubbers.dmi' + connect_types = list(3) + layer = 2.38 + icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED /obj/machinery/atmospherics/pipe/simple/hidden/supply name = "Air supply pipe" + desc = "A one meter section of supply pipe" + icon = 'icons/obj/pipes_supply.dmi' + connect_types = list(2) + layer = 2.39 + icon_connect_type = "-supply" color = PIPE_COLOR_BLUE + +/obj/machinery/atmospherics/pipe/simple/visible/universal + name="Universal pipe adapter" + desc = "An adapter for regular, supply and scrubbers pipes" + connect_types = list(1,2,3) + icon_state = "map_universal" + +/obj/machinery/atmospherics/pipe/simple/visible/universal/update_icon(var/safety = 0) + if(!check_icon_cache()) + return + + alpha = 255 + + overlays.Cut() + overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") + underlays.Cut() + + if (node1) + universal_underlays(node1) + if(node2) + universal_underlays(node2) + else + var/node1_dir = get_dir(node1,src) + universal_underlays(,node1_dir) + else if (node2) + universal_underlays(node2) + else + universal_underlays(,dir) + universal_underlays(dir, -180) + +/obj/machinery/atmospherics/pipe/simple/visible/universal/update_underlays() + ..() + update_icon() + + + +/obj/machinery/atmospherics/pipe/simple/hidden/universal + name="Universal pipe adapter" + desc = "An adapter for regular, supply and scrubbers pipes" + connect_types = list(1,2,3) + icon_state = "map_universal" + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0) + if(!check_icon_cache()) + return + + alpha = 255 + + overlays.Cut() + overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") + underlays.Cut() + + if (node1) + universal_underlays(node1) + if(node2) + universal_underlays(node2) + else + var/node2_dir = turn(get_dir(src,node1),-180) + universal_underlays(,node2_dir) + else if (node2) + universal_underlays(node2) + var/node1_dir = turn(get_dir(src,node2),-180) + universal_underlays(,node1_dir) + else + universal_underlays(,dir) + universal_underlays(,turn(dir, -180)) + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/update_underlays() + ..() + update_icon() + +/obj/machinery/atmospherics/proc/universal_underlays(var/obj/machinery/atmospherics/node, var/direction) + var/turf/T = loc + if(node) + var/node_dir = get_dir(src,node) + if(node.icon_connect_type == "-supply") + add_underlay_adapter(T, , node_dir, "") + add_underlay_adapter(T, node, node_dir, "-supply") + add_underlay_adapter(T, , node_dir, "-scrubbers") + else if (node.icon_connect_type == "-scrubbers") + add_underlay_adapter(T, , node_dir, "") + add_underlay_adapter(T, , node_dir, "-supply") + add_underlay_adapter(T, node, node_dir, "-scrubbers") + else + add_underlay_adapter(T, node, node_dir, "") + add_underlay_adapter(T, , node_dir, "-supply") + add_underlay_adapter(T, , node_dir, "-scrubbers") + else + add_underlay_adapter(T, , direction, "-supply") + add_underlay_adapter(T, , direction, "-scrubbers") + add_underlay_adapter(T, , direction, "") + +/obj/machinery/atmospherics/proc/add_underlay_adapter(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) //modified from add_underlay, does not make exposed underlays + if(node) + if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) + else + underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) + else + underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) + + /obj/machinery/atmospherics/pipe/simple/hidden/yellow color = PIPE_COLOR_YELLOW @@ -368,8 +500,8 @@ /obj/machinery/atmospherics/pipe/manifold - icon = 'icons/atmos/manifold.dmi' - icon_state = "" + icon = 'icons/atmos/manifold.dmi' + icon_state = "" name = "pipe manifold" desc = "A manifold composed of regular pipes" @@ -470,19 +602,25 @@ del(src) else overlays.Cut() - overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "core") - overlays += icon_manager.get_atmos_icon("manifold", , , "clamps") + overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "core" + icon_connect_type) + overlays += icon_manager.get_atmos_icon("manifold", , , "clamps" + icon_connect_type) underlays.Cut() + var/turf/T = get_turf(src) var/list/directions = list(NORTH, SOUTH, EAST, WEST) + var/node1_direction = get_dir(src, node1) + var/node2_direction = get_dir(src, node2) + var/node3_direction = get_dir(src, node3) + directions -= dir - directions -= add_underlay(node1) - directions -= add_underlay(node2) - directions -= add_underlay(node3) + directions -= add_underlay(T,node1,node1_direction,icon_connect_type) + directions -= add_underlay(T,node2,node2_direction,icon_connect_type) + directions -= add_underlay(T,node3,node3_direction,icon_connect_type) for(var/D in directions) - add_underlay(,D) + add_underlay(T,,D,icon_connect_type) + /obj/machinery/atmospherics/pipe/manifold/update_underlays() ..() @@ -495,9 +633,13 @@ if(direction&connect_directions) for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) - node1 = target - connect_directions &= ~direction - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + connect_directions &= ~direction + break if (node1) break @@ -506,9 +648,13 @@ if(direction&connect_directions) for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) - node2 = target - connect_directions &= ~direction - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node2 = target + connect_directions &= ~direction + break if (node2) break @@ -517,9 +663,13 @@ if(direction&connect_directions) for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) - node3 = target - connect_directions &= ~direction - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node3 = target + connect_directions &= ~direction + break if (node3) break @@ -529,15 +679,25 @@ update_icon() /obj/machinery/atmospherics/pipe/manifold/visible - icon_state = "map" + icon_state = "map" level = 2 /obj/machinery/atmospherics/pipe/manifold/visible/scrubbers - name = "Scrubbers pipe" + name="Scrubbers pipe manifold" + desc = "A manifold composed of scrubbers pipes" + icon_state = "map-scrubbers" + connect_types = list(3) + layer = 2.38 + icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED /obj/machinery/atmospherics/pipe/manifold/visible/supply - name = "Air supply pipe" + name="Air supply pipe manifold" + desc = "A manifold composed of supply pipes" + icon_state = "map-supply" + connect_types = list(2) + layer = 2.39 + icon_connect_type = "-supply" color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/manifold/visible/yellow @@ -553,16 +713,26 @@ color = PIPE_COLOR_PURPLE /obj/machinery/atmospherics/pipe/manifold/hidden - icon_state = "map" + icon_state = "map" level = 1 alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers - name = "Scrubbers pipe" + name="Scrubbers pipe manifold" + desc = "A manifold composed of scrubbers pipes" + icon_state = "map-scrubbers" + connect_types = list(3) + layer = 2.38 + icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED /obj/machinery/atmospherics/pipe/manifold/hidden/supply - name = "Air supply pipe" + name="Air supply pipe manifold" + desc = "A manifold composed of supply pipes" + icon_state = "map-supply" + connect_types = list(2) + layer = 2.39 + icon_connect_type = "-supply" color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/manifold/hidden/yellow @@ -578,8 +748,8 @@ color = PIPE_COLOR_PURPLE /obj/machinery/atmospherics/pipe/manifold4w - icon = 'icons/atmos/manifold.dmi' - icon_state = "" + icon = 'icons/atmos/manifold.dmi' + icon_state = "" name = "4-way pipe manifold" desc = "A manifold composed of regular pipes" @@ -675,12 +845,14 @@ del(src) else overlays.Cut() - overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "4way") - overlays += icon_manager.get_atmos_icon("manifold", , , "clamps_4way") + overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "4way" + icon_connect_type) + overlays += icon_manager.get_atmos_icon("manifold", , , "clamps_4way" + icon_connect_type) underlays.Cut() + /* var/list/directions = list(NORTH, SOUTH, EAST, WEST) + directions -= add_underlay(node1) directions -= add_underlay(node2) directions -= add_underlay(node3) @@ -688,6 +860,25 @@ for(var/D in directions) add_underlay(,D) + */ + + var/turf/T = get_turf(src) + var/list/directions = list(NORTH, SOUTH, EAST, WEST) + var/node1_direction = get_dir(src, node1) + var/node2_direction = get_dir(src, node2) + var/node3_direction = get_dir(src, node3) + var/node4_direction = get_dir(src, node4) + + directions -= dir + + directions -= add_underlay(T,node1,node1_direction,icon_connect_type) + directions -= add_underlay(T,node2,node2_direction,icon_connect_type) + directions -= add_underlay(T,node3,node3_direction,icon_connect_type) + directions -= add_underlay(T,node4,node4_direction,icon_connect_type) + + for(var/D in directions) + add_underlay(T,,D,icon_connect_type) + /obj/machinery/atmospherics/pipe/manifold4w/update_underlays() ..() @@ -702,39 +893,65 @@ for(var/obj/machinery/atmospherics/target in get_step(src,1)) if(target.initialize_directions & 2) - node1 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,2)) if(target.initialize_directions & 1) - node2 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node2 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,4)) if(target.initialize_directions & 8) - node3 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node3 = target + break for(var/obj/machinery/atmospherics/target in get_step(src,8)) if(target.initialize_directions & 4) - node4 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node4 = target + break var/turf/T = get_turf(src) if(istype(T)) hide(T.intact) update_icon() -/obj/machinery/atmospherics/pipe/manifold4w/visible - icon_state = "map_4way" +/obj/machinery/atmospherics/pipe/manifold4w/visible + icon_state = "map_4way" level = 2 /obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers - name = "Scrubbers pipe" + name="4-way scrubbers pipe manifold" + desc = "A manifold composed of scrubbers pipes" + icon_state = "map_4way-scrubbers" + connect_types = list(3) + layer = 2.38 + icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED /obj/machinery/atmospherics/pipe/manifold4w/visible/supply - name = "Air supply pipe" + name="4-way air supply pipe manifold" + desc = "A manifold composed of supply pipes" + icon_state = "map_4way-supply" + connect_types = list(2) + layer = 2.39 + icon_connect_type = "-supply" color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/manifold4w/visible/yellow @@ -749,17 +966,27 @@ /obj/machinery/atmospherics/pipe/manifold4w/visible/purple color = PIPE_COLOR_PURPLE -/obj/machinery/atmospherics/pipe/manifold4w/hidden - icon_state = "map_4way" +/obj/machinery/atmospherics/pipe/manifold4w/hidden + icon_state = "map_4way" level = 1 alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers - name = "Scrubbers pipe" + name="4-way scrubbers pipe manifold" + desc = "A manifold composed of scrubbers pipes" + icon_state = "map_4way-scrubbers" + connect_types = list(3) + layer = 2.38 + icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply - name = "Air supply pipe" + name="4-way air supply pipe manifold" + desc = "A manifold composed of supply pipes" + icon_state = "map_4way-supply" + connect_types = list(2) + layer = 2.39 + icon_connect_type = "-supply" color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/manifold4w/hidden/yellow @@ -839,8 +1066,12 @@ /obj/machinery/atmospherics/pipe/cap/initialize() for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) - node = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node = target + break var/turf/T = src.loc // hide if turf is not intact hide(T.intact) @@ -907,8 +1138,12 @@ for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) if(target.initialize_directions & get_dir(target,src)) - node1 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + break update_underlays() @@ -1088,8 +1323,12 @@ for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) if(target.initialize_directions & get_dir(target,src)) - node1 = target - break + var/c = check_connect_types(target,src) + if (c) + target.connected_to = c + src.connected_to = c + node1 = target + break update_icon() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 421ad9a9bb..5ebbe54410 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -32,6 +32,16 @@ Buildable meters #define PIPE_GAS_MIXER_M 25 #define PIPE_OMNI_MIXER 26 #define PIPE_OMNI_FILTER 27 +///// Supply, scrubbers and universal pipes +#define PIPE_UNIVERSAL 28 +#define PIPE_SUPPLY_STRAIGHT 29 +#define PIPE_SUPPLY_BENT 30 +#define PIPE_SCRUBBERS_STRAIGHT 31 +#define PIPE_SCRUBBERS_BENT 32 +#define PIPE_SUPPLY_MANIFOLD 33 +#define PIPE_SCRUBBERS_MANIFOLD 34 +#define PIPE_SUPPLY_MANIFOLD4W 35 +#define PIPE_SCRUBBERS_MANIFOLD4W 36 /obj/item/pipe name = "pipe" @@ -39,6 +49,7 @@ Buildable meters var/pipe_type = 0 //var/pipe_dir = 0 var/pipename + var/connect_types[] = list(1) //1=regular, 2=supply, 3=scrubber force = 7 icon = 'icons/obj/pipe-item.dmi' icon_state = "simple" @@ -64,10 +75,29 @@ Buildable meters src.pipe_type = PIPE_HE_STRAIGHT + is_bent else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/insulated)) src.pipe_type = PIPE_INSULATED_STRAIGHT + is_bent + else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/visible/supply) || istype(make_from, /obj/machinery/atmospherics/pipe/simple/hidden/supply)) + src.pipe_type = PIPE_SUPPLY_STRAIGHT + is_bent + connect_types = list(2) + src.color = PIPE_COLOR_BLUE + else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/visible/scrubbers) || istype(make_from, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers)) + src.pipe_type = PIPE_SCRUBBERS_STRAIGHT + is_bent + connect_types = list(3) + src.color = PIPE_COLOR_RED + else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/visible/universal) || istype(make_from, /obj/machinery/atmospherics/pipe/simple/hidden/universal)) + src.pipe_type = PIPE_UNIVERSAL + connect_types = list(1,2,3) else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple)) src.pipe_type = PIPE_SIMPLE_STRAIGHT + is_bent else if(istype(make_from, /obj/machinery/atmospherics/portables_connector)) src.pipe_type = PIPE_CONNECTOR + else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold/visible/supply) || istype(make_from, /obj/machinery/atmospherics/pipe/manifold/hidden/supply)) + src.pipe_type = PIPE_SUPPLY_MANIFOLD + connect_types = list(2) + src.color = PIPE_COLOR_BLUE + else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold/visible/scrubbers) || istype(make_from, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers)) + src.pipe_type = PIPE_SCRUBBERS_MANIFOLD + connect_types = list(3) + src.color = PIPE_COLOR_RED else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold)) src.pipe_type = PIPE_MANIFOLD else if(istype(make_from, /obj/machinery/atmospherics/unary/vent_pump)) @@ -96,6 +126,14 @@ Buildable meters src.pipe_type = PIPE_HEAT_EXCHANGE else if(istype(make_from, /obj/machinery/atmospherics/tvalve)) src.pipe_type = PIPE_MTVALVE + else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w/visible/supply) || istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply)) + src.pipe_type = PIPE_SUPPLY_MANIFOLD4W + connect_types = list(2) + src.color = PIPE_COLOR_BLUE + else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers) || istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers)) + src.pipe_type = PIPE_SCRUBBERS_MANIFOLD4W + connect_types = list(3) + src.color = PIPE_COLOR_RED else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w)) src.pipe_type = PIPE_MANIFOLD4W else if(istype(make_from, /obj/machinery/atmospherics/pipe/cap)) @@ -113,6 +151,14 @@ Buildable meters else src.pipe_type = pipe_type src.dir = dir + if (pipe_type == 29 || pipe_type == 30 || pipe_type == 33 || pipe_type == 35) + connect_types = list(2) + src.color = PIPE_COLOR_BLUE + else if (pipe_type == 31 || pipe_type == 32 || pipe_type == 34 || pipe_type == 36) + connect_types = list(3) + src.color = PIPE_COLOR_RED + else if (pipe_type == 28) + connect_types = list(1,2,3) //src.pipe_dir = get_pipe_dir() update() src.pixel_x = rand(-5, 5) @@ -151,7 +197,17 @@ Buildable meters "gas mixer t", \ "gas mixer m", \ "omni mixer", \ - "omni filter" + "omni filter", \ +///// Supply and scrubbers pipes + "universal pipe adapter", \ + "supply pipe", \ + "bent supply pipe", \ + "scrubbers pipe", \ + "bent scrubbers pipe", \ + "supply manifold", \ + "scrubbers manifold", \ + "supply 4-way manifold", \ + "scrubbers 4-way manifold", \ ) name = nlist[pipe_type+1] + " fitting" var/list/islist = list( \ @@ -184,7 +240,17 @@ Buildable meters "t_mixer", \ "m_mixer", \ "omni_mixer", \ - "omni_filter" + "omni_filter", \ +///// Supply and scrubbers pipes + "universal", \ + "simple", \ + "simple", \ + "simple", \ + "simple", \ + "manifold", \ + "manifold", \ + "manifold4w", \ + "manifold4w", \ ) icon_state = islist[pipe_type + 1] @@ -208,22 +274,22 @@ Buildable meters src.dir = turn(src.dir, -90) - if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) + if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) if(dir==2) dir = 1 else if(dir==8) dir = 4 - else if (pipe_type == PIPE_MANIFOLD4W) + else if (pipe_type in list (PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W)) dir = 2 //src.pipe_dir = get_pipe_dir() return /obj/item/pipe/Move() ..() - if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \ + if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \ && (src.dir in cardinal)) src.dir = src.dir|turn(src.dir, 90) - else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) + else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) if(dir==2) dir = 1 else if(dir==8) @@ -247,16 +313,19 @@ Buildable meters PIPE_PUMP ,\ PIPE_VOLUME_PUMP ,\ PIPE_PASSIVE_GATE ,\ - PIPE_MVALVE \ + PIPE_MVALVE, \ + PIPE_SUPPLY_STRAIGHT, \ + PIPE_SCRUBBERS_STRAIGHT, \ + PIPE_UNIVERSAL, \ ) return dir|flip - if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT) + if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT) return dir //dir|acw if(PIPE_CONNECTOR,PIPE_UVENT,PIPE_SCRUBBER,PIPE_HEAT_EXCHANGE) return dir - if(PIPE_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER) + if(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER) return dir|flip|cw|acw - if(PIPE_MANIFOLD) + if(PIPE_MANIFOLD, PIPE_SUPPLY_MANIFOLD, PIPE_SCRUBBERS_MANIFOLD) return flip|cw|acw if(PIPE_GAS_FILTER, PIPE_GAS_MIXER,PIPE_MTVALVE) return dir|flip|cw @@ -314,18 +383,18 @@ Buildable meters return ..() if (!isturf(src.loc)) return 1 - if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) + if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) if(dir==2) dir = 1 else if(dir==8) dir = 4 - else if (pipe_type in list(PIPE_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER)) + else if (pipe_type in list(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER)) dir = 2 var/pipe_dir = get_pipe_dir() for(var/obj/machinery/atmospherics/M in src.loc) - if(M.initialize_directions & pipe_dir) // matches at least one direction on either type of pipe - user << "\red There is already a pipe at that location." + if((M.initialize_directions & pipe_dir) && M.check_connect_types_construction(M,src)) // matches at least one direction on either type of pipe & same connection type + user << "\red There is already a pipe of the same type at this location." return 1 // no conflicts found @@ -351,6 +420,63 @@ Buildable meters P.node2.initialize() P.node2.build_network() + if(PIPE_SUPPLY_STRAIGHT, PIPE_SUPPLY_BENT) + var/obj/machinery/atmospherics/pipe/simple/hidden/supply/P = new( src.loc ) + P.color = color + P.dir = src.dir + P.initialize_directions = pipe_dir + var/turf/T = P.loc + P.level = T.intact ? 2 : 1 + P.initialize() + if (!P) + usr << pipefailtext + return 1 + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() + + if(PIPE_SCRUBBERS_STRAIGHT, PIPE_SCRUBBERS_BENT) + var/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers/P = new( src.loc ) + P.color = color + P.dir = src.dir + P.initialize_directions = pipe_dir + var/turf/T = P.loc + P.level = T.intact ? 2 : 1 + P.initialize() + if (!P) + usr << pipefailtext + return 1 + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() + + if(PIPE_UNIVERSAL) + var/obj/machinery/atmospherics/pipe/simple/hidden/universal/P = new( src.loc ) + P.color = color + P.dir = src.dir + P.initialize_directions = pipe_dir + var/turf/T = P.loc + P.level = T.intact ? 2 : 1 + P.initialize() + if (!P) + usr << pipefailtext + return 1 + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() + if(PIPE_HE_STRAIGHT, PIPE_HE_BENT) var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/P = new ( src.loc ) P.dir = src.dir @@ -408,6 +534,52 @@ Buildable meters M.node3.initialize() M.node3.build_network() + if(PIPE_SUPPLY_MANIFOLD) //manifold + var/obj/machinery/atmospherics/pipe/manifold/hidden/supply/M = new( src.loc ) + M.color = color + M.dir = dir + M.initialize_directions = pipe_dir + //M.New() + var/turf/T = M.loc + M.level = T.intact ? 2 : 1 + M.initialize() + if (!M) + usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + return 1 + M.build_network() + if (M.node1) + M.node1.initialize() + M.node1.build_network() + if (M.node2) + M.node2.initialize() + M.node2.build_network() + if (M.node3) + M.node3.initialize() + M.node3.build_network() + + if(PIPE_SCRUBBERS_MANIFOLD) //manifold + var/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers/M = new( src.loc ) + M.color = color + M.dir = dir + M.initialize_directions = pipe_dir + //M.New() + var/turf/T = M.loc + M.level = T.intact ? 2 : 1 + M.initialize() + if (!M) + usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + return 1 + M.build_network() + if (M.node1) + M.node1.initialize() + M.node1.build_network() + if (M.node2) + M.node2.initialize() + M.node2.build_network() + if (M.node3) + M.node3.initialize() + M.node3.build_network() + if(PIPE_MANIFOLD4W) //4-way manifold var/obj/machinery/atmospherics/pipe/manifold4w/M = new( src.loc ) M.pipe_color = color @@ -434,6 +606,60 @@ Buildable meters M.node4.initialize() M.node4.build_network() + if(PIPE_SUPPLY_MANIFOLD4W) //4-way manifold + var/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply/M = new( src.loc ) + M.color = color + M.dir = dir + M.initialize_directions = pipe_dir + M.connect_types = src.connect_types + //M.New() + var/turf/T = M.loc + M.level = T.intact ? 2 : 1 + M.initialize() + if (!M) + usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + return 1 + M.build_network() + if (M.node1) + M.node1.initialize() + M.node1.build_network() + if (M.node2) + M.node2.initialize() + M.node2.build_network() + if (M.node3) + M.node3.initialize() + M.node3.build_network() + if (M.node4) + M.node4.initialize() + M.node4.build_network() + + if(PIPE_SCRUBBERS_MANIFOLD4W) //4-way manifold + var/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers/M = new( src.loc ) + M.color = color + M.dir = dir + M.initialize_directions = pipe_dir + M.connect_types = src.connect_types + //M.New() + var/turf/T = M.loc + M.level = T.intact ? 2 : 1 + M.initialize() + if (!M) + usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + return 1 + M.build_network() + if (M.node1) + M.node1.initialize() + M.node1.build_network() + if (M.node2) + M.node2.initialize() + M.node2.build_network() + if (M.node3) + M.node3.initialize() + M.node3.build_network() + if (M.node4) + M.node4.initialize() + M.node4.build_network() + if(PIPE_JUNCTION) var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/P = new ( src.loc ) P.dir = src.dir @@ -818,4 +1044,11 @@ Buildable meters #undef PIPE_GAS_FILTER_M #undef PIPE_GAS_MIXER_T #undef PIPE_GAS_MIXER_M +#undef PIPE_SUPPLY_STRAIGHT +#undef PIPE_SUPPLY_BENT +#undef PIPE_SCRUBBERS_STRAIGHT +#undef PIPE_SCRUBBERS_BENT +#undef PIPE_SUPPLY_MANIFOLD +#undef PIPE_SCRUBBERS_MANIFOLD +#undef PIPE_UNIVERSAL //#undef PIPE_MANIFOLD4W diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index fd61f30471..9f86d55ce2 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -25,7 +25,18 @@ Manual T-Valve
upward Pipe
downward Pipe
+Supply pipes:
+Pipe
+Bent Pipe
+Manifold
+4-Way Manifold
+Scrubbers pipes:
+Pipe
+Bent Pipe
+Manifold
+4-Way Manifold
Devices:
+Universal pipe adapter
Connector
Unary Vent
Gas Pump
diff --git a/icons/atmos/manifold.dmi b/icons/atmos/manifold.dmi index f6b24341c9a04ce1762668022902385e95dace35..b7c5d0a2f14018483b6aad036b062a2c56926ff8 100644 GIT binary patch delta 1966 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 delta 953 zcmV;q14jI|5XlH3iBL{Q4GJ0x0000DNk~Le0001h0001h2m=5B0QBII`H>-@e~Wrl zSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1*^ zNsYQ3WDos+fB+_z3qZDq{u7-|xd3E)=s(v5^${R@=s(vb8GvjL{a23Le*t6<{a3oC zz5~b}`mbiUTmZlx`cGze++_&tp?|Z52mskb|DQg8`8p>8K=#moh#fG$n45(w?ibxU z&irH@>RWp$fM)1lSv#HD9cF24TetV-!EE15({yT6+t=-5D(Yg3uCKRcE9tf^ zALTpYz+N>?lW+2>O5V)7sXCf&&6Dm$o+nAt^z?--?E>f^fKz+n=n>fKoW07_cf0-} zUB|2r3BCiB%fM&M>5w=5EIMFyNaCL4UprEVbWb#3i#gpRfEt{Df72nklb`EZ9kO|q zw~*B#xsx9%Ssl{-o{J7x9kS8#jfB-9Z1&4$-;qcp68R4ZT_HKt2V{G}gJ*p}2w-0y z5cFMrK(zO$4+sJ5^M6YBs1FDM?CS&Pb-Sw%h`L98KnP%8A2_e?>jScm>jT08h~U|A zBoc{4BEbn>VE6z5e~@)PJ^*gMfQFqf_yYlO^93~Qd;uQ-IbXmBK+YG?u=52p!Jqr- z`2a-d%xA1VfaVL1j+~p`I`9s3HC`V;^94uN%fksC&IAB-HJ<;Y`GF(r)!_u|GXVfy zjpzTT^8thY|BLihh!=>9(+0NMX%q5J}{X-GX#55#Dv00000NkvXXu0mjfdu-8H diff --git a/icons/atmos/pipe_underlays.dmi b/icons/atmos/pipe_underlays.dmi index 0edf79e50089a24171b85badc8f3cf57a856f236..f6f38a9a7d7a7171d2b162c30211f444faaf5faa 100644 GIT binary patch delta 2465 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 SHl6?g002ovPDHLkU;%>ohSbIY diff --git a/icons/atmos/pipes.dmi b/icons/atmos/pipes.dmi index 019be28ffd8a7a70de8e4cffc0ecfd4c89a1c55b..08b267c6d0feba53eacb74763134fbcb4093f99d 100644 GIT binary patch literal 3578 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 delta 1339 zcmZ8he>l^593QntOOsrFjJ_@Xpj%Dd5AL3wuc1RZDZ9HIA&OjnEGj&6zSc;hCOL9Z z#D!vd)|Sy`6J6cvG33cT;s~SCO!IS_@Aq@-xxeoIc)#DT_v`(<-mmvxZ#}t;h~xzY z`dX~EUyZ}zEd2d^4jF6Z$1q!A%#wAbkg+5M1u*x@<#GoHhmepEfk2R#mj^+RNF?HN zxk91v{Q2|t_V&%q%`Gi0c6N5*;o)Mjn8{?ewzf(n5~)L+g0Z1=t!YZ7z{>eXlQP3ZgzIIpP!%6Or!k$n$g?j^r66Doae+}F~%n2 zO3Nt(SGw;w{zus6UZ_dx{GKar;YM{?oGfZT#7NMSmZc#q=}MS(%=kbc&7hWV?T_pomyJ zJJJ{Dyew$&ZNsBgU|5i=v6?|T9Jh_s}O81Ec(Z>aUXeIwVwb|2RKAeP_z#M9QT7;@lET^ILlGMCw)rd$y@_@TSXzQd@QmDGXJ% z8cH@M)#P5!-~026wfS0Xne3wZ(vsw4qkWJtm5>mijTvbCa9UQk9_c_16m3v(b*Ww+ zpPk%pW0t(Z9lTVKE6ed+!vkUT{#!84lFv6kUiCh(iunfTDz65Fv{kvG`RyD<$RY_hWf z9v}(2v4gKbPiA4x0&f80EpVwqq;CNcLdUAm>Ia}2-9%JFA{0^+LQa4>H8=r3O`g^7 zvdSy$&UF2}0+M_%y-ucCilH-694ai3PYIL-3f}{Z-+?p{P!6C+*C^QRER-9Jj?H5- zC0f0lLFmBXmk1oL2G0c1cxR0|vKu_n`&I$XQe>qhB2or;^SsfQS9_-6>=TQSm(W0> z44}D|YRvn>SwN{_ceo&tJ15)Cu`BTYncI1OTfCBIO|=AT+kPmet_l9OcJuuFlbK^p zQp|Q?F|G;zK?A(&76GNt04(33$OTIjp(5=D@b#LRoI@KWpeZ`3QQUS|!CeH7pW>$S zbLeSc_$Ub3#;28NkzNoh*GCoew&~%LH{kFs5S@qdw(4bm}*FMDD-QVlSM*dH%3!5g;0#`YQC56*vYpwCLaSLC^W07{m?3;+NC diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index b8e9bee2804945a6f3a37708d1b849af50de3990..2fa39fec047240b45cf2935f19265cb76f240631 100644 GIT binary patch delta 2249 zcmV;)2sZbq!2yZJ0gxnr7kX4!bVOxyV{&P5bZKvH004NLjgql$0x=AR=ewt{U~W}f zhAy{Mhbjhm1r%~V&M0wCi4)ql?@(1#Eyx)oee(bNbC&S7dEf4#-)-B1F;QUXVEy>i zHWwOXf(~Au+h#&KP4fLnVg#XsMIt{tT(r$VF+m5fZ8JvWF+m4^t1C9?hz-nWCB!Sa zzD;_=GzK@Q;5oAu3ao;;Ad8+`j4P;ObM~_eB^&eci2Aa`DLW%Lr~*C8?|G}+)JRS+ z9&BKV!ByhA8v3Z9W|I;XJQ>j~mf*6-Dwh*xHt|z0DRl?@`Csdcs>d3=o;CBssD~aZ zRm-7Hwy)%ZXZn{SeP`X^nf{KwgJ!0JF&THSz!En59{Sz3{Q|tROk8Iz-uSaT0UAI8 zAON#iK`0u3XUy70622)@(MdHUO2r3r1Pr_UA8q z2rZ9%XC=pqb45$&QWnPg-dU{wR)vGD+6_JCRX z*!S;3pL+~qFH^} z?tt07ce~x#5EJ<+v=QUt;sP!&FX80m1dfl7mGh6c4ea~J*2m`e@8600SIs}(Hht{x z|NQ(Mj*pLFc6JsnFE8V$a+89|?_aoo2uBc;0t>iL5E#&J2ZA67B**|01VJD{2ACiS z0tw+F9QH;4Y<&^wl-?>#Zw$cJCkVnk0|r=UCr**Ah%aBh?CTgoZ2c@27Z;&ctHJ8( zDm;Gt7;3c|92^|L`}gnTbL@W`VCxeEVHT+ynrt6>wOWP4!$UYcJRCSKdry&nxDMF* zJpAah*XzZ8kG)Vu7uHF9O@>+1Agy=%*s@bO^RSLAaoBPB=a-v+KNQnEJl& zXP$4j+heWI8$MG;J_v%iT$Lfj)+Y#;6i#J}nUoSs-}imU^3Y({*fPSd^y~FH%*@O{ z5CjP$s51TxUOxx|sMqTN0NUOe*!l$F3ZVhs+}wm}wW@rxZZ_o2&COhYmBQ9nVawZM zRP-yA3iNut#4+CZi(LNrW9d$yQmKrUK0&xbxD#$=WhIgJBn(6Nb9Po*NcwyjhH={N zqobqTsY-P9!!U%|yLW}hhtbc18S_%9lz8#yY~n&c2m*Nf_O0+-r_+IIwF;j;eM-Et z+yH|h$mNxRtxpiHP;Nzke)jBH=Ffc5G(fZ2gr%jWOrxC#Hs`BT9;?rl#4}=8Sm(e; zk=xqZGH&QG_3QOIG#U+PG#Wy~RVtO>&Ye4nmuU3Oe*Ux9xabpvD>CPR!!QH@h!?y7 zAYp9N#+O~s_a*Ht#P#AA<`~21Pb#8+DS$M(VH}J6{KwWO z2v=kpV9`RC%=ohF8SMPOLo9qWn@xE1=n?Gg?IrY>P8f#puGNBHr>F68cHO=E_hD~u zPnyA&kn`cg2h_5#^$EfiLIeEc$B+2$&!0aJOhc%=55h2nt*tHC-rgQ4PlxpNdAuFi zbOrwtJ+J0JH>GQ{bot_%k&w_bq@NE-aD~(hLI;(9cSPRuMnzwztWKwsc$wD0 z)UQ-3@ZiA%;ki<&1iQPt@Z!ab#A|nVSLy~=sZ?^!#bWCdgewYf#F%7U`TJt&i{?$+ z?RH`##M;{0z%}exdLu~Qd01?Hf^bD41I))_;Qx2EBMnPGZ3JZ3jJv)p$WM{7i$rF_ z)+Y#8Xc^#thYufu=l#Eho-ND)K)m2}b#(=Q-Ma_m`Tc5{vtOsm;7AwK` z{k}=Vr5l3*Tc03YA~L{z0Eiz}Sx86T<;&zE*9hoq!5asR$Y{3pu?-fsK0&xZWPsxb zU$(N$wh1pREX01k<#O3nov`(#@J5eM0hAu8*)qs~*!l!Pm_<4TAzSDvnv*Rr*!pRL zAV}n7OOs^~Z-YKT5at;$z)=)=s;tCczI;h!A!b>MMJv;MxjGfX))&!kw>`|P#Mt@- zLD<1d?iVe{o9IeObLRp0U2Ooq9FrJU_zVY34$PyAOlPg1c3w@V1ghBB>n>^ X9~UVQt3sZE00000NkvXXu0mjfdPPog delta 1635 zcmV-p2Auhc#sR3o0gxnr4|-HsbVOxyV{&P5bZKvH004NLjncVp!!Qg6;MsZ#BAHt> zZH6vh3I~OUreg*=42e?Ox9?CC>5+mO1$^M~Q)_tHz4iy__Pr_?69o?~Z0{db zbD@!EXyNHmH8av_=FdlB%?K^561m0VN;M1v`rHoV{TRUWB=zXSr|DwxGzC>=qFv6Z7$i^0MSpwwiGi19ZsW>uqkUi7aCr zOz<3ot>khv^j4u3oe~v1X_iwg!Dfe5Sl2Tz9~)|Fyk{@faQK`0u3 zcg)i`62$@hnRM4~uAw=$PDenZj08m_N(w}xi1yg;;L6`2EZPcDQMgZODP^RPCfZXf zBqXY(Lj);AzJeQ{` z!F2*GV;TgV*t#W|(qty!yao_w;{fD517^kN-v2V<#}2~Wd$Km9H3HKOph)bp;>YEk zfNfqNaGU^r-*>nQqpHT1RU{#j4`t7botl8N8h~z5#3DG)fLZam_uqE>#6hTk(-2mw z%B<1|bQ*xlHgGh+ENgNCUQosf$W(P_Td`ZMR(Nu9LakPdhQlG<+}zOZ?XA`}qbxn* zZyb{iVBO-|D$1Exl0CT%S+CnHOTP))?RI#4d`uS?7xeJ(u+sN0y#mfF-R(FIot~c3 z`T02whr?)iU;OWOcX$7Ietv#`)7dEQFU!RKZ*u%~C+-42O9$1{s@_1p5{bML?J`%b6R z31_p}Lc`yd&wt(6co@0PCt%^;#CUsqqv>=?Pft%Y znM`u;KmKmG_n$jHw~vpHh5gUF|M6xLq9q?qS0tXqtR$-dD`FT%B^Dro|~ySr2RW7TTNs_R>q_y7Q9kS5?xr?XJ@#C2Wz zvsz7EN%D2qb)&M~HUPO!cT$9OHykGeH>Wb?1y7tD&*7yDT zdSQF6zI}_fEB;_kSS3CHfK8bR*z>%lB%79e#rp;E`j7w0rReZHj}8wHX)qWp#1nB` z*QM)jmwvsxM9and_P&0l!C;VD!4?33oAegMj_x)cOK^m=@K zDw6M48Sy5F+ZEy-uugmcfHFuEaKGQDTCEoSKiS(LulIrHdC@)CTCGO?e!tL0<;9OL z|Ml`>JU#$G8B%*esL1ObQFMLl5+4Ad449A|0Dy^B0+#jrHPz*86XF8^n4mNn&%wa~ zInMucnfH2sJ!&?aMD*F^D+mI5e}AXH_Vy?YLz>U$MmLf>J^+9XvIHCwQIze{rgV&V z`7->Fi#t95Kq+JiI7)tLlbMTQ!u5JR>gOBpwXh=Y_y7QSh4|7$r?Iz}o}~7y!7SA20v_6C_{&047Ml h002yofB^uQ{0p5|tzJeqPb2^U002ovPDHLkV1hCIF$n+w