From 8aa5a137c52f0d940c0394c637a7e83e25937b5b Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Mon, 3 Nov 2014 08:21:31 -0300 Subject: [PATCH] Pipenet revamp -Removed the pipenet network datum, now it will all be done with the pipeline datum -All atmos pipes and machines will always have a pipeline datum -Moved the valves to the binary subtype and the portable connectors to the unary subtype -The pipe vents (who were barely used in three spots of the map) are removed, the map slots will replaced with outlets -Fixes some bugs of pipenet disconnection, mostly on explosions -Cleaned a bit the copypaste of construction.dm of pipes -Removed the ID restrictions of digital valves and the frequency (both unused) --- code/ATMOSPHERICS/atmospherics.dm | 52 +- .../binary_devices/binary_atmos_base.dm | 129 +++-- .../components/binary_devices/circulator.dm | 6 +- .../components/binary_devices/dp_vent_pump.dm | 6 +- .../components/binary_devices/passive_gate.dm | 6 +- .../components/binary_devices/pump.dm | 7 +- .../components/binary_devices/volume_pump.dm | 6 +- .../components/portables_connector.dm | 147 +----- .../components/trinary_devices/filter.dm | 9 +- .../components/trinary_devices/mixer.dm | 11 +- .../trinary_devices/trinary_base.dm | 171 +++--- .../components/unary/cold_sink.dm | 4 +- .../components/unary/heat_exchanger.dm | 10 +- .../components/unary/heat_source.dm | 2 +- .../components/unary/outlet_injector.dm | 6 +- .../components/unary/oxygen_generator.dm | 3 +- .../components/unary/unary_base.dm | 105 ++-- .../components/unary/vent_pump.dm | 14 +- .../components/unary/vent_scrubber.dm | 6 +- code/ATMOSPHERICS/components/valve.dm | 312 +---------- code/ATMOSPHERICS/datum_pipe_network.dm | 208 -------- code/ATMOSPHERICS/datum_pipeline.dm | 488 ++++++++++++------ code/ATMOSPHERICS/he_pipes.dm | 2 +- code/ATMOSPHERICS/pipes.dm | 25 +- code/ATMOSPHERICS/pipes/manifold.dm | 3 + code/ATMOSPHERICS/pipes/manifold4w.dm | 4 + code/ATMOSPHERICS/pipes/simple.dm | 2 + code/ATMOSPHERICS/pipes/tank.dm | 162 ++---- code/ATMOSPHERICS/pipes/vent.dm | 89 ---- code/controllers/master_controller.dm | 6 +- .../atmoalter/portable_atmospherics.dm | 24 +- code/game/machinery/cryo.dm | 2 +- code/game/machinery/pipe/construction.dm | 254 ++------- code/game/mecha/mecha.dm | 18 +- code/game/objects/effects/spiders.dm | 71 ++- code/modules/events/alien_infestation.dm | 4 +- code/modules/events/spider_infestation.dm | 4 +- code/modules/events/vent_clog.dm | 4 +- 38 files changed, 754 insertions(+), 1628 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 5a048c562bb..d8357574d76 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -23,37 +23,24 @@ Pipelines + Other Objects -> Pipe network var/global/list/iconsetids = list() var/global/list/pipeimages = list() -/* -/obj/machinery/atmospherics/process() - //build_network() -*/ -/obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - // Check to see if should be added to network. Add self if so and adjust variables appropriately. - // Note don't forget to have neighbors look as well! +/obj/machinery/atmospherics/proc/returnPipenet() + return - return null +/obj/machinery/atmospherics/proc/returnPipenetAir() + return + +/obj/machinery/atmospherics/proc/setPipenet() + return + +/obj/machinery/atmospherics/proc/replacePipenet() + return /obj/machinery/atmospherics/proc/build_network() // Called to build a network from this node - - return null - -/obj/machinery/atmospherics/proc/return_network(obj/machinery/atmospherics/reference) - // Returns pipe_network associated with connection to reference - // Notes: should create network if necessary - // Should never return null - - return null - -/obj/machinery/atmospherics/proc/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - // Used when two pipe_networks are combining - -/obj/machinery/atmospherics/proc/return_network_air(datum/network/reference) - // Return a list of gas_mixture(s) in the object - // associated with reference pipe_network for use in rebuilding the networks gases list - // Is permitted to return null + return /obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) + return /obj/machinery/atmospherics/proc/icon_addintact(var/obj/machinery/atmospherics/node, var/connected) var/image/img = getpipeimage('icons/obj/atmospherics/binary_devices.dmi', "pipe_intact", get_dir(src,node), node.pipe_color) @@ -101,8 +88,8 @@ Pipelines + Other Objects -> Pipe network else return ..() -/obj/machinery/atmospherics/proc/nullifyPipenetwork() - return +/obj/machinery/atmospherics/proc/nullifyPipenet(datum/pipeline/P) + P.other_atmosmch -= src /obj/machinery/atmospherics/proc/getpipeimage(var/iconset, var/iconstate, var/direction, var/col=rgb(255,255,255)) @@ -125,3 +112,14 @@ Pipelines + Other Objects -> Pipe network return img +/obj/machinery/atmospherics/proc/construction(D, P) + dir = D + initialize_directions = P + var/turf/T = loc + level = T.intact ? 2 : 1 + initialize() + var/list/nodes = pipeline_expansion() + for(var/obj/machinery/atmospherics/A in nodes) + A.initialize() + A.addMember(src) + build_network() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 417d818148c..8e81d0469f5 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -10,8 +10,8 @@ var/obj/machinery/atmospherics/node1 var/obj/machinery/atmospherics/node2 - var/datum/pipe_network/network1 - var/datum/pipe_network/network2 + var/datum/pipeline/parent1 + var/datum/pipeline/parent2 var/showpipe = 0 @@ -60,33 +60,15 @@ ..(intact) // Housekeeping and pipe network stuff below -/obj/machinery/atmospherics/binary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node1) - network1 = new_network - - else if(reference == node2) - network2 = new_network - - if(new_network.normal_members.Find(src)) - return 0 - - new_network.normal_members += src - - return null - /obj/machinery/atmospherics/binary/Destroy() - loc = null - if(node1) node1.disconnect(src) - del(network1) + node1 = null + nullifyPipenet(parent1) if(node2) node2.disconnect(src) - del(network2) - - node1 = null - node2 = null - + node2 = null + nullifyPipenet(parent2) ..() /obj/machinery/atmospherics/binary/initialize() @@ -111,58 +93,63 @@ update_icon() /obj/machinery/atmospherics/binary/build_network() - if(!network1 && node1) - network1 = new /datum/pipe_network() - network1.normal_members += src - network1.build_network(node1, src) + if(!parent1) + parent1 = new /datum/pipeline() + parent1.build_pipeline(src) - if(!network2 && node2) - network2 = new /datum/pipe_network() - network2.normal_members += src - network2.build_network(node2, src) - - -/obj/machinery/atmospherics/binary/return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node1) - return network1 - - if(reference==node2) - return network2 - - return null - -/obj/machinery/atmospherics/binary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network1 == old_network) - network1 = new_network - if(network2 == old_network) - network2 = new_network - - return 1 - -/obj/machinery/atmospherics/binary/return_network_air(datum/pipe_network/reference) - var/list/results = list() - - if(network1 == reference) - results += air1 - if(network2 == reference) - results += air2 - - return results + if(!parent2) + parent2 = new /datum/pipeline() + parent2.build_pipeline(src) /obj/machinery/atmospherics/binary/disconnect(obj/machinery/atmospherics/reference) - if(reference==node1) - del(network1) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + qdel(parent1) node1 = null - else if(reference==node2) - del(network2) + else if(reference == node2) + if(istype(node2, /obj/machinery/atmospherics/pipe)) + qdel(parent2) node2 = null - update_icon() - return null +/obj/machinery/atmospherics/binary/nullifyPipenet(datum/pipeline/P) + ..() + if(P == parent1) + parent1.other_airs -= air1 + parent1 = null + else if(P == parent2) + parent2.other_airs -= air2 + parent2 = null -/obj/machinery/atmospherics/binary/nullifyPipenetwork() - network1 = null - network2 = null \ No newline at end of file +/obj/machinery/atmospherics/binary/returnPipenetAir(datum/pipeline/P) + if(P == parent1) + return air1 + else if(P == parent2) + return air2 + +/obj/machinery/atmospherics/binary/pipeline_expansion(datum/pipeline/P) + if(P) + if(parent1 == P) + return list(node1) + else if(parent2 == P) + return list(node2) + else + return list(node1, node2) + +/obj/machinery/atmospherics/binary/setPipenet(datum/pipeline/P, obj/machinery/atmospherics/A) + if(A == node1) + parent1 = P + else if(A == node2) + parent2 = P + +/obj/machinery/atmospherics/binary/returnPipenet(obj/machinery/atmospherics/A) + if(A == node1) + return parent1 + else if(A == node2) + return parent2 + +/obj/machinery/atmospherics/binary/replacePipenet(datum/pipeline/Old, datum/pipeline/New) + if(Old == parent1) + parent1 = New + else if(Old == parent2) + parent2 = New \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index a5a222736fb..675590c6796 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -41,11 +41,9 @@ //Actually transfer the gas var/datum/gas_mixture/removed = air2.remove(transfer_moles) - if(network1) - network1.update = 1 + parent1.update = 1 - if(network2) - network2.update = 1 + parent2.update = 1 return removed diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index dcca599c211..598744b115f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -74,8 +74,7 @@ loc.assume_air(removed) air_update_turf() - if(network1) - network1.update = 1 + parent1.update = 1 else //external -> output var/pressure_delta = 10000 @@ -94,8 +93,7 @@ air2.merge(removed) air_update_turf() - if(network2) - network2.update = 1 + parent2.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index b51b528df27..6cfdd654255 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -51,11 +51,9 @@ Passive gate is similar to the regular pump except: var/datum/gas_mixture/removed = air1.remove(transfer_moles) air2.merge(removed) - if(network1) - network1.update = 1 + parent1.update = 1 - if(network2) - network2.update = 1 + parent2.update = 1 //Radio remote control diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 937050358ca..079f1e00b1f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -58,11 +58,10 @@ Thus, the two variables affect pump operation are set in New(): var/datum/gas_mixture/removed = air1.remove(transfer_moles) air2.merge(removed) - if(network1) - network1.update = 1 + parent1.update = 1 - if(network2) - network2.update = 1 + + parent2.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 0be2ecb627b..2dc5d74a1fd 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -57,11 +57,9 @@ Thus, the two variables affect pump operation are set in New(): air2.merge(removed) - if(network1) - network1.update = 1 + parent1.update = 1 - if(network2) - network2.update = 1 + parent2.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 7a0a5db640b..6fd16461e2d 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -1,42 +1,19 @@ -/* -This should ideally have /unary/ as parent, why doesn't it? //Donkie -*/ -/obj/machinery/atmospherics/portables_connector - icon = 'icons/obj/atmospherics/unary_devices.dmi' - icon_state = "connector_map" //Only for mapping purposes, so mappers can see direction - +/obj/machinery/atmospherics/unary/portables_connector name = "connector port" desc = "For connecting portables devices related to atmospherics control." - - dir = SOUTH - initialize_directions = SOUTH - + icon = 'icons/obj/atmospherics/unary_devices.dmi' + icon_state = "connector_map" //Only for mapping purposes, so mappers can see direction can_unwrench = 1 - var/obj/machinery/portable_atmospherics/connected_device - - var/obj/machinery/atmospherics/node - - var/datum/pipe_network/network - - var/showpipe = 0 - var/on = 0 use_power = 0 level = 0 - -/obj/machinery/atmospherics/portables_connector/visible +/obj/machinery/atmospherics/unary/portables_connector/visible level = 2 -/obj/machinery/atmospherics/portables_connector/New() - initialize_directions = dir - ..() - -/obj/machinery/atmospherics/portables_connector/update_icon() +/obj/machinery/atmospherics/unary/portables_connector/update_icon() icon_state = "connector" - underlays.Cut() - if(showpipe) var/state var/col @@ -45,114 +22,26 @@ This should ideally have /unary/ as parent, why doesn't it? //Donkie col = node.pipe_color else state = "pipe_exposed" - underlays += getpipeimage('icons/obj/atmospherics/binary_devices.dmi', state, initialize_directions, col) - return - -/obj/machinery/atmospherics/portables_connector/hide(var/intact) - showpipe = !intact - update_icon() - - ..(intact) - -/obj/machinery/atmospherics/portables_connector/process() - ..() - if(!on) - return +/obj/machinery/atmospherics/unary/portables_connector/process() if(!connected_device) - on = 0 return - if(network) - network.update = 1 - return 1 + parent.update = 1 -// Housekeeping and pipe network stuff below -/obj/machinery/atmospherics/portables_connector/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node) - network = new_network - - if(new_network.normal_members.Find(src)) - return 0 - - new_network.normal_members += src - - return null - -/obj/machinery/atmospherics/portables_connector/Destroy() +/obj/machinery/atmospherics/unary/portables_connector/Destroy() if(connected_device) connected_device.disconnect() - - if(node) - node.disconnect(src) - del(network) - - node = null - ..() -/obj/machinery/atmospherics/portables_connector/initialize() - src.disconnect(src) - - var/node_connect = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) - if(target.initialize_directions & get_dir(target,src)) - node = target - break - //build_network() //might need this - - if(level == 2) - showpipe = 1 - - update_icon() - -/obj/machinery/atmospherics/portables_connector/build_network() - if(!network && node) - network = new /datum/pipe_network() - network.normal_members += src - network.build_network(node, src) - - -/obj/machinery/atmospherics/portables_connector/return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node) - return network - - if(reference==connected_device) - return network - - return null - -/obj/machinery/atmospherics/portables_connector/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network == old_network) - network = new_network - - return 1 - -/obj/machinery/atmospherics/portables_connector/return_network_air(datum/pipe_network/reference) - var/list/results = list() - - if(connected_device) - results += connected_device.air_contents - - return results - -/obj/machinery/atmospherics/portables_connector/disconnect(obj/machinery/atmospherics/reference) - if(reference==node) - del(network) - node = null - - update_icon() - - return null - - -/obj/machinery/atmospherics/portables_connector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (connected_device) - user << "You cannot unwrench this [src], dettach [connected_device] first." - return 1 +/obj/machinery/atmospherics/unary/portables_connector/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/wrench)) + if(connected_device) + user << "You cannot unwrench this [src], dettach [connected_device] first." + return 1 return ..() + +/obj/machinery/atmospherics/unary/portables_connector/portableConnectorReturnAir() + return connected_device.portableConnectorReturnAir() + +/obj/proc/portableConnectorReturnAir() diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 11fc0f5e2f8..13d187bd906 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -122,14 +122,11 @@ Filter types: air2.merge(filtered_out) air3.merge(removed) - if(network2) - network2.update = 1 + parent2.update = 1 - if(network3) - network3.update = 1 + parent3.update = 1 - if(network1) - network1.update = 1 + parent1.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index bf297813064..1fbae3d2ec6 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -87,14 +87,13 @@ var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) air3.merge(removed2) - if(network1 && transfer_moles1) - network1.update = 1 + if(transfer_moles1) + parent1.update = 1 - if(network2 && transfer_moles2) - network2.update = 1 + if(transfer_moles2) + parent2.update = 1 - if(network3) - network3.update = 1 + parent3.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 902b315b5ed..94c92c5ff18 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -12,9 +12,9 @@ var/obj/machinery/atmospherics/node2 var/obj/machinery/atmospherics/node3 - var/datum/pipe_network/network1 - var/datum/pipe_network/network2 - var/datum/pipe_network/network3 + var/datum/pipeline/parent1 + var/datum/pipeline/parent2 + var/datum/pipeline/parent3 var/flipped = 0 @@ -77,42 +77,22 @@ Iconnery /* Housekeeping and pipe network stuff below */ -/obj/machinery/atmospherics/trinary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node1) - network1 = new_network - - else if(reference == node2) - network2 = new_network - - else if (reference == node3) - network3 = new_network - - if(new_network.normal_members.Find(src)) - return 0 - - new_network.normal_members += src - - return null - /obj/machinery/atmospherics/trinary/Destroy() if(node1) node1.disconnect(src) - del(network1) + node1 = null + nullifyPipenet(parent1) if(node2) node2.disconnect(src) - del(network2) + node2 = null + nullifyPipenet(parent2) if(node3) node3.disconnect(src) - del(network3) - - node1 = null - node2 = null - node3 = null - + node3 = null + nullifyPipenet(parent3) ..() /obj/machinery/atmospherics/trinary/initialize() - src.disconnect(src) //Mixer: //1 and 2 is input @@ -151,76 +131,83 @@ Housekeeping and pipe network stuff below update_icon() /obj/machinery/atmospherics/trinary/build_network() - if(!network1 && node1) - network1 = new /datum/pipe_network() - network1.normal_members += src - network1.build_network(node1, src) + if(!parent1) + parent1 = new /datum/pipeline() + parent1.build_pipeline(src) - if(!network2 && node2) - network2 = new /datum/pipe_network() - network2.normal_members += src - network2.build_network(node2, src) + if(!parent2) + parent2 = new /datum/pipeline() + parent2.build_pipeline(src) - if(!network3 && node3) - network3 = new /datum/pipe_network() - network3.normal_members += src - network3.build_network(node3, src) - - -/obj/machinery/atmospherics/trinary/return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node1) - return network1 - - if(reference==node2) - return network2 - - if(reference==node3) - return network3 - - return null - -/obj/machinery/atmospherics/trinary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network1 == old_network) - network1 = new_network - if(network2 == old_network) - network2 = new_network - if(network3 == old_network) - network3 = new_network - - return 1 - -/obj/machinery/atmospherics/trinary/return_network_air(datum/pipe_network/reference) - var/list/results = list() - - if(network1 == reference) - results += air1 - if(network2 == reference) - results += air2 - if(network3 == reference) - results += air3 - - return results + if(!parent3) + parent3 = new /datum/pipeline() + parent3.build_pipeline(src) /obj/machinery/atmospherics/trinary/disconnect(obj/machinery/atmospherics/reference) - if(reference==node1) - del(network1) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + qdel(parent1) node1 = null - - else if(reference==node2) - del(network2) + else if(reference == node2) + if(istype(node2, /obj/machinery/atmospherics/pipe)) + qdel(parent2) node2 = null - - else if(reference==node3) - del(network3) + else if(reference == node3) + if(istype(node3, /obj/machinery/atmospherics/pipe)) + qdel(parent3) node3 = null - update_icon() - return null +/obj/machinery/atmospherics/trinary/nullifyPipenet(datum/pipeline/P) + ..() + if(P == parent1) + parent1.other_airs -= air1 + parent1 = null + else if(P == parent2) + parent2.other_airs -= air2 + parent2 = null + else if(P == parent3) + parent3.other_airs -= air3 + parent3 = null -/obj/machinery/atmospherics/trinary/nullifyPipenetwork() - network1 = null - network2 = null - network3 = null \ No newline at end of file +/obj/machinery/atmospherics/trinary/returnPipenetAir(datum/pipeline/P) + if(P == parent1) + return air1 + else if(P == parent2) + return air2 + else if(P == parent3) + return air3 + +/obj/machinery/atmospherics/trinary/pipeline_expansion(datum/pipeline/P) + if(P) + if(parent1 == P) + return list(node1) + else if(parent2 == P) + return list(node2) + else if(parent3 == P) + return list(node3) + return list(node1, node2, node3) + +/obj/machinery/atmospherics/trinary/setPipenet(datum/pipeline/P, obj/machinery/atmospherics/A) + if(A == node1) + parent1 = P + else if(A == node2) + parent2 = P + else if(A == node3) + parent3 = P + +/obj/machinery/atmospherics/trinary/returnPipenet(obj/machinery/atmospherics/A) + if(A == node1) + return parent1 + else if(A == node2) + return parent2 + else if(A == node3) + return parent3 + +/obj/machinery/atmospherics/trinary/replacePipenet(datum/pipeline/Old, datum/pipeline/New) + if(Old == parent1) + parent1 = New + else if(Old == parent2) + parent2 = New + else if(Old == parent3) + parent3 = New \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index ea66aa52d4f..dd518949b65 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -24,7 +24,7 @@ /obj/machinery/atmospherics/unary/cold_sink/process() ..() - if(!on || !network) + if(!on) return 0 var/air_heat_capacity = air_contents.heat_capacity() var/combined_heat_capacity = current_heat_capacity + air_heat_capacity @@ -37,5 +37,5 @@ //todo: have current temperature affected. require power to bring down current temperature again if(abs(old_temperature-air_contents.temperature) > 1) - network.update = 1 + parent.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index 41b0ad9619c..e0cb9ac42d3 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -57,12 +57,10 @@ air_contents.temperature = new_temperature partner.air_contents.temperature = new_temperature - if(network) - if(abs(old_temperature-air_contents.temperature) > 1) - network.update = 1 + if(abs(old_temperature-air_contents.temperature) > 1) + parent.update = 1 - if(partner.network) - if(abs(other_old_temperature-partner.air_contents.temperature) > 1) - partner.network.update = 1 + if(abs(other_old_temperature-partner.air_contents.temperature) > 1) + partner.parent.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index 062bbd71110..88e7e22e967 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -39,5 +39,5 @@ //todo: have current temperature affected. require power to bring up current temperature again if(abs(old_temperature-air_contents.temperature) > 1) - network.update = 1 + parent.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index 5b7d808e70f..553b863da7a 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -48,8 +48,7 @@ loc.assume_air(removed) air_update_turf() - if(network) - network.update = 1 + parent.update = 1 return 1 @@ -66,8 +65,7 @@ loc.assume_air(removed) - if(network) - network.update = 1 + parent.update = 1 flick("inje_inject", src) diff --git a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm index cbbb91683fd..0103a1966cd 100644 --- a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm +++ b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm @@ -43,7 +43,6 @@ air_contents.temperature = (current_heat_capacity*air_contents.temperature + 20*added_oxygen*T0C)/(current_heat_capacity+20*added_oxygen) air_contents.oxygen += added_oxygen - if(network) - network.update = 1 + parent.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index b19b3a82531..e33065ff618 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -1,28 +1,23 @@ /obj/machinery/atmospherics/unary icon = 'icons/obj/atmospherics/unary_devices.dmi' - dir = SOUTH initialize_directions = SOUTH layer = TURF_LAYER+0.1 - var/datum/gas_mixture/air_contents - var/obj/machinery/atmospherics/node - - var/datum/pipe_network/network - + var/datum/pipeline/parent var/showpipe = 0 /obj/machinery/atmospherics/unary/New() ..() initialize_directions = dir air_contents = new - air_contents.volume = 200 /* Iconnery */ + //Separate this because we don't need to update pipe icons if we just are going to change the state /obj/machinery/atmospherics/unary/proc/update_icon_nopipes() return @@ -54,91 +49,67 @@ Iconnery /* Housekeeping and pipe network stuff below */ -/obj/machinery/atmospherics/unary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node) - network = new_network - - if(new_network.normal_members.Find(src)) - return 0 - - new_network.normal_members += src - - return null /obj/machinery/atmospherics/unary/Destroy() if(node) node.disconnect(src) - del(network) - - node = null - + node = null + nullifyPipenet(parent) ..() -/obj/machinery/atmospherics/unary/initialize(infiniteloop = 0) - if(!infiniteloop) - src.disconnect(src) - var/node_connect = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) +/obj/machinery/atmospherics/unary/initialize() + for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) node = target - if(!infiniteloop) - target.initialize(1) break - //build_network() might need this - if(level == 2) showpipe = 1 - update_icon() /obj/machinery/atmospherics/unary/default_change_direction_wrench(mob/user, obj/item/weapon/wrench/W) if(..()) initialize_directions = dir if(node) - disconnect(node) + node.disconnect(src) + node = null + nullifyPipenet(parent) initialize() + if(node) + node.initialize() + node.addMember(src) + build_network() . = 1 /obj/machinery/atmospherics/unary/build_network() - if(!network && node) - network = new /datum/pipe_network() - network.normal_members += src - network.build_network(node, src) - - -/obj/machinery/atmospherics/unary/return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node) - return network - - return null - -/obj/machinery/atmospherics/unary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network == old_network) - network = new_network - - return 1 - -/obj/machinery/atmospherics/unary/return_network_air(datum/pipe_network/reference) - var/list/results = list() - - if(network == reference) - results += air_contents - - return results + if(!parent) + parent = new /datum/pipeline() + parent.build_pipeline(src) /obj/machinery/atmospherics/unary/disconnect(obj/machinery/atmospherics/reference) - if(reference==node) + if(reference == node) + if(istype(node, /obj/machinery/atmospherics/pipe)) + qdel(parent) node = null - reference.disconnect(src) - del(network) - update_icon() - return null +/obj/machinery/atmospherics/unary/nullifyPipenet() + ..() + parent.other_airs -= air_contents + parent = null -/obj/machinery/atmospherics/unary/nullifyPipenetwork() - network = null \ No newline at end of file +/obj/machinery/atmospherics/unary/returnPipenetAir() + return air_contents + +/obj/machinery/atmospherics/unary/pipeline_expansion() + return list(node) + +/obj/machinery/atmospherics/unary/setPipenet(datum/pipeline/P) + parent = P + +/obj/machinery/atmospherics/unary/returnPipenet() + return parent + +/obj/machinery/atmospherics/unary/replacePipenet(datum/pipeline/Old, datum/pipeline/New) + if(Old == parent) + parent = New \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 86df661d4c3..5859425b3a3 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -114,8 +114,7 @@ loc.assume_air(removed) air_update_turf() - if(network) - network.update = 1 + parent.update = 1 else //external -> internal var/pressure_delta = 10000 @@ -135,8 +134,7 @@ air_contents.merge(removed) air_update_turf() - if(network) - network.update = 1 + parent.update = 1 return 1 @@ -320,12 +318,8 @@ L << "That vent is welded shut." return - if(!network || !network.normal_members.len) - L << "This vent is not connected to anything." - return - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in network.normal_members) + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in parent.other_atmosmch) if(temp_vent.welded) continue if(temp_vent in loc) @@ -359,7 +353,7 @@ var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection] if(!target_vent) return - + for(var/mob/O in viewers(L, null)) O.show_message(text("[L] scrambles into the ventilation ducts!"), 1) diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 7f3e04d9d14..098d1a87b8f 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -143,8 +143,7 @@ loc.assume_air(removed) air_update_turf() - if(network) - network.update = 1 + parent.update = 1 else //Just siphoning all air if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) @@ -157,8 +156,7 @@ air_contents.merge(removed) air_update_turf() - if(network) - network.update = 1 + parent.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index d343ce2d9d2..8f8252a15be 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -1,355 +1,85 @@ - -/* -This file contains: -Manual Valve -Digital Valve - -These pipes are not under the binary_atmos base because instead of doing pretty maths, they simply -connect the networks together for a more efficient transfer -*/ - -/obj/machinery/atmospherics/valve +/obj/machinery/atmospherics/binary/valve icon = 'icons/obj/atmospherics/binary_devices.dmi' icon_state = "mvalve_map" - name = "manual valve" desc = "A pipe valve" - - dir = SOUTH - initialize_directions = SOUTH|NORTH - can_unwrench = 1 - var/open = 0 - var/openDuringInit //useless, must remove - - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - - var/datum/pipe_network/network_node1 - var/datum/pipe_network/network_node2 var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection -/obj/machinery/atmospherics/valve/open +/obj/machinery/atmospherics/binary/valve/open open = 1 //Separate this because we don't need to update pipe icons if we just are going to crank the handle -/obj/machinery/atmospherics/valve/proc/update_icon_nopipes(var/animation = 0) +/obj/machinery/atmospherics/binary/valve/update_icon_nopipes(animation = 0) normalize_dir() icon_state = "mvalve_off" - overlays.Cut() if(animation) overlays += getpipeimage('icons/obj/atmospherics/binary_devices.dmi', "mvalve_[open][!open]") else if(open) overlays += getpipeimage('icons/obj/atmospherics/binary_devices.dmi', "mvalve_on") -/obj/machinery/atmospherics/valve/update_icon() +/obj/machinery/atmospherics/binary/valve/update_icon() update_icon_nopipes() - var/connected = 0 underlays.Cut() - //Add non-broken pieces if(node1) connected = icon_addintact(node1, connected) - if(node2) connected = icon_addintact(node2, connected) - //Add broken pieces icon_addbroken(connected) -/obj/machinery/atmospherics/valve/New() - ..() - switch(dir) - if(NORTH || SOUTH) - initialize_directions = NORTH|SOUTH - if(EAST || WEST) - initialize_directions = EAST|WEST - -/obj/machinery/atmospherics/valve/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node1) - network_node1 = new_network - if(open) - network_node2 = new_network - else if(reference == node2) - network_node2 = new_network - if(open) - network_node1 = new_network - - if(new_network.normal_members.Find(src)) - return 0 - - new_network.normal_members += src - - if(open) - if(reference == node1) - if(node2) - return node2.network_expand(new_network, src) - else if(reference == node2) - if(node1) - return node1.network_expand(new_network, src) - - return null - -/obj/machinery/atmospherics/valve/Destroy() - if(node1) - node1.disconnect(src) - del(network_node1) - if(node2) - node2.disconnect(src) - del(network_node2) - - node1 = null - node2 = null - - ..() - -/obj/machinery/atmospherics/valve/proc/open() - if(open) - return 0 - +/obj/machinery/atmospherics/binary/valve/proc/open() open = 1 - update_icon_nopipes() - - if(network_node1&&network_node2) - network_node1.merge(network_node2) - network_node2 = network_node1 - - if(network_node1) - network_node1.update = 1 - else if(network_node2) - network_node2.update = 1 - - return 1 - -/obj/machinery/atmospherics/valve/proc/close() - if(!open) - return 0 + parent1.update = 0 + parent2.update = 0 + return +/obj/machinery/atmospherics/binary/valve/proc/close() open = 0 - update_icon_nopipes() + return - if(network_node1) - del(network_node1) - if(network_node2) - del(network_node2) - - build_network() - - return 1 - -/obj/machinery/atmospherics/valve/proc/normalize_dir() +/obj/machinery/atmospherics/binary/valve/proc/normalize_dir() if(dir==3) dir = 1 else if(dir==12) dir = 4 -/obj/machinery/atmospherics/valve/attack_ai(mob/user as mob) +/obj/machinery/atmospherics/binary/valve/attack_ai(mob/user) return -/obj/machinery/atmospherics/valve/attack_paw(mob/user as mob) - return attack_hand(user) - -obj/machinery/atmospherics/valve/attack_hand(mob/user as mob) - src.add_fingerprint(usr) +/obj/machinery/atmospherics/binary/valve/attack_hand(mob/user) + add_fingerprint(usr) update_icon_nopipes(1) sleep(10) - if (src.open) - src.close() - else - src.open() - -/obj/machinery/atmospherics/valve/process() - ..() - . = PROCESS_KILL - -/* if(open && (!node1 || !node2)) + if(open) close() - if(!node1) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (!node2) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ + else + open() + parent1.reconcile_air() - return - -/obj/machinery/atmospherics/valve/initialize() - normalize_dir() - - var/node1_dir - var/node2_dir - - for(var/direction in cardinal) - if(direction&initialize_directions) - if (!node1_dir) - node1_dir = direction - else if (!node2_dir) - node2_dir = direction - - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) - if(target.initialize_directions & get_dir(target,src)) - 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 - - //build_network() - update_icon() - -/* - var/connect_directions - switch(dir) - if(NORTH) - connect_directions = NORTH|SOUTH - if(SOUTH) - connect_directions = NORTH|SOUTH - if(EAST) - connect_directions = EAST|WEST - if(WEST) - connect_directions = EAST|WEST - else - connect_directions = dir - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - connect_directions &= ~direction - node1 = target - break - if(node1) - break - - for(var/direction in cardinal) - 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 - break - if(node1) - break -*/ -/obj/machinery/atmospherics/valve/build_network() - if(!network_node1 && node1) - network_node1 = new /datum/pipe_network() - network_node1.normal_members += src - network_node1.build_network(node1, src) - - if(!network_node2 && node2) - network_node2 = new /datum/pipe_network() - network_node2.normal_members += src - network_node2.build_network(node2, src) - - -/obj/machinery/atmospherics/valve/return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node1) - return network_node1 - - if(reference==node2) - return network_node2 - - return null - -/obj/machinery/atmospherics/valve/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network_node1 == old_network) - network_node1 = new_network - if(network_node2 == old_network) - network_node2 = new_network - - return 1 - -/obj/machinery/atmospherics/valve/return_network_air(datum/network/reference) - return null - -/obj/machinery/atmospherics/valve/disconnect(obj/machinery/atmospherics/reference) - if(reference==node1) - del(network_node1) - node1 = null - - else if(reference==node2) - del(network_node2) - node2 = null - - update_icon() - - return null - -/obj/machinery/atmospherics/valve/digital // can be controlled by AI +/obj/machinery/atmospherics/binary/valve/digital // can be controlled by AI name = "digital valve" desc = "A digitally controlled valve." icon_state = "dvalve_map" -/obj/machinery/atmospherics/valve/digital/attack_ai(mob/user as mob) +/obj/machinery/atmospherics/valve/digital/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user as mob) - if(!src.allowed(user)) - user << "Access denied." - return - ..() - -/obj/machinery/atmospherics/valve/digital/update_icon_nopipes(var/animation) +/obj/machinery/atmospherics/binary/valve/digital/update_icon_nopipes(animation) normalize_dir() - if(stat & NOPOWER) icon_state = "dvalve_nopower" overlays.Cut() return - icon_state = "dvalve_off" - overlays.Cut() if(animation) overlays += getpipeimage('icons/obj/atmospherics/binary_devices.dmi', "dvalve_[open][!open]") else if(open) overlays += getpipeimage('icons/obj/atmospherics/binary_devices.dmi', "dvalve_on") - -//Radio remote control - -/obj/machinery/atmospherics/valve/digital/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - -/obj/machinery/atmospherics/valve/digital/initialize() - ..() - if(frequency) - set_frequency(frequency) - -/obj/machinery/atmospherics/valve/digital/receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id)) - return 0 - - switch(signal.data["command"]) - if("valve_open") - if(!open) - open() - - if("valve_close") - if(open) - close() - - if("valve_toggle") - if(open) - close() - else - open() - -/obj/machinery/atmospherics/valve/nullifyPipenetwork() - network_node1 = null - network_node2 = null \ No newline at end of file diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm index 4a4b9b5191d..e69de29bb2d 100644 --- a/code/ATMOSPHERICS/datum_pipe_network.dm +++ b/code/ATMOSPHERICS/datum_pipe_network.dm @@ -1,208 +0,0 @@ -var/global/list/datum/pipe_network/pipe_networks = list() - -/datum/pipe_network - var/list/datum/gas_mixture/gases = list() //All of the gas_mixtures continuously connected in this network - - var/list/obj/machinery/atmospherics/normal_members = list() - var/list/datum/pipeline/line_members = list() - //membership roster to go through for updates and what not - - var/update = 1 - var/datum/gas_mixture/air_transient = null - -/datum/pipe_network/New() - air_transient = new() - ..() - -/datum/pipe_network/Destroy() - pipe_networks -= src - for(var/datum/pipeline/P in line_members) - P.network = null - for(var/obj/machinery/atmospherics/A in normal_members) - A.nullifyPipenetwork() - ..() - -/datum/pipe_network/proc/process() - //Equalize gases amongst pipe if called for - if(update) - update = 0 - reconcile_air() //equalize_gases(gases) - - //Give pipelines their process call for pressure checking and what not. Have to remove pressure checks for the time being as pipes dont radiate heat - Mport - //for(var/datum/pipeline/line_member in line_members) - // line_member.process() - -/datum/pipe_network/proc/build_network(obj/machinery/atmospherics/start_normal, obj/machinery/atmospherics/reference) - //Purpose: Generate membership roster - //Notes: Assuming that members will add themselves to appropriate roster in network_expand() - - if(!start_normal) - qdel(src) - - start_normal.network_expand(src, reference) - - update_network_gases() - - if((normal_members.len>0)||(line_members.len>0)) - pipe_networks += src - else - qdel(src) - -/datum/pipe_network/proc/merge(datum/pipe_network/giver) - if(giver==src) return 0 - - normal_members -= giver.normal_members - normal_members += giver.normal_members - - line_members -= giver.line_members - line_members += giver.line_members - - for(var/obj/machinery/atmospherics/normal_member in giver.normal_members) - normal_member.reassign_network(giver, src) - - for(var/datum/pipeline/line_member in giver.line_members) - line_member.network = src - - update_network_gases() - return 1 - -/datum/pipe_network/proc/update_network_gases() - //Go through membership roster and make sure gases is up to date - - gases = list() - - for(var/obj/machinery/atmospherics/normal_member in normal_members) - var/result = normal_member.return_network_air(src) - if(result) gases += result - - for(var/datum/pipeline/line_member in line_members) - gases += line_member.air - -/datum/pipe_network/proc/reconcile_air() - //Perfectly equalize all gases members instantly - - //Calculate totals from individual components - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 - - air_transient.volume = 0 - - air_transient.oxygen = 0 - air_transient.nitrogen = 0 - air_transient.toxins = 0 - air_transient.carbon_dioxide = 0 - - - air_transient.trace_gases = list() - - for(var/datum/gas_mixture/gas in gases) - air_transient.volume += gas.volume - total_thermal_energy += gas.thermal_energy() - total_heat_capacity += gas.heat_capacity() - - air_transient.oxygen += gas.oxygen - air_transient.nitrogen += gas.nitrogen - air_transient.toxins += gas.toxins - air_transient.carbon_dioxide += gas.carbon_dioxide - - if(gas.trace_gases.len) - for(var/datum/gas/trace_gas in gas.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in air_transient.trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - air_transient.trace_gases += corresponding - - corresponding.moles += trace_gas.moles - - if(air_transient.volume > 0) - - if(total_heat_capacity > 0) - air_transient.temperature = total_thermal_energy/total_heat_capacity - - //Allow air mixture to react - if(air_transient.react()) - update = 1 - - else - air_transient.temperature = 0 - - //Update individual gas_mixtures by volume ratio - for(var/datum/gas_mixture/gas in gases) - gas.oxygen = air_transient.oxygen*gas.volume/air_transient.volume - gas.nitrogen = air_transient.nitrogen*gas.volume/air_transient.volume - gas.toxins = air_transient.toxins*gas.volume/air_transient.volume - gas.carbon_dioxide = air_transient.carbon_dioxide*gas.volume/air_transient.volume - - gas.temperature = air_transient.temperature - - if(air_transient.trace_gases.len) - for(var/datum/gas/trace_gas in air_transient.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in gas.trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - gas.trace_gases += corresponding - - corresponding.moles = trace_gas.moles*gas.volume/air_transient.volume - return 1 - -proc/equalize_gases(datum/gas_mixture/list/gases) - //Perfectly equalize all gases members instantly - - //Calculate totals from individual components - var/total_volume = 0 - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 - - var/total_oxygen = 0 - var/total_nitrogen = 0 - var/total_toxins = 0 - var/total_carbon_dioxide = 0 - - var/list/total_trace_gases = list() - - for(var/datum/gas_mixture/gas in gases) - total_volume += gas.volume - total_thermal_energy += gas.thermal_energy() - total_heat_capacity += gas.heat_capacity() - - total_oxygen += gas.oxygen - total_nitrogen += gas.nitrogen - total_toxins += gas.toxins - total_carbon_dioxide += gas.carbon_dioxide - - if(gas.trace_gases.len) - for(var/datum/gas/trace_gas in gas.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in total_trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - total_trace_gases += corresponding - - corresponding.moles += trace_gas.moles - - if(total_volume > 0) - - //Calculate temperature - var/temperature = 0 - - if(total_heat_capacity > 0) - temperature = total_thermal_energy/total_heat_capacity - - //Update individual gas_mixtures by volume ratio - for(var/datum/gas_mixture/gas in gases) - gas.oxygen = total_oxygen*gas.volume/total_volume - gas.nitrogen = total_nitrogen*gas.volume/total_volume - gas.toxins = total_toxins*gas.volume/total_volume - gas.carbon_dioxide = total_carbon_dioxide*gas.volume/total_volume - - gas.temperature = temperature - - if(total_trace_gases.len) - for(var/datum/gas/trace_gas in total_trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in gas.trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - gas.trace_gases += corresponding - - corresponding.moles = trace_gas.moles*gas.volume/total_volume - - return 1 \ No newline at end of file diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 9664b73747a..41c15ac0de5 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -1,24 +1,145 @@ +var/global/list/datum/pipeline/pipe_networks = list() + /datum/pipeline var/datum/gas_mixture/air + var/list/datum/gas_mixture/other_airs = list() - var/list/obj/machinery/atmospherics/pipe/members - var/list/obj/machinery/atmospherics/pipe/edges //Used for building networks + var/list/obj/machinery/atmospherics/pipe/members = list() + var/list/obj/machinery/atmospherics/other_atmosmch = list() - var/datum/pipe_network/network + var/update = 1 var/alert_pressure = 0 -/datum/pipeline/proc/process()//This use to be called called from the pipe networks +/datum/pipeline/New() + pipe_networks += src +/datum/pipeline/Destroy() + pipe_networks -= src + if(air && air.volume) + temporarily_store_air() + for(var/obj/machinery/atmospherics/pipe/P in members) + P.parent = null + for(var/obj/machinery/atmospherics/A in other_atmosmch) + A.nullifyPipenet(src) + ..() + +/datum/pipeline/proc/process()//This use to be called called from the pipe networks + if(update) + update = 0 + reconcile_air() + return + /* //Check to see if pressure is within acceptable limits var/pressure = air.return_pressure() if(pressure > alert_pressure) for(var/obj/machinery/atmospherics/pipe/member in members) if(!member.check_pressure(pressure)) break //Only delete 1 pipe per process - //Allow for reactions //air.react() //Should be handled by pipe_network now + */ + + +var/pipenetwarnings = 10 + +/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/base) + base.setPipenet(src) + var/volume = 0 + if(istype(base, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/E = base + volume = E.volume + alert_pressure = E.alert_pressure + members += E + if(E.air_temporary) + air = E.air_temporary + E.air_temporary = null + else + addMachineryMember(base) + if(!air) + air = new + var/list/possible_expansions = list(base) + while(possible_expansions.len>0) + for(var/obj/machinery/atmospherics/borderline in possible_expansions) + + var/list/result = borderline.pipeline_expansion(src) + + if(result.len>0) + for(var/obj/machinery/atmospherics/P in result) + if(istype(P, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/item = P + if(!members.Find(item)) + + if(item.parent) + if(pipenetwarnings > 0) + error("[item.type] added to a pipenet while still having one. ([item.x], [item.y], [item.z])") + pipenetwarnings -= 1 + if(pipenetwarnings == 0) + error("further messages about pipenets will be supressed") + members += item + possible_expansions += item + + volume += item.volume + item.parent = src + + alert_pressure = min(alert_pressure, item.alert_pressure) + + if(item.air_temporary) + air.merge(item.air_temporary) + item.air_temporary = null + else + P.setPipenet(src, borderline) + addMachineryMember(P) + + possible_expansions -= borderline + + air.volume = volume + +/datum/pipeline/proc/addMachineryMember(obj/machinery/atmospherics/A) + other_atmosmch |= A + var/datum/gas_mixture/G = A.returnPipenetAir(src) + other_airs |= G + +/datum/pipeline/proc/addMember(obj/machinery/atmospherics/A, obj/machinery/atmospherics/N) + if(istype(A, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/P = A + P.parent = src + var/list/adjacent = P.pipeline_expansion() + for(var/obj/machinery/atmospherics/pipe/I in adjacent) + if(I.parent == src) + continue + var/datum/pipeline/E = I.parent + merge(E) + if(!members.Find(P)) + members += P + air.volume += P.volume + else + A.setPipenet(src, N) + addMachineryMember(A) + +/datum/pipeline/proc/merge(datum/pipeline/E) + air.volume += E.air.volume + members.Add(E.members) + for(var/obj/machinery/atmospherics/pipe/S in E.members) + S.parent = src + air.merge(E.air) + for(var/obj/machinery/atmospherics/A in E.other_atmosmch) + A.replacePipenet(E, src) + other_atmosmch.Add(E.other_atmosmch) + other_airs.Add(E.other_airs) + E.members.Cut() + E.other_atmosmch.Cut() + qdel(E) + +/obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/A) + return + +/obj/machinery/atmospherics/pipe/addMember(obj/machinery/atmospherics/A) + parent.addMember(A, src) + +/obj/machinery/atmospherics/addMember(obj/machinery/atmospherics/A) + var/datum/pipeline/P = returnPipenet(A) + P.addMember(A, src) /datum/pipeline/proc/temporarily_store_air() //Update individual gas_mixtures by volume ratio @@ -41,149 +162,6 @@ corresponding.moles = trace_gas.moles*member.volume/air.volume -var/pipenetwarnings = 10 - -/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/pipe/base) - var/list/possible_expansions = list(base) - members = list(base) - edges = list() - - var/volume = base.volume - base.parent = src - alert_pressure = base.alert_pressure - - if(base.air_temporary) - air = base.air_temporary - base.air_temporary = null - else - air = new - while(possible_expansions.len>0) - for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions) - - var/list/result = borderline.pipeline_expansion() - var/edge_check = result.len - - if(result.len>0) - for(var/obj/machinery/atmospherics/pipe/item in result) - if(!members.Find(item)) - - if(item.parent) - if(pipenetwarnings > 0) - error("[item.type] added to a pipenet while still having one. ([item.x], [item.y], [item.z])") - pipenetwarnings -= 1 - if(pipenetwarnings == 0) - error("further messages about pipenets will be supressed") - members += item - possible_expansions += item - - volume += item.volume - item.parent = src - - alert_pressure = min(alert_pressure, item.alert_pressure) - - if(item.air_temporary) - air.merge(item.air_temporary) - item.air_temporary = null - - edge_check-- - - if(edge_check>0) - edges += borderline - - possible_expansions -= borderline - - air.volume = volume - -/datum/pipeline/proc/addMember(obj/machinery/atmospherics/pipe/P) - P.parent = src - var/list/adjacent = P.pipeline_expansion() - var/list/oldedges = list() - for(var/obj/machinery/atmospherics/pipe/I in adjacent) - oldedges += I - if(I.parent == src) - continue - var/datum/pipeline/E = I.parent - air.volume += E.air.volume - if(E.members.len > members.len) - members.Add(E.members) - for(var/obj/machinery/atmospherics/pipe/S in E.members) - S.parent = src - edges.Add(E.edges) - air.merge(E.air) - adjacent -= I - if(adjacent.len) - edges |= P - if(!members.Find(P)) - members += P - air.volume += P.volume - if(oldedges.len) - for(var/obj/machinery/atmospherics/pipe/O in oldedges) - var/list/Oedges = O.pipeline_expansion() - for(var/obj/machinery/atmospherics/pipe/Oedgepipes in Oedges) - Oedges -= Oedgepipes - if(Oedges.len) - edges |= O - else - edges -= O - -/obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/pipe/P) - return - -/obj/machinery/atmospherics/pipe/addMember(obj/machinery/atmospherics/pipe/P) - parent.addMember(P) - -/datum/pipeline/Destroy() - if(network) - qdel(network) - if(air && air.volume) - temporarily_store_air() - for(var/obj/machinery/atmospherics/pipe/P in members) - P.parent = null - ..() - -/datum/pipeline/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - - if(new_network.line_members.Find(src)) - return 0 - - new_network.line_members += src - - network = new_network - - for(var/obj/machinery/atmospherics/pipe/edge in edges) - for(var/obj/machinery/atmospherics/result in edge.pipeline_expansion()) - if(!istype(result,/obj/machinery/atmospherics/pipe) && (result!=reference)) - result.network_expand(new_network, edge) - - return 1 - -/datum/pipeline/proc/return_network(obj/machinery/atmospherics/reference) - if(!network) - network = new /datum/pipe_network() - network.build_network(src, null) - //technically passing these parameters should not be allowed - //however pipe_network.build_network(..) and pipeline.network_extend(...) - // were setup to properly handle this case - - return network - -/datum/pipeline/proc/mingle_with_turf(turf/simulated/target, mingle_volume) - var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume) - air_sample.volume = mingle_volume - - var/datum/gas_mixture/turf_air = target.return_air() - - equalize_gases(list(air_sample, turf_air)) - air.merge(air_sample) - //turf_air already modified by equalize_gases() - - if(istype(target)) - if(target.air) - if(target.air.check_tile_graphic()) - target.update_visuals(target.air) - if(network) - network.update = 1 - /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) var/total_heat_capacity = air.heat_capacity() var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) @@ -234,5 +212,215 @@ var/pipenetwarnings = 10 (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) air.temperature -= heat/total_heat_capacity - if(network) - network.update = 1 \ No newline at end of file + update = 1 + +/datum/pipeline/proc/reconcile_air() + var/list/datum/gas_mixture/GL = list() + var/list/datum/pipeline/PL = list() + PL += src + + for(var/i=1;i<=PL.len;i++) + var/datum/pipeline/P = PL[i] + GL += P.air + GL += P.other_airs + for(var/obj/machinery/atmospherics/binary/valve/V in P.other_atmosmch) + if(V.open) + PL |= V.parent1 + PL |= V.parent2 + for(var/obj/machinery/atmospherics/unary/portables_connector/C in P.other_atmosmch) + if(C.connected_device) + GL += C.portableConnectorReturnAir() + + var/total_volume = 0 + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 + var/total_oxygen = 0 + var/total_nitrogen = 0 + var/total_toxins = 0 + var/total_carbon_dioxide = 0 + var/list/total_trace_gases = list() + + for(var/datum/gas_mixture/G in GL) + total_volume += G.volume + total_thermal_energy += G.thermal_energy() + total_heat_capacity += G.heat_capacity() + + total_oxygen += G.oxygen + total_nitrogen += G.nitrogen + total_toxins += G.toxins + total_carbon_dioxide += G.carbon_dioxide + + if(G.trace_gases.len) + for(var/datum/gas/trace_gas in G.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in total_trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + total_trace_gases += corresponding + + corresponding.moles += trace_gas.moles + + if(total_volume > 0) + + //Calculate temperature + var/temperature = 0 + + if(total_heat_capacity > 0) + temperature = total_thermal_energy/total_heat_capacity + + //Update individual gas_mixtures by volume ratio + for(var/datum/gas_mixture/G in GL) + G.oxygen = total_oxygen*G.volume/total_volume + G.nitrogen = total_nitrogen*G.volume/total_volume + G.toxins = total_toxins*G.volume/total_volume + G.carbon_dioxide = total_carbon_dioxide*G.volume/total_volume + + G.temperature = temperature + + if(total_trace_gases.len) + for(var/datum/gas/trace_gas in total_trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in G.trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + G.trace_gases += corresponding + + corresponding.moles = trace_gas.moles*G.volume/total_volume + + +/* +/datum/pipeline/proc/mingle_with_turf(turf/simulated/target, mingle_volume) + var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume) + air_sample.volume = mingle_volume + + var/datum/gas_mixture/turf_air = target.return_air() + + equalize_gases(list(air_sample, turf_air)) + air.merge(air_sample) + //turf_air already modified by equalize_gases() + + if(istype(target)) + if(target.air) + if(target.air.check_tile_graphic()) + target.update_visuals(target.air) + update = 1 + +/datum/pipeline/proc/reconcile_air() + //Perfectly equalize all gases members instantly + + //Calculate totals from individual components + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 + var/datum/gas_mixture/air_transient = new() + var/list/gases = list(air) + gases.Add(other_airs) + for(var/datum/gas_mixture/gas in gases) + air_transient.volume += gas.volume + total_thermal_energy += gas.thermal_energy() + total_heat_capacity += gas.heat_capacity() + + air_transient.oxygen += gas.oxygen + air_transient.nitrogen += gas.nitrogen + air_transient.toxins += gas.toxins + air_transient.carbon_dioxide += gas.carbon_dioxide + + if(gas.trace_gases.len) + for(var/datum/gas/trace_gas in gas.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in air_transient.trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + air_transient.trace_gases += corresponding + + corresponding.moles += trace_gas.moles + + if(air_transient.volume > 0) + + if(total_heat_capacity > 0) + air_transient.temperature = total_thermal_energy/total_heat_capacity + + //Allow air mixture to react + if(air_transient.react()) + update = 1 + + else + air_transient.temperature = 0 + + //Update individual gas_mixtures by volume ratio + for(var/datum/gas_mixture/gas in gases) + gas.oxygen = air_transient.oxygen*gas.volume/air_transient.volume + gas.nitrogen = air_transient.nitrogen*gas.volume/air_transient.volume + gas.toxins = air_transient.toxins*gas.volume/air_transient.volume + gas.carbon_dioxide = air_transient.carbon_dioxide*gas.volume/air_transient.volume + + gas.temperature = air_transient.temperature + + if(air_transient.trace_gases.len) + for(var/datum/gas/trace_gas in air_transient.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in gas.trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + gas.trace_gases += corresponding + + corresponding.moles = trace_gas.moles*gas.volume/air_transient.volume + return 1 + +proc/equalize_gases(datum/gas_mixture/list/gases) + //Perfectly equalize all gases members instantly + + //Calculate totals from individual components + var/total_volume = 0 + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 + + var/total_oxygen = 0 + var/total_nitrogen = 0 + var/total_toxins = 0 + var/total_carbon_dioxide = 0 + + var/list/total_trace_gases = list() + + for(var/datum/gas_mixture/gas in gases) + total_volume += gas.volume + total_thermal_energy += gas.thermal_energy() + total_heat_capacity += gas.heat_capacity() + + total_oxygen += gas.oxygen + total_nitrogen += gas.nitrogen + total_toxins += gas.toxins + total_carbon_dioxide += gas.carbon_dioxide + + if(gas.trace_gases.len) + for(var/datum/gas/trace_gas in gas.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in total_trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + total_trace_gases += corresponding + + corresponding.moles += trace_gas.moles + + if(total_volume > 0) + + //Calculate temperature + var/temperature = 0 + + if(total_heat_capacity > 0) + temperature = total_thermal_energy/total_heat_capacity + + //Update individual gas_mixtures by volume ratio + for(var/datum/gas_mixture/gas in gases) + gas.oxygen = total_oxygen*gas.volume/total_volume + gas.nitrogen = total_nitrogen*gas.volume/total_volume + gas.toxins = total_toxins*gas.volume/total_volume + gas.carbon_dioxide = total_carbon_dioxide*gas.volume/total_volume + + gas.temperature = temperature + + if(total_trace_gases.len) + for(var/datum/gas/trace_gas in total_trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in gas.trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + gas.trace_gases += corresponding + + corresponding.moles = trace_gas.moles*gas.volume/total_volume + + return 1 +*/ \ No newline at end of file diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index 03a892e7a37..182696fe101 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -82,4 +82,4 @@ node2 = target break update_icon() - return + return \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index da4756b3d74..1a13c0701eb 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -9,7 +9,7 @@ var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called -/obj/machinery/atmospherics/pipe/proc/pipeline_expansion() +/obj/machinery/atmospherics/proc/pipeline_expansion() return null /obj/machinery/atmospherics/pipe/proc/check_pressure(pressure) @@ -24,32 +24,12 @@ air_update_turf() /obj/machinery/atmospherics/pipe/return_air() - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) return parent.air /obj/machinery/atmospherics/pipe/build_network() if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) - return parent.return_network() - -/obj/machinery/atmospherics/pipe/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) - return parent.network_expand(new_network, reference) - -/obj/machinery/atmospherics/pipe/return_network(obj/machinery/atmospherics/reference) - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) - return parent.return_network(reference) - -/obj/machinery/atmospherics/pipe/Destroy() - del(parent) - ..() /obj/machinery/atmospherics/pipe/attackby(obj/item/weapon/W, mob/user) if(istype(W, /obj/item/device/analyzer)) @@ -59,3 +39,6 @@ return return ..() + +/obj/machinery/atmospherics/pipe/setPipenet(datum/pipeline/P) + parent = P \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index cefc8589ad0..29f16311b63 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -57,14 +57,17 @@ if(node1) var/obj/machinery/atmospherics/A = node1 node1.disconnect(src) + node1 = null A.build_network() if(node2) var/obj/machinery/atmospherics/A = node2 node2.disconnect(src) + node2 = null A.build_network() if(node3) var/obj/machinery/atmospherics/A = node3 node3.disconnect(src) + node3 = null A.build_network() releaseAirToTurf() ..() diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 9f71e5950a5..17b6528e039 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -55,18 +55,22 @@ if(node1) var/obj/machinery/atmospherics/A = node1 node1.disconnect(src) + node1 = null A.build_network() if(node2) var/obj/machinery/atmospherics/A = node2 node2.disconnect(src) + node2 = null A.build_network() if(node3) var/obj/machinery/atmospherics/A = node3 node3.disconnect(src) + node3 = null A.build_network() if(node4) var/obj/machinery/atmospherics/A = node4 node4.disconnect(src) + node4 = null A.build_network() releaseAirToTurf() ..() diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm index 4ed1acca93d..da6fce0c263 100644 --- a/code/ATMOSPHERICS/pipes/simple.dm +++ b/code/ATMOSPHERICS/pipes/simple.dm @@ -69,10 +69,12 @@ The regular pipe you see everywhere, including bent ones. if(node1) var/obj/machinery/atmospherics/A = node1 node1.disconnect(src) + node1 = null A.build_network() if(node2) var/obj/machinery/atmospherics/A = node2 node2.disconnect(src) + node2 = null A.build_network() releaseAirToTurf() ..() diff --git a/code/ATMOSPHERICS/pipes/tank.dm b/code/ATMOSPHERICS/pipes/tank.dm index 0c5dfe53a23..0424cf34005 100644 --- a/code/ATMOSPHERICS/pipes/tank.dm +++ b/code/ATMOSPHERICS/pipes/tank.dm @@ -1,42 +1,12 @@ - -/* -Atmospheric Tanks -*/ -/obj/machinery/atmospherics/pipe/tank +/obj/machinery/atmospherics/unary/tank icon = 'icons/obj/atmospherics/pipe_tank.dmi' icon_state = "generic" - name = "pressure tank" desc = "A large vessel containing pressurized gas." - - volume = 10000 //in liters, 1 meters by 1 meters by 2 meters - - dir = SOUTH - initialize_directions = SOUTH + var/volume = 10000 //in liters, 1 meters by 1 meters by 2 meters density = 1 - can_unwrench = 0 - var/obj/machinery/atmospherics/node - var/showpipe = 0 -/obj/machinery/atmospherics/pipe/tank/New() - initialize_directions = dir - ..() - -/obj/machinery/atmospherics/pipe/tank/hide(var/intact) - showpipe = !intact - update_icon() - - ..(intact) - -/obj/machinery/atmospherics/pipe/tank/Destroy() - if(node) - node.disconnect(src) - ..() - -/obj/machinery/atmospherics/pipe/tank/pipeline_expansion() - return list(node) - -/obj/machinery/atmospherics/pipe/tank/update_icon() +/obj/machinery/atmospherics/unary/tank/update_icon() underlays.Cut() if(showpipe) var/state @@ -46,124 +16,66 @@ Atmospheric Tanks col = node.pipe_color else state = "pipe_exposed" - underlays += getpipeimage('icons/obj/atmospherics/pipe_tank.dmi', state, initialize_directions, col) -/obj/machinery/atmospherics/pipe/tank/initialize() - var/connect_direction = dir - for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) - if(target.initialize_directions & get_dir(target,src)) - node = target - break - - if(level == 2) - showpipe = 1 - - update_icon() - -/obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference) - if(reference == node) - if(istype(node, /obj/machinery/atmospherics/pipe)) - del(parent) - node = null - update_icon() - - -/* -CO2 Tank -*/ -/obj/machinery/atmospherics/pipe/tank/carbon_dioxide +/obj/machinery/atmospherics/unary/tank/carbon_dioxide name = "pressure tank (Carbon Dioxide)" -/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - +/obj/machinery/atmospherics/unary/tank/carbon_dioxide/New() ..() + air_contents.volume = volume + air_contents.temperature = T20C + air_contents.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) -/* -Plasma Tank -*/ -/obj/machinery/atmospherics/pipe/tank/toxins +/obj/machinery/atmospherics/unary/tank/toxins icon_state = "orange" name = "pressure tank (Plasma)" -/obj/machinery/atmospherics/pipe/tank/toxins/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.toxins = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - +/obj/machinery/atmospherics/unary/tank/toxins/New() ..() + air_contents.volume = volume + air_contents.temperature = T20C + air_contents.toxins = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) -/* -Plasma + Oxygen Tank -*/ -/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b +/obj/machinery/atmospherics/unary/tank/oxygen_agent_b icon_state = "orange_2" name = "pressure tank (Oxygen + Plasma)" -/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T0C - - var/datum/gas/oxygen_agent_b/trace_gas = new - trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - air_temporary.trace_gases += trace_gas - +/obj/machinery/atmospherics/unary/tank/oxygen_agent_b/New() ..() + air_contents.volume = volume + air_contents.temperature = T0C + var/datum/gas/oxygen_agent_b/trace_gas = new + trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) + air_contents.trace_gases += trace_gas -/* -Oxygen Tank -*/ -/obj/machinery/atmospherics/pipe/tank/oxygen +/obj/machinery/atmospherics/unary/tank/oxygen icon_state = "blue" name = "pressure tank (Oxygen)" -/obj/machinery/atmospherics/pipe/tank/oxygen/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - +/obj/machinery/atmospherics/unary/tank/oxygen/New() ..() + air_contents.volume = volume + air_contents.temperature = T20C + air_contents.oxygen = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) -/* -Nitrogen Tank -*/ -/obj/machinery/atmospherics/pipe/tank/nitrogen +/obj/machinery/atmospherics/unary/tank/nitrogen icon_state = "red" name = "pressure tank (Nitrogen)" -/obj/machinery/atmospherics/pipe/tank/nitrogen/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - +/obj/machinery/atmospherics/unary/tank/nitrogen/New() ..() + air_contents.volume = volume + air_contents.temperature = T20C + air_contents.nitrogen = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) -/* -Air Tank -*/ -/obj/machinery/atmospherics/pipe/tank/air +/obj/machinery/atmospherics/unary/tank/air icon_state = "grey" name = "pressure tank (Air)" -/obj/machinery/atmospherics/pipe/tank/air/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() \ No newline at end of file +/obj/machinery/atmospherics/unary/tank/air/New() + ..() + air_contents.volume = volume + air_contents.temperature = T20C + air_contents.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) + air_contents.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/vent.dm b/code/ATMOSPHERICS/pipes/vent.dm index 677c1988dd3..e69de29bb2d 100644 --- a/code/ATMOSPHERICS/pipes/vent.dm +++ b/code/ATMOSPHERICS/pipes/vent.dm @@ -1,89 +0,0 @@ - -/* -Atmospheric Vent -*/ -/obj/machinery/atmospherics/pipe/vent - icon = 'icons/obj/atmospherics/pipe_vent.dmi' - icon_state = "intact" - - name = "vent" - desc = "A large air vent" - - level = 1 - - volume = 250 - - dir = SOUTH - initialize_directions = SOUTH - - can_unwrench = 0 - - var/build_killswitch = 1 - - var/obj/machinery/atmospherics/node1 - -/obj/machinery/atmospherics/pipe/vent/New() - initialize_directions = dir - ..() - -/obj/machinery/atmospherics/pipe/vent/process() - if(!parent) - if(build_killswitch <= 0) - . = PROCESS_KILL - else - build_killswitch-- - ..() - return - else - parent.mingle_with_turf(loc, 250) -/* - if(!node1) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ -/obj/machinery/atmospherics/pipe/vent/Destroy() - if(node1) - node1.disconnect(src) - ..() - -/obj/machinery/atmospherics/pipe/vent/pipeline_expansion() - return list(node1) - -/obj/machinery/atmospherics/pipe/vent/update_icon() - if(node1) - icon_state = "intact" - - dir = get_dir(src, node1) - - else - icon_state = "exposed" - -/obj/machinery/atmospherics/pipe/vent/initialize() - var/connect_direction = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - - update_icon() - -/obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - update_icon() - - return null - -/obj/machinery/atmospherics/pipe/vent/hide(var/i) //to make the little pipe section invisible, the icon changes. - if(node1) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" - dir = get_dir(src, node1) - else - icon_state = "exposed" \ No newline at end of file diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index acf02a77bc8..c35c6577189 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -267,9 +267,9 @@ var/global/pipe_processing_killed = 0 processing_objects -= Object /datum/controller/game_controller/proc/process_pipenets() - last_thing_processed = /datum/pipe_network - for(var/datum/pipe_network/Network in pipe_networks) - Network.process() + last_thing_processed = /datum/pipeline + for(var/datum/pipeline/P in pipe_networks) + P.process() /datum/controller/game_controller/proc/process_powernets() last_thing_processed = /datum/powernet diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 25bc022a36b..3741c13b09e 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -3,7 +3,7 @@ use_power = 0 var/datum/gas_mixture/air_contents = new - var/obj/machinery/atmospherics/portables_connector/connected_port + var/obj/machinery/atmospherics/unary/portables_connector/connected_port var/obj/item/weapon/tank/holding var/volume = 0 @@ -34,7 +34,7 @@ /obj/machinery/portable_atmospherics/update_icon() return null -/obj/machinery/portable_atmospherics/proc/connect(obj/machinery/atmospherics/portables_connector/new_port) +/obj/machinery/portable_atmospherics/proc/connect(obj/machinery/atmospherics/unary/portables_connector/new_port) //Make sure not already connected to something else if(connected_port || !new_port || new_port.connected_device) return 0 @@ -46,32 +46,22 @@ //Perform the connection connected_port = new_port connected_port.connected_device = src + connected_port.parent.reconcile_air() anchored = 1 //Prevent movement - - //Actually enforce the air sharing - var/datum/pipe_network/network = connected_port.return_network(src) - if(network && !network.gases.Find(air_contents)) - network.gases += air_contents - network.update = 1 - return 1 /obj/machinery/portable_atmospherics/proc/disconnect() if(!connected_port) return 0 - - var/datum/pipe_network/network = connected_port.return_network(src) - if(network) - network.gases -= air_contents - anchored = 0 - connected_port.connected_device = null connected_port = null - return 1 +/obj/machinery/portable_atmospherics/portableConnectorReturnAir() + return air_contents + /obj/machinery/portable_atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed ))) if (src.holding) @@ -90,7 +80,7 @@ update_icon() return else - var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc + var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector) in loc if(possible_port) if(connect(possible_port)) user << "You connect [name] to the port." diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index e5acc1ea5af..de9224050fb 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -61,7 +61,7 @@ process_occupant() if(abs(temperature_archived-air_contents.temperature) > 1) - network.update = 1 + parent.update = 1 updateDialog() return 1 diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 7120b1d1550..9e0ab579263 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -27,7 +27,6 @@ Buildable meters name = "pipe" desc = "A pipe" var/pipe_type = 0 - //var/pipe_dir = 0 var/pipename force = 7 icon = 'icons/obj/pipe-item.dmi' @@ -37,7 +36,7 @@ Buildable meters level = 2 var/flipped = 0 -/obj/item/pipe/New(var/loc, var/pipe_type as num, var/dir as num, var/obj/machinery/atmospherics/make_from = null) +/obj/item/pipe/New(loc, pipe_type, dir, obj/machinery/atmospherics/make_from) ..() if (make_from) src.dir = make_from.dir @@ -55,7 +54,7 @@ Buildable meters src.pipe_type = PIPE_INSULATED_STRAIGHT + is_bent 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)) + else if(istype(make_from, /obj/machinery/atmospherics/unary/portables_connector)) src.pipe_type = PIPE_CONNECTOR else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold)) src.pipe_type = PIPE_MANIFOLD @@ -63,7 +62,7 @@ Buildable meters src.pipe_type = PIPE_UVENT else if(istype(make_from, /obj/machinery/atmospherics/valve/digital)) src.pipe_type = PIPE_DVALVE - else if(istype(make_from, /obj/machinery/atmospherics/valve)) + else if(istype(make_from, /obj/machinery/atmospherics/binary/valve)) src.pipe_type = PIPE_MVALVE else if(istype(make_from, /obj/machinery/atmospherics/binary/pump)) src.pipe_type = PIPE_PUMP @@ -305,275 +304,90 @@ Buildable meters switch(pipe_type) if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT) var/obj/machinery/atmospherics/pipe/simple/P = new( src.loc ) - P.dir = src.dir - P.initialize_directions = pipe_dir - var/turf/T = P.loc - P.level = T.intact ? 2 : 1 - P.initialize() - if (P.node1) - P.node1.initialize() - P.node1.addMember(P) - if (P.node2) - P.node2.initialize() - P.node2.addMember(P) - P.build_network() + P.construction(dir, pipe_dir) if(PIPE_HE_STRAIGHT, PIPE_HE_BENT) var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/P = new ( src.loc ) - P.dir = src.dir - P.initialize_directions = pipe_dir P.initialize_directions_he = pipe_dir - //var/turf/T = P.loc - //P.level = T.intact ? 2 : 1 - P.initialize() - if (P.node1) - P.node1.initialize() - P.node1.addMember(P) - if (P.node2) - P.node2.initialize() - P.node2.addMember(P) - P.build_network() + P.construction(dir, pipe_dir) - if(PIPE_CONNECTOR) // connector - var/obj/machinery/atmospherics/portables_connector/C = new( src.loc ) - C.dir = dir - C.initialize_directions = pipe_dir + if(PIPE_CONNECTOR) + var/obj/machinery/atmospherics/unary/portables_connector/C = new( src.loc ) if (pipename) C.name = pipename - var/turf/T = C.loc - C.level = T.intact ? 2 : 1 - C.initialize() - C.build_network() - if (C.node) - C.node.initialize() - C.node.build_network() + C.construction(dir, pipe_dir) - - if(PIPE_MANIFOLD) //manifold + if(PIPE_MANIFOLD) var/obj/machinery/atmospherics/pipe/manifold/M = new(loc) - M.dir = dir - M.initialize_directions = pipe_dir - var/turf/T = M.loc - M.level = T.intact ? 2 : 1 - M.initialize() - if (M.node1) - M.node1.initialize() - M.node1.addMember(M) - if (M.node2) - M.node2.initialize() - M.node2.addMember(M) - if (M.node3) - M.node3.initialize() - M.node3.addMember(M) - M.build_network() + M.construction(dir, pipe_dir) - if(PIPE_4WAYMANIFOLD) //manifold + if(PIPE_4WAYMANIFOLD) var/obj/machinery/atmospherics/pipe/manifold4w/M = new( src.loc ) - - var/turf/T = M.loc - M.level = T.intact ? 2 : 1 - M.initialize() - if (M.node1) - M.node1.initialize() - M.node1.addMember(M) - if (M.node2) - M.node2.initialize() - M.node2.addMember(M) - if (M.node3) - M.node3.initialize() - M.node3.addMember(M) - if (M.node4) - M.node4.initialize() - M.node4.addMember(M) - M.build_network() + M.construction(dir, pipe_dir) if(PIPE_JUNCTION) var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/P = new ( src.loc ) - P.dir = src.dir - P.initialize_directions = src.get_pdir() P.initialize_directions_he = src.get_hdir() - //var/turf/T = P.loc - //P.level = T.intact ? 2 : 1 - P.initialize() - if (P.node1) - P.node1.initialize() - P.node1.addMember(P) - if (P.node2) - P.node2.initialize() - P.node2.addMember(P) - P.build_network() + P.construction(dir, get_pdir()) - if(PIPE_UVENT) //unary vent + if(PIPE_UVENT) var/obj/machinery/atmospherics/unary/vent_pump/V = new( src.loc ) - V.dir = dir - V.initialize_directions = pipe_dir + V.construction(dir, pipe_dir) + + if(PIPE_MVALVE) + var/obj/machinery/atmospherics/binary/valve/V = new(src.loc) if (pipename) V.name = pipename - var/turf/T = V.loc - V.level = T.intact ? 2 : 1 - V.initialize() - V.build_network() - if (V.node) - V.node.initialize() - V.node.build_network() + V.construction(dir, get_pdir()) - - if(PIPE_MVALVE) //manual valve - var/obj/machinery/atmospherics/valve/V = new(src.loc) - V.dir = dir - V.initialize_directions = pipe_dir - if (pipename) - V.name = pipename - var/turf/T = V.loc - V.level = T.intact ? 2 : 1 - V.initialize() - V.build_network() - if (V.node1) -// world << "[V.node1.name] is connected to valve, forcing it to update its nodes." - V.node1.initialize() - V.node1.build_network() - if (V.node2) -// world << "[V.node2.name] is connected to valve, forcing it to update its nodes." - V.node2.initialize() - V.node2.build_network() - - if(PIPE_DVALVE) //Digital valves. Shameless copypaste from manual valves because I don't into atmos code. + if(PIPE_DVALVE) var/obj/machinery/atmospherics/valve/digital/V = new(src.loc) - V.dir = dir - V.initialize_directions = pipe_dir if (pipename) V.name = pipename - var/turf/T = V.loc - V.level = T.intact ? 2 : 1 - V.initialize() - V.build_network() - if (V.node1) - V.node1.initialize() - V.node1.build_network() - if (V.node2) - V.node2.initialize() - V.node2.build_network() + V.construction(dir, get_pdir()) - if(PIPE_PUMP) //gas pump + if(PIPE_PUMP) var/obj/machinery/atmospherics/binary/pump/P = new(src.loc) - P.dir = dir - P.initialize_directions = pipe_dir - if (pipename) - P.name = pipename - var/turf/T = P.loc - P.level = T.intact ? 2 : 1 - P.initialize() - 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_GAS_FILTER, PIPE_GAS_MIXER) //Trinary stuff + P.construction(dir, pipe_dir) + if(PIPE_GAS_FILTER, PIPE_GAS_MIXER) var/obj/machinery/atmospherics/trinary/P if(pipe_type == PIPE_GAS_FILTER) P = new /obj/machinery/atmospherics/trinary/filter(src.loc) else if(pipe_type == PIPE_GAS_MIXER) P = new /obj/machinery/atmospherics/trinary/mixer(src.loc) - P.flipped = flipped - P.dir = unflip(dir) - P.initialize_directions = pipe_dir if (pipename) P.name = pipename - var/turf/T = P.loc - P.level = T.intact ? 2 : 1 - P.initialize() - P.build_network() - if (P.node1) - P.node1.initialize() - P.node1.build_network() - if (P.node2) - P.node2.initialize() - P.node2.build_network() - if (P.node3) - P.node3.initialize() - P.node3.build_network() + P.construction(unflip(dir), pipe_dir) - if(PIPE_SCRUBBER) //scrubber + if(PIPE_SCRUBBER) var/obj/machinery/atmospherics/unary/vent_scrubber/S = new(src.loc) - S.dir = dir - S.initialize_directions = pipe_dir if (pipename) S.name = pipename - var/turf/T = S.loc - S.level = T.intact ? 2 : 1 - S.initialize() - S.build_network() - if (S.node) - S.node.initialize() - S.node.build_network() + S.construction(dir, pipe_dir) if(PIPE_INSULATED_STRAIGHT, PIPE_INSULATED_BENT) var/obj/machinery/atmospherics/pipe/simple/insulated/P = new( src.loc ) - P.dir = src.dir - P.initialize_directions = pipe_dir - var/turf/T = P.loc - P.level = T.intact ? 2 : 1 - P.initialize() - if (P.node1) - P.node1.initialize() - P.node1.addMember(P) - if (P.node2) - P.node2.initialize() - P.node2.addMember(P) - P.build_network() + P.construction(dir, pipe_dir) - if(PIPE_PASSIVE_GATE) //passive gate + if(PIPE_PASSIVE_GATE) var/obj/machinery/atmospherics/binary/passive_gate/P = new(src.loc) - P.dir = dir - P.initialize_directions = pipe_dir if (pipename) P.name = pipename - var/turf/T = P.loc - P.level = T.intact ? 2 : 1 - P.initialize() - P.build_network() - if (P.node1) - P.node1.initialize() - P.node1.build_network() - if (P.node2) - P.node2.initialize() - P.node2.build_network() + P.construction(dir, pipe_dir) - if(PIPE_VOLUME_PUMP) //volume pump + if(PIPE_VOLUME_PUMP) var/obj/machinery/atmospherics/binary/volume_pump/P = new(src.loc) - P.dir = dir - P.initialize_directions = pipe_dir if (pipename) P.name = pipename - var/turf/T = P.loc - P.level = T.intact ? 2 : 1 - P.initialize() - P.build_network() - if (P.node1) - P.node1.initialize() - P.node1.build_network() - if (P.node2) - P.node2.initialize() - P.node2.build_network() + P.construction(dir, pipe_dir) - if(PIPE_HEAT_EXCHANGE) // heat exchanger + if(PIPE_HEAT_EXCHANGE) var/obj/machinery/atmospherics/unary/heat_exchanger/C = new( src.loc ) - C.dir = dir - C.initialize_directions = pipe_dir if (pipename) C.name = pipename - var/turf/T = C.loc - C.level = T.intact ? 2 : 1 - C.initialize() - C.build_network() - if (C.node) - C.node.initialize() - C.node.build_network() + C.construction(dir, pipe_dir) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user.visible_message( \ diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 338ed1bae87..e8b7317b67a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -45,7 +45,7 @@ var/internal_tank_valve = ONE_ATMOSPHERE var/obj/machinery/portable_atmospherics/canister/internal_tank var/datum/gas_mixture/cabin_air - var/obj/machinery/atmospherics/portables_connector/connected_port = null + var/obj/machinery/atmospherics/unary/portables_connector/connected_port = null var/obj/item/device/radio/radio = null @@ -832,7 +832,7 @@ . = t_air.return_temperature() return -/obj/mecha/proc/connect(obj/machinery/atmospherics/portables_connector/new_port) +/obj/mecha/proc/connect(obj/machinery/atmospherics/unary/portables_connector/new_port) //Make sure not already connected to something else if(connected_port || !new_port || new_port.connected_device) return 0 @@ -844,12 +844,8 @@ //Perform the connection connected_port = new_port connected_port.connected_device = src + connected_port.parent.reconcile_air() - //Actually enforce the air sharing - var/datum/pipe_network/network = connected_port.return_network(src) - if(network && !(internal_tank.return_air() in network.gases)) - network.gases += internal_tank.return_air() - network.update = 1 log_message("Connected to gas port.") return 1 @@ -857,15 +853,13 @@ if(!connected_port) return 0 - var/datum/pipe_network/network = connected_port.return_network(src) - if(network) - network.gases -= internal_tank.return_air() - connected_port.connected_device = null connected_port = null src.log_message("Disconnected from gas port.") return 1 +/obj/mecha/portableConnectorReturnAir() + return internal_tank.return_air() ///////////////////////// //////// Verbs //////// @@ -881,7 +875,7 @@ if(usr.stat) return if(usr != src.occupant) return - var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc + var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc if(possible_port) if(connect(possible_port)) src.occupant_message("[name] connects to the port.") diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 75bb884316e..b0bec3393ff 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -132,43 +132,40 @@ entry_vent = null else if(entry_vent) if(get_dist(src, entry_vent) <= 1) - if(entry_vent.network && entry_vent.network.normal_members.len) - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.network.normal_members) - vents.Add(temp_vent) - if(!vents.len) - entry_vent = null - return - var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents) - if(prob(50)) - visible_message("[src] scrambles into the ventillation ducts!", \ - "You hear something squeezing through the ventilation ducts.") - - spawn(rand(20,60)) - loc = exit_vent - var/travel_time = round(get_dist(loc, exit_vent.loc) / 2) - spawn(travel_time) - - if(!exit_vent || exit_vent.welded) - loc = entry_vent - entry_vent = null - return - - if(prob(50)) - audible_message("You hear something squeezing through the ventilation ducts.") - sleep(travel_time) - - if(!exit_vent || exit_vent.welded) - loc = entry_vent - entry_vent = null - return - loc = exit_vent.loc - entry_vent = null - var/area/new_area = get_area(loc) - if(new_area) - new_area.Entered(src) - else + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.parent.other_atmosmch) + vents.Add(temp_vent) + if(!vents.len) entry_vent = null + return + var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents) + if(prob(50)) + visible_message("[src] scrambles into the ventillation ducts!", \ + "You hear something squeezing through the ventilation ducts.") + + spawn(rand(20,60)) + loc = exit_vent + var/travel_time = round(get_dist(loc, exit_vent.loc) / 2) + spawn(travel_time) + + if(!exit_vent || exit_vent.welded) + loc = entry_vent + entry_vent = null + return + + if(prob(50)) + audible_message("You hear something squeezing through the ventilation ducts.") + sleep(travel_time) + + if(!exit_vent || exit_vent.welded) + loc = entry_vent + entry_vent = null + return + loc = exit_vent.loc + entry_vent = null + var/area/new_area = get_area(loc) + if(new_area) + new_area.Entered(src) //================= else if(prob(33)) @@ -213,7 +210,7 @@ var/mob/living/user = usr var/breakout_time = 2 user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT + user.last_special = world.time + CLICK_CD_BREAKOUT user << "You struggle against the tight bonds! (This will take about [breakout_time] minutes.)" visible_message("You see something struggling and writhing in the [src]!") if(do_after(user,(breakout_time*60*10))) diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index c4c82a9cf45..bdb5d6cd0dc 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -28,8 +28,8 @@ /datum/round_event/alien_infestation/start() var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world) - if(temp_vent.loc.z == 1 && !temp_vent.welded && temp_vent.network) - if(temp_vent.network.normal_members.len > 20) //Stops Aliens getting stuck in small networks. See: Security, Virology + if(temp_vent.loc.z == 1 && !temp_vent.welded) + if(temp_vent.parent.other_atmosmch.len > 20) //Stops Aliens getting stuck in small networks. See: Security, Virology vents += temp_vent var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index 8bfb56e49f8..e282e3b45b1 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -21,8 +21,8 @@ /datum/round_event/spider_infestation/start() var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world) - if(temp_vent.loc.z == 1 && !temp_vent.welded && temp_vent.network) - if(temp_vent.network.normal_members.len > 20) + if(temp_vent.loc.z == 1 && !temp_vent.welded) + if(temp_vent.parent.other_atmosmch.len > 20) vents += temp_vent while((spawncount >= 1) && vents.len) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index db410577ab7..1f06710548a 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -17,8 +17,8 @@ /datum/round_event/vent_clog/setup() endWhen = rand(25, 100) for(var/obj/machinery/atmospherics/unary/vent_scrubber/temp_vent in machines) - if(temp_vent.loc.z == 1 && temp_vent.network) - if(temp_vent.network.normal_members.len > 20) + if(temp_vent.loc.z == 1) + if(temp_vent.parent.other_atmosmch.len > 20) vents += temp_vent if(!vents.len) return kill()