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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