mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-11 01:13:18 +00:00
If you came here thinking this was some game feature then you are in the wrong place. Here is where I ramble about code. This adds /datum/element as a sort of sibling to components. Only one of each type gets instanced and they do not get tied directly to any particular thing like a component does. Basically they're a very lightweight component for doing simple functionality that doesn't have much state. Originally this concept came about as a kind of component that could be shared between many parents to reduce some resource costs. Doing this would allow us to componentize more behaviors that are a part of too many things to be viable to have a whole component for every single one. For example a component on every space turf would be entirely unviable. With elements it's much more reasonable. This implements a prety bare framework and a couple components are migrated to it. It's ready to be used but I fully expect I'm going to need to refine how it works for all the usecases we'll want it for. Also: this fixes the qdeleted signal. This signal isn't even possible because after qdel is done there's nothing to receive a signal anyway. I've changed it to a qdeling signal instead. I need it to work for some elements to know when to clean themselves up.
42 lines
1.5 KiB
Plaintext
42 lines
1.5 KiB
Plaintext
/datum/element/cleaning/Attach(datum/target)
|
|
. = ..()
|
|
if(!ismovableatom(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/Clean)
|
|
|
|
/datum/element/cleaning/Detach(datum/target)
|
|
. = ..()
|
|
UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
|
|
|
|
/datum/element/cleaning/proc/Clean(datum/source)
|
|
var/atom/movable/AM = source
|
|
var/turf/tile = AM.loc
|
|
if(!isturf(tile))
|
|
return
|
|
|
|
SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
|
for(var/A in tile)
|
|
if(is_cleanable(A))
|
|
qdel(A)
|
|
else if(istype(A, /obj/item))
|
|
var/obj/item/I = A
|
|
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
|
if(ismob(I.loc))
|
|
var/mob/M = I.loc
|
|
M.regenerate_icons()
|
|
else if(ishuman(A))
|
|
var/mob/living/carbon/human/cleaned_human = A
|
|
if(!(cleaned_human.mobility_flags & MOBILITY_STAND))
|
|
if(cleaned_human.head)
|
|
SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
|
if(cleaned_human.wear_suit)
|
|
SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
|
else if(cleaned_human.w_uniform)
|
|
SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
|
if(cleaned_human.shoes)
|
|
SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
|
SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
|
cleaned_human.wash_cream()
|
|
cleaned_human.regenerate_icons()
|
|
to_chat(cleaned_human, "<span class='danger'>[AM] cleans your face!</span>")
|