From 2bc70f523c8426558de8424dbd3347e48c352d07 Mon Sep 17 00:00:00 2001 From: kyunkyunkyun <120701975+kyunkyunkyun@users.noreply.github.com> Date: Sun, 25 May 2025 21:49:37 +0500 Subject: [PATCH] Sorta revert of #29402 (#29436) * Revert "Remove useless fillers for multitile doors (#29402)" This reverts commit e351e69ad5b52485c0f365454804b7f51aea2940. * keep em * now we are safe --- code/game/machinery/doors/airlock.dm | 10 +++ code/game/machinery/doors/airlock_types.dm | 75 +++++++++++++++++++ code/game/machinery/doors/door.dm | 61 +++++++++++++-- .../objects/structures/door_assembly_types.dm | 22 +++++- 4 files changed, 160 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1808702ce1f..990b09898b8 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -175,6 +175,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) /obj/machinery/door/airlock/Destroy() SStgui.close_uis(wires) + QDEL_LIST_CONTENTS(fillers) QDEL_NULL(electronics) QDEL_NULL(wires) QDEL_NULL(note) @@ -1267,9 +1268,13 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) update_icon(AIRLOCK_OPENING, 1) sleep(1) set_opacity(0) + if(width > 1) + set_fillers_opacity(0) update_freelook_sight() sleep(4) density = FALSE + if(width > 1) + set_fillers_density(FALSE) sleep(1) layer = OPEN_DOOR_LAYER update_icon(AIRLOCK_OPEN, 1) @@ -1309,12 +1314,16 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) if(!override) sleep(1) density = TRUE + if(width > 1) + set_fillers_density(TRUE) if(!override) sleep(4) if(!safe) crush() if((visible && !glass) || polarized_on) set_opacity(1) + if(width > 1) + set_fillers_opacity(1) update_freelook_sight() sleep(1) update_icon(AIRLOCK_CLOSED, 1) @@ -1531,6 +1540,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) electronics = null ae.forceMove(loc) ae.is_installed = FALSE + QDEL_LIST_CONTENTS(fillers) qdel(src) /obj/machinery/door/airlock/proc/note_type() //Returns a string representing the type of note pinned to this airlock diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 1800a9f2c7b..bfb6d2c79f8 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -671,3 +671,78 @@ MAPPING_DIRECTIONAL_HELPERS_MULTITILE(/obj/machinery/door/airlock/multi_tile/gla /obj/machinery/door/airlock/multi_tile/glass opacity = FALSE glass = TRUE + +/obj/airlock_filler_object + name = "airlock fluff" + desc = "You shouldn't be able to see this fluff!" + icon = null + icon_state = null + density = TRUE + opacity = TRUE + anchored = TRUE + invisibility = INVISIBILITY_MAXIMUM + obj_integrity = INFINITY // our parent airlock/assembly will handle that + //atmos_canpass = CANPASS_DENSITY + /// The door/airlock this fluff panel is attached to + var/obj/machinery/door/filled_airlock + /// The assembly this fluff panel is attached to + var/obj/structure/door_assembly/filled_assembly + +/obj/airlock_filler_object/Destroy() + filled_airlock = null + filled_assembly = null + return ..() + +/obj/airlock_filler_object/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration_flat = 0, armour_penetration_percentage = 0) + if(filled_airlock) + filled_airlock.take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir) + else if(filled_assembly) + filled_assembly.take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir) + return ..() + +/obj/airlock_filler_object/ex_act(severity) + if(filled_airlock) + filled_airlock.ex_act(severity) + else if(filled_assembly) + filled_assembly.ex_act(severity) + return ..() + +/// Multi-tile airlocks pair with a filler panel, if one goes so does the other. +/obj/airlock_filler_object/proc/pair_airlock(obj/machinery/door/parent_airlock) + if(isnull(parent_airlock)) + stack_trace("Attempted to pair an airlock filler with no parent airlock specified!") + + filled_airlock = parent_airlock + RegisterSignal(filled_airlock, COMSIG_PARENT_QDELETING, PROC_REF(no_airlock)) + +/obj/airlock_filler_object/proc/pair_assembly(obj/structure/door_assembly/parent_assembly) + if(isnull(parent_assembly)) + stack_trace("Attempted to pair an airlock filler with no parent assembly specified!") + + filled_assembly = parent_assembly + RegisterSignal(filled_assembly, COMSIG_PARENT_QDELETING, PROC_REF(no_assembly)) + +/obj/airlock_filler_object/proc/no_airlock() + UnregisterSignal(filled_airlock) + qdel(src) + +/obj/airlock_filler_object/proc/no_assembly() + UnregisterSignal(filled_assembly) + qdel(src) + +/// Multi-tile airlocks (using a filler panel) have special handling for movables with PASS_FLAG_GLASS +/obj/airlock_filler_object/CanPass(atom/movable/mover, border_dir) + if(mover == filled_assembly) + return TRUE + . = ..() + if(.) + return + + if(istype(mover)) + return !opacity + +/obj/airlock_filler_object/singularity_act() + return + +/obj/airlock_filler_object/singularity_pull(S, current_size) + return diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 50b49681426..bc33e513cb5 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -37,6 +37,8 @@ var/unres_sides = 0 //Multi-tile doors var/width = 1 + /// List. Player view blocking fillers for multi-tile doors. + var/list/fillers //Whether nonstandard door sounds (cmag laughter) are off cooldown. var/sound_ready = TRUE var/sound_cooldown = 1 SECONDS @@ -54,6 +56,7 @@ /// So explosion doesn't deal extra damage for multitile airlocks COOLDOWN_DECLARE(explosion_cooldown) + /obj/machinery/door/Initialize(mapload) . = ..() set_init_door_layer() @@ -88,7 +91,7 @@ update_icon() /obj/machinery/door/ex_act() - if(width > 1) + if(width > 1 && fillers) if(!COOLDOWN_FINISHED(src, explosion_cooldown)) return COOLDOWN_START(src, explosion_cooldown, 1 SECONDS) @@ -382,12 +385,18 @@ recalculate_atmos_connectivity() do_animate("opening") set_opacity(0) + if(width > 1) + set_fillers_opacity(0) sleep(5) density = FALSE + if(width > 1) + set_fillers_density(FALSE) sleep(5) layer = initial(layer) update_icon() set_opacity(0) + if(width > 1) + set_fillers_opacity(0) operating = NONE update_freelook_sight() if(autoclose) @@ -414,10 +423,14 @@ layer = closingLayer sleep(5) density = TRUE + if(width > 1) + set_fillers_density(TRUE) sleep(5) update_icon() if(!glass || polarized_on) set_opacity(TRUE) + if(width > 1) + set_fillers_opacity(TRUE) operating = NONE recalculate_atmos_connectivity() update_freelook_sight() @@ -429,12 +442,9 @@ /obj/machinery/door/proc/get_airlock_turfs() var/list/airlock_turfs = list(get_turf(src)) - if(width > 1) - var/turf/last_turf = get_turf(src) - for(var/i in width - 1) - var/turf/next_turf = get_step(last_turf, dir) - airlock_turfs |= next_turf - last_turf = next_turf + if(width > 1 && fillers) + for(var/obj/F in fillers) + airlock_turfs |= get_turf(F) return airlock_turfs /obj/machinery/door/proc/check_for_mobs() @@ -542,11 +552,15 @@ /** * Sets the bounds of the airlock. For use with multi-tile airlocks. * If the airlock is multi-tile, it will set the bounds to be the size of the airlock. + * If the airlock doesn't already have fillers, it will create them. + * If the airlock already has fillers, it will move them to the correct location. */ /obj/machinery/door/proc/update_bounds() if(width <= 1) return + QDEL_LIST_CONTENTS(fillers) + if(dir in list(EAST, WEST)) bound_width = width * world.icon_size bound_height = world.icon_size @@ -571,6 +585,39 @@ bound_y = 0 pixel_y = 0 + LAZYINITLIST(fillers) + + var/obj/last_filler = src + for(var/i in 1 to width - 1) + var/obj/airlock_filler_object/filler + + if(length(fillers) < i) + filler = new(src) + filler.pair_airlock(src) + fillers.Add(filler) + else + filler = fillers[i] + + filler.loc = get_step(last_filler, dir) + filler.density = density + filler.set_opacity(opacity) + + last_filler = filler + +/obj/machinery/door/proc/set_fillers_density(density) + if(!length(fillers)) + return + + for(var/obj/airlock_filler_object/filler as anything in fillers) + filler.density = density + +/obj/machinery/door/proc/set_fillers_opacity(opacity) + if(!length(fillers)) + return + + for(var/obj/airlock_filler_object/filler as anything in fillers) + filler.set_opacity(opacity) + #define MAX_FOAM_LEVEL 5 // Adds foam to the airlock, which will block it from being opened /obj/machinery/door/proc/foam_up() diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index 725380f2185..a48abdf346c 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -136,10 +136,11 @@ icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi' base_name = "large airlock" overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' + var/width = 2 + var/list/fillers airlock_type = /obj/machinery/door/airlock/multi_tile glass_type = /obj/machinery/door/airlock/multi_tile/glass material_amt = 8 - var/width = 2 /obj/structure/door_assembly/multi_tile/Initialize(mapload, direction) . = ..() @@ -179,6 +180,25 @@ bound_y = 0 pixel_y = 0 + QDEL_LIST_CONTENTS(fillers) + LAZYINITLIST(fillers) + + var/obj/last_filler = src + for(var/i in 1 to width - 1) + var/obj/airlock_filler_object/filler + + if(length(fillers) < i) + filler = new(src) + filler.pair_assembly(src) + fillers += filler + else + filler = fillers[i] + + filler.loc = get_step(last_filler, dir) + filler.set_opacity(opacity) + + last_filler = filler + /obj/structure/door_assembly/door_assembly_cult name = "cult airlock assembly" icon = 'icons/obj/doors/airlocks/cult/runed/cult.dmi'