From a41725a9552f08dd49901328af2fab22ba327d20 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Mon, 16 Oct 2017 22:48:48 -0700 Subject: [PATCH] Atmospherics Multilayer Pipes (#30972) * 1 * rpd * 3 * 4 * 5 * 6 * 7 * 8 * wew * src. and underlays * update * woops * misspelled params * reviews * fixes * fixes * better checks and layer crap * Update RPD.dm * Update pipe_construction.dm * 3 layers, fixes * woops i didn't update defines correctly * dunc * Fixes * Fixes * fixes * fixes some more bullshit * fixes * fixes * not needed * makes attachment sprites prettier or uglier i dunno * Unary flag * sprite fix?? * fixes... * sprite fixes --- code/__DEFINES/atmospherics.dm | 13 ++ code/__DEFINES/pipe_construction.dm | 13 +- code/game/machinery/pipe/construction.dm | 130 ++++++++++++----- code/game/machinery/pipe/pipe_dispenser.dm | 26 ++-- code/game/objects/items/RPD.dm | 89 ++++++++---- .../atmospherics/machinery/atmosmachinery.dm | 92 ++++++++---- .../components/binary_devices/circulator.dm | 1 + .../trinary_devices/trinary_devices.dm | 1 + .../components/unary_devices/cryo.dm | 1 + .../unary_devices/portables_connector.dm | 1 + .../components/unary_devices/tank.dm | 1 + .../components/unary_devices/thermomachine.dm | 1 + .../components/unary_devices/unary_devices.dm | 1 + .../atmospherics/machinery/other/meter.dm | 42 ++++-- .../machinery/pipes/bluespace_pipe.dm | 2 +- .../machinery/pipes/layermanifold.dm | 135 ++++++++++++++++++ .../atmospherics/machinery/pipes/manifold.dm | 2 +- .../atmospherics/machinery/pipes/pipes.dm | 21 +-- .../atmospherics/machinery/pipes/simple.dm | 16 +-- .../portable/portable_atmospherics.dm | 12 +- code/modules/mob/mob_defines.dm | 2 + icons/obj/atmospherics/pipes/manifold.dmi | Bin 5169 -> 15231 bytes icons/obj/atmospherics/pipes/pipe_item.dmi | Bin 23898 -> 26767 bytes tgstation.dme | 1 + 24 files changed, 453 insertions(+), 150 deletions(-) create mode 100644 code/modules/atmospherics/machinery/pipes/layermanifold.dm diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 383e4c8bcc..1273b5e3de 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -177,6 +177,19 @@ #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland #define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300" +//IF YOU EVER CHANGE THESE CHANGE SPRITES TO MATCH. +#define PIPING_LAYER_MIN 1 +#define PIPING_LAYER_MAX 3 +#define PIPING_LAYER_DEFAULT 2 +#define PIPING_LAYER_P_X 5 +#define PIPING_LAYER_P_Y 5 +#define PIPING_LAYER_LCHANGE 0.05 + +#define PIPING_ALL_LAYER 1 //intended to connect with all layers, check for all instead of just one. +#define PIPING_ONE_PER_TURF 2 //can only be built if nothing else with this flag is on the tile already. +#define PIPING_DEFAULT_LAYER_ONLY 4 //can only exist at PIPING_LAYER_DEFAULT +#define PIPING_CARDINAL_AUTONORMALIZE 8 //north/south east/west doesn't matter, auto normalize on build. + #define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity()) #define ADD_GAS(gas_id, out_list)\ diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm index 2d15b8aed3..403c9a061f 100644 --- a/code/__DEFINES/pipe_construction.dm +++ b/code/__DEFINES/pipe_construction.dm @@ -7,24 +7,25 @@ Construction breaks otherwise //Pipes #define PIPE_SIMPLE /obj/machinery/atmospherics/pipe/simple #define PIPE_MANIFOLD /obj/machinery/atmospherics/pipe/manifold -#define PIPE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/manifold4w +#define PIPE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/manifold4w #define PIPE_HE /obj/machinery/atmospherics/pipe/heat_exchanging/simple #define PIPE_HE_MANIFOLD /obj/machinery/atmospherics/pipe/heat_exchanging/manifold #define PIPE_HE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w #define PIPE_JUNCTION /obj/machinery/atmospherics/pipe/heat_exchanging/junction -#define PIPE_BLUESPACE /obj/machinery/atmospherics/pipe/bluespace +#define PIPE_LAYER_MANIFOLD /obj/machinery/atmospherics/pipe/layer_manifold +#define PIPE_BLUESPACE /obj/machinery/atmospherics/pipe/bluespace //Unary #define PIPE_CONNECTOR /obj/machinery/atmospherics/components/unary/portables_connector #define PIPE_UVENT /obj/machinery/atmospherics/components/unary/vent_pump #define PIPE_SCRUBBER /obj/machinery/atmospherics/components/unary/vent_scrubber #define PIPE_INJECTOR /obj/machinery/atmospherics/components/unary/outlet_injector -#define PIPE_HEAT_EXCHANGE /obj/machinery/atmospherics/components/unary/heat_exchanger +#define PIPE_HEAT_EXCHANGE /obj/machinery/atmospherics/components/unary/heat_exchanger //Binary #define PIPE_PUMP /obj/machinery/atmospherics/components/binary/pump -#define PIPE_PASSIVE_GATE /obj/machinery/atmospherics/components/binary/passive_gate -#define PIPE_VOLUME_PUMP /obj/machinery/atmospherics/components/binary/volume_pump +#define PIPE_PASSIVE_GATE /obj/machinery/atmospherics/components/binary/passive_gate +#define PIPE_VOLUME_PUMP /obj/machinery/atmospherics/components/binary/volume_pump #define PIPE_MVALVE /obj/machinery/atmospherics/components/binary/valve -#define PIPE_DVALVE /obj/machinery/atmospherics/components/binary/valve/digital +#define PIPE_DVALVE /obj/machinery/atmospherics/components/binary/valve/digital //Trinary #define PIPE_GAS_FILTER /obj/machinery/atmospherics/components/trinary/filter #define PIPE_GAS_MIXER /obj/machinery/atmospherics/components/trinary/mixer diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 7a8f1f1779..66b451725e 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -19,11 +19,13 @@ Buildable meters item_state = "buildpipe" w_class = WEIGHT_CLASS_NORMAL level = 2 - var/flipped = 0 - var/is_bent = 0 + var/flipped = FALSE + var/is_bent = FALSE + var/piping_layer = PIPING_LAYER_DEFAULT var/static/list/pipe_types = list( PIPE_SIMPLE, \ + PIPE_LAYER_MANIFOLD, \ PIPE_MANIFOLD, \ PIPE_4WAYMANIFOLD, \ PIPE_HE, \ @@ -52,40 +54,58 @@ Buildable meters ..() to_chat(user, "Alt-click to rotate it clockwise.") -/obj/item/pipe/New(loc, pipe_type, dir, obj/machinery/atmospherics/make_from) - ..() +/obj/item/pipe/Initialize(mapload, _pipe_type, _dir, obj/machinery/atmospherics/make_from) if(make_from) - src.setDir(make_from.dir) - src.pipename = make_from.name + setDir(make_from.dir) + pipename = make_from.name add_atom_colour(make_from.color, FIXED_COLOUR_PRIORITY) if(make_from.type in pipe_types) - src.pipe_type = make_from.type + pipe_type = make_from.type + setPipingLayer(make_from.piping_layer) else //make pipe_type a value we can work with for(var/P in pipe_types) if(istype(make_from, P)) - src.pipe_type = P + pipe_type = P break var/obj/machinery/atmospherics/components/trinary/triP = make_from if(istype(triP) && triP.flipped) - src.flipped = 1 - src.setDir(turn(src.dir, -45)) + flipped = TRUE + setDir(turn(dir, -45)) else - src.pipe_type = pipe_type - src.setDir(dir) + pipe_type = _pipe_type + setDir(_dir) - if(src.dir in GLOB.diagonals) - is_bent = 1 + if(_dir in GLOB.diagonals) + is_bent = TRUE update() - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + return ..() + +/obj/item/pipe/dropped() + if(loc) + setPipingLayer(piping_layer) + return ..() + +/obj/item/pipe/proc/setPipingLayer(new_layer = PIPING_LAYER_DEFAULT) + var/obj/machinery/atmospherics/fakeA = get_pipe_cache(pipe_type) + var/nolayer = (fakeA.pipe_flags & PIPING_ALL_LAYER) + if(nolayer) + new_layer = PIPING_LAYER_DEFAULT + piping_layer = new_layer + if(pipe_type != PIPE_LAYER_MANIFOLD) + pixel_x = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + pixel_y = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + layer = initial(layer) + ((piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE) //update the name and icon of the pipe item depending on the type GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_SIMPLE]" = "simple", \ "[PIPE_MANIFOLD]" = "manifold", \ + "[PIPE_LAYER_MANIFOLD]" = "layer_manifold", \ "[PIPE_4WAYMANIFOLD]" = "manifold4w", \ "[PIPE_HE]" = "he", \ "[PIPE_HE_MANIFOLD]" = "he_manifold", \ @@ -114,6 +134,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_SIMPLE]" = "pipe", \ "[PIPE_SIMPLE]_b" = "bent pipe", \ "[PIPE_MANIFOLD]" = "manifold", \ + "[PIPE_LAYER_MANIFOLD]" = "layer manifold", \ "[PIPE_4WAYMANIFOLD]" = "4-way manifold", \ "[PIPE_HE]" = "h/e pipe", \ "[PIPE_HE]_b" = "bent h/e pipe", \ @@ -151,7 +172,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( if ( usr.stat || usr.restrained() || !usr.canmove ) return - src.setDir(turn(src.dir, -90)) + setDir(turn(dir, -90)) fixdir() @@ -166,11 +187,11 @@ GLOBAL_LIST_INIT(pipeID2State, list( return if (pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER)) - src.setDir(turn(src.dir, flipped )? 45 : -45) + setDir(turn(dir, flipped )? 45 : -45) flipped = !flipped return - src.setDir(turn(src.dir, -180)) + setDir(turn(dir, -180)) fixdir() @@ -199,7 +220,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( //Helper to clean up dir /obj/item/pipe/proc/fixdir() - if((pipe_type in list (PIPE_SIMPLE, PIPE_HE, PIPE_MVALVE, PIPE_DVALVE)) && !is_bent) + if((pipe_type in list (PIPE_SIMPLE, PIPE_HE, PIPE_MVALVE, PIPE_DVALVE, PIPE_LAYER_MANIFOLD)) && !is_bent) if(dir==SOUTH) setDir(NORTH) else if(dir==WEST) @@ -208,40 +229,54 @@ GLOBAL_LIST_INIT(pipeID2State, list( /obj/item/pipe/attack_self(mob/user) return rotate() +/obj/item/pipe/proc/get_pipe_cache(type, direction) + var/static/list/obj/machinery/atmospherics/check_cache + if(!islist(check_cache)) + check_cache = list() + if(!check_cache[type]) + check_cache[type] = list() + if(!check_cache[type]["[direction]"]) + check_cache[type]["[direction]"] = new type(null, null, direction) + + return check_cache[type]["[direction]"] + /obj/item/pipe/attackby(obj/item/W, mob/user, params) if (!istype(W, /obj/item/wrench)) return ..() - if (!isturf(src.loc)) - return 1 - + if (!isturf(loc)) + return TRUE add_fingerprint(user) fixdir() if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER)) setDir(unflip(dir)) - var/obj/machinery/atmospherics/A = new pipe_type(src.loc) - A.setDir(src.dir) - A.SetInitDirections() + var/obj/machinery/atmospherics/fakeA = get_pipe_cache(pipe_type, dir) - for(var/obj/machinery/atmospherics/M in src.loc) - if(M == A) //we don't want to check to see if it interferes with itself + for(var/obj/machinery/atmospherics/M in loc) + if((M.pipe_flags & PIPING_ONE_PER_TURF) && (fakeA.pipe_flags & PIPING_ONE_PER_TURF)) //Only one dense/requires density object per tile, eg connectors/cryo/heater/coolers. + to_chat(user, "Something is hogging the tile!") + return TRUE + if((M.piping_layer != piping_layer) && !((M.pipe_flags & PIPING_ALL_LAYER) || (pipe_type == PIPE_LAYER_MANIFOLD))) continue - if(M.GetInitDirections() & A.GetInitDirections()) // matches at least one direction on either type of pipe + if(M.GetInitDirections() & fakeA.GetInitDirections()) // matches at least one direction on either type of pipe to_chat(user, "There is already a pipe at that location!") - qdel(A) - return 1 + return TRUE // no conflicts found + var/obj/machinery/atmospherics/A = new pipe_type(loc) + A.setDir(dir) + A.SetInitDirections() + if(pipename) A.name = pipename var/obj/machinery/atmospherics/components/trinary/T = A if(istype(T)) T.flipped = flipped - A.on_construction(pipe_type, color) + A.on_construction(pipe_type, color, piping_layer) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) user.visible_message( \ "[user] fastens \the [src].", \ "You fasten \the [src].", \ @@ -271,16 +306,33 @@ GLOBAL_LIST_INIT(pipeID2State, list( icon_state = "meter" item_state = "buildpipe" w_class = WEIGHT_CLASS_BULKY + var/piping_layer = PIPING_LAYER_DEFAULT -/obj/item/pipe_meter/attackby(obj/item/W, mob/user, params) +/obj/item/pipe_meter/attackby(obj/item/I, mob/user, params) ..() - if (!istype(W, /obj/item/wrench)) + if (!istype(I, /obj/item/wrench)) return ..() - if(!locate(/obj/machinery/atmospherics/pipe, src.loc)) + var/obj/machinery/atmospherics/pipe/pipe + for(var/obj/machinery/atmospherics/pipe/P in loc) + if(P.piping_layer == piping_layer) + pipe = P + break + if(!pipe) to_chat(user, "You need to fasten it to a pipe!") - return 1 - new/obj/machinery/meter( src.loc ) - playsound(src.loc, W.usesound, 50, 1) + return TRUE + new /obj/machinery/meter(loc, piping_layer) + playsound(src, I.usesound, 50, 1) to_chat(user, "You fasten the meter to the pipe.") qdel(src) + +/obj/item/pipe_meter/dropped() + . = ..() + if(loc) + setAttachLayer(piping_layer) + +/obj/item/pipe_meter/proc/setAttachLayer(new_layer = PIPING_LAYER_DEFAULT) + piping_layer = new_layer + pixel_x = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + pixel_y = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 26559c5ef9..911a81c2fc 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -6,18 +6,21 @@ density = TRUE anchored = TRUE var/wait = 0 + var/piping_layer = PIPING_LAYER_DEFAULT /obj/machinery/pipedispenser/attack_paw(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/pipedispenser/attack_hand(mob/user) if(..()) return 1 var/dat = {" +PIPING LAYER: --[piping_layer]++
Pipes:
Pipe
Bent Pipe
Manifold
+Layer Manifold
4-Way Manifold
Manual Valve
Digital Valve
@@ -53,18 +56,23 @@ usr << browse(null, "window=pipedispenser") return 1 usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(href_list["make"]) if(wait < world.time) var/p_type = text2path(href_list["make"]) var/p_dir = text2num(href_list["dir"]) - var/obj/item/pipe/P = new (src.loc, pipe_type=p_type, dir=p_dir) + var/obj/item/pipe/P = new (loc, p_type, p_dir) + P.setPipingLayer(piping_layer) P.add_fingerprint(usr) wait = world.time + 10 if(href_list["makemeter"]) if(wait < world.time ) - new /obj/item/pipe_meter(src.loc) + new /obj/item/pipe_meter(loc) wait = world.time + 15 + if(href_list["layer_up"]) + piping_layer = Clamp(++piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + if(href_list["layer_down"]) + piping_layer = Clamp(--piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) return /obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, params) @@ -75,7 +83,7 @@ return else if (istype(W, /obj/item/wrench)) if (!anchored && !isinspace()) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to fasten \the [src] to the floor...") if (do_after(user, 40*W.toolspeed, target = src)) add_fingerprint(user) @@ -88,7 +96,7 @@ if (usr.machine==src) usr << browse(null, "window=pipedispenser") else if(anchored) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src] from the floor...") if (do_after(user, 20*W.toolspeed, target = src)) add_fingerprint(user) @@ -160,11 +168,11 @@ Nah if(..()) return 1 usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(href_list["dmake"]) if(wait < world.time) var/p_type = text2num(href_list["dmake"]) - var/obj/structure/disposalconstruct/C = new (src.loc,p_type) + var/obj/structure/disposalconstruct/C = new (loc,p_type) if(!C.can_place()) to_chat(usr, "There's not enough room to build that here!") @@ -211,7 +219,7 @@ Nah if(..()) return 1 usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(wait < world.time) if(href_list["tube"]) var/tube_type = text2num(href_list["tube"]) diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 15abe72a52..0151b0e9e1 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -30,10 +30,10 @@ RPD var/selected=0 /datum/pipe_info/New(pid,direction,dt) - src.id=pid - src.icon_state=GLOB.pipeID2State["[pid]"] - src.dir = direction - src.dirtype=dt + id=pid + icon_state=GLOB.pipeID2State["[pid]"] + dir = direction + dirtype=dt /datum/pipe_info/proc/Render(dispenser,label) return "
  • [label]
  • " @@ -67,10 +67,10 @@ GLOBAL_LIST_INIT(disposalpipeID2State, list( icon_state = "meterX" /datum/pipe_info/disposal/New(var/pid,var/dt) - src.id=pid - src.icon_state=GLOB.disposalpipeID2State[pid+1] - src.dir = SOUTH - src.dirtype=dt + id=pid + icon_state=GLOB.disposalpipeID2State[pid+1] + dir = SOUTH + dirtype=dt if(pidDISP_END_CHUTE) icon_state = "con[icon_state]" @@ -80,13 +80,14 @@ GLOBAL_LIST_INIT(disposalpipeID2State, list( //find these defines in code\game\machinery\pipe\consruction.dm GLOBAL_LIST_INIT(RPD_recipes, list( "Pipes" = list( - "Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 1, PIPE_BENDABLE), - //"Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 5, PIPE_BENT), - "Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY), - "Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY), - "Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY), - "4-Way Manifold" = new /datum/pipe_info(PIPE_4WAYMANIFOLD, 1, PIPE_QUAD), - "Bluespace Pipe" = new /datum/pipe_info(PIPE_BLUESPACE, 1, PIPE_UNARY), + "Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 1, PIPE_BENDABLE), + //"Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 5, PIPE_BENT), + "Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY), + "Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY), + "Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY), + "4-Way Manifold" = new /datum/pipe_info(PIPE_4WAYMANIFOLD, 1, PIPE_QUAD), + "Layer Manifold" = new /datum/pipe_info(PIPE_LAYER_MANIFOLD, 1, PIPE_BINARY), + "Bluespace Pipe" = new /datum/pipe_info(PIPE_BLUESPACE, 1, PIPE_UNARY), ), "Devices"=list( "Connector" = new /datum/pipe_info(PIPE_CONNECTOR, 1, PIPE_UNARY), @@ -153,6 +154,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( ) var/paint_color="grey" var/screen = CATEGORY_ATMOS //Starts on the atmos tab. + var/piping_layer = PIPING_LAYER_DEFAULT /obj/item/pipe_dispenser/New() . = ..() @@ -201,6 +203,14 @@ GLOBAL_LIST_INIT(RPD_recipes, list( dat += "Atmospherics Disposals
    " else if(screen == CATEGORY_DISPOSALS) dat += "Atmospherics Disposals
    " + var/generated_layer_list = "" + var/layers_total = PIPING_LAYER_MAX - PIPING_LAYER_MIN + 1 + for(var/iter = PIPING_LAYER_MIN, iter <= layers_total, iter++) + if(iter == piping_layer) + generated_layer_list += "[iter]" + else + generated_layer_list += "[iter]" + dat += "Atmospherics Piping Layer: [generated_layer_list]
    " dat += "" var/icon/preview=null @@ -459,7 +469,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( usr << browse(null, "window=pipedispenser") return usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(href_list["screen"]) screen = text2num(href_list["screen"]) show_menu(usr) @@ -469,11 +479,18 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_flipped = text2num(href_list["flipped"]) show_menu(usr) + if(href_list["setlayer"]) + if(!isnum(href_list["setlayer"])) + piping_layer = text2num(href_list["setlayer"]) + else + piping_layer = href_list["setlayer"] + show_menu(usr) + if(href_list["eatpipes"]) p_class = EATING_MODE p_conntype=-1 p_dir=1 - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -481,13 +498,13 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_class = PAINT_MODE p_conntype = -1 p_dir = 1 - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) if(href_list["set_color"]) paint_color = href_list["set_color"] - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -496,7 +513,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_dir = text2num(href_list["dir"]) p_conntype = text2num(href_list["type"]) p_class = ATMOS_MODE - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -504,7 +521,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_class = METER_MODE p_conntype = -1 p_dir = 1 - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -513,7 +530,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_conntype = text2num(href_list["type"]) p_dir = 1 p_class = DISPOSALS_MODE - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -522,10 +539,18 @@ GLOBAL_LIST_INIT(RPD_recipes, list( if(!user.IsAdvancedToolUser() || istype(A, /turf/open/space/transit)) return ..() + var/atmos_piping_mode = p_class == ATMOS_MODE || p_class == METER_MODE + var/temp_piping_layer + if(atmos_piping_mode) + if(istype(A, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/AM = A + temp_piping_layer = AM.piping_layer + A = get_turf(user) + //make sure what we're clicking is valid for the current mode var/is_paintable = (p_class == PAINT_MODE && istype(A, /obj/machinery/atmospherics/pipe)) var/is_consumable = (p_class == EATING_MODE && (istype(A, /obj/item/pipe) || istype(A, /obj/item/pipe_meter) || istype(A, /obj/structure/disposalconstruct))) - var/can_make_pipe = ((p_class == ATMOS_MODE || p_class == METER_MODE || p_class == DISPOSALS_MODE) && isturf(A)) + var/can_make_pipe = ((atmos_piping_mode || p_class == DISPOSALS_MODE) && isturf(A)) if(!is_paintable && !is_consumable && !can_make_pipe) return ..() @@ -540,10 +565,8 @@ GLOBAL_LIST_INIT(RPD_recipes, list( if(PAINT_MODE) //Paint pipes var/obj/machinery/atmospherics/pipe/P = A playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) - P.add_atom_colour(paint_colors[paint_color], FIXED_COLOUR_PRIORITY) - P.pipe_color = paint_colors[paint_color] + P.paint(paint_colors[paint_color]) user.visible_message("[user] paints \the [P] [paint_color].","You paint \the [P] [paint_color].") - P.update_node_icon() return if(EATING_MODE) //Eating pipes @@ -558,21 +581,29 @@ GLOBAL_LIST_INIT(RPD_recipes, list( playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 2, target = A)) activate() - var/obj/item/pipe/P = new (A, pipe_type=queued_p_type, dir=queued_p_dir) + var/obj/item/pipe/P = new(A, queued_p_type, queued_p_dir) P.flipped = queued_p_flipped P.update() P.add_fingerprint(usr) + if(!isnull(temp_piping_layer)) + P.setPipingLayer(temp_piping_layer) + else + P.setPipingLayer(piping_layer) if(METER_MODE) //Making pipe meters to_chat(user, "You start building a meter...") playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 2, target = A)) activate() - new /obj/item/pipe_meter(A) + var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(A) + if(!isnull(temp_piping_layer)) + PM.setAttachLayer(temp_piping_layer) + else + PM.setAttachLayer(piping_layer) if(DISPOSALS_MODE) //Making disposals pipes if(isclosedturf(A)) - to_chat(user, "[src]'s error light flickers; there's something in the way!") + to_chat(user, "\the [src]'s error light flickers; there's something in the way!") return to_chat(user, "You start building a disposals pipe...") playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index ce68eecdc9..75e15780f6 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -25,6 +25,8 @@ Pipelines + Other Objects -> Pipe network var/can_unwrench = 0 var/initialize_directions = 0 var/pipe_color + var/piping_layer = PIPING_LAYER_DEFAULT + var/pipe_flags = NONE var/global/list/iconsetids = list() var/global/list/pipeimages = list() @@ -39,7 +41,11 @@ Pipelines + Other Objects -> Pipe network if(is_type_in_list(src, GLOB.ventcrawl_machinery) && user.ventcrawler) to_chat(user, "Alt-click to crawl through it.") -/obj/machinery/atmospherics/New(loc, process = TRUE) +/obj/machinery/atmospherics/New(loc, process = TRUE, setdir) + if(!isnull(setdir)) + setDir(setdir) + if(pipe_flags & PIPING_CARDINAL_AUTONORMALIZE) + normalize_cardinal_directions() nodes = new(device_type) if (!armor) armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 100, acid = 70) @@ -61,6 +67,13 @@ Pipelines + Other Objects -> Pipe network return ..() //return QDEL_HINT_FINDREFERENCE +/obj/machinery/atmospherics/proc/destroy_network() + return + +/obj/machinery/atmospherics/proc/build_network() + // Called to build a network from this node + return + /obj/machinery/atmospherics/proc/nullifyNode(I) if(NODE_I) var/obj/machinery/atmospherics/N = NODE_I @@ -80,6 +93,11 @@ Pipelines + Other Objects -> Pipe network break return node_connects +/obj/machinery/atmospherics/proc/normalize_cardinal_directions() + if(dir==SOUTH) + setDir(NORTH) + else if(dir==WEST) + setDir(EAST) //this is called just after the air controller sets up turfs /obj/machinery/atmospherics/proc/atmosinit(var/list/node_connects) @@ -91,12 +109,37 @@ Pipelines + Other Objects -> Pipe network if(can_be_node(target, I)) NODE_I = target break - update_icon() +/obj/machinery/atmospherics/proc/setPipingLayer(new_layer) + if(pipe_flags & PIPING_DEFAULT_LAYER_ONLY) + new_layer = PIPING_LAYER_DEFAULT + piping_layer = new_layer + pixel_x = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + pixel_y = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + layer = initial(layer) + ((piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE) + /obj/machinery/atmospherics/proc/can_be_node(obj/machinery/atmospherics/target) - if(target.initialize_directions & get_dir(target,src)) + return connection_check(target, piping_layer) + +//Find a connecting /obj/machinery/atmospherics in specified direction +/obj/machinery/atmospherics/proc/findConnecting(direction, prompted_layer) + for(var/obj/machinery/atmospherics/target in get_step(src, direction)) + if(target.initialize_directions & get_dir(target,src)) + if(connection_check(target, prompted_layer)) + return target + +/obj/machinery/atmospherics/proc/connection_check(obj/machinery/atmospherics/target, given_layer) + if(isConnectable(target, given_layer) && target.isConnectable(src, given_layer) && (target.initialize_directions & get_dir(target,src))) return TRUE + return FALSE + +/obj/machinery/atmospherics/proc/isConnectable(obj/machinery/atmospherics/target, given_layer) + if(isnull(given_layer)) + given_layer = piping_layer + if((target.piping_layer == given_layer) || (target.pipe_flags & PIPING_ALL_LAYER)) + return TRUE + return FALSE /obj/machinery/atmospherics/proc/pipeline_expansion() return nodes @@ -119,14 +162,10 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/replacePipenet() return -/obj/machinery/atmospherics/proc/build_network() - // Called to build a network from this node - return - /obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) if(istype(reference, /obj/machinery/atmospherics/pipe)) var/obj/machinery/atmospherics/pipe/P = reference - qdel(P.parent) + P.destroy_network() var/I = nodes.Find(reference) NODE_I = null update_icon() @@ -135,12 +174,17 @@ Pipelines + Other Objects -> Pipe network return /obj/machinery/atmospherics/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pipe)) //lets you autodrop + var/obj/item/pipe/pipe = W + if(user.dropItemToGround(pipe)) + pipe.setPipingLayer(piping_layer) //align it with us + return TRUE if(istype(W, /obj/item/wrench)) if(can_unwrench(user)) var/turf/T = get_turf(src) if (level==1 && isturf(T) && T.intact) to_chat(user, "You must remove the plating first!") - return 1 + return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() add_fingerprint(user) @@ -148,7 +192,7 @@ Pipelines + Other Objects -> Pipe network var/unsafe_wrenching = FALSE var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src]...") if (internal_pressure > 2*ONE_ATMOSPHERE) to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") @@ -193,7 +237,8 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(can_unwrench) - var/obj/item/pipe/stored = new(loc, make_from=src) + var/obj/item/pipe/stored = new(loc, piping_layer, dir, src) + stored.setPipingLayer(piping_layer) if(!disassembled) stored.obj_integrity = stored.max_integrity * 0.5 transfer_fingerprints_to(stored) @@ -224,10 +269,11 @@ Pipelines + Other Objects -> Pipe network if(unconnected & direction) underlays += getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', "pipe_exposed", direction) -/obj/machinery/atmospherics/on_construction(pipe_type, obj_color) +/obj/machinery/atmospherics/on_construction(pipe_type, obj_color, set_layer) if(can_unwrench) add_atom_colour(obj_color, FIXED_COLOUR_PRIORITY) pipe_color = obj_color + setPipingLayer(set_layer) var/turf/T = get_turf(src) level = T.intact ? 2 : 1 atmosinit() @@ -237,18 +283,16 @@ Pipelines + Other Objects -> Pipe network A.addMember(src) build_network() +/obj/machinery/atmospherics/Entered(atom/movable/AM) + if(istype(AM, /mob/living)) + var/mob/living/L = AM + L.ventcrawl_layer = piping_layer + return ..() + /obj/machinery/atmospherics/singularity_pull(S, current_size) - ..() if(current_size >= STAGE_FIVE) deconstruct(FALSE) - - -//Find a connecting /obj/machinery/atmospherics in specified direction -/obj/machinery/atmospherics/proc/findConnecting(direction) - for(var/obj/machinery/atmospherics/target in get_step(src, direction)) - if(target.initialize_directions & get_dir(target,src)) - return target - + return ..() #define VENT_SOUND_DELAY 30 @@ -259,7 +303,7 @@ Pipelines + Other Objects -> Pipe network if(user in buckled_mobs)// fixes buckle ventcrawl edgecase fuck bug return - var/obj/machinery/atmospherics/target_move = findConnecting(direction) + var/obj/machinery/atmospherics/target_move = findConnecting(direction, user.ventcrawl_layer) if(target_move) if(target_move.can_crawl_through()) if(is_type_in_typecache(target_move, GLOB.ventcrawl_machinery)) @@ -269,14 +313,14 @@ Pipelines + Other Objects -> Pipe network var/list/pipenetdiff = returnPipenets() ^ target_move.returnPipenets() if(pipenetdiff.len) user.update_pipe_vision(target_move) - user.loc = target_move + user.forceMove(target_move) user.client.eye = target_move //Byond only updates the eye every tick, This smooths out the movement if(world.time - user.last_played_vent > VENT_SOUND_DELAY) user.last_played_vent = world.time playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3) else if((direction & initialize_directions) || is_type_in_typecache(src, GLOB.ventcrawl_machinery) && can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent - user.forceMove(src.loc) + user.forceMove(loc) user.visible_message("You hear something squeezing through the ducts...","You climb out the ventilation system.") user.canmove = 0 spawn(1) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 786aff1038..ef6dd85afa 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -11,6 +11,7 @@ var/status = 0 var/last_pressure_delta = 0 + pipe_flags = PIPING_ONE_PER_TURF anchored = TRUE density = TRUE diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm index 14495cd237..8ba105fdb1 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm @@ -5,6 +5,7 @@ use_power = IDLE_POWER_USE device_type = TRINARY layer = GAS_FILTER_LAYER + pipe_flags = PIPING_ONE_PER_TURF var/flipped = FALSE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 277608d845..423f3a64a0 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -11,6 +11,7 @@ layer = ABOVE_WINDOW_LAYER state_open = FALSE circuit = /obj/item/circuitboard/machine/cryo_tube + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY var/on = FALSE var/autoeject = FALSE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index e17a2f796c..ee48889041 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -8,6 +8,7 @@ use_power = NO_POWER_USE level = 0 layer = GAS_FILTER_LAYER + pipe_flags = PIPING_ONE_PER_TURF /obj/machinery/atmospherics/components/unary/portables_connector/New() ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index ca60c9bf85..04f1068a00 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -9,6 +9,7 @@ density = TRUE var/gas_type = 0 layer = ABOVE_WINDOW_LAYER + pipe_flags = PIPING_ONE_PER_TURF /obj/machinery/atmospherics/components/unary/tank/New() ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index dc482eda02..d7bfe1ecb8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -11,6 +11,7 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 30) layer = OBJ_LAYER circuit = /obj/item/circuitboard/machine/thermomachine + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY var/on = FALSE var/min_temperature = 0 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index a6ac9760e8..f629020d74 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -3,6 +3,7 @@ dir = SOUTH initialize_directions = SOUTH device_type = UNARY + pipe_flags = PIPING_ONE_PER_TURF /obj/machinery/atmospherics/components/unary/SetInitDirections() initialize_directions = dir diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 124caa23be..7294638162 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -13,19 +13,33 @@ active_power_usage = 4 max_integrity = 150 armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 40, acid = 0) - - -/obj/machinery/meter/Initialize(mapload) - . = ..() - SSair.atmos_machinery += src - if (!target) - target = locate(/obj/machinery/atmospherics/pipe) in loc + var/target_layer = PIPING_LAYER_DEFAULT /obj/machinery/meter/Destroy() SSair.atmos_machinery -= src - src.target = null + target = null return ..() +/obj/machinery/meter/Initialize(mapload, new_piping_layer) + if(!isnull(new_piping_layer)) + target_layer = new_piping_layer + SSair.atmos_machinery += src + if(mapload && !target) + reattach_to_layer() + return ..() + +/obj/machinery/meter/proc/reattach_to_layer() + for(var/obj/machinery/atmospherics/pipe/pipe in loc) + if(pipe.piping_layer == target_layer) + target = pipe + setAttachLayer(pipe.piping_layer) + break + +/obj/machinery/meter/proc/setAttachLayer(var/new_layer) + target_layer = new_layer + pixel_x = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + pixel_y = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + /obj/machinery/meter/process_atmos() if(!target) icon_state = "meterX" @@ -75,7 +89,7 @@ radio_connection.post_signal(src, signal) /obj/machinery/meter/proc/status() - if (src.target) + if (target) var/datum/gas_mixture/environment = target.return_air() if(environment) . = "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)] K ([round(environment.temperature-T0C,0.01)]°C)." @@ -91,23 +105,23 @@ /obj/machinery/meter/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/wrench)) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40*W.toolspeed, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ "You unfasten \the [src].", \ "You hear ratchet.") - new /obj/item/pipe_meter(src.loc) + new /obj/item/pipe_meter(loc) qdel(src) else return ..() /obj/machinery/meter/attack_ai(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/meter/attack_paw(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/meter/attack_hand(mob/user) @@ -129,4 +143,4 @@ /obj/machinery/meter/turf/Initialize() . = ..() - src.target = loc + target = loc diff --git a/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm b/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm index 476235d3d9..51e89950c1 100644 --- a/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm +++ b/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(bluespace_pipes) /obj/machinery/atmospherics/pipe/bluespace/pipeline_expansion() return ..() + GLOB.bluespace_pipes - src -/obj/machinery/atmospherics/components/pipe/bluespace/hide() +/obj/machinery/atmospherics/pipe/bluespace/hide() update_icon() /obj/machinery/atmospherics/pipe/bluespace/update_icon(showpipe) diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm new file mode 100644 index 0000000000..cc9ef36678 --- /dev/null +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -0,0 +1,135 @@ +/obj/machinery/atmospherics/pipe/layer_manifold + name = "pipe-layer manifold" + icon = 'icons/obj/atmospherics/pipes/manifold.dmi' + icon_state = "manifoldlayer" + desc = "A special pipe to bridge pipe layers with." + dir = SOUTH + initialize_directions = NORTH|SOUTH + pipe_flags = PIPING_ALL_LAYER | PIPING_DEFAULT_LAYER_ONLY | PIPING_CARDINAL_AUTONORMALIZE + piping_layer = PIPING_LAYER_DEFAULT + device_type = 0 + volume = 260 + var/list/front_nodes + var/list/back_nodes + +/obj/machinery/atmospherics/pipe/layer_manifold/Initialize() + front_nodes = list() + back_nodes = list() + return ..() + +/obj/machinery/atmospherics/pipe/layer_manifold/Destroy() + nullifyAllNodes() + return ..() + +/obj/machinery/atmospherics/pipe/layer_manifold/proc/nullifyAllNodes() + var/list/obj/machinery/atmospherics/needs_nullifying = get_all_connected_nodes() + front_nodes = null + back_nodes = null + nodes = list() + for(var/obj/machinery/atmospherics/A in needs_nullifying) + A.disconnect(src) + A.build_network() + +/obj/machinery/atmospherics/pipe/layer_manifold/proc/get_all_connected_nodes() + var/list/obj/machinery/atmospherics/all_connected = list() + for(var/obj/machinery/atmospherics/I in front_nodes) + all_connected[I] = I + for(var/obj/machinery/atmospherics/I in back_nodes) + all_connected[I] = I + for(var/obj/machinery/atmospherics/I in nodes) + all_connected[I] = I + var/list/obj/machinery/atmospherics/returnlist = list() + for(var/obj/machinery/atmospherics/A in all_connected) + returnlist += all_connected[A] + return returnlist + +/obj/machinery/atmospherics/pipe/layer_manifold/update_icon() //HEAVILY WIP FOR UPDATE ICONS!! + layer = (initial(layer) + (PIPING_LAYER_MAX * PIPING_LAYER_LCHANGE)) //This is above everything else. + var/invis = invisibility ? "-f" : "" + icon_state = "[initial(icon_state)][invis]" + cut_overlays() + for(var/obj/machinery/atmospherics/A in front_nodes) + add_attached_image(A) + for(var/obj/machinery/atmospherics/A in back_nodes) + add_attached_image(A) + +/obj/machinery/atmospherics/pipe/layer_manifold/proc/add_attached_image(obj/machinery/atmospherics/A) + var/invis = A.invisibility ? "-f" : "" + if(istype(A, /obj/machinery/atmospherics/pipe/layer_manifold)) + for(var/i = PIPING_LAYER_MIN, i <= PIPING_LAYER_MAX, i++) + var/image/I = getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full_layer_long[invis]", get_dir(src, A), A.pipe_color) + I.pixel_x = (i - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + I.pixel_y = (i - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + I.layer = layer - 0.01 + add_overlay(I) + else + var/image/I = getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full_layer_long[invis]", get_dir(src, A), A.pipe_color) + I.pixel_x = A.pixel_x + I.pixel_y = A.pixel_y + I.layer = layer - 0.01 + add_overlay(I) + +/obj/machinery/atmospherics/pipe/layer_manifold/SetInitDirections() + switch(dir) + if(NORTH || SOUTH) + initialize_directions = NORTH|SOUTH + if(EAST || WEST) + initialize_directions = EAST|WEST + +/obj/machinery/atmospherics/pipe/layer_manifold/isConnectable(obj/machinery/atmospherics/target, given_layer) + if(!given_layer) + return TRUE + . = ..() + +/obj/machinery/atmospherics/pipe/layer_manifold/proc/findAllConnections() + front_nodes = list() + back_nodes = list() + var/list/new_nodes = list() + for(var/iter in PIPING_LAYER_MIN to PIPING_LAYER_MAX) + var/obj/machinery/atmospherics/foundfront = findConnecting(dir, iter) + var/obj/machinery/atmospherics/foundback = findConnecting(turn(dir, 180), iter) + front_nodes += foundfront + back_nodes += foundback + if(foundfront && !QDELETED(foundfront)) + new_nodes += foundfront + if(foundback && !QDELETED(foundback)) + new_nodes += foundback + update_icon() + return new_nodes + +/obj/machinery/atmospherics/pipe/layer_manifold/atmosinit() + normalize_cardinal_directions() + findAllConnections() + var/turf/T = loc // hide if turf is not intact + hide(T.intact) + +/obj/machinery/atmospherics/pipe/layer_manifold/setPipingLayer() + piping_layer = PIPING_LAYER_DEFAULT + +/obj/machinery/atmospherics/pipe/layer_manifold/pipeline_expansion() + return get_all_connected_nodes() + +/obj/machinery/atmospherics/pipe/layer_manifold/disconnect(obj/machinery/atmospherics/reference) + if(istype(reference, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/P = reference + P.destroy_network() + while(reference in get_all_connected_nodes()) + if(reference in nodes) + var/I = nodes.Find(reference) + NODE_I = null + if(reference in front_nodes) + var/I = front_nodes.Find(reference) + front_nodes[I] = null + if(reference in back_nodes) + var/I = back_nodes.Find(reference) + back_nodes[I] = null + update_icon() + +/obj/machinery/atmospherics/pipe/layer_manifold/relaymove(mob/living/user, dir) + if(initialize_directions & dir) + return ..() + if((NORTH|EAST) & dir) + user.ventcrawl_layer = Clamp(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + if((SOUTH|WEST) & dir) + user.ventcrawl_layer = Clamp(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + to_chat(user, "You align yourself with the [user.ventcrawl_layer]\th output.") diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm index 66b831c477..89aea64a81 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold.dm @@ -125,7 +125,7 @@ /obj/machinery/atmospherics/pipe/manifold/orange/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/purple pipe_color=rgb(128,0,182) color=rgb(128,0,182) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 49383a74cb..cc01e6c4bd 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -24,6 +24,14 @@ if(oldN) oldN.build_network() +/obj/machinery/atmospherics/pipe/destroy_network() + QDEL_NULL(parent) + +/obj/machinery/atmospherics/pipe/build_network() + if(QDELETED(parent)) + parent = new + parent.build_pipeline(src) + /obj/machinery/atmospherics/pipe/update_icon() //overridden by manifolds if(NODE1&&NODE2) icon_state = "intact[invisibility ? "-f" : "" ]" @@ -51,14 +59,13 @@ /obj/machinery/atmospherics/pipe/return_air() return parent.air -/obj/machinery/atmospherics/pipe/build_network() - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) - /obj/machinery/atmospherics/pipe/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/device/analyzer)) atmosanalyzer_scan(parent.air, user) + if(istype(W, /obj/item/pipe_meter)) + var/obj/item/pipe_meter/meter = W + user.dropItemToGround(meter) + meter.setAttachLayer(piping_layer) else return ..() @@ -81,9 +88,7 @@ qdel(meter) . = ..() - if(parent && !QDELETED(parent)) - qdel(parent) - parent = null + QDEL_NULL(parent) /obj/machinery/atmospherics/pipe/proc/update_node_icon() for(DEVICE_TYPE_LOOP) diff --git a/code/modules/atmospherics/machinery/pipes/simple.dm b/code/modules/atmospherics/machinery/pipes/simple.dm index 5ac9ac31e6..e8d82c611c 100644 --- a/code/modules/atmospherics/machinery/pipes/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/simple.dm @@ -12,10 +12,12 @@ The regular pipe you see everywhere, including bent ones. dir = SOUTH initialize_directions = SOUTH|NORTH + pipe_flags = PIPING_CARDINAL_AUTONORMALIZE device_type = BINARY /obj/machinery/atmospherics/pipe/simple/SetInitDirections() + normalize_cardinal_directions() if(dir in GLOB.diagonals) initialize_directions = dir switch(dir) @@ -24,20 +26,6 @@ The regular pipe you see everywhere, including bent ones. if(EAST,WEST) initialize_directions = EAST|WEST -/obj/machinery/atmospherics/pipe/simple/atmosinit() - normalize_dir() - ..() - -/obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() - if(dir==SOUTH) - setDir(NORTH) - else if(dir==WEST) - setDir(EAST) - -/obj/machinery/atmospherics/pipe/simple/update_icon() - normalize_dir() - ..() - //Colored pipes, use these for mapping /obj/machinery/atmospherics/pipe/simple/general diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 96a5b8e489..cad1584991 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -45,11 +45,11 @@ /obj/machinery/portable_atmospherics/proc/connect(obj/machinery/atmospherics/components/unary/portables_connector/new_port) //Make sure not already connected to something else if(connected_port || !new_port || new_port.connected_device) - return 0 + return FALSE //Make sure are close enough for a valid connection if(new_port.loc != get_turf(src)) - return 0 + return TRUE //Perform the connection connected_port = new_port @@ -58,7 +58,9 @@ connected_port_parent.reconcile_air() anchored = TRUE //Prevent movement - return 1 + pixel_x = new_port.pixel_x + pixel_y = new_port.pixel_y + return TRUE /obj/machinery/portable_atmospherics/Move() . = ..() @@ -67,11 +69,11 @@ /obj/machinery/portable_atmospherics/proc/disconnect() if(!connected_port) - return 0 + return FALSE anchored = FALSE connected_port.connected_device = null connected_port = null - return 1 + return TRUE /obj/machinery/portable_atmospherics/portableConnectorReturnAir() return air_contents diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index cf0a786cae..6becdb3ddd 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -143,3 +143,5 @@ var/list/can_ride_typecache = list() var/list/mousemove_intercept_objects + + var/ventcrawl_layer = PIPING_LAYER_DEFAULT diff --git a/icons/obj/atmospherics/pipes/manifold.dmi b/icons/obj/atmospherics/pipes/manifold.dmi index 6fe285c74bce33d100731cc7d0015c49577853c1..3e4d218ca6b8b5d228f1f7cf8b3fa9004a9c3be6 100644 GIT binary patch literal 15231 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 literal 23898 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