diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 2ca103868c6..723fa1f928c 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -78,7 +78,50 @@ Pipelines + Other Objects -> Pipe network /** Check if this machine is willing to connect with the target machine. */ /obj/machinery/atmospherics/proc/check_connectable(obj/machinery/atmospherics/target) - return (src.connect_types & target.connect_types) + return (src.connect_types & target.connect_types) && !check_if_side_in_use(target) + +/** Returns true if a pipe is already connected to the same side of the target as ourselves. This is a hack to prevent multi-connection from the same turf. Our atmopipes do not have support for multiple connections, this requires a major refactor or replacement port from TG in the future. */ +/obj/machinery/atmospherics/proc/check_if_side_in_use(obj/machinery/atmospherics/target) + if(istype(src, /obj/machinery/atmospherics/pipe/simple/hidden/universal) \ + || istype(src, /obj/machinery/atmospherics/pipe/simple/visible/universal) \ + || istype(target, /obj/machinery/atmospherics/pipe/simple/visible/universal) \ + || istype(target, /obj/machinery/atmospherics/pipe/simple/visible/universal)) + return FALSE // Snowflake to allow univerals pipe adaptors to bridge the gap on the same side + var/list/node_list = target.get_neighbor_nodes_for_init() + if(!length(node_list)) // Preserving original behavior + return TRUE + // By default, do not allow connections from the same side. + var/turf/our_turf = get_turf(src) + for(var/obj/machinery/atmospherics/check_node in node_list) + if(QDELETED(check_node) || check_node == src) + continue + if(get_turf(check_node) == our_turf) + return TRUE + return FALSE + +/// Prioritize pipes that are already trying to link to us, prevents mismatching when both sides call atmo_init() on their own +/obj/machinery/atmospherics/proc/get_prioritized_nodes(turf/at_loc) + RETURN_TYPE(/list) + + var/priority_target = null + var/list/viable_nodes = list() + for(var/obj/machinery/atmospherics/checking in at_loc) + var/list/node_list = checking.get_neighbor_nodes_for_init() + if(!priority_target) // Check for pipes already linking to us from their side. We want them to be priority to link back. + for(var/obj/machinery/atmospherics/node_check in node_list) + if(!priority_target && node_check == src) + priority_target = checking + break + // Otherwise we just want a list of all the viable targets we COULD link to. check_connectable() will be called after to see if they can be linked to properly. + if(checking != priority_target) + viable_nodes += checking + + // So the goal of this proc is to organize the list so that the one trying to link to us will be FIRST, but the list of targets is always all available nodes + if(priority_target) // Put the priority target at the head + viable_nodes = list(priority_target) + viable_nodes + + return viable_nodes + /obj/machinery/atmospherics/attackby(atom/A, mob/user as mob) if(istype(A, /obj/item/pipe_painter)) diff --git a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm index 19a62d9a2f5..b3dee9dd7af 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm @@ -143,13 +143,13 @@ var/node2_connect = turn(dir, -90) var/node1_connect = turn(dir, 90) - for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) - if(target.initialize_directions & get_dir(target,src)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node1_connect))) + if(can_be_node(target, 1)) node1 = target break - for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) - if(target.initialize_directions & get_dir(target,src)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node2_connect))) + if(can_be_node(target, 2)) node2 = target break diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 73311b09236..c69cca42685 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -18,7 +18,6 @@ Thus, the two variables affect pump operation are set in New(): construction_type = /obj/item/pipe/directional pipe_state = "pump" level = 1 - var/base_icon = "pump" name = "gas pump" desc = "A pump that moves gas from one place to another." @@ -27,6 +26,7 @@ Thus, the two variables affect pump operation are set in New(): //var/max_volume_transfer = 10000 + pipe_flags = NONE // Other pumps can be on other layers use_power = USE_POWER_OFF idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //7500 W ~ 10 HP @@ -39,7 +39,6 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump/Initialize(mapload) . = ..() - air1.volume = ATMOS_DEFAULT_VOLUME_PUMP air2.volume = ATMOS_DEFAULT_VOLUME_PUMP if(frequency) @@ -55,7 +54,6 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump/fuel icon_state = "map_off-fuel" - base_icon = "pump-fuel" icon_connect_type = "-fuel" connect_types = CONNECT_TYPE_FUEL @@ -65,7 +63,6 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump/aux icon_state = "map_off-aux" - base_icon = "pump-aux" icon_connect_type = "-aux" connect_types = CONNECT_TYPE_AUX @@ -73,7 +70,26 @@ Thus, the two variables affect pump operation are set in New(): icon_state = "map_on-aux" use_power = USE_POWER_IDLE +/obj/machinery/atmospherics/binary/pump/scrubbers + icon_state = "map_off-scrubbers" + icon_connect_type = "-scrubbers" + connect_types = CONNECT_TYPE_SCRUBBER + +/obj/machinery/atmospherics/binary/pump/scrubbers/on + icon_state = "map_on-scrubbers" + use_power = USE_POWER_IDLE + +/obj/machinery/atmospherics/binary/pump/supply + icon_state = "map_off-supply" + icon_connect_type = "-supply" + connect_types = CONNECT_TYPE_SUPPLY + +/obj/machinery/atmospherics/binary/pump/supply/on + icon_state = "map_on-supply" + use_power = USE_POWER_IDLE + /obj/machinery/atmospherics/binary/pump/update_icon() + var/base_icon = "pump[icon_connect_type]" if(!powered()) icon_state = "[base_icon]-off" else @@ -85,8 +101,10 @@ Thus, the two variables affect pump operation are set in New(): var/turf/T = get_turf(src) if(!istype(T)) return - add_underlay(T, node1, turn(dir, -180), node1?.icon_connect_type) - add_underlay(T, node2, dir, node2?.icon_connect_type) + if(node1) + add_underlay(T, node1, turn(dir, -180), icon_connect_type) + if(node2) + add_underlay(T, node2, dir, icon_connect_type) /obj/machinery/atmospherics/binary/pump/hide(i) update_underlays() @@ -295,9 +313,3 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump/high_power/on use_power = USE_POWER_IDLE icon_state = "map_on" - -/obj/machinery/atmospherics/binary/pump/high_power/update_icon() - if(!powered()) - icon_state = "off" - else - icon_state = "[use_power ? "on" : "off"]" diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index f4b6717af63..fb0f684a343 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -20,11 +20,11 @@ Thus, the two variables affect pump operation are set in New(): construction_type = /obj/item/pipe/directional pipe_state = "volumepump" level = 1 - var/base_icon = "pump" name = "volumetric gas pump" desc = "A pump that moves gas by volume" + pipe_flags = NONE // Other pumps can be on other layers use_power = USE_POWER_OFF idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 15000 //15000 W ~ 20.4 HP @@ -51,13 +51,12 @@ Thus, the two variables affect pump operation are set in New(): unregister_radio(src, frequency) . = ..() -/obj/machinery/atmospherics/binary/pump/on +/obj/machinery/atmospherics/binary/volume_pump/on icon_state = "map_on" use_power = USE_POWER_IDLE /obj/machinery/atmospherics/binary/volume_pump/fuel icon_state = "map_off-fuel" - base_icon = "pump-fuel" icon_connect_type = "-fuel" connect_types = CONNECT_TYPE_FUEL @@ -67,7 +66,6 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/volume_pump/aux icon_state = "map_off-aux" - base_icon = "pump-aux" icon_connect_type = "-aux" connect_types = CONNECT_TYPE_AUX @@ -75,13 +73,32 @@ Thus, the two variables affect pump operation are set in New(): icon_state = "map_on-aux" use_power = USE_POWER_IDLE -/obj/machinery/atmospherics/binary/volume_pump/update_icon() - if(!powered()) - icon_state = "off" - else - icon_state = "[use_power ? "on" : "off"]" +/obj/machinery/atmospherics/binary/volume_pump/scrubbers + icon_state = "map_off-scrubbers" + icon_connect_type = "-scrubbers" + connect_types = CONNECT_TYPE_SCRUBBER - overclock_overlay = mutable_appearance('icons/atmos/volume_pump_overclock.dmi', "vpumpoverclock") +/obj/machinery/atmospherics/binary/volume_pump/scrubbers/on + icon_state = "map_on-scrubbers" + use_power = USE_POWER_IDLE + +/obj/machinery/atmospherics/binary/volume_pump/supply + icon_state = "map_off-supply" + icon_connect_type = "-supply" + connect_types = CONNECT_TYPE_SUPPLY + +/obj/machinery/atmospherics/binary/volume_pump/supply/on + icon_state = "map_on-supply" + use_power = USE_POWER_IDLE + +/obj/machinery/atmospherics/binary/volume_pump/update_icon() + var/base_icon = "pump[icon_connect_type]" + if(!powered()) + icon_state = "[base_icon]-off" + else + icon_state = "[use_power ? "[base_icon]-on" : "[base_icon]-off"]" + + overclock_overlay = mutable_appearance('icons/atmos/volume_pump_overclock.dmi', "vpumpoverclock[icon_connect_type]") if(powered() && use_power && overclocked) add_overlay(overclock_overlay) else @@ -93,8 +110,10 @@ Thus, the two variables affect pump operation are set in New(): var/turf/T = get_turf(src) if(!istype(T)) return - add_underlay(T, node1, turn(dir, -180), node1?.icon_connect_type) - add_underlay(T, node2, dir, node2?.icon_connect_type) + if(node1) + add_underlay(T, node1, turn(dir, -180), icon_connect_type) + if(node2) + add_underlay(T, node2, dir, icon_connect_type) /obj/machinery/atmospherics/binary/volume_pump/hide(i) update_underlays() diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index ff28e3da550..e9c1a4eb4fb 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -242,7 +242,7 @@ for(var/datum/omni_port/P in ports) if(P.node || P.mode == 0) continue - for(var/obj/machinery/atmospherics/target in get_step(src, P.dir)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, P.dir))) if(can_be_node(target, 1)) P.node = target break diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 64d77917520..a4966a60f50 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -9,7 +9,7 @@ initialize_directions = SOUTH construction_type = /obj/item/pipe/directional pipe_state = "connector" - pipe_flags = PIPING_DEFAULT_LAYER_ONLY|PIPING_ONE_PER_TURF + pipe_flags = PIPING_ONE_PER_TURF var/obj/machinery/portable_atmospherics/connected_device @@ -25,21 +25,31 @@ icon_state = "map_connector-fuel" pipe_state = "connector-fuel" icon_connect_type = "-fuel" - pipe_flags = PIPING_ONE_PER_TURF connect_types = CONNECT_TYPE_FUEL /obj/machinery/atmospherics/portables_connector/aux icon_state = "map_connector-aux" pipe_state = "connector-aux" icon_connect_type = "-aux" - pipe_flags = PIPING_ONE_PER_TURF connect_types = CONNECT_TYPE_AUX +/obj/machinery/atmospherics/portables_connector/scrubbers + icon_state = "map_connector-scrubbers" + pipe_state = "connector-scrubbers" + icon_connect_type = "-scrubbers" + connect_types = CONNECT_TYPE_SCRUBBER + +/obj/machinery/atmospherics/portables_connector/supply + icon_state = "map_connector-supply" + pipe_state = "connector-supply" + icon_connect_type = "-supply" + connect_types = CONNECT_TYPE_SUPPLY + /obj/machinery/atmospherics/portables_connector/init_dir() initialize_directions = dir /obj/machinery/atmospherics/portables_connector/update_icon() - icon_state = "connector" + icon_state = "connector[icon_connect_type]" /obj/machinery/atmospherics/portables_connector/update_underlays() ..() @@ -96,7 +106,7 @@ var/node_connect = dir - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node_connect))) if(can_be_node(target, 1)) node = target break diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index 8d7a1cef091..f6bb112d814 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -38,7 +38,7 @@ var/node_connect = dir - for(var/obj/machinery/atmospherics/target in get_step(src, node_connect)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, node_connect))) if(can_be_node(target, 1)) node = target break diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index 455706f7fd5..b8c5505e5b1 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -40,7 +40,7 @@ var/node_connect = dir //check that there is something to connect to - for(var/obj/machinery/atmospherics/target in get_step(src, node_connect)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, node_connect))) if(can_be_node(target, 1)) node = target break diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index 19c698d7429..9464b1c33c1 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -52,7 +52,7 @@ var/node_connect = dir - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node_connect))) if(can_be_node(target, 1)) node = target break diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 512fd24fa2e..922fcdad207 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -18,7 +18,7 @@ idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 30000 //7500 W ~ 10 HP //VOREStation Edit - 30000 W - connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY //connects to regular and supply pipes + connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_FUEL|CONNECT_TYPE_AUX // All except scrubbers blocks_emissive = EMISSIVE_BLOCK_NONE var/area/initial_loc diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index f4c47aec3c5..d35cd5b4f04 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -9,7 +9,7 @@ idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //7500 W ~ 10 HP - connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SCRUBBER //connects to regular and scrubber pipes + connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SCRUBBER|CONNECT_TYPE_FUEL|CONNECT_TYPE_AUX // All except supply level = 1 diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index d2adccb43b1..6e9fbd0b790 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -54,7 +54,7 @@ add_overlay(GLOB.icon_manager.get_atmos_icon("pipe", , pipe_color, "cap[icon_connect_type]")) /obj/machinery/atmospherics/pipe/cap/atmos_init() - for(var/obj/machinery/atmospherics/target in get_step(src, dir)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, dir))) if (can_be_node(target, 1)) node = target break diff --git a/code/ATMOSPHERICS/pipes/he_pipes.dm b/code/ATMOSPHERICS/pipes/he_pipes.dm index 7a8d0209b8f..8d22e406431 100644 --- a/code/ATMOSPHERICS/pipes/he_pipes.dm +++ b/code/ATMOSPHERICS/pipes/he_pipes.dm @@ -54,11 +54,11 @@ else if (!node2_dir) node2_dir = direction - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node1_dir)) + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_prioritized_nodes(get_step(src,node1_dir))) if(can_be_node(target, 1)) node1 = target break - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node2_dir)) + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_prioritized_nodes(get_step(src,node2_dir))) if(can_be_node(target, 2)) node2 = target break diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 21bdc5a0217..40262ec9115 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -136,7 +136,7 @@ for(var/direction in GLOB.cardinal) if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,direction))) if (can_be_node(target, 1)) node1 = target connect_directions &= ~direction @@ -147,7 +147,7 @@ for(var/direction in GLOB.cardinal) if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,direction))) if (can_be_node(target, 2)) node2 = target connect_directions &= ~direction @@ -158,7 +158,7 @@ for(var/direction in GLOB.cardinal) if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,direction))) if (can_be_node(target, 3)) node3 = target connect_directions &= ~direction diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 13470d24cf6..f622e0aac08 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -117,22 +117,22 @@ /obj/machinery/atmospherics/pipe/manifold4w/atmos_init() - for(var/obj/machinery/atmospherics/target in get_step(src, NORTH)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, NORTH))) if (can_be_node(target, 1)) node1 = target break - for(var/obj/machinery/atmospherics/target in get_step(src, SOUTH)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, SOUTH))) if (can_be_node(target, 2)) node2 = target break - for(var/obj/machinery/atmospherics/target in get_step(src, EAST)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, EAST))) if (can_be_node(target, 3)) node3 = target break - for(var/obj/machinery/atmospherics/target in get_step(src, WEST)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, WEST))) if (can_be_node(target, 4)) node4 = target break diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm index b4e553116f3..1f0745acd4a 100644 --- a/code/ATMOSPHERICS/pipes/pipe_base.dm +++ b/code/ATMOSPHERICS/pipes/pipe_base.dm @@ -123,9 +123,6 @@ . = ..() /obj/machinery/atmospherics/pipe/attackby(obj/item/W as obj, mob/user as mob) - if (istype(src, /obj/machinery/atmospherics/pipe/tank)) - return ..() - if(istype(W,/obj/item/pipe_painter)) return 0 diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm index e9297b08039..fb36526ef8a 100644 --- a/code/ATMOSPHERICS/pipes/simple.dm +++ b/code/ATMOSPHERICS/pipes/simple.dm @@ -136,11 +136,11 @@ else if (!node2_dir) node2_dir = direction - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node1_dir))) if(can_be_node(target, 1)) node1 = target break - for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node2_dir))) if(can_be_node(target, 2)) node2 = target break diff --git a/code/ATMOSPHERICS/pipes/tank.dm b/code/ATMOSPHERICS/pipes/tank.dm index 94023f098bd..09dd9adcf6a 100644 --- a/code/ATMOSPHERICS/pipes/tank.dm +++ b/code/ATMOSPHERICS/pipes/tank.dm @@ -15,7 +15,11 @@ level = 1 dir = SOUTH initialize_directions = SOUTH - pipe_flags = PIPING_DEFAULT_LAYER_ONLY + construction_type = /obj/item/pipe/directional/tank // special lorge pipe + pipe_state = "tank" + + pipe_flags = PIPING_ONE_PER_TURF + connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_SCRUBBER|CONNECT_TYPE_FUEL|CONNECT_TYPE_AUX density = TRUE /obj/machinery/atmospherics/pipe/tank/Initialize(mapload) @@ -42,7 +46,8 @@ var/turf/T = get_turf(src) if(!istype(T)) return - add_underlay(T, node1, dir) + if(node1) + add_underlay(T, node1, dir, node1.icon_connect_type) /obj/machinery/atmospherics/pipe/tank/hide() update_underlays() @@ -50,7 +55,7 @@ /obj/machinery/atmospherics/pipe/tank/atmos_init() var/connect_direction = dir - for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,connect_direction))) if (can_be_node(target, 1)) node1 = target break @@ -67,10 +72,6 @@ return null -/obj/machinery/atmospherics/pipe/tank/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/pipe_painter)) - return - /obj/machinery/atmospherics/pipe/tank/air name = "Pressure Tank (Air)" icon_state = "air_map" @@ -172,3 +173,20 @@ air_temporary.adjust_gas(GAS_CH4, (start_pressure)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)) icon_state = "ch4" + +/obj/machinery/atmospherics/pipe/tank/custom + name = "Pressure Tank" + icon_state = "air_map" + +/obj/machinery/atmospherics/pipe/tank/custom/atmos_init() + . = ..() + icon_state = "air" // Forces air for the proper blending, we don't want -scrubbers! + update_icon() + +/obj/machinery/atmospherics/pipe/tank/custom/update_icon() + cut_overlays() + if(!pipe_color) + return + var/image/I = image(icon, icon_state = "custom") + I.color = pipe_color + add_overlay(I) diff --git a/code/ATMOSPHERICS/pipes/universal.dm b/code/ATMOSPHERICS/pipes/universal.dm index 97843506ef9..35bce2671e0 100644 --- a/code/ATMOSPHERICS/pipes/universal.dm +++ b/code/ATMOSPHERICS/pipes/universal.dm @@ -1,5 +1,9 @@ +#define LIST_NODE1 1 +#define LIST_NODE2 2 + // // Universal Pipe Adapter - Designed for connecting scrubbers, normal, and supply pipes together. +// Visible varient // /obj/machinery/atmospherics/pipe/simple/visible/universal name="Universal pipe adapter" @@ -9,33 +13,46 @@ pipe_flags = PIPING_ALL_LAYER|PIPING_CARDINAL_AUTONORMALIZE construction_type = /obj/item/pipe/binary pipe_state = "universal" + var/list/universal_nodes = new/list(PIPING_LAYER_AUX) + +/obj/machinery/atmospherics/pipe/simple/visible/universal/Initialize(mapload) + . = ..() + universal_nodes[PIPING_LAYER_SUPPLY] = list(null, null) + universal_nodes[PIPING_LAYER_REGULAR] = list(null, null) + universal_nodes[PIPING_LAYER_SCRUBBER] = list(null, null) + universal_nodes[PIPING_LAYER_FUEL] = list(null, null) + universal_nodes[PIPING_LAYER_AUX] = list(null, null) + +/obj/machinery/atmospherics/pipe/simple/visible/universal/Destroy() + . = ..() + universal_destroy(universal_nodes) + +/obj/machinery/atmospherics/pipe/simple/visible/universal/atmos_init() + universal_atmos_init(universal_nodes) + +/obj/machinery/atmospherics/pipe/simple/visible/universal/disconnect(obj/machinery/atmospherics/reference) + universal_disconnect(universal_nodes, reference) + +/obj/machinery/atmospherics/pipe/simple/visible/universal/pipeline_expansion() + var/list/all_nodes = list() + for(var/list/sublist in universal_nodes) + all_nodes += sublist + return all_nodes + +/obj/machinery/atmospherics/pipe/simple/visible/universal/get_neighbor_nodes_for_init() + return pipeline_expansion() /obj/machinery/atmospherics/pipe/simple/visible/universal/update_icon(safety = 0) - alpha = 255 - - cut_overlays() - add_overlay(GLOB.icon_manager.get_atmos_icon("pipe", , pipe_color, "universal")) - underlays.Cut() - - if (node1) - universal_underlays(node1) - if(node2) - universal_underlays(node2) - else - var/node1_dir = get_dir(node1,src) - universal_underlays(,node1_dir) - else if (node2) - universal_underlays(node2) - else - universal_underlays(,dir) - universal_underlays(,turn(dir, -180)) + universal_node_update_icon(universal_nodes) /obj/machinery/atmospherics/pipe/simple/visible/universal/update_underlays() ..() update_icon() - - +// +// Universal Pipe Adapter - Designed for connecting scrubbers, normal, and supply pipes together. +// Hidden varient +// /obj/machinery/atmospherics/pipe/simple/hidden/universal name="Universal pipe adapter" desc = "An adapter for regular, supply and scrubbers pipes" @@ -44,76 +61,153 @@ pipe_flags = PIPING_ALL_LAYER|PIPING_CARDINAL_AUTONORMALIZE construction_type = /obj/item/pipe/binary pipe_state = "universal" + var/list/universal_nodes = new/list(PIPING_LAYER_AUX) + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/Initialize(mapload) + . = ..() + universal_nodes[PIPING_LAYER_SUPPLY] = list(null, null) + universal_nodes[PIPING_LAYER_REGULAR] = list(null, null) + universal_nodes[PIPING_LAYER_SCRUBBER] = list(null, null) + universal_nodes[PIPING_LAYER_FUEL] = list(null, null) + universal_nodes[PIPING_LAYER_AUX] = list(null, null) + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/Destroy() + . = ..() + universal_destroy(universal_nodes) + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/atmos_init() + universal_atmos_init(universal_nodes) + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/disconnect(obj/machinery/atmospherics/reference) + universal_disconnect(universal_nodes, reference) + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/pipeline_expansion() + var/list/all_nodes = list() + for(var/list/sublist in universal_nodes) + all_nodes += sublist + return all_nodes + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/get_neighbor_nodes_for_init() + return pipeline_expansion() /obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(safety = 0) // Doesn't leak. It's a special pipe. + universal_node_update_icon(universal_nodes) + +/obj/machinery/atmospherics/pipe/simple/hidden/universal/update_underlays() + ..() + update_icon() + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Shared universal pipe adaptor procs +// +// TODO : universal should be unified into it's own subtype and changed on all maps with hidden and visible subtypes... this is awful +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +/obj/machinery/atmospherics/pipe/simple/proc/universal_atmos_init(list/universal_nodes) + normalize_dir() + var/node1_dir + var/node2_dir + + for(var/direction in GLOB.cardinal) + if(direction&initialize_directions) + if (!node1_dir) + node1_dir = direction + else if (!node2_dir) + node2_dir = direction + + var/has_any_nodes = FALSE + var/node_index = 0 + for(var/list/node_layer in universal_nodes) + node_index++ // So we can tell what layer we are on + // Each node layer expects the target to be on the same layer! + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node1_dir))) + if(target.piping_layer == node_index && can_be_node(target, 1)) + node_layer[LIST_NODE1] = target + has_any_nodes = TRUE + break + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node2_dir))) + if(target.piping_layer == node_index && can_be_node(target, 2)) + node_layer[LIST_NODE2] = target + has_any_nodes = TRUE + break + if(!has_any_nodes) + qdel(src) + return + + var/turf/T = loc + if(level == 1 && !T.is_plating()) + hide(1) + update_icon() + +/obj/machinery/atmospherics/pipe/simple/proc/universal_destroy(list/universal_nodes) + for(var/list/sublist in universal_nodes) + var/obj/machinery/atmospherics/nodeone = sublist[LIST_NODE1] + var/obj/machinery/atmospherics/nodetwo = sublist[LIST_NODE2] + nodeone?.disconnect(src) + nodetwo?.disconnect(src) + sublist.Cut() + universal_nodes.Cut() + universal_nodes = null + +/obj/machinery/atmospherics/pipe/simple/proc/universal_disconnect(list/universal_nodes, obj/machinery/atmospherics/reference) + for(var/list/node_layer in universal_nodes) + var/obj/machinery/atmospherics/node_one = node_layer[LIST_NODE1] + var/obj/machinery/atmospherics/node_two = node_layer[LIST_NODE2] + + if(reference == node_one) + node_one.disconnect(src) + node_layer[LIST_NODE1] = null + + if(reference == node_two) + node_two.disconnect(src) + node_layer[LIST_NODE2] = null + + update_icon() + return null + +/obj/machinery/atmospherics/pipe/simple/proc/universal_node_update_icon(list/universal_nodes) alpha = 255 cut_overlays() add_overlay(GLOB.icon_manager.get_atmos_icon("pipe", , pipe_color, "universal")) underlays.Cut() - if (node1) - universal_underlays(node1) - if(node2) - universal_underlays(node2) + var/layer_index = 0 + for(var/list/node_layer in universal_nodes) + layer_index++ + var/obj/machinery/atmospherics/node_one = node_layer[LIST_NODE1] + var/obj/machinery/atmospherics/node_two = node_layer[LIST_NODE2] + + if (node_one) + universal_underlays(node_one, null, layer_index) + if(node_two) + universal_underlays(node_two, null, layer_index) + else + var/node1_dir = get_dir(node_one,src) + universal_underlays(null, node1_dir, layer_index) + else if (node_two) + universal_underlays(node_two, null, layer_index) else - var/node2_dir = turn(get_dir(src,node1),-180) - universal_underlays(,node2_dir) - else if (node2) - universal_underlays(node2) - var/node1_dir = turn(get_dir(src,node2),-180) - universal_underlays(,node1_dir) - else - universal_underlays(,dir) - universal_underlays(,turn(dir, -180)) + universal_underlays(null, dir, layer_index) + universal_underlays(null, turn(dir, -180), layer_index) -/obj/machinery/atmospherics/pipe/simple/hidden/universal/update_underlays() - ..() - update_icon() - -/obj/machinery/atmospherics/proc/universal_underlays(obj/machinery/atmospherics/node, direction) +/obj/machinery/atmospherics/pipe/simple/proc/universal_underlays(obj/machinery/atmospherics/node, direction, layer_index) var/turf/T = loc if(node) - var/node_dir = get_dir(src,node) - switch(node.icon_connect_type) - if("-supply") - add_underlay_adapter(T, , node_dir, "") - add_underlay_adapter(T, node, node_dir, "-supply") - add_underlay_adapter(T, , node_dir, "-scrubbers") - add_underlay_adapter(T, , node_dir, "-fuel") - add_underlay_adapter(T, , node_dir, "-aux") - if ("-scrubbers") - add_underlay_adapter(T, , node_dir, "") - add_underlay_adapter(T, , node_dir, "-supply") - add_underlay_adapter(T, node, node_dir, "-scrubbers") - add_underlay_adapter(T, , node_dir, "-fuel") - add_underlay_adapter(T, , node_dir, "-aux") - if ("-fuel") - add_underlay_adapter(T, , node_dir, "") - add_underlay_adapter(T, , node_dir, "-supply") - add_underlay_adapter(T, , node_dir, "-scrubbers") - add_underlay_adapter(T, node, node_dir, "-fuel") - add_underlay_adapter(T, , node_dir, "-aux") - if ("-aux") - add_underlay_adapter(T, , node_dir, "") - add_underlay_adapter(T, , node_dir, "-supply") - add_underlay_adapter(T, , node_dir, "-scrubbers") - add_underlay_adapter(T, , node_dir, "-fuel") - add_underlay_adapter(T, node, node_dir, "-aux") - else - add_underlay_adapter(T, node, node_dir, "") - add_underlay_adapter(T, , node_dir, "-supply") - add_underlay_adapter(T, , node_dir, "-scrubbers") - add_underlay_adapter(T, , node_dir, "-fuel") - add_underlay_adapter(T, , node_dir, "-aux") - else - add_underlay_adapter(T, , direction, "-supply") - add_underlay_adapter(T, , direction, "-scrubbers") - add_underlay_adapter(T, , direction, "-fuel") - add_underlay_adapter(T, , direction, "-aux") - add_underlay_adapter(T, , direction, "") + direction = get_dir(src,node) + switch(layer_index) + if(PIPING_LAYER_SUPPLY) + add_underlay_adapter(T, node, direction, "-supply") + if (PIPING_LAYER_SCRUBBER) + add_underlay_adapter(T, node, direction, "-scrubbers") + if (PIPING_LAYER_FUEL) + add_underlay_adapter(T, node, direction, "-fuel") + if (PIPING_LAYER_AUX) + add_underlay_adapter(T, node, direction, "-aux") + else + add_underlay_adapter(T, node, direction, "") -/obj/machinery/atmospherics/proc/add_underlay_adapter(turf/T, obj/machinery/atmospherics/node, direction, icon_connect_type) //modified from add_underlay, does not make exposed underlays +/obj/machinery/atmospherics/pipe/simple/proc/add_underlay_adapter(turf/T, obj/machinery/atmospherics/node, direction, icon_connect_type) //modified from add_underlay, does not make exposed underlays if(node) if(!T.is_plating() && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) underlays += GLOB.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) @@ -121,3 +215,6 @@ underlays += GLOB.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else underlays += GLOB.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) + +#undef LIST_NODE1 +#undef LIST_NODE2 diff --git a/code/ATMOSPHERICS/pipes/vent.dm b/code/ATMOSPHERICS/pipes/vent.dm index 7a4693e8c6f..a8e4b9ebd94 100644 --- a/code/ATMOSPHERICS/pipes/vent.dm +++ b/code/ATMOSPHERICS/pipes/vent.dm @@ -60,7 +60,7 @@ /obj/machinery/atmospherics/pipe/vent/atmos_init() var/connect_direction = dir - for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,connect_direction))) if (can_be_node(target, 1)) node1 = target break diff --git a/code/__defines/construction.dm b/code/__defines/construction.dm index e90259d09bd..cfb90a13b55 100644 --- a/code/__defines/construction.dm +++ b/code/__defines/construction.dm @@ -87,7 +87,7 @@ // Macro for easy use of boilerplate code for searching for a valid node connection. #define STANDARD_ATMOS_CHOOSE_NODE(node_num, direction) \ - for(var/obj/machinery/atmospherics/target in get_step(src, direction)) { \ + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src, direction)) ) { \ if(can_be_node(target, node_num)) { \ node##node_num = target; \ break; \ diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index c9a873d8114..10431e2a0f3 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -32,6 +32,9 @@ Buildable meters var/mirrored = FALSE /obj/item/pipe/quaternary dispenser_class = PIPE_ONEDIR +/obj/item/pipe/directional/tank // lorge + w_class = ITEMSIZE_COST_HUGE + dispenser_class = PIPE_DIRECTIONAL /** * Call constructor with: @@ -79,16 +82,16 @@ Buildable meters // Do it the Polaris way switch(piping_layer) if(PIPING_LAYER_SCRUBBER) - color = PIPE_COLOR_RED + // color = PIPE_COLOR_RED name = "[initial(fakeA.name)] scrubber fitting" if(PIPING_LAYER_SUPPLY) - color = PIPE_COLOR_BLUE + // color = PIPE_COLOR_BLUE name = "[initial(fakeA.name)] supply fitting" if(PIPING_LAYER_FUEL) - color = PIPE_COLOR_YELLOW + // color = PIPE_COLOR_YELLOW name = "[initial(fakeA.name)] fuel fitting" if(PIPING_LAYER_AUX) - color = PIPE_COLOR_CYAN + // color = PIPE_COLOR_CYAN name = "[initial(fakeA.name)] aux fitting" // Or if we were to do it the TG way... // pixel_x = PIPE_PIXEL_OFFSET_X(piping_layer) diff --git a/code/game/machinery/pipe/pipe_recipes.dm b/code/game/machinery/pipe/pipe_recipes.dm index 41cbdc96ba8..2b729d97da3 100644 --- a/code/game/machinery/pipe/pipe_recipes.dm +++ b/code/game/machinery/pipe/pipe_recipes.dm @@ -15,16 +15,14 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list( new /datum/pipe_recipe/pipe("Upward Pipe", /obj/machinery/atmospherics/pipe/zpipe/up), new /datum/pipe_recipe/pipe("Downward Pipe", /obj/machinery/atmospherics/pipe/zpipe/down), new /datum/pipe_recipe/pipe("Universal Pipe Adaptor",/obj/machinery/atmospherics/pipe/simple/visible/universal), + new /datum/pipe_recipe/pipe("Pressure Tank", /obj/machinery/atmospherics/pipe/tank/custom), ), "Devices" = list( new /datum/pipe_recipe/pipe("Connector", /obj/machinery/atmospherics/portables_connector), new /datum/pipe_recipe/pipe("Unary Vent", /obj/machinery/atmospherics/unary/vent_pump), - new /datum/pipe_recipe/pipe("Aux Vent", /obj/machinery/atmospherics/unary/vent_pump/aux), new /datum/pipe_recipe/pipe("Passive Vent", /obj/machinery/atmospherics/pipe/vent), new /datum/pipe_recipe/pipe("Injector", /obj/machinery/atmospherics/unary/outlet_injector), new /datum/pipe_recipe/pipe("Gas Pump", /obj/machinery/atmospherics/binary/pump), - new /datum/pipe_recipe/pipe("Fuel Pump", /obj/machinery/atmospherics/binary/pump/fuel), - new /datum/pipe_recipe/pipe("Aux Pump", /obj/machinery/atmospherics/binary/pump/aux), new /datum/pipe_recipe/pipe("Pressure Regulator", /obj/machinery/atmospherics/binary/passive_gate), new /datum/pipe_recipe/pipe("High Power Gas Pump", /obj/machinery/atmospherics/binary/pump/high_power), new /datum/pipe_recipe/pipe("Volumetric Gas Pump", /obj/machinery/atmospherics/binary/volume_pump), diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index a2ce2230547..ba2259809d6 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -136,7 +136,7 @@ if (!node1_dir) node1_dir = direction - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node1_dir))) if(can_be_node(target, 1)) node1 = target break @@ -173,7 +173,7 @@ if (!node1_dir) node1_dir = direction - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(src,node1_dir))) if(can_be_node(target, 1)) node1 = target break diff --git a/code/modules/overmap/ships/engines/gas_thruster_vr.dm b/code/modules/overmap/ships/engines/gas_thruster_vr.dm index f9abdd54038..d4af5ded95f 100644 --- a/code/modules/overmap/ships/engines/gas_thruster_vr.dm +++ b/code/modules/overmap/ships/engines/gas_thruster_vr.dm @@ -19,7 +19,7 @@ var/node_connect = dir var/turf/one_step = get_step(src,node_connect) - for(var/obj/machinery/atmospherics/target in get_step(one_step,node_connect)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(one_step,node_connect))) if(can_be_node(target, 1)) node = target break @@ -62,7 +62,7 @@ var/turf/one_step = get_step(src,node_connect) var/turf/two_step = get_step(one_step,node_connect) - for(var/obj/machinery/atmospherics/target in get_step(two_step,node_connect)) + for(var/obj/machinery/atmospherics/target in get_prioritized_nodes(get_step(two_step,node_connect))) if(can_be_node(target, 1)) node = target break diff --git a/icons/atmos/connector.dmi b/icons/atmos/connector.dmi index bb7c007d8ee..a5cdbdc9c17 100644 Binary files a/icons/atmos/connector.dmi and b/icons/atmos/connector.dmi differ diff --git a/icons/atmos/pump.dmi b/icons/atmos/pump.dmi index 06194547ab8..e0b38547e42 100644 Binary files a/icons/atmos/pump.dmi and b/icons/atmos/pump.dmi differ diff --git a/icons/atmos/tank.dmi b/icons/atmos/tank.dmi index fa1fbc81e90..87af4fca9fa 100644 Binary files a/icons/atmos/tank.dmi and b/icons/atmos/tank.dmi differ diff --git a/icons/atmos/volume_pump.dmi b/icons/atmos/volume_pump.dmi index 9114b6ac31d..444307e999f 100644 Binary files a/icons/atmos/volume_pump.dmi and b/icons/atmos/volume_pump.dmi differ diff --git a/icons/atmos/volume_pump_overclock.dmi b/icons/atmos/volume_pump_overclock.dmi index 4770c2ec548..9829c8a0276 100644 Binary files a/icons/atmos/volume_pump_overclock.dmi and b/icons/atmos/volume_pump_overclock.dmi differ diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index 104edca8599..1c37f79efe3 100644 Binary files a/icons/obj/pipe-item.dmi and b/icons/obj/pipe-item.dmi differ