Files
Bubberstation/code/game/objects/structures/plasticflaps.dm
MrMelbert 0a3fccd8cd [MDB Ignore] Adds transparent, walkable airtight flaps to cold room doors on all maps (inc. Medbay, RND, Telecomms) (#89584)
## About The Pull Request

Adds airtight flaps to cold rooms on all maps

This includes:
- Kitchen Cold Room
- Medbay Cold Room
   - ...For maps with them. Not all of them do.
- Additionally, all maps with medbay cold rooms are now properly cold
rooms.
 - RND Server Room
 - Xenobio Kill Room
 - Telecomms

This also includes maintenance doors on all mentioned rooms, though I
don't know if they should or should not.

Also, flaps now burn if in very hot environments. 

Also, I tweaked the layer of flaps so you can click doors through them.
Open doors. Shouldn't affect the visuals.

Also, flaps now have a sound for walking through them. Not crawling
though.

## Why It's Good For The Game

The actual initial reason I did this is because IRL when you walk
through a coldroom you go through the flaps and I wanted to add that,
because it's a funny chef thing.

But they do actually serve a purpose, they block cold air from escaping.

So I figured it would be sensible to put them in places where rooms are
intentionally kept cold.

As you know, these rooms will often spill their cold air out and cause
firelocks to fall, which is just very very annoying. It doesn't really
let us play around with cold air as a gameplay mechanic because it
spreads so aggressively and causes firedoors.

So they now serve twofold:
1. Blocking cold air from causing firelock air in these certain areas
2. Chef larp

If the fact that they block air is troublesome so some maintainer(s),
I'll probably just bump it down to being cosmetic flaps. Cause that was
the original goal anyways.

(Or maybe we can come to an agreement to change the flaps to only block
a portion of air or something)

(The melting was added as a way to keep fire deadly) 

## Changelog

🆑 Melbert
add: The Kitchen Coldroom, RND Server Room, Xenobio Kill Room, and
Telecomms on all maps now come equipped with walkable, transparent
airtight plastic flaps.
add: Medbay Coldrooms are now consistently cold across all maps that has
one. They, too, now have plastic flaps.
add: Plastic flaps will now melt in hot environments / active fires.
Cargo flaps are more resilient to fire than kitchen flaps.
qol: Open doors no longer layer beneath plastic flaps, in other words
you can actually click on them to shut them.
qol: Plastic flaps may be less irritating to traverse for things which
can already pass through glass
sound: Walking out of plastic flaps now has sfx. Crawling out is still
silent.
/🆑
2025-03-12 16:46:52 -04:00

242 lines
8.1 KiB
Plaintext

/obj/structure/plasticflaps
name = "airtight plastic flaps"
desc = "Heavy duty, airtight, plastic flaps. Definitely can't get past those. No way."
gender = PLURAL
icon = 'icons/obj/structures.dmi'
icon_state = "plasticflaps"
armor_type = /datum/armor/structure_plasticflaps
density = FALSE
anchored = TRUE
can_atmos_pass = ATMOS_PASS_NO
can_astar_pass = CANASTARPASS_ALWAYS_PROC
integrity_failure = 0.75
// This layer only matters for determining when you click it vs other objects
layer = BELOW_OPEN_DOOR_LAYER
/// If TRUE, we can't pass through unless the mob is resting (or fulfills more specific requirements)
var/require_resting = TRUE
/// Layer the flaps render on
var/flaps_layer = ABOVE_MOB_LAYER
/// Alpha of the flaps
var/flaps_alpha = 255
/// Limits how much damage from environmental fire we can take per second
COOLDOWN_DECLARE(burn_damage_cd)
/datum/armor/structure_plasticflaps
melee = 100
bullet = 80
laser = 80
energy = 100
bomb = 50
fire = 50
acid = 50
/obj/structure/plasticflaps/opaque
opacity = TRUE
/obj/structure/plasticflaps/kitchen
name = "cold room plastic flaps"
desc = "Light and airtight plastic flaps made to keep the cold room cold and the warm room warm."
armor_type = /datum/armor/structure_plasticflaps/kitchen
require_resting = FALSE
flaps_alpha = 150
/datum/armor/structure_plasticflaps/kitchen
melee = 50
fire = 20
acid = 20
/obj/structure/plasticflaps/Initialize(mapload)
. = ..()
alpha = 0
gen_overlay()
air_update_turf(TRUE, TRUE)
var/static/list/loc_connections = list(
COMSIG_ATOM_EXITED = PROC_REF(play_plastic_sound),
)
AddElement(/datum/element/connect_loc, loc_connections)
var/static/list/adjacent_loc_connections = list(
COMSIG_TURF_EXPOSE = PROC_REF(check_melt),
)
AddComponent(/datum/component/connect_range, tracked = src, connections = adjacent_loc_connections, range = 1, works_in_containers = FALSE)
/obj/structure/plasticflaps/proc/play_plastic_sound(obj/source, atom/movable/exiting)
SIGNAL_HANDLER
if(isitem(exiting))
var/obj/item/item_exiter = exiting
if(item_exiter.w_class <= WEIGHT_CLASS_NORMAL)
return
if(item_exiter.item_flags & ABSTRACT)
return
if(isliving(exiting))
var/mob/living/living_exiter = exiting
if(living_exiter.mob_size <= MOB_SIZE_TINY)
return
// you're crawling under them
if(living_exiter.body_position == LYING_DOWN)
return
if(living_exiter.incorporeal_move)
return
if(HAS_TRAIT(exiting, TRAIT_MAGICALLY_PHASED))
return
if(locate(/obj/structure/plasticflaps) in exiting.loc)
return
playsound(src, 'sound/effects/plasticflaps.ogg', 50, TRUE, ignore_walls = FALSE, falloff_exponent = 8, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
/obj/structure/plasticflaps/proc/check_melt(turf/source, datum/gas_mixture/air, temperature)
SIGNAL_HANDLER
if(temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
return
if(!COOLDOWN_FINISHED(src, burn_damage_cd))
return
COOLDOWN_START(src, burn_damage_cd, 1 SECONDS)
var/percent_damage_taken = clamp(0.2 * (temperature / (FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 2.5)), 0.05, 0.25)
take_damage(max_integrity * percent_damage_taken, BURN, FIRE, sound_effect = FALSE)
/obj/structure/plasticflaps/atom_break(damage_flag)
if(damage_flag == FIRE)
visible_message(span_warning("[src] start\s to melt from the heat!"))
return ..()
/obj/structure/plasticflaps/atom_destruction(damage_flag)
if(damage_flag == FIRE)
visible_message(span_warning("[src] melt\s away into plastic goo!"))
return ..()
/obj/structure/plasticflaps/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents)
if(!same_z_layer)
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
gen_overlay()
return ..()
/obj/structure/plasticflaps/setDir(newdir)
. = ..()
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
gen_overlay()
/obj/structure/plasticflaps/proc/gen_overlay()
var/turf/our_turf = get_turf(src)
//you see mobs under it, but you hit them like they are above it
SSvis_overlays.add_vis_overlay(src, icon, icon_state,
layer = flaps_layer,
plane = MUTATE_PLANE(GAME_PLANE, our_turf),
dir = dir,
alpha = flaps_alpha,
add_appearance_flags = RESET_ALPHA,
)
/obj/structure/plasticflaps/vv_edit_var(var_name, var_val)
. = ..()
var/list/relevant_vars = list(
NAMEOF(src, flaps_layer),
NAMEOF(src, flaps_alpha),
NAMEOF(src, dir),
NAMEOF(src, icon),
NAMEOF(src, icon_state),
)
if(var_name in relevant_vars)
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
gen_overlay()
/obj/structure/plasticflaps/examine(mob/user)
. = ..()
if(anchored)
. += span_notice("[src] are <b>screwed</b> to the floor.")
else
. += span_notice("[src] are no longer <i>screwed</i> to the floor, and the flaps can be <b>cut</b> apart.")
/obj/structure/plasticflaps/screwdriver_act(mob/living/user, obj/item/W)
if(..())
return TRUE
add_fingerprint(user)
var/action = anchored ? "unscrews [src] from" : "screws [src] to"
var/uraction = anchored ? "unscrew [src] from" : "screw [src] to"
user.visible_message(span_warning("[user] [action] the floor."), span_notice("You start to [uraction] the floor..."), span_hear("You hear rustling noises."))
if(!W.use_tool(src, user, 100, volume=100, extra_checks = CALLBACK(src, PROC_REF(check_anchored_state), anchored)))
return TRUE
set_anchored(!anchored)
update_atmos_behaviour()
air_update_turf(TRUE)
to_chat(user, span_notice("You [uraction] the floor."))
return TRUE
///Update the flaps behaviour to gases, if not anchored will let air pass through
/obj/structure/plasticflaps/proc/update_atmos_behaviour()
can_atmos_pass = anchored ? ATMOS_PASS_NO : ATMOS_PASS_YES
/obj/structure/plasticflaps/wirecutter_act(mob/living/user, obj/item/W)
. = ..()
if(!anchored)
user.visible_message(span_warning("[user] cuts apart [src]."), span_notice("You start to cut apart [src]."), span_hear("You hear cutting."))
if(W.use_tool(src, user, 50, volume=100))
if(anchored)
return TRUE
to_chat(user, span_notice("You cut apart [src]."))
var/obj/item/stack/sheet/plastic/five/P = new(loc)
if (!QDELETED(P))
P.add_fingerprint(user)
qdel(src)
return TRUE
/obj/structure/plasticflaps/proc/check_anchored_state(check_anchored)
if(anchored != check_anchored)
return FALSE
return TRUE
/obj/structure/plasticflaps/CanAStarPass(to_dir, datum/can_pass_info/pass_info)
if(!require_resting)
return TRUE
if(pass_info.is_living)
if(pass_info.is_bot)
return TRUE
if(pass_info.can_ventcrawl && pass_info.mob_size != MOB_SIZE_TINY)
return FALSE
if(pass_info.pass_flags & PASSFLAPS)
return TRUE
if(pass_info.pulling_info)
return CanAStarPass(to_dir, pass_info.pulling_info)
return TRUE //diseases, stings, etc can pass
/obj/structure/plasticflaps/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
if(mover.pass_flags & PASSFLAPS) //For anything specifically engineered to cross plastic flaps.
return TRUE
if((mover.pass_flags & PASSGLASS) && prob(60))
return TRUE
if(!require_resting)
return TRUE
if(istype(mover, /obj/structure/bed))
var/obj/structure/bed/bed_mover = mover
if(bed_mover.density || bed_mover.has_buckled_mobs())//if it's a bed/chair and is dense or someone is buckled, it will not pass
return FALSE
else if(istype(mover, /obj/structure/closet/cardboard))
var/obj/structure/closet/cardboard/cardboard_mover = mover
if(cardboard_mover.move_delay)
return FALSE
else if(ismecha(mover))
return FALSE
else if(isliving(mover)) // You Shall Not Pass!
var/mob/living/living_mover = mover
if(istype(living_mover.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass.
return TRUE
if(living_mover.body_position == STANDING_UP && living_mover.mob_size != MOB_SIZE_TINY && !(HAS_TRAIT(living_mover, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(living_mover, TRAIT_VENTCRAWLER_NUDE)))
return FALSE //If you're not laying down, or a small creature, or a ventcrawler, then no pass.
return .
/obj/structure/plasticflaps/atom_deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/plastic/five(loc)
/obj/structure/plasticflaps/Destroy()
var/atom/oldloc = loc
. = ..()
if (oldloc)
oldloc.air_update_turf(TRUE, FALSE)