diff --git a/code/__DEFINES/footstep.dm b/code/__DEFINES/footstep.dm index 469549b8827..bda71aa4443 100644 --- a/code/__DEFINES/footstep.dm +++ b/code/__DEFINES/footstep.dm @@ -7,12 +7,14 @@ #define FOOTSTEP_WATER "water" #define FOOTSTEP_LAVA "lava" #define FOOTSTEP_MEAT "meat" +#define FOOTSTEP_GLASS "glass" //barefoot sounds #define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot" #define FOOTSTEP_WOOD_CLAW "woodclaw" #define FOOTSTEP_HARD_BAREFOOT "hardbarefoot" #define FOOTSTEP_HARD_CLAW "hardclaw" #define FOOTSTEP_CARPET_BAREFOOT "carpetbarefoot" +#define FOOTSTEP_GLASS_BAREFOOT "glassbarefoot" //misc footstep sounds #define FOOTSTEP_GENERIC_HEAVY "heavy" @@ -83,7 +85,11 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), FOOTSTEP_MEAT = list(list( - 'sound/effects/meatslap.ogg'), 100, 0) + 'sound/effects/meatslap.ogg'), 100, 0), + FOOTSTEP_GLASS = list(list( + 'sound/effects/footstep/glass1.ogg', + 'sound/effects/footstep/glass2.ogg', + 'sound/effects/footstep/glass3.ogg'), 100, 1), )) //bare footsteps lists GLOBAL_LIST_INIT(barefootstep, list( @@ -127,6 +133,10 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/lava3.ogg'), 100, 0), FOOTSTEP_MEAT = list(list( 'sound/effects/meatslap.ogg'), 100, 0), + FOOTSTEP_GLASS_BAREFOOT = list(list( + 'sound/effects/footstep/glassbarefoot1.ogg', + 'sound/effects/footstep/glassbarefoot2.ogg', + 'sound/effects/footstep/glassbarefoot3.ogg'), 100, 1), )) //claw footsteps lists @@ -171,6 +181,10 @@ GLOBAL_LIST_INIT(clawfootstep, list( 'sound/effects/footstep/lava3.ogg'), 100, 0), FOOTSTEP_MEAT = list(list( 'sound/effects/meatslap.ogg'), 100, 0), + FOOTSTEP_GLASS = list(list( + 'sound/effects/footstep/glassbarefoot1.ogg', + 'sound/effects/footstep/glassbarefoot2.ogg', + 'sound/effects/footstep/glassbarefoot3.ogg'), 100, 1), )) //heavy footsteps list diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 4950beb7e74..bff5100982a 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -26,11 +26,13 @@ #define DISPOSAL_PIPE_LAYER 2.3 #define GAS_PIPE_HIDDEN_LAYER 2.35 #define WIRE_LAYER 2.4 +#define TRANSPARENT_TURF_LAYER 2.41 #define WIRE_TERMINAL_LAYER 2.45 #define GAS_SCRUBBER_LAYER 2.46 #define GAS_PIPE_VISIBLE_LAYER 2.47 #define GAS_FILTER_LAYER 2.48 #define GAS_PUMP_LAYER 2.49 +#define HOLOPAD_LAYER 2.491 #define CONVEYOR_LAYER 2.495 #define LOW_OBJ_LAYER 2.5 #define LOW_SIGIL_LAYER 2.52 diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 41612fb870b..4705c041775 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -4,7 +4,8 @@ name = "Bluespace Gigabeacon" desc = "A device that draws power from bluespace and creates a permanent tracking beacon." level = 1 // underfloor - layer = 2.5 + layer = WIRE_LAYER + plane = FLOOR_PLANE anchored = 1 use_power = IDLE_POWER_USE idle_power_usage = 0 @@ -26,7 +27,8 @@ Beacon.syndicate = syndicate Beacon.area_bypass = area_bypass Beacon.cc_beacon = cc_beacon - hide(T.intact) + if(!T.transparent_floor) + hide(T.intact) /obj/machinery/bluespace_beacon/proc/destroy_beacon() QDEL_NULL(Beacon) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index c4d5c4984b9..da287020804 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(holopads) use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 - layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. + layer = HOLOPAD_LAYER //Preventing mice and drones from sneaking under them. plane = FLOOR_PLANE max_integrity = 300 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 7bd89ac6dae..1a5a5ced2ec 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -11,7 +11,7 @@ name = "Electromagnetic Generator" desc = "A device that uses station power to create points of magnetic energy." level = 1 // underfloor - layer = 2.5 + layer = WIRE_LAYER+0.001 anchored = 1 use_power = IDLE_POWER_USE idle_power_usage = 50 @@ -32,7 +32,8 @@ /obj/machinery/magnetic_module/New() ..() var/turf/T = loc - hide(T.intact) + if(!T.transparent_floor) + hide(T.intact) center = T spawn(10) // must wait for map loading to finish diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 48d87d0f330..f43e0033e23 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -8,7 +8,8 @@ name = "navigation beacon" desc = "A radio beacon used for bot navigation." level = 1 // underfloor - layer = 2.5 + layer = WIRE_LAYER + plane = FLOOR_PLANE anchored = 1 max_integrity = 500 armor = list(melee = 70, bullet = 70, laser = 70, energy = 70, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80) @@ -26,7 +27,8 @@ set_codes() var/turf/T = loc - hide(T.intact) + if(!T.transparent_floor) + hide(T.intact) if(!codes || !codes.len) log_runtime(EXCEPTION("Empty codes datum at ([x],[y],[z])"), src, list("codes_txt: '[codes_txt]'")) if("patrol" in codes) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index ac61c2cccc9..98eaf1ceb2e 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -337,12 +337,18 @@ fixdir() var/pipe_dir = get_pipe_dir() + var/turf/T = get_turf(loc) for(var/obj/machinery/atmospherics/M in src.loc) if((M.initialize_directions & pipe_dir) && M.check_connect_types_construction(M,src)) // matches at least one direction on either type of pipe to_chat(user, "There is already a pipe of the same type at this location.") return 1 + if(pipe_type in list(PIPE_SUPPLY_STRAIGHT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_STRAIGHT, PIPE_SCRUBBERS_BENT, PIPE_HE_STRAIGHT, PIPE_HE_BENT, PIPE_SUPPLY_MANIFOLD, PIPE_SCRUBBERS_MANIFOLD, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_UVENT, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_PASV_VENT, PIPE_DP_VENT, PIPE_PASSIVE_GATE)) + if(T.transparent_floor) //stops jank with transparent floors and pipes + to_chat(user, "You can only fix simple pipes and devices over glass floors!") + return 1 + switch(pipe_type) //What kind of heartless person thought of doing this? if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT) var/obj/machinery/atmospherics/pipe/simple/P = new( src.loc ) diff --git a/code/game/objects/items/devices/painter/pipe_painter.dm b/code/game/objects/items/devices/painter/pipe_painter.dm index 4ad7b16b293..17c383809aa 100644 --- a/code/game/objects/items/devices/painter/pipe_painter.dm +++ b/code/game/objects/items/devices/painter/pipe_painter.dm @@ -27,8 +27,8 @@ return var/turf/T = get_turf(P) - if(P.level < 2 && T.level == 1 && T.intact) - to_chat(user, "You must remove the plating first.") + if(P.level < 2 && T.level == 1 && T.intact && !T.transparent_floor) + to_chat(user, "You must remove the flooring first.") return P.change_color(GLOB.pipe_colors[paint_setting]) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index b796740a60b..7330819e7d0 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -90,7 +90,7 @@ /obj/blob_act(obj/structure/blob/B) if(isturf(loc)) var/turf/T = loc - if(T.intact && level == 1) //the blob doesn't destroy thing below the floor + if((T.intact && level == 1) || T.transparent_floor) //the blob doesn't destroy thing below the floor return take_damage(400, BRUTE, "melee", 0, get_dir(src, B)) @@ -199,7 +199,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /obj/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) if(isturf(loc)) var/turf/T = loc - if(T.intact && level == 1) //fire can't damage things hidden below the floor. + if((T.intact && level == 1) || T.transparent_floor) //fire can't damage things hidden below the floor. return ..() if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 4266d6ef254..c373a28936c 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -368,7 +368,8 @@ GLOBAL_LIST_EMPTY(safes) /obj/structure/safe/floor/Initialize() . = ..() var/turf/T = loc - hide(T.intact) + if(!T.transparent_floor) + hide(T.intact) /obj/structure/safe/floor/hide(intact) invisibility = intact ? INVISIBILITY_MAXIMUM : 0 diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 24fcba648f2..8f8e94362b7 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -27,6 +27,7 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") var/list/burnt_states = list("floorscorched1", "floorscorched2") var/list/prying_tool_list = list(TOOL_CROWBAR) //What tool/s can we use to pry up the tile? + var/keep_dir = TRUE //When false, resets dir to default on changeturf() var/footstep = FOOTSTEP_FLOOR var/barefootstep = FOOTSTEP_HARD_BAREFOOT @@ -124,11 +125,18 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama var/turf/simulated/floor/W = ..() + var/obj/machinery/atmospherics/R + if(keep_icon) W.icon_regular_floor = old_icon W.icon_plating = old_plating + if(W.keep_dir) W.dir = old_dir - + if(W.transparent_floor) + for(R in W) + R.update_icon() + for(R in W) + R.update_underlays() W.update_icon() return W diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index d0805cf5099..ad26fa8919e 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -70,6 +70,35 @@ to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") return TRUE + else if(is_glass_sheet(C)) + if(broken || burnt) + to_chat(user, "Repair the plating first!") + return TRUE + var/obj/item/stack/sheet/R = C + if(R.get_amount() < 2) + to_chat(user, "You need two sheets to build a [C.name] floor!") + return TRUE + to_chat(user, "You begin swapping the plating for [C]...") + if(do_after(user, 3 SECONDS * C.toolspeed, target = src)) + if(R.get_amount() >= 2 && !transparent_floor) + if(istype(C, /obj/item/stack/sheet/plasmaglass)) //So, what type of glass floor do we want today? + ChangeTurf(/turf/simulated/floor/transparent/glass/plasma) + else if(istype(C, /obj/item/stack/sheet/plasmarglass)) + ChangeTurf(/turf/simulated/floor/transparent/glass/reinforced/plasma) + else if(istype(C, /obj/item/stack/sheet/glass)) + ChangeTurf(/turf/simulated/floor/transparent/glass) + else if(istype(C, /obj/item/stack/sheet/rglass)) + ChangeTurf(/turf/simulated/floor/transparent/glass/reinforced) + else if(istype(C, /obj/item/stack/sheet/titaniumglass)) + ChangeTurf(/turf/simulated/floor/transparent/glass/titanium) + else if(istype(C, /obj/item/stack/sheet/plastitaniumglass)) + ChangeTurf(/turf/simulated/floor/transparent/glass/titanium/plasma) + playsound(src, C.usesound, 80, TRUE) + R.use(2) + to_chat(user, "You swap the plating for [C].") + new /obj/item/stack/sheet/metal(src, 2) + return TRUE + /turf/simulated/floor/plating/screwdriver_act(mob/user, obj/item/I) . = TRUE if(!I.tool_use_check(user, 0)) diff --git a/code/game/turfs/simulated/floor/transparent.dm b/code/game/turfs/simulated/floor/transparent.dm new file mode 100644 index 00000000000..81030c4d294 --- /dev/null +++ b/code/game/turfs/simulated/floor/transparent.dm @@ -0,0 +1,112 @@ +/turf/simulated/floor/transparent/glass + name = "glass floor" + desc = "Don't jump on it... Or do, I'm not your mom." + icon = 'icons/turf/floors/glass.dmi' + icon_state = "unsmooth" + baseturf = /turf/space + smooth = SMOOTH_TRUE + canSmoothWith = list(/turf/simulated/floor/transparent/glass, /turf/simulated/floor/transparent/glass/reinforced, /turf/simulated/floor/transparent/glass/plasma, /turf/simulated/floor/transparent/glass/reinforced/plasma) + footstep = FOOTSTEP_GLASS + barefootstep = FOOTSTEP_GLASS_BAREFOOT + clawfootstep = FOOTSTEP_GLASS_BAREFOOT + heavyfootstep = FOOTSTEP_GLASS_BAREFOOT + light_power = 0.25 + light_range = 2 + layer = TRANSPARENT_TURF_LAYER + keep_dir = FALSE + intact = FALSE + transparent_floor = TRUE + heat_capacity = 800 + +/turf/simulated/floor/transparent/glass/Initialize(mapload) + . = ..() + var/image/I = image('icons/turf/space.dmi', src, SPACE_ICON_STATE) + I.plane = PLANE_SPACE + underlays += I + dir = SOUTH //dirs that are not 2/south cause smoothing jank + icon_state = "" //Prevents default icon appearing behind the glass + +/turf/simulated/floor/transparent/glass/welder_act(mob/user, obj/item/I) + if(!broken && !burnt) + return + if(!I.tool_use_check(user, 0)) + return + if(I.use_tool(src, user, volume = I.tool_volume)) + to_chat(user, "You fix some cracks in the glass.") + overlays -= current_overlay + current_overlay = null + burnt = FALSE + broken = FALSE + update_icon() + +/turf/simulated/floor/transparent/glass/crowbar_act(mob/user, obj/item/I) + if(!I || !user) + return + var/obj/item/stack/R = user.get_inactive_hand() + if(istype(R, /obj/item/stack/sheet/metal)) + if(R.get_amount() < 2) //not enough metal in the stack + to_chat(user, "You also need to hold two sheets of metal to dismantle [src]!") + return + else + to_chat(user, "You begin replacing [src]...") + playsound(src, I.usesound, 80, TRUE) + if(do_after(user, 3 SECONDS * I.toolspeed, target = src)) + if(R.get_amount() < 2 || !transparent_floor) + return + else //not holding metal at all + to_chat(user, "You also need to hold two sheets of metal to dismantle \the [src]!") + return + switch(type) //What material is returned? Depends on the turf + if(/turf/simulated/floor/transparent/glass/reinforced) + new /obj/item/stack/sheet/rglass(src, 2) + if(/turf/simulated/floor/transparent/glass) + new /obj/item/stack/sheet/glass(src, 2) + if(/turf/simulated/floor/transparent/glass/plasma) + new /obj/item/stack/sheet/plasmaglass(src, 2) + if(/turf/simulated/floor/transparent/glass/reinforced/plasma) + new /obj/item/stack/sheet/plasmarglass(src, 2) + if(/turf/simulated/floor/transparent/glass/titanium) + new /obj/item/stack/sheet/titaniumglass(src, 2) + if(/turf/simulated/floor/transparent/glass/titanium/plasma) + new /obj/item/stack/sheet/plastitaniumglass(src, 2) + R.use(2) + playsound(src, 'sound/items/deconstruct.ogg', 80, TRUE) + ChangeTurf(/turf/simulated/floor/plating) + + +/turf/simulated/floor/transparent/glass/reinforced + name = "reinforced glass floor" + desc = "Jump on it, it can cope. Promise..." + icon = 'icons/turf/floors/reinf_glass.dmi' + thermal_conductivity = 0.035 + heat_capacity = 1600 + +/turf/simulated/floor/transparent/glass/reinforced/acid_act(acidpwr, acid_volume) + acidpwr = min(acidpwr, 50) + . = ..() + +/turf/simulated/floor/transparent/glass/plasma + name = "plasma glass floor" + desc = "Wait, was space always that color?" + icon = 'icons/turf/floors/plasmaglass.dmi' + thermal_conductivity = 0.030 + heat_capacity = 32000 + +/turf/simulated/floor/transparent/glass/reinforced/plasma + name = "reinforced plasma glass floor" + desc = "For when you REALLY don't want your floor choice to suffocate everyone." + icon = 'icons/turf/floors/reinf_plasmaglass.dmi' + thermal_conductivity = 0.025 + heat_capacity = 325000 + +/turf/simulated/floor/transparent/glass/titanium + name = "titanium glass floor" + desc = "Stylish AND strong!" + icon = 'icons/turf/floors/titaniumglass.dmi' + canSmoothWith = list(/turf/simulated/floor/transparent/glass/titanium, /turf/simulated/floor/transparent/glass/titanium/plasma) + thermal_conductivity = 0.025 + heat_capacity = 1600 + +/turf/simulated/floor/transparent/glass/titanium/plasma + name = "plastitanium glass floor" + icon = 'icons/turf/floors/plastitaniumglass.dmi' diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 938e2f8a851..8c64a8456bf 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -6,6 +6,7 @@ var/intact = TRUE var/turf/baseturf = /turf/space var/slowdown = 0 //negative for faster, positive for slower + var/transparent_floor = FALSE //used to check if pipes should be visible under the turf or not ///Properties for open tiles (/floor) /// All the gas vars, on the turf, are meant to be utilized for initializing a gas datum and setting its first gas values; the turf vars are never further modified at runtime; it is never directly used for calculations by the atmospherics system. diff --git a/code/modules/atmospherics/machinery/atmospherics.dm b/code/modules/atmospherics/machinery/atmospherics.dm index bb255692633..2ad433f0930 100644 --- a/code/modules/atmospherics/machinery/atmospherics.dm +++ b/code/modules/atmospherics/machinery/atmospherics.dm @@ -71,10 +71,13 @@ Pipelines + Other Objects -> Pipe network // Icons/overlays/underlays /obj/machinery/atmospherics/update_icon() var/turf/T = get_turf(loc) - if(!T || level == 2 || !T.intact) - plane = GAME_PLANE - else + if(T.transparent_floor) plane = FLOOR_PLANE + else + if(!T || level == 2 || !T.intact) + plane = GAME_PLANE + else + plane = FLOOR_PLANE /obj/machinery/atmospherics/proc/update_pipe_image() pipe_image = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) //the 20 puts it above Byond's darkness (not its opacity view) @@ -95,15 +98,18 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/add_underlay(turf/T, obj/machinery/atmospherics/node, direction, icon_connect_type) if(node) - if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe) && !T.transparent_floor) //underlays += SSair.icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else //underlays += SSair.icon_manager.get_atmos_icon("underlay_intact", direction, color_cache_name(node)) underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else - //underlays += SSair.icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) - underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "exposed" + icon_connect_type) + if(T.transparent_floor) //we want to keep pipes under transparent floors connected normally + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) + else + //underlays += SSair.icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "exposed" + icon_connect_type) /obj/machinery/atmospherics/proc/update_underlays() if(check_icon_cache()) @@ -166,11 +172,14 @@ Pipelines + Other Objects -> Pipe network //(De)construction /obj/machinery/atmospherics/attackby(obj/item/W, mob/user) + var/turf/T = get_turf(src) if(can_unwrench && istype(W, /obj/item/wrench)) - var/turf/T = get_turf(src) + if(T.transparent_floor && istype(src, /obj/machinery/atmospherics/pipe) && layer != GAS_PIPE_VISIBLE_LAYER) //pipes on GAS_PIPE_VISIBLE_LAYER are above the transparent floor and should be interactable + to_chat(user, "You can't interact with something that's under the floor!") + return if(level == 1 && isturf(T) && T.intact) to_chat(user, "You must remove the plating first.") - return 1 + return var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() add_fingerprint(user) @@ -184,14 +193,14 @@ Pipelines + Other Objects -> Pipe network playsound(src.loc, 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?") + to_chat(user, "As you begin unwrenching \the [src] a gust of air blows in your face... maybe you should reconsider?") unsafe_wrenching = TRUE //Oh dear oh dear if(do_after(user, 40 * W.toolspeed, target = src) && !QDELETED(src)) user.visible_message( \ "[user] unfastens \the [src].", \ "You have unfastened \the [src].", \ - "You hear ratchet.") + "You hear ratcheting.") investigate_log("was REMOVED by [key_name(usr)]", "atmos") for(var/obj/item/clothing/shoes/magboots/usermagboots in user.get_equipped_items()) @@ -206,6 +215,9 @@ Pipelines + Other Objects -> Pipe network unsafe_pressure_release(user,internal_pressure) deconstruct(TRUE) else + if(T.transparent_floor) + to_chat(user, "You can't interact with something that's under the floor!") + return TRUE return ..() //Called when an atmospherics object is unwrenched while having a large pressure difference @@ -240,7 +252,12 @@ Pipelines + Other Objects -> Pipe network dir = D initialize_directions = P var/turf/T = loc - level = T.intact ? 2 : 1 + if(!T.transparent_floor) + level = T.intact ? 2 : 1 + else + level = 2 + plane = GAME_PLANE + layer = GAS_PIPE_VISIBLE_LAYER add_fingerprint(usr) if(!SSair.initialized) //If there's no atmos subsystem, we can't really initialize pipenets SSair.machinery_to_construct.Add(src) @@ -337,12 +354,15 @@ Pipelines + Other Objects -> Pipe network /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 if(node) - if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe) && !T.transparent_floor) underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else - underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) + if(T.transparent_floor) //we want to keep pipes under transparent floors connected normally + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) + else + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) /obj/machinery/atmospherics/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index 9859058d731..94f9f17e4b5 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -2,6 +2,7 @@ icon = 'icons/atmos/vent_pump.dmi' icon_state = "map_vent" plane = FLOOR_PLANE + layer = GAS_SCRUBBER_LAYER name = "passive vent" desc = "A large air vent" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index 1cfb4d18eb1..ed0c438008a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/unary/tank icon = 'icons/atmos/tank.dmi' icon_state = "air_map" - + layer = GAS_PIPE_VISIBLE_LAYER name = "pressure tank" desc = "A large vessel containing pressurized gas." diff --git a/code/modules/atmospherics/machinery/datum_icon_manager.dm b/code/modules/atmospherics/machinery/datum_icon_manager.dm index 2e0ef593bae..f7a345a7c9a 100644 --- a/code/modules/atmospherics/machinery/datum_icon_manager.dm +++ b/code/modules/atmospherics/machinery/datum_icon_manager.dm @@ -159,9 +159,9 @@ var/cache_name = state for(var/D in GLOB.cardinal) - var/image/I = image(icon('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D)) + var/image/I = image(icon('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D), layer = GAS_PIPE_HIDDEN_LAYER) underlays[cache_name + "[D]"] = I for(var/pipe_color in GLOB.pipe_colors) - I = image(icon('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D)) + I = image(icon('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D), layer = GAS_PIPE_HIDDEN_LAYER) I.color = GLOB.pipe_colors[pipe_color] underlays[state + "[D]" + "[GLOB.pipe_colors[pipe_color]]"] = I diff --git a/code/modules/atmospherics/machinery/pipes/cap.dm b/code/modules/atmospherics/machinery/pipes/cap.dm index 615075cf3c0..4cfa2efb450 100644 --- a/code/modules/atmospherics/machinery/pipes/cap.dm +++ b/code/modules/atmospherics/machinery/pipes/cap.dm @@ -79,7 +79,8 @@ break var/turf/T = get_turf(src) // hide if turf is not intact - if(!istype(T)) return + if(!istype(T) || T.transparent_floor) + return hide(T.intact) update_icon() diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm index ffb66a01da3..20dd2990888 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold.dm @@ -57,6 +57,8 @@ node3 = target break var/turf/T = src.loc // hide if turf is not intact + if(T.transparent_floor) + return hide(T.intact) update_icon() diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm index 80d18bcee0f..5cefc6f723c 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm @@ -165,7 +165,8 @@ break var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + if(!T.transparent_floor) + hide(T.intact) update_icon() /obj/machinery/atmospherics/pipe/manifold4w/visible diff --git a/code/modules/atmospherics/machinery/pipes/pipe.dm b/code/modules/atmospherics/machinery/pipes/pipe.dm index afda1c30db7..925bf48715d 100644 --- a/code/modules/atmospherics/machinery/pipes/pipe.dm +++ b/code/modules/atmospherics/machinery/pipes/pipe.dm @@ -46,10 +46,6 @@ if(istype(W, /obj/item/analyzer)) atmosanalyzer_scan(parent.air, user) return - - if(istype(W, /obj/item/painter)) - return - return ..() /obj/machinery/atmospherics/proc/pipeline_expansion() diff --git a/code/modules/atmospherics/machinery/pipes/simple/pipe_simple.dm b/code/modules/atmospherics/machinery/pipes/simple/pipe_simple.dm index 92c421fbff9..7e14946e61e 100644 --- a/code/modules/atmospherics/machinery/pipes/simple/pipe_simple.dm +++ b/code/modules/atmospherics/machinery/pipes/simple/pipe_simple.dm @@ -68,7 +68,8 @@ break var/turf/T = loc // hide if turf is not intact - hide(T.intact) + if(!T.transparent_floor) + hide(T.intact) update_icon() /obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index fcccefbf513..db7152b3505 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -35,6 +35,7 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "0-1" var/d1 = 0 var/d2 = 1 + plane = FLOOR_PLANE layer = WIRE_LAYER //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 color = COLOR_RED @@ -68,9 +69,11 @@ By design, d1 is the smallest direction and d2 is the highest d2 = text2num(copytext( icon_state, dash+1 )) var/turf/T = get_turf(src) // hide if turf is not intact + LAZYADD(GLOB.cable_list, src) //add it to the global cable list + if(T.transparent_floor) + return if(level == 1) hide(T.intact) - LAZYADD(GLOB.cable_list, src) //add it to the global cable list /obj/structure/cable/Destroy() // called when a cable is deleted if(powernet) @@ -162,7 +165,8 @@ By design, d1 is the smallest direction and d2 is the highest // /obj/structure/cable/attackby(obj/item/W, mob/user) var/turf/T = get_turf(src) - if(T.intact) + if(T.transparent_floor || T.intact) + to_chat(user, "You can't interact with something that's under the floor!") return else if(istype(W, /obj/item/stack/cable_coil)) @@ -204,7 +208,8 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/wirecutter_act(mob/user, obj/item/I) . = TRUE var/turf/T = get_turf(src) - if(T.intact) + if(T.transparent_floor || T.intact) + to_chat(user, "You can't interact with something that's under the floor!") return if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return @@ -703,7 +708,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain var/turf/T = get_turf(C) - if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable + if(!isturf(T) || T.intact || T.transparent_floor) // sanity checks, also stop use interacting with T-scanner revealed cable return if(get_dist(C, user) > 1) // make sure it's close enough @@ -719,7 +724,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain // one end of the clicked cable is pointing towards us if(C.d1 == dirn || C.d2 == dirn) - if(U.intact) // can't place a cable if the floor is complete + if(U.intact || U.transparent_floor) // can't place a cable if the floor is complete to_chat(user, "You can't lay cable there unless the floor tiles are removed!") return else diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 584079b3c45..d8fc709a656 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -15,6 +15,8 @@ /obj/machinery/power/terminal/Initialize(mapload) . = ..() var/turf/T = get_turf(src) + if(T.transparent_floor) + return if(level == 1) hide(T.intact) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index b2afa9c06e3..cb875dce0cf 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -691,6 +691,7 @@ armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) damage_deflection = 10 flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2 + plane = FLOOR_PLANE layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes var/base_icon_state // initial icon state on map @@ -757,6 +758,9 @@ // update the icon_state to reflect hidden status /obj/structure/disposalpipe/proc/update() var/turf/T = get_turf(src) + if(T.transparent_floor) + update_icon() + return hide(T.intact && !istype(T, /turf/space)) // space never hides pipes update_icon() @@ -889,15 +893,20 @@ /obj/structure/disposalpipe/attackby(obj/item/I, mob/user, params) var/turf/T = get_turf(src) - if(T.intact) - return // prevent interaction with T-scanner revealed pipes + if(T.intact || T.transparent_floor) + to_chat(user, "You can't interact with something that's under the floor!") + return // prevent interaction with T-scanner revealed pipes and pipes under glass add_fingerprint(user) /obj/structure/disposalpipe/welder_act(mob/user, obj/item/I) . = TRUE + var/turf/T = get_turf(src) if(!I.tool_use_check(user, 0)) return + if(T.transparent_floor) + to_chat(user, "You can't interact with something that's under the floor!") + return WELDER_ATTEMPT_SLICING_MESSAGE if(!I.use_tool(src, user, 30, volume = I.tool_volume)) return @@ -1201,7 +1210,7 @@ return var/turf/T = src.loc - if(T.intact) + if(T.intact || T.transparent_floor) return // prevent interaction with T-scanner revealed pipes src.add_fingerprint(user) diff --git a/icons/turf/floors/glass.dmi b/icons/turf/floors/glass.dmi new file mode 100644 index 00000000000..1d0f13d0c06 Binary files /dev/null and b/icons/turf/floors/glass.dmi differ diff --git a/icons/turf/floors/plasmaglass.dmi b/icons/turf/floors/plasmaglass.dmi new file mode 100644 index 00000000000..629d8be41ec Binary files /dev/null and b/icons/turf/floors/plasmaglass.dmi differ diff --git a/icons/turf/floors/plastitaniumglass.dmi b/icons/turf/floors/plastitaniumglass.dmi new file mode 100644 index 00000000000..39a56f32b00 Binary files /dev/null and b/icons/turf/floors/plastitaniumglass.dmi differ diff --git a/icons/turf/floors/reinf_glass.dmi b/icons/turf/floors/reinf_glass.dmi new file mode 100644 index 00000000000..c5072fd11e0 Binary files /dev/null and b/icons/turf/floors/reinf_glass.dmi differ diff --git a/icons/turf/floors/reinf_plasmaglass.dmi b/icons/turf/floors/reinf_plasmaglass.dmi new file mode 100644 index 00000000000..c46025e5291 Binary files /dev/null and b/icons/turf/floors/reinf_plasmaglass.dmi differ diff --git a/icons/turf/floors/titaniumglass.dmi b/icons/turf/floors/titaniumglass.dmi new file mode 100644 index 00000000000..597487ff175 Binary files /dev/null and b/icons/turf/floors/titaniumglass.dmi differ diff --git a/paradise.dme b/paradise.dme index b6861bb6feb..785bd2f6158 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1154,6 +1154,7 @@ #include "code\game\turfs\simulated\floor\misc_floor.dm" #include "code\game\turfs\simulated\floor\plasteel_floor.dm" #include "code\game\turfs\simulated\floor\plating.dm" +#include "code\game\turfs\simulated\floor\transparent.dm" #include "code\game\turfs\space\space.dm" #include "code\game\turfs\space\transit.dm" #include "code\game\verbs\ooc.dm" diff --git a/sound/effects/footstep/glass1.ogg b/sound/effects/footstep/glass1.ogg new file mode 100644 index 00000000000..7afddff640a Binary files /dev/null and b/sound/effects/footstep/glass1.ogg differ diff --git a/sound/effects/footstep/glass2.ogg b/sound/effects/footstep/glass2.ogg new file mode 100644 index 00000000000..5bac4625b68 Binary files /dev/null and b/sound/effects/footstep/glass2.ogg differ diff --git a/sound/effects/footstep/glass3.ogg b/sound/effects/footstep/glass3.ogg new file mode 100644 index 00000000000..5d355e8ef17 Binary files /dev/null and b/sound/effects/footstep/glass3.ogg differ diff --git a/sound/effects/footstep/glassbarefoot1.ogg b/sound/effects/footstep/glassbarefoot1.ogg new file mode 100644 index 00000000000..7dd8d9e5371 Binary files /dev/null and b/sound/effects/footstep/glassbarefoot1.ogg differ diff --git a/sound/effects/footstep/glassbarefoot2.ogg b/sound/effects/footstep/glassbarefoot2.ogg new file mode 100644 index 00000000000..b82c3e0d9d1 Binary files /dev/null and b/sound/effects/footstep/glassbarefoot2.ogg differ diff --git a/sound/effects/footstep/glassbarefoot3.ogg b/sound/effects/footstep/glassbarefoot3.ogg new file mode 100644 index 00000000000..317bf53fcc8 Binary files /dev/null and b/sound/effects/footstep/glassbarefoot3.ogg differ