diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 2ca103868c..723fa1f928 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 19a62d9a2f..b3dee9dd7a 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 73311b0923..c69cca4268 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 f4b6717af6..fb0f684a34 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 c2aead4d92..469f4332b2 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 64d7791752..a4966a60f5 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 8d7a1cef09..f6bb112d81 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 455706f7fd..b8c5505e5b 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 ad2f14f94b..819325bb57 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 512fd24fa2..922fcdad20 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 f4c47aec3c..d35cd5b4f0 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 d2adccb43b..6e9fbd0b79 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 7a8d0209b8..8d22e40643 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 21bdc5a021..40262ec911 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 13470d24cf..f622e0aac0 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 b4e553116f..1f0745acd4 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 e9297b0803..fb36526ef8 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 94023f098b..09dd9adcf6 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 97843506ef..35bce2671e 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 7a4693e8c6..a8e4b9ebd9 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 e90259d09b..cfb90a13b5 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 c9a873d811..10431e2a0f 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 559eb9aefa..bcb8ba3bf8 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 a2ce223054..ba2259809d 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 f9abdd5403..d4af5ded95 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 bb7c007d8e..a5cdbdc9c1 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 06194547ab..e0b38547e4 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 fa1fbc81e9..87af4fca9f 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 9114b6ac31..444307e999 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 4770c2ec54..9829c8a027 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 104edca859..1c37f79efe 100644 Binary files a/icons/obj/pipe-item.dmi and b/icons/obj/pipe-item.dmi differ