diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm
index 5b51661c0e1..fcc49f6c7e0 100644
--- a/_maps/map_files/debug/multiz.dmm
+++ b/_maps/map_files/debug/multiz.dmm
@@ -103,7 +103,7 @@
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"au" = (
-/turf/open/openspace,
+/turf/open/transparent/openspace,
/area/space)
"av" = (
/obj/structure/stairs/north,
@@ -1023,7 +1023,7 @@
},
/area/hallway/secondary/service)
"eC" = (
-/turf/open/openspace,
+/turf/open/transparent/openspace,
/area/maintenance/department/bridge)
"eD" = (
/obj/effect/turf_decal/stripes/asteroid/line{
@@ -1187,7 +1187,7 @@
/turf/open/floor/plating,
/area/construction)
"iu" = (
-/turf/open/openspace,
+/turf/open/transparent/openspace,
/area/hallway/secondary/service)
"iH" = (
/obj/effect/turf_decal/stripes/white/line,
@@ -1263,7 +1263,7 @@
},
/area/hallway/secondary/service)
"nx" = (
-/turf/open/openspace,
+/turf/open/transparent/openspace,
/area/space/nearstation)
"nz" = (
/obj/machinery/light{
@@ -1307,7 +1307,7 @@
/turf/open/floor/plating,
/area/maintenance/department/bridge)
"qo" = (
-/turf/open/openspace,
+/turf/open/transparent/openspace,
/area/engine/storage)
"qx" = (
/obj/structure/railing/corner{
@@ -1330,7 +1330,7 @@
/obj/machinery/light{
dir = 8
},
-/turf/open/openspace,
+/turf/open/transparent/openspace,
/area/engine/storage)
"rN" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -1498,7 +1498,7 @@
/area/construction)
"Bk" = (
/obj/structure/grille,
-/turf/open/openspace,
+/turf/open/transparent/openspace,
/area/space/nearstation)
"Bm" = (
/obj/machinery/light{
@@ -1687,7 +1687,7 @@
"Ob" = (
/obj/structure/lattice,
/obj/structure/grille,
-/turf/open/openspace,
+/turf/open/transparent/openspace,
/area/space/nearstation)
"Og" = (
/obj/machinery/airalarm/directional/north,
diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json
index e8a474161e7..a1c35541087 100644
--- a/_maps/multiz_debug.json
+++ b/_maps/multiz_debug.json
@@ -2,5 +2,5 @@
"map_name": "MultiZ Debug",
"map_path": "map_files/debug",
"map_file": "multiz.dmm",
- "traits": [{"Up" : 1, "Linkage" : "Cross"}, {"Up" : 1, "Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}, {"Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}]
+ "traits": [{"Up" : 1, "Linkage" : "Cross"}, {"Up" : 1, "Down" : -1, "Baseturf" : "/turf/open/transparent/openspace", "Linkage" : "Cross"}, {"Down" : -1, "Baseturf" : "/turf/open/transparent/openspace", "Linkage" : "Cross"}]
}
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 4f22467d07f..54cef8a2582 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
/turf/open/chasm,
/turf/open/lava,
/turf/open/water,
- /turf/open/openspace
+ /turf/open/transparent/openspace
)))
#define isgroundlessturf(A) (is_type_in_typecache(A, GLOB.turfs_without_ground))
@@ -41,7 +41,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isplatingturf(A) (istype(A, /turf/open/floor/plating))
-#define isopenspace(A) (istype(A, /turf/open/openspace))
+#define istransparentturf(A) (istype(A, /turf/open/transparent))
//Mobs
#define isliving(A) (istype(A, /mob/living))
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 99a742fde4a..df1931cc805 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1318,7 +1318,7 @@
if(isspaceturf(T)) // Turf never has gravity
return FALSE
- if(istype(T, /turf/open/openspace)) //openspace in a space area doesn't get gravity
+ if(istype(T, /turf/open/transparent/openspace)) //openspace in a space area doesn't get gravity
if(istype(get_area(T), /area/space))
return FALSE
diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm
index f3bd1a18303..fb3bf90ac75 100644
--- a/code/game/objects/structures/stairs.dm
+++ b/code/game/objects/structures/stairs.dm
@@ -3,7 +3,7 @@
#define STAIR_TERMINATOR_YES 2
// dir determines the direction of travel to go upwards
-// stairs require /turf/open/openspace as the tile above them to work, unless your stairs have 'force_open_above' set to TRUE
+// stairs require /turf/open/transparent/openspace as the tile above them to work, unless your stairs have 'force_open_above' set to TRUE
// multiple stair objects can be chained together; the Z level transition will happen on the final stair object in the chain
/obj/structure/stairs
@@ -12,7 +12,7 @@
icon_state = "stairs"
anchored = TRUE
- var/force_open_above = FALSE // replaces the turf above this stair obj with /turf/open/openspace
+ var/force_open_above = FALSE // replaces the turf above this stair obj with /turf/open/transparent/openspace
var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC
var/turf/listeningTo
@@ -107,20 +107,20 @@
/obj/structure/stairs/proc/build_signal_listener()
if(listeningTo)
UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW)
- var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP)
+ var/turf/open/transparent/openspace/T = get_step_multiz(get_turf(src), UP)
RegisterSignal(T, COMSIG_TURF_MULTIZ_NEW, .proc/on_multiz_new)
listeningTo = T
/obj/structure/stairs/proc/force_open_above()
- var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP)
+ var/turf/open/transparent/openspace/T = get_step_multiz(get_turf(src), UP)
if(T && !istype(T))
- T.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR)
+ T.ChangeTurf(/turf/open/transparent/openspace, flags = CHANGETURF_INHERIT_AIR)
/obj/structure/stairs/proc/on_multiz_new(turf/source, dir)
if(dir == UP)
- var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP)
+ var/turf/open/transparent/openspace/T = get_step_multiz(get_turf(src), UP)
if(T && !istype(T))
- T.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR)
+ T.ChangeTurf(/turf/open/transparent/openspace, flags = CHANGETURF_INHERIT_AIR)
/obj/structure/stairs/intercept_zImpact(atom/movable/AM, levels = 1)
. = ..()
diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm
index 6d2a5c37211..12fbc97785a 100644
--- a/code/game/turfs/open/openspace.dm
+++ b/code/game/turfs/open/openspace.dm
@@ -11,77 +11,47 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
layer = SPLASHSCREEN_LAYER
-/turf/open/openspace
+/turf/open/transparent/openspace
name = "open space"
desc = "Watch your step!"
icon_state = "transparent"
- baseturfs = /turf/open/openspace
+ baseturfs = /turf/open/transparent/openspace
CanAtmosPassVertical = ATMOS_PASS_YES
//mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/can_cover_up = TRUE
var/can_build_on = TRUE
- intact = 0
-/turf/open/openspace/airless
+/turf/open/transparent/openspace/airless
initial_gas_mix = AIRLESS_ATMOS
-/turf/open/openspace/debug/update_multiz()
+/turf/open/transparent/openspace/debug/update_multiz()
..()
return TRUE
-/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
+///No bottom level for openspace.
+/turf/open/transparent/openspace/show_bottom_level()
+ return FALSE
+
+/turf/open/transparent/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
. = ..()
- plane = OPENSPACE_PLANE
- layer = OPENSPACE_LAYER
vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it.
- return INITIALIZE_HINT_LATELOAD
-
-/turf/open/openspace/LateInitialize()
- update_multiz(TRUE, TRUE)
-
-/turf/open/openspace/Destroy()
- vis_contents.len = 0
- return ..()
-
-/turf/open/openspace/can_have_cabling()
+/turf/open/transparent/openspace/can_have_cabling()
if(locate(/obj/structure/lattice/catwalk, src))
return TRUE
return FALSE
-/turf/open/openspace/update_multiz(prune_on_fail = FALSE, init = FALSE)
- . = ..()
- var/turf/T = below()
- if(!T)
- vis_contents.len = 0
- if(prune_on_fail)
- ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
- return FALSE
- if(init)
- vis_contents += T
+/turf/open/transparent/openspace/zAirIn()
return TRUE
-/turf/open/openspace/multiz_turf_del(turf/T, dir)
- if(dir != DOWN)
- return
- update_multiz()
-
-/turf/open/openspace/multiz_turf_new(turf/T, dir)
- if(dir != DOWN)
- return
- update_multiz()
-
-/turf/open/openspace/zAirIn()
+/turf/open/transparent/openspace/zAirOut()
return TRUE
-/turf/open/openspace/zAirOut()
+/turf/open/transparent/openspace/zPassIn(atom/movable/A, direction, turf/source)
return TRUE
-/turf/open/openspace/zPassIn(atom/movable/A, direction, turf/source)
- return TRUE
-
-/turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination)
+/turf/open/transparent/openspace/zPassOut(atom/movable/A, direction, turf/destination)
if(A.anchored)
return FALSE
for(var/obj/O in contents)
@@ -89,13 +59,13 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
return FALSE
return TRUE
-/turf/open/openspace/proc/CanCoverUp()
+/turf/open/transparent/openspace/proc/CanCoverUp()
return can_cover_up
-/turf/open/openspace/proc/CanBuildHere()
+/turf/open/transparent/openspace/proc/CanBuildHere()
return can_build_on
-/turf/open/openspace/attackby(obj/item/C, mob/user, params)
+/turf/open/transparent/openspace/attackby(obj/item/C, mob/user, params)
..()
if(!CanBuildHere())
return
@@ -137,7 +107,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
else
to_chat(user, "The plating is going to need some support! Place metal rods first.")
-/turf/open/openspace/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
+/turf/open/transparent/openspace/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
if(!CanBuildHere())
return FALSE
@@ -150,7 +120,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3)
return FALSE
-/turf/open/openspace/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
+/turf/open/transparent/openspace/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
switch(passed_mode)
if(RCD_FLOORWALL)
to_chat(user, "You build a floor.")
diff --git a/code/game/turfs/open/transparent.dm b/code/game/turfs/open/transparent.dm
new file mode 100644
index 00000000000..334b42e9354
--- /dev/null
+++ b/code/game/turfs/open/transparent.dm
@@ -0,0 +1,73 @@
+/turf/open/transparent
+ baseturfs = /turf/open/transparent/openspace
+ intact = FALSE //this means wires go on top
+
+/turf/open/transparent/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
+ . = ..()
+ plane = OPENSPACE_PLANE
+ layer = OPENSPACE_LAYER
+
+ return INITIALIZE_HINT_LATELOAD
+
+/turf/open/transparent/LateInitialize()
+ update_multiz(TRUE, TRUE)
+
+/turf/open/transparent/Destroy()
+ vis_contents.len = 0
+ return ..()
+
+/turf/open/transparent/update_multiz(prune_on_fail = FALSE, init = FALSE)
+ . = ..()
+ var/turf/T = below()
+ if(!T)
+ vis_contents.len = 0
+ if(!show_bottom_level() && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to plating as a fallback
+ ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
+ return FALSE
+ if(init)
+ vis_contents += T
+ return TRUE
+
+/turf/open/transparent/multiz_turf_del(turf/T, dir)
+ if(dir != DOWN)
+ return
+ update_multiz()
+
+/turf/open/transparent/multiz_turf_new(turf/T, dir)
+ if(dir != DOWN)
+ return
+ update_multiz()
+
+///Called when there is no real turf below this turf
+/turf/open/transparent/proc/show_bottom_level()
+ var/turf/path = SSmapping.level_trait(z, ZTRAIT_BASETURF) || /turf/open/space
+ if(!ispath(path))
+ path = text2path(path)
+ if(!ispath(path))
+ warning("Z-level [z] has invalid baseturf '[SSmapping.level_trait(z, ZTRAIT_BASETURF)]'")
+ path = /turf/open/space
+ var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER, plane = PLANE_SPACE)
+ underlays += underlay_appearance
+ return TRUE
+
+
+/turf/open/transparent/glass
+ name = "Glass floor"
+ desc = "Dont jump on it, or do, I'm not your mom."
+ icon = 'icons/turf/floors/glass.dmi'
+ icon_state = "floor_glass"
+ smooth = SMOOTH_MORE
+ canSmoothWith = list(/turf/open/transparent/glass, /turf/open/transparent/glass/reinforced)
+ footstep = FOOTSTEP_PLATING
+ barefootstep = FOOTSTEP_HARD_BAREFOOT
+ clawfootstep = FOOTSTEP_HARD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
+
+/turf/open/transparent/glass/Initialize()
+ icon_state = "" //Prevent the normal icon from appearing behind the smooth overlays
+ return ..()
+
+/turf/open/transparent/glass/reinforced
+ name = "Reinforced glass floor"
+ desc = "Do jump on it, it can take it."
+ icon = 'icons/turf/floors/reinf_glass.dmi'
diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm
index fecc17c711a..9a12d14ff2a 100644
--- a/code/modules/awaymissions/away_props.dm
+++ b/code/modules/awaymissions/away_props.dm
@@ -76,7 +76,7 @@
toggle()
/obj/structure/pitgrate/proc/update_openspace()
- var/turf/open/openspace/T = get_turf(src)
+ var/turf/open/transparent/openspace/T = get_turf(src)
if(!istype(T))
return
//Simple way to keep plane conflicts away, could probably be upgraded to something less nuclear with 513
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 7df2061208e..28ff220fb27 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1517,7 +1517,7 @@
if(!ceiling) //We are at the highest z-level.
to_chat(src, "You can't see through the ceiling above you.")
return
- else if(!isopenspace(ceiling)) //There is no openspace turf above us.
+ else if(!istransparentturf(ceiling)) //There is no turf we can look through above us
to_chat(src, "You can't see through the floor above you.")
return
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index be8005cfc6a..22cefcd56f3 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -182,7 +182,7 @@
var/clone_area = SSmapping.RequestBlockReservation(size_x * 2 + 1, size_y * 2 + 1)
for(var/turf/placeholder in block(locate(target_turf.x - size_x, target_turf.y - size_y, target_turf.z), locate(target_turf.x + size_x, target_turf.y + size_y, target_turf.z)))
var/turf/T = placeholder
- while(istype(T, /turf/open/openspace)) //Multi-z photography
+ while(istype(T, /turf/open/transparent/openspace)) //Multi-z photography
T = SSmapping.get_turf_below(T)
if(!T)
break
diff --git a/icons/turf/floors/glass.dmi b/icons/turf/floors/glass.dmi
new file mode 100644
index 00000000000..adf6f57aaa3
Binary files /dev/null and b/icons/turf/floors/glass.dmi differ
diff --git a/icons/turf/floors/reinf_glass.dmi b/icons/turf/floors/reinf_glass.dmi
new file mode 100644
index 00000000000..dda99cd07f8
Binary files /dev/null and b/icons/turf/floors/reinf_glass.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index c558060582e..64fedf0ba99 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1248,6 +1248,7 @@
#include "code\game\turfs\open\lava.dm"
#include "code\game\turfs\open\openspace.dm"
#include "code\game\turfs\open\river.dm"
+#include "code\game\turfs\open\transparent.dm"
#include "code\game\turfs\open\water.dm"
#include "code\game\turfs\open\floor\fancy_floor.dm"
#include "code\game\turfs\open\floor\hull.dm"