mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-25 14:08:31 +01:00
Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29
# Conflicts: # _maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm # _maps/RandomRuins/SpaceRuins/garbagetruck2.dmm # _maps/map_files/CatwalkStation/CatwalkStation_2023.dmm # _maps/map_files/tramstation/tramstation.dmm # code/_onclick/hud/new_player.dm # code/datums/components/squashable.dm # code/datums/diseases/advance/symptoms/heal.dm # code/datums/diseases/chronic_illness.dm # code/datums/status_effects/buffs.dm # code/datums/status_effects/debuffs/drunk.dm # code/datums/status_effects/debuffs/stamcrit.dm # code/game/machinery/computer/crew.dm # code/game/objects/items/devices/scanners/health_analyzer.dm # code/game/objects/items/wall_mounted.dm # code/game/turfs/closed/indestructible.dm # code/modules/admin/view_variables/filterrific.dm # code/modules/antagonists/heretic/influences.dm # code/modules/cargo/orderconsole.dm # code/modules/client/preferences.dm # code/modules/events/space_vines/vine_mutations.dm # code/modules/mob/dead/new_player/new_player.dm # code/modules/mob/living/carbon/human/death.dm # code/modules/mob/living/carbon/human/species_types/jellypeople.dm # code/modules/mob/living/damage_procs.dm # code/modules/mob/living/living.dm # code/modules/mob_spawn/ghost_roles/mining_roles.dm # code/modules/mob_spawn/mob_spawn.dm # code/modules/projectiles/ammunition/energy/laser.dm # code/modules/projectiles/guns/ballistic/launchers.dm # code/modules/projectiles/guns/energy/laser.dm # code/modules/reagents/chemistry/machinery/chem_dispenser.dm # code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm # code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm # code/modules/reagents/chemistry/reagents/medicine_reagents.dm # code/modules/surgery/healing.dm # code/modules/unit_tests/designs.dm # icons/mob/inhands/items_lefthand.dmi # icons/mob/inhands/items_righthand.dmi # tgui/packages/tgui/interfaces/ChemDispenser.tsx
This commit is contained in:
@@ -11,10 +11,13 @@
|
||||
* assembly code at the bottom of this file
|
||||
*/
|
||||
/datum/component/trapdoor
|
||||
can_transfer = TRUE
|
||||
///assembly tied to this trapdoor
|
||||
var/obj/item/assembly/trapdoor/assembly
|
||||
///path of the turf this should change into when the assembly is pulsed. needed for openspace trapdoors knowing what to turn back into
|
||||
var/trapdoor_turf_path
|
||||
///stack of baseturfs on top of the openspace under this trapdoor
|
||||
var/list/trapdoor_baseturfs = list()
|
||||
/// is this trapdoor "conspicuous" (ie. it gets examine text and overlay added)
|
||||
var/conspicuous
|
||||
/// overlay that makes trapdoors more obvious
|
||||
@@ -32,8 +35,10 @@
|
||||
var/autoclose = TRUE
|
||||
/// Delay before trapdoor shuts close
|
||||
var/autoclose_delay = 5 SECONDS
|
||||
/// Is this trapdoor on a shuttle
|
||||
var/on_shuttle = FALSE
|
||||
|
||||
/datum/component/trapdoor/Initialize(starts_open, trapdoor_turf_path, assembly, conspicuous = TRUE, list/carried_decals = null, autoclose = TRUE)
|
||||
/datum/component/trapdoor/Initialize(starts_open, trapdoor_turf_path, trapdoor_baseturfs, assembly, conspicuous = TRUE, list/carried_decals = null, autoclose = TRUE)
|
||||
if(!isopenturf(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
@@ -46,29 +51,57 @@
|
||||
if(!trapdoor_overlay)
|
||||
trapdoor_overlay = mutable_appearance('icons/turf/overlays.dmi', "border_black", ABOVE_NORMAL_TURF_LAYER)
|
||||
|
||||
var/turf/parent_turf = parent
|
||||
if(SSshuttle.get_containing_shuttle(parent_turf))
|
||||
on_shuttle = TRUE
|
||||
|
||||
if(IS_OPEN(parent))
|
||||
openspace_trapdoor_setup(trapdoor_turf_path, assembly)
|
||||
openspace_trapdoor_setup(trapdoor_turf_path, trapdoor_baseturfs)
|
||||
if(autoclose)
|
||||
addtimer(CALLBACK(src, PROC_REF(try_closing)), autoclose_delay)
|
||||
else
|
||||
tile_trapdoor_setup(trapdoor_turf_path, assembly)
|
||||
tile_trapdoor_setup()
|
||||
|
||||
if(starts_open)
|
||||
try_opening()
|
||||
|
||||
/datum/component/trapdoor/PostTransfer(datum/new_parent)
|
||||
if(!isopenturf(new_parent))
|
||||
if(isatom(new_parent))
|
||||
var/atom/new_parent_atom = new_parent
|
||||
new_parent_atom.visible_message(span_warning("The trapdoor mechanism under [new_parent_atom] is broken!"))
|
||||
return COMPONENT_NOTRANSFER
|
||||
if(SSshuttle.get_containing_shuttle(new_parent))
|
||||
on_shuttle = TRUE
|
||||
else
|
||||
on_shuttle = FALSE
|
||||
|
||||
/datum/component/trapdoor/proc/is_under_shuttle()
|
||||
var/turf/parent_turf = parent
|
||||
var/shuttle_skipover_depth = parent_turf.depth_to_find_baseturf(/turf/baseturf_skipover/shuttle)
|
||||
return shuttle_skipover_depth && parent_turf.depth_to_find_baseturf(/turf/baseturf_skipover/trapdoor) > shuttle_skipover_depth
|
||||
|
||||
///initializing as an opened trapdoor, we need to trust that we were given the data by a closed trapdoor
|
||||
/datum/component/trapdoor/proc/openspace_trapdoor_setup(trapdoor_turf_path)
|
||||
/datum/component/trapdoor/proc/openspace_trapdoor_setup(trapdoor_turf_path, trapdoor_baseturfs)
|
||||
src.trapdoor_turf_path = trapdoor_turf_path
|
||||
src.trapdoor_baseturfs = trapdoor_baseturfs
|
||||
|
||||
///initializing as a closed trapdoor, we need to take data from the tile we're on to give it to the open state to store
|
||||
/datum/component/trapdoor/proc/tile_trapdoor_setup(trapdoor_turf_path)
|
||||
/datum/component/trapdoor/proc/tile_trapdoor_setup()
|
||||
src.trapdoor_turf_path = parent.type
|
||||
insert_trapdoor_skipover()
|
||||
if(stored_decals.len)
|
||||
reapply_all_decals()
|
||||
if(conspicuous)
|
||||
var/turf/parent_turf = parent
|
||||
parent_turf.add_overlay(trapdoor_overlay)
|
||||
|
||||
/datum/component/trapdoor/proc/insert_trapdoor_skipover()
|
||||
var/turf/parent_turf = parent
|
||||
if(parent_turf.depth_to_find_baseturf(/turf/baseturf_skipover/trapdoor))
|
||||
return
|
||||
parent_turf.insert_baseturf((parent_turf.level_to_find_baseturf(/turf/baseturf_skipover/shuttle) || 1) + 1, /turf/baseturf_skipover/trapdoor)
|
||||
|
||||
/datum/component/trapdoor/RegisterWithParent()
|
||||
. = ..()
|
||||
RegisterSignal(parent, COMSIG_TURF_CHANGE, PROC_REF(turf_changed_pre))
|
||||
@@ -84,6 +117,8 @@
|
||||
// SKYRAT EDIT END
|
||||
RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(try_unlink))
|
||||
RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(try_link))
|
||||
RegisterSignal(parent, COMSIG_SHUTTLE_TURF_SHOULD_MOVE_SPECIAL, PROC_REF(should_move_special))
|
||||
RegisterSignal(parent, COMSIG_SHUTTLE_TURF_ON_MOVE_SPECIAL, PROC_REF(on_move_special))
|
||||
|
||||
/datum/component/trapdoor/UnregisterFromParent()
|
||||
. = ..()
|
||||
@@ -94,9 +129,13 @@
|
||||
UnregisterSignal(parent, COMSIG_ATOM_EXAMINE)
|
||||
UnregisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL))
|
||||
UnregisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION)
|
||||
UnregisterSignal(parent, COMSIG_SHUTTLE_TURF_SHOULD_MOVE_SPECIAL)
|
||||
UnregisterSignal(parent, COMSIG_SHUTTLE_TURF_ON_MOVE_SPECIAL)
|
||||
|
||||
/datum/component/trapdoor/proc/try_unlink(turf/source, mob/user, obj/item/tool)
|
||||
SIGNAL_HANDLER
|
||||
if(is_under_shuttle())
|
||||
return
|
||||
if(!assembly)
|
||||
return
|
||||
if(IS_OPEN(parent))
|
||||
@@ -108,6 +147,8 @@
|
||||
|
||||
/datum/component/trapdoor/proc/try_link(turf/source, mob/user, obj/item/tool)
|
||||
SIGNAL_HANDLER
|
||||
if(is_under_shuttle())
|
||||
return
|
||||
if(!istype(tool, /obj/item/trapdoor_remote))
|
||||
return
|
||||
var/obj/item/trapdoor_remote/remote = tool
|
||||
@@ -126,6 +167,8 @@
|
||||
/datum/component/trapdoor/proc/async_try_link(turf/source, mob/user, obj/item/trapdoor_remote/remote)
|
||||
if(!do_after(user, 2 SECONDS, target=source))
|
||||
return
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(IS_OPEN(parent))
|
||||
source.balloon_alert(user, "can't link trapdoor when its open")
|
||||
return
|
||||
@@ -139,6 +182,8 @@
|
||||
/datum/component/trapdoor/proc/async_try_unlink(turf/source, mob/user, obj/item/tool)
|
||||
if(!do_after(user, 5 SECONDS, target=source))
|
||||
return
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(IS_OPEN(parent))
|
||||
source.balloon_alert(user, "can't unlink trapdoor when its open")
|
||||
return
|
||||
@@ -161,6 +206,8 @@
|
||||
* changing turfs does not bring over decals, so we must perform a little bit of element reapplication.
|
||||
*/
|
||||
/datum/component/trapdoor/proc/reapply_all_decals()
|
||||
if(is_under_shuttle())
|
||||
return
|
||||
for(var/list/element_data as anything in stored_decals)
|
||||
apply_decal(element_data[1], element_data[2], element_data[3], element_data[4])
|
||||
stored_decals = list()
|
||||
@@ -192,12 +239,12 @@
|
||||
try_closing()
|
||||
|
||||
///signal called by turf changing
|
||||
/datum/component/trapdoor/proc/turf_changed_pre(datum/source, path, new_baseturfs, flags, post_change_callbacks)
|
||||
/datum/component/trapdoor/proc/turf_changed_pre(datum/source, path, list/new_baseturfs, flags, post_change_callbacks)
|
||||
SIGNAL_HANDLER
|
||||
var/turf/open/dying_trapdoor = parent
|
||||
if((flags & CHANGETURF_TRAPDOOR_INDUCED) == 0) //not a process of the trapdoor
|
||||
if(!IS_OPEN(parent) && !ispath(path, /turf/closed) && !ispath(path, /turf/open/openspace)) // allow people to place tiles on plating / change tiles without breaking the trapdoor
|
||||
post_change_callbacks += CALLBACK(src, TYPE_PROC_REF(/datum/component/trapdoor, carry_over_trapdoor), path, conspicuous, assembly)
|
||||
if(!IS_OPEN(parent) && !ispath(path, /turf/closed) && islist(new_baseturfs) && new_baseturfs.Find(/turf/baseturf_skipover/trapdoor)) // allow people to place tiles on plating / change tiles without breaking the trapdoor
|
||||
post_change_callbacks += CALLBACK(src, TYPE_PROC_REF(/datum/component/trapdoor, carry_over_trapdoor), path, null, conspicuous, assembly)
|
||||
return
|
||||
// otherwise, break trapdoor
|
||||
dying_trapdoor.visible_message(span_warning("The trapdoor mechanism in [dying_trapdoor] is broken!"))
|
||||
@@ -206,7 +253,7 @@
|
||||
stored_decals.Cut()
|
||||
assembly = null
|
||||
return
|
||||
post_change_callbacks += CALLBACK(src, TYPE_PROC_REF(/datum/component/trapdoor, carry_over_trapdoor), trapdoor_turf_path, conspicuous, assembly)
|
||||
post_change_callbacks += CALLBACK(src, TYPE_PROC_REF(/datum/component/trapdoor, carry_over_trapdoor), trapdoor_turf_path, trapdoor_baseturfs, conspicuous, assembly)
|
||||
|
||||
/**
|
||||
* ## carry_over_trapdoor
|
||||
@@ -214,8 +261,8 @@
|
||||
* applies the trapdoor to the new turf (created by the last trapdoor)
|
||||
* apparently callbacks with arguments on invoke and the callback itself have the callback args go first. interesting!
|
||||
*/
|
||||
/datum/component/trapdoor/proc/carry_over_trapdoor(trapdoor_turf_path, conspicuous, assembly, turf/new_turf)
|
||||
new_turf.AddComponent(/datum/component/trapdoor, FALSE, trapdoor_turf_path, assembly, conspicuous, stored_decals, autoclose)
|
||||
/datum/component/trapdoor/proc/carry_over_trapdoor(trapdoor_turf_path, trapdoor_baseturfs, conspicuous, assembly, turf/new_turf)
|
||||
new_turf.AddComponent(/datum/component/trapdoor, FALSE, trapdoor_turf_path, trapdoor_baseturfs, assembly, conspicuous, stored_decals, autoclose)
|
||||
|
||||
/**
|
||||
* ## on_examine
|
||||
@@ -224,6 +271,8 @@
|
||||
*/
|
||||
/datum/component/trapdoor/proc/on_examine(datum/source, mob/user, list/examine_text)
|
||||
SIGNAL_HANDLER
|
||||
if(is_under_shuttle())
|
||||
return
|
||||
if(conspicuous)
|
||||
examine_text += "There seems to be a tiny gap around this tile with some wires that you might be able to pulse with a <b>multitool</b>."
|
||||
|
||||
@@ -235,12 +284,19 @@
|
||||
*/
|
||||
/datum/component/trapdoor/proc/try_opening()
|
||||
var/turf/open/trapdoor_turf = parent
|
||||
var/opening_depth = trapdoor_turf.depth_to_find_baseturf(/turf/baseturf_skipover/trapdoor)
|
||||
if(!opening_depth)
|
||||
stack_trace("Could not find baseturf skipover for trapdoor")
|
||||
return
|
||||
if(is_under_shuttle())
|
||||
return
|
||||
///we want to save this turf's decals as they were right before deletion, so this is the point where we begin listening
|
||||
if(assembly)
|
||||
RegisterSignal(parent, COMSIG_TURF_DECAL_DETACHED, PROC_REF(decal_detached))
|
||||
playsound(trapdoor_turf, 'sound/machines/trapdoor/trapdoor_open.ogg', 50)
|
||||
trapdoor_baseturfs = trapdoor_turf.get_baseturfs_to_depth(opening_depth)
|
||||
trapdoor_turf.visible_message(span_warning("[trapdoor_turf] swings open!"))
|
||||
trapdoor_turf.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR | CHANGETURF_TRAPDOOR_INDUCED)
|
||||
trapdoor_turf.ScrapeAway(opening_depth, flags = CHANGETURF_INHERIT_AIR | CHANGETURF_TRAPDOOR_INDUCED)
|
||||
|
||||
/**
|
||||
* ## try_closing
|
||||
@@ -256,7 +312,23 @@
|
||||
return
|
||||
playsound(trapdoor_turf, 'sound/machines/trapdoor/trapdoor_shut.ogg', 50)
|
||||
trapdoor_turf.visible_message(span_warning("The trapdoor mechanism in [trapdoor_turf] swings shut!"))
|
||||
trapdoor_turf.ChangeTurf(trapdoor_turf_path, flags = CHANGETURF_INHERIT_AIR | CHANGETURF_TRAPDOOR_INDUCED)
|
||||
var/list/new_baseturfs = list()
|
||||
new_baseturfs += trapdoor_turf.baseturfs
|
||||
new_baseturfs += trapdoor_turf.type
|
||||
if(on_shuttle)
|
||||
new_baseturfs += /turf/baseturf_skipover/shuttle
|
||||
new_baseturfs += trapdoor_baseturfs
|
||||
trapdoor_baseturfs = null
|
||||
trapdoor_turf.ChangeTurf(trapdoor_turf_path, new_baseturfs, flags = CHANGETURF_INHERIT_AIR | CHANGETURF_TRAPDOOR_INDUCED)
|
||||
|
||||
/datum/component/trapdoor/proc/should_move_special(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
var/turf/source_turf = source
|
||||
return IS_OPEN(source_turf) && !is_under_shuttle()
|
||||
|
||||
/datum/component/trapdoor/proc/on_move_special(datum/source, turf/new_turf)
|
||||
SIGNAL_HANDLER
|
||||
new_turf.TakeComponent(src)
|
||||
|
||||
#undef IS_OPEN
|
||||
|
||||
|
||||
Reference in New Issue
Block a user