diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 937e3909..8ea2009f 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -21,6 +21,7 @@ Buildable meters level = 2 var/piping_layer = PIPING_LAYER_DEFAULT var/RPD_type + var/disposable = TRUE /obj/item/pipe/directional RPD_type = PIPE_UNARY @@ -232,3 +233,22 @@ Buildable meters /obj/item/pipe_meter/proc/setAttachLayer(new_layer = PIPING_LAYER_DEFAULT) piping_layer = new_layer PIPING_LAYER_DOUBLE_SHIFT(src, piping_layer) + +/obj/item/pipe/bluespace + pipe_type = /obj/machinery/atmospherics/pipe/bluespace + var/bluespace_network_name = "default" + icon_state = "bluespace" + disposable = FALSE + +/obj/item/pipe/bluespace/attack_self(mob/user) + var/new_name = input(user, "Enter identifier for bluespace pipe network", "bluespace pipe", bluespace_network_name) as text|null + if(!isnull(new_name)) + bluespace_network_name = new_name + +/obj/item/pipe/bluespace/make_from_existing(obj/machinery/atmospherics/pipe/bluespace/make_from) + bluespace_network_name = make_from.bluespace_network_name + return ..() + +/obj/item/pipe/bluespace/build_pipe(obj/machinery/atmospherics/pipe/bluespace/A) + A.bluespace_network_name = bluespace_network_name + return ..() diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 51701f7c..499a304b 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -347,12 +347,14 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( . = FALSE if((mode & DESTROY_MODE) && istype(A, /obj/item/pipe) || istype(A, /obj/structure/disposalconstruct) || istype(A, /obj/structure/c_transit_tube) || istype(A, /obj/structure/c_transit_tube_pod) || istype(A, /obj/item/pipe_meter)) - to_chat(user, "You start destroying a pipe...") - playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) - if(do_after(user, destroy_speed, target = A)) - activate() - qdel(A) - return + var/obj/item/pipe/P = A + if(!istype(P) || P.disposable) + to_chat(user, "You start destroying a pipe...") + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, destroy_speed, target = A)) + activate() + qdel(A) + return if((mode & PAINT_MODE)) if(istype(A, /obj/machinery/atmospherics/pipe) && !istype(A, /obj/machinery/atmospherics/pipe/layer_manifold)) diff --git a/code/modules/atmospherics/machinery/pipes/bluespace.dm b/code/modules/atmospherics/machinery/pipes/bluespace.dm new file mode 100644 index 00000000..2735a381 --- /dev/null +++ b/code/modules/atmospherics/machinery/pipes/bluespace.dm @@ -0,0 +1,86 @@ +GLOBAL_LIST_EMPTY(bluespace_pipe_networks) +/obj/machinery/atmospherics/pipe/bluespace + name = "bluespace pipe" + desc = "Transmits gas across large distances of space. Developed using bluespace technology." + icon = 'icons/obj/atmospherics/pipes/bluespace.dmi' + icon_state = "map" + pipe_state = "bluespace" + dir = SOUTH + initialize_directions = SOUTH + device_type = UNARY + can_buckle = FALSE + construction_type = /obj/item/pipe/bluespace + var/bluespace_network_name + +/obj/machinery/atmospherics/pipe/bluespace/New() + icon_state = "pipe" + if(bluespace_network_name) // in case someone maps one in for some reason + if(!GLOB.bluespace_pipe_networks[bluespace_network_name]) + GLOB.bluespace_pipe_networks[bluespace_network_name] = list() + GLOB.bluespace_pipe_networks[bluespace_network_name] |= src + ..() + +/obj/machinery/atmospherics/pipe/bluespace/on_construction() + . = ..() + if(bluespace_network_name) + if(!GLOB.bluespace_pipe_networks[bluespace_network_name]) + GLOB.bluespace_pipe_networks[bluespace_network_name] = list() + GLOB.bluespace_pipe_networks[bluespace_network_name] |= src + +/obj/machinery/atmospherics/pipe/bluespace/Destroy() + if(GLOB.bluespace_pipe_networks[bluespace_network_name]) + GLOB.bluespace_pipe_networks[bluespace_network_name] -= src + for(var/p in GLOB.bluespace_pipe_networks[bluespace_network_name]) + var/obj/machinery/atmospherics/pipe/bluespace/P = p + QDEL_NULL(P.parent) + P.build_network() + return ..() + +/obj/machinery/atmospherics/pipe/bluespace/examine(user) + . = ..() + . += "This one is connected to the \"[html_encode(bluespace_network_name)]\" network." + +/obj/machinery/atmospherics/pipe/bluespace/SetInitDirections() + initialize_directions = dir + +/obj/machinery/atmospherics/pipe/bluespace/pipeline_expansion() + return ..() + GLOB.bluespace_pipe_networks[bluespace_network_name] - src + +/obj/machinery/atmospherics/pipe/bluespace/hide() + update_icon() + +/obj/machinery/atmospherics/pipe/bluespace/update_icon(showpipe) + underlays.Cut() + + var/turf/T = loc + if(level == 2 || !T.intact) + showpipe = TRUE + plane = GAME_PLANE + else + showpipe = FALSE + plane = FLOOR_PLANE + + if(!showpipe) + return //no need to update the pipes if they aren't showing + + var/connected = 0 //Direction bitset + + for(var/i in 1 to device_type) //adds intact pieces + if(nodes[i]) + var/obj/machinery/atmospherics/node = nodes[i] + var/image/img = get_pipe_underlay("pipe_intact", get_dir(src, node), node.pipe_color) + underlays += img + connected |= img.dir + + for(var/direction in GLOB.cardinals) + if((initialize_directions & direction) && !(connected & direction)) + underlays += get_pipe_underlay("pipe_exposed", direction) + +/obj/machinery/atmospherics/pipe/bluespace/paint() + return FALSE + +/obj/machinery/atmospherics/pipe/bluespace/proc/get_pipe_underlay(state, dir, color = null) + if(color) + . = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', state, dir, color) + else + . = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', state, dir) diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index ec4309b6..50418cff 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -1,86 +1,96 @@ - -///////////////////////////////////////// -//////////////Blue Space///////////////// -///////////////////////////////////////// - -/datum/design/beacon - name = "Tracking Beacon" - desc = "A blue space tracking beacon." - id = "beacon" - build_type = PROTOLATHE - materials = list(MAT_METAL = 150, MAT_GLASS = 100) - build_path = /obj/item/beacon - category = list("Bluespace Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY - -/datum/design/bag_holding - name = "Bag of Holding" - desc = "A backpack that opens into a localized pocket of bluespace." - id = "bag_holding" - build_type = PROTOLATHE - materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000) - build_path = /obj/item/storage/backpack/holding - category = list("Bluespace Designs") - dangerous_construction = TRUE - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/satchel_holding - name = "Satchel of Holding" - desc = "A satchel that opens into a localized pocket of bluespace." - id = "satchel_holding" - build_type = PROTOLATHE - materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000) - build_path = /obj/item/storage/backpack/holding/satchel - category = list("Bluespace Designs") - dangerous_construction = TRUE - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/biobag_holding - name = "Bio Bag of Holding" - desc = "A chemical holding thingy. Mostly used for xenobiology." - id = "biobag_holding" - build_type = PROTOLATHE - materials = list(MAT_GOLD = 1500, MAT_DIAMOND = 750, MAT_URANIUM = 250, MAT_BLUESPACE = 1000) - build_path = /obj/item/storage/bag/bio/holding - category = list("Bluespace Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/bluespace_crystal - name = "Artificial Bluespace Crystal" - desc = "A small blue crystal with mystical properties." - id = "bluespace_crystal" - build_type = PROTOLATHE - materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500) - build_path = /obj/item/stack/ore/bluespace_crystal/artificial - category = list("Bluespace Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/telesci_gps - name = "GPS Device" - desc = "Little thingie that can track its position at all times." - id = "telesci_gps" - build_type = PROTOLATHE - materials = list(MAT_METAL = 500, MAT_GLASS = 1000) - build_path = /obj/item/gps - category = list("Bluespace Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO - -/datum/design/desynchronizer - name = "Desynchronizer" - desc = "A device that can desynchronize the user from spacetime." - id = "desynchronizer" - build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_BLUESPACE = 1000) - build_path = /obj/item/desynchronizer - category = list("Bluespace Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/miningsatchel_holding - name = "Mining Satchel of Holding" - desc = "A mining satchel that can hold an infinite amount of ores." - id = "minerbag_holding" - build_type = PROTOLATHE - materials = list(MAT_GOLD = 250, MAT_URANIUM = 500) //quite cheap, for more convenience - build_path = /obj/item/storage/bag/ore/holding - category = list("Bluespace Designs") - departmental_flags = DEPARTMENTAL_FLAG_CARGO + +///////////////////////////////////////// +//////////////Blue Space///////////////// +///////////////////////////////////////// + +/datum/design/beacon + name = "Tracking Beacon" + desc = "A blue space tracking beacon." + id = "beacon" + build_type = PROTOLATHE + materials = list(MAT_METAL = 150, MAT_GLASS = 100) + build_path = /obj/item/beacon + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY + +/datum/design/bag_holding + name = "Bag of Holding" + desc = "A backpack that opens into a localized pocket of bluespace." + id = "bag_holding" + build_type = PROTOLATHE + materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000) + build_path = /obj/item/storage/backpack/holding + category = list("Bluespace Designs") + dangerous_construction = TRUE + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/satchel_holding + name = "Satchel of Holding" + desc = "A satchel that opens into a localized pocket of bluespace." + id = "satchel_holding" + build_type = PROTOLATHE + materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000) + build_path = /obj/item/storage/backpack/holding/satchel + category = list("Bluespace Designs") + dangerous_construction = TRUE + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/biobag_holding + name = "Bio Bag of Holding" + desc = "A chemical holding thingy. Mostly used for xenobiology." + id = "biobag_holding" + build_type = PROTOLATHE + materials = list(MAT_GOLD = 1500, MAT_DIAMOND = 750, MAT_URANIUM = 250, MAT_BLUESPACE = 1000) + build_path = /obj/item/storage/bag/bio/holding + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/bluespace_crystal + name = "Artificial Bluespace Crystal" + desc = "A small blue crystal with mystical properties." + id = "bluespace_crystal" + build_type = PROTOLATHE + materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500) + build_path = /obj/item/stack/ore/bluespace_crystal/artificial + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/telesci_gps + name = "GPS Device" + desc = "Little thingie that can track its position at all times." + id = "telesci_gps" + build_type = PROTOLATHE + materials = list(MAT_METAL = 500, MAT_GLASS = 1000) + build_path = /obj/item/gps + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO + +/datum/design/desynchronizer + name = "Desynchronizer" + desc = "A device that can desynchronize the user from spacetime." + id = "desynchronizer" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_BLUESPACE = 1000) + build_path = /obj/item/desynchronizer + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/miningsatchel_holding + name = "Mining Satchel of Holding" + desc = "A mining satchel that can hold an infinite amount of ores." + id = "minerbag_holding" + build_type = PROTOLATHE + materials = list(MAT_GOLD = 250, MAT_URANIUM = 500) //quite cheap, for more convenience + build_path = /obj/item/storage/bag/ore/holding + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_CARGO + +/datum/design/bluespace_pipe + name = "Bluespace Pipe" + desc = "A pipe that teleports gases." + id = "bluespace_pipe" + build_type = PROTOLATHE + materials = list(/datum/material/gold = 1000, /datum/material/diamond = 750, /datum/material/uranium = 250, /datum/material/bluespace = 2000) + build_path = /obj/item/pipe/bluespace + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index cf21970f..ad936bc9 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -330,7 +330,7 @@ display_name = "Bluespace Travel" description = "Application of Bluespace for static teleportation technology." prereq_ids = list("adv_power", "adv_bluespace") - design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick") + design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick", "bluespace_pipe") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/icons/obj/atmospherics/pipes/bluespace.dmi b/icons/obj/atmospherics/pipes/bluespace.dmi new file mode 100644 index 00000000..866e6f9b Binary files /dev/null and b/icons/obj/atmospherics/pipes/bluespace.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 855cf5a3..0774cdc8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1473,6 +1473,7 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" #include "code\modules\atmospherics\machinery\other\meter.dm" #include "code\modules\atmospherics\machinery\other\miner.dm" +#include "code\modules\atmospherics\machinery\pipes\bluespace.dm" #include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" #include "code\modules\atmospherics\machinery\pipes\manifold.dm" #include "code\modules\atmospherics\machinery\pipes\manifold4w.dm"