From 11d46098cb6711c529d653fdbb70400d46e5907e Mon Sep 17 00:00:00 2001
From: S34NW <12197162+S34NW@users.noreply.github.com>
Date: Wed, 21 Apr 2021 22:29:34 +0100
Subject: [PATCH] i can see clearly now the plating's gone
---
code/__DEFINES/layers.dm | 2 +
code/game/machinery/Beacon.dm | 3 +-
code/game/machinery/hologram.dm | 2 +-
code/game/machinery/magnet.dm | 3 +-
code/game/machinery/navbeacon.dm | 3 +-
code/game/objects/structures/safe.dm | 3 +-
code/game/turfs/simulated/floor.dm | 2 +
code/game/turfs/simulated/floor/plating.dm | 36 ++++++++++++++
.../game/turfs/simulated/floor/transparent.dm | 44 ++++++++++++++++++
.../atmospherics/machinery/atmospherics.dm | 3 ++
.../atmospherics/machinery/pipes/cap.dm | 3 +-
.../atmospherics/machinery/pipes/manifold.dm | 2 +
.../machinery/pipes/manifold4w.dm | 3 +-
.../machinery/pipes/simple/pipe_simple.dm | 3 +-
code/modules/power/cable.dm | 11 ++++-
code/modules/power/terminal.dm | 2 +
code/modules/recycling/disposal.dm | 13 +++++-
icons/turf/floors/glass.dmi | Bin 0 -> 3595 bytes
icons/turf/floors/reinf_glass.dmi | Bin 0 -> 9255 bytes
paradise.dme | 1 +
20 files changed, 128 insertions(+), 11 deletions(-)
create mode 100644 code/game/turfs/simulated/floor/transparent.dm
create mode 100644 icons/turf/floors/glass.dmi
create mode 100644 icons/turf/floors/reinf_glass.dmi
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index 9286ea2726d..8ac366023e8 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..83ff9fcf168 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -26,7 +26,8 @@
Beacon.syndicate = syndicate
Beacon.area_bypass = area_bypass
Beacon.cc_beacon = cc_beacon
- hide(T.intact)
+ if(!istype(T, /turf/simulated/floor/transparent))
+ 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..a9eb8b4de3c 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -32,7 +32,8 @@
/obj/machinery/magnetic_module/New()
..()
var/turf/T = loc
- hide(T.intact)
+ if(!istype(T, /turf/simulated/floor/transparent))
+ 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..ef3d6928aa1 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -26,7 +26,8 @@
set_codes()
var/turf/T = loc
- hide(T.intact)
+ if(!istype(T, /turf/simulated/floor/transparent))
+ 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/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index 5bfe4e8a880..252da89083a 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(!istype(T, /turf/simulated/floor/transparent))
+ 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 3ba2e638099..f2eaec50d35 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -30,6 +30,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
var/footstep = FOOTSTEP_FLOOR
var/barefootstep = FOOTSTEP_HARD_BAREFOOT
@@ -130,6 +131,7 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama
if(keep_icon)
W.icon_regular_floor = old_icon
W.icon_plating = old_plating
+ if(W.keep_dir)
W.dir = old_dir
W.update_icon()
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 94d95c2af86..27f860e53ad 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -70,6 +70,42 @@
to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.")
return TRUE
+ else if(istype(C, /obj/item/stack/sheet/glass))
+ if(broken || burnt)
+ to_chat(user, "Repair the plating first!")
+ return TRUE
+ var/obj/item/stack/sheet/glass/R = C
+ if(R.get_amount() < 2)
+ to_chat(user, "You need two glass to make a glass floor!")
+ return TRUE
+ else
+ to_chat(user, "You begin swapping the plating for glass...")
+ if(do_after(user, 30 * C.toolspeed, target = src))
+ if(R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/transparent/glass))
+ ChangeTurf(/turf/simulated/floor/transparent/glass)
+ playsound(src, C.usesound, 80, 1)
+ R.use(2)
+ to_chat(user, "You swap the plating for glass.")
+ return TRUE
+
+ else if(istype(C, /obj/item/stack/sheet/rglass))
+ if(broken || burnt)
+ to_chat(user, "Repair the plating first!")
+ return TRUE
+ var/obj/item/stack/sheet/rglass/R = C
+ if(R.get_amount() < 2)
+ to_chat(user, "You need two reinforced glass to make a reinforced glass floor!")
+ return TRUE
+ else
+ to_chat(user, "You begin swapping the plating for reinforced glass...")
+ if(do_after(user, 30 * C.toolspeed, target = src))
+ if(R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/transparent/glass/reinforced))
+ ChangeTurf(/turf/simulated/floor/transparent/glass/reinforced)
+ playsound(src, C.usesound, 80, 1)
+ R.use(2)
+ to_chat(user, "You swap the plating for reinforced glass.")
+ 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..8e9b6d10e43
--- /dev/null
+++ b/code/game/turfs/simulated/floor/transparent.dm
@@ -0,0 +1,44 @@
+/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
+ broken_states = list("damaged1", "damaged2", "damaged3")
+ smooth = SMOOTH_MORE
+ canSmoothWith = list(/turf/simulated/floor/transparent)
+ footstep = FOOTSTEP_PLATING
+ light_power = 0.75
+ light_range = 2
+ layer = TRANSPARENT_TURF_LAYER
+ keep_dir = FALSE
+ intact = FALSE
+
+/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 = 2
+ icon_state = "" //Prevents default icon appearing behind the glass
+
+/turf/simulated/floor/transparent/attackby(obj/item/C as obj, mob/user as mob, params)
+ if(!C || !user)
+ return
+ if(istype(C, /obj/item/crowbar))
+ to_chat(user, "You begin removing the glass...")
+ playsound(src, C.usesound, 80, 1)
+ if(do_after(user, 30 * C.toolspeed, target = src))
+ if(!istype(src, /turf/simulated/floor/transparent))
+ return
+ if(istype(src, /turf/simulated/floor/transparent/glass/reinforced))
+ new /obj/item/stack/sheet/rglass(src, 2)
+ else
+ new /obj/item/stack/sheet/glass(src, 2)
+ ChangeTurf(/turf/simulated/floor/plating)
+
+
+/turf/simulated/floor/transparent/glass/reinforced
+ name = "reinforced glass floor"
+ desc = "Do jump on it, it can take it. Promise..."
+ icon = 'icons/turf/floors/reinf_glass.dmi'
diff --git a/code/modules/atmospherics/machinery/atmospherics.dm b/code/modules/atmospherics/machinery/atmospherics.dm
index 8a77e3908f1..8e965c88685 100644
--- a/code/modules/atmospherics/machinery/atmospherics.dm
+++ b/code/modules/atmospherics/machinery/atmospherics.dm
@@ -165,6 +165,9 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/attackby(obj/item/W, mob/user)
if(can_unwrench && istype(W, /obj/item/wrench))
var/turf/T = get_turf(src)
+ if(istype(T, /turf/simulated/floor/transparent))
+ to_chat(user, "You must remove the glass first.")
+ return
if(level == 1 && isturf(T) && T.intact)
to_chat(user, "You must remove the plating first.")
return 1
diff --git a/code/modules/atmospherics/machinery/pipes/cap.dm b/code/modules/atmospherics/machinery/pipes/cap.dm
index 516660e72ba..bf3b7f43d2e 100644
--- a/code/modules/atmospherics/machinery/pipes/cap.dm
+++ b/code/modules/atmospherics/machinery/pipes/cap.dm
@@ -76,7 +76,8 @@
break
var/turf/T = get_turf(src) // hide if turf is not intact
- if(!istype(T)) return
+ if(!istype(T) || istype(T, /turf/simulated/floor/transparent))
+ 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 ab7196e0864..b28f18f92ba 100644
--- a/code/modules/atmospherics/machinery/pipes/manifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/manifold.dm
@@ -55,6 +55,8 @@
node3 = target
break
var/turf/T = src.loc // hide if turf is not intact
+ if(istype(T, /turf/simulated/floor/transparent))
+ 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 0ac16c2c69d..75f2db8aabf 100644
--- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm
+++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm
@@ -162,7 +162,8 @@
break
var/turf/T = src.loc // hide if turf is not intact
- hide(T.intact)
+ if(!istype(T, /turf/simulated/floor/transparent))
+ hide(T.intact)
update_icon()
/obj/machinery/atmospherics/pipe/manifold4w/visible
diff --git a/code/modules/atmospherics/machinery/pipes/simple/pipe_simple.dm b/code/modules/atmospherics/machinery/pipes/simple/pipe_simple.dm
index 92c421fbff9..a4ecfc583d9 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(!istype(T, /turf/simulated/floor/transparent))
+ 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 3c8db1f50df..b48c03376cf 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(istype(T, /turf/simulated/floor/transparent))
+ 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,6 +165,9 @@ 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(istype(T, /turf/simulated/floor/transparent))
+ to_chat(user, "You must remove the glass first.")
+ return
if(T.intact)
return
@@ -204,6 +210,9 @@ 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(istype(T, /turf/simulated/floor/transparent))
+ to_chat(user, "You must remove the glass first.")
+ return
if(T.intact)
return
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm
index 584079b3c45..b2284eba265 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(istype(T, /turf/simulated/floor/transparent))
+ return
if(level == 1)
hide(T.intact)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index adb27fccc82..f259ee40ac1 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(istype(T, /turf/simulated/floor/transparent))
+ 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 || istype(T, /turf/simulated/floor/transparent))
+ to_chat(user, "You must remove the plating first.")
+ 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(istype(T, /turf/simulated/floor/transparent))
+ to_chat(user, "You must remove the glass first.")
+ return
WELDER_ATTEMPT_SLICING_MESSAGE
if(!I.use_tool(src, user, 30, volume = I.tool_volume))
return
diff --git a/icons/turf/floors/glass.dmi b/icons/turf/floors/glass.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..2f25a8ec7eb3ce224c73dfb2559febdc1cd7dc22
GIT binary patch
literal 3595
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
RVF}=$=REJZKf6nI{S&|1Sup?r
literal 0
HcmV?d00001
diff --git a/icons/turf/floors/reinf_glass.dmi b/icons/turf/floors/reinf_glass.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..f206b4f3dfccb094d87f0c7c1f3d177e8461a49a
GIT binary patch
literal 9255
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