diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 67a44bbe01f..d955ed23d45 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -83,6 +83,7 @@ #define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force) #define COMSIG_MOVABLE_THROW "movable_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) #define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) + // /obj signals #define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 5b194642fd0..2f4ae3d78fc 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -34,10 +34,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define BANG_PROTECT_2 (1<<6) -// An item worn in the ear slot with HEALS_EARS will heal your ears each -// Life() tick, even if normally your ears would be too damaged to heal. -#define HEALS_EARS_2 (1<<7) - // A mob with OMNITONGUE has no restriction in the ability to speak // languages that they know. So even if they wouldn't normally be able to // through mob or tongue restrictions, this flag allows them to ignore diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index a447df40451..1e23eef04f3 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -123,7 +123,6 @@ GLOBAL_LIST_INIT(bitfields, list( "NO_EMP_WIRES_2" = NO_EMP_WIRES_2, "HOLOGRAM_2" = HOLOGRAM_2, "BANG_PROTECT_2" = BANG_PROTECT_2, - "HEALS_EARS_2" = HEALS_EARS_2, "OMNITONGUE_2" = OMNITONGUE_2, "TESLA_IGNORE_2" = TESLA_IGNORE_2 ), diff --git a/code/datums/components/earhealing.dm b/code/datums/components/earhealing.dm new file mode 100644 index 00000000000..79303ff701f --- /dev/null +++ b/code/datums/components/earhealing.dm @@ -0,0 +1,30 @@ +// An item worn in the ear slot with this component will heal your ears each +// Life() tick, even if normally your ears would be too damaged to heal. + +/datum/component/earhealing + var/mob/living/carbon/wearer + +/datum/component/earhealing/Initialize() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), .proc/equippedChanged) + +/datum/component/earhealing/proc/equippedChanged(mob/living/carbon/user, slot) + if (slot == SLOT_EARS && istype(user)) + if (!wearer) + START_PROCESSING(SSobj, src) + wearer = user + else + if (wearer) + STOP_PROCESSING(SSobj, src) + wearer = null + +/datum/component/earhealing/process() + if (!wearer) + STOP_PROCESSING(SSobj, src) + return + if(!wearer.has_trait(TRAIT_DEAF)) + var/obj/item/organ/ears/ears = wearer.getorganslot(ORGAN_SLOT_EARS) + if (ears) + ears.deaf = max(ears.deaf - 1, (ears.ear_damage < UNHEALING_EAR_DAMAGE ? 0 : 1)) // Do not clear deafness while above the unhealing ear damage threshold + ears.ear_damage = max(ears.ear_damage - 0.1, 0) diff --git a/code/datums/components/wearertargeting.dm b/code/datums/components/wearertargeting.dm new file mode 100644 index 00000000000..adf8acceb98 --- /dev/null +++ b/code/datums/components/wearertargeting.dm @@ -0,0 +1,26 @@ +// A dummy parent type used for easily making components that target an item's wearer rather than the item itself. + +/datum/component/wearertargeting + var/datum/component/mobhook + var/list/valid_slots = list() + var/list/signals = list() + var/datum/callback/callback = CALLBACK(GLOBAL_PROC, .proc/pass) + var/mobtype = /mob/living + +/datum/component/wearertargeting/Initialize() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), .proc/checkMobHook) + +/datum/component/wearertargeting/Destroy() + QDEL_NULL(mobhook) + return ..() + +/datum/component/wearertargeting/proc/checkMobHook(mob/user, slot) + if ((slot in valid_slots) && istype(user, mobtype)) + if (mobhook && mobhook.parent != user) + QDEL_NULL(mobhook) + if (!mobhook) + mobhook = user.AddComponent(/datum/component/redirect, signals, callback) + else + QDEL_NULL(mobhook) diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index 2ed77df3613..56797e26bda 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -15,7 +15,11 @@ strip_delay = 15 equip_delay_other = 25 resistance_flags = FLAMMABLE - flags_2 = BANG_PROTECT_2|HEALS_EARS_2 + flags_2 = BANG_PROTECT_2 + +/obj/item/clothing/ears/earmuffs/ComponentInitialize() + . = ..() + AddComponent(/datum/component/earhealing) /obj/item/clothing/ears/headphones name = "headphones" diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index fff342a1014..c54d3bb5329 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -27,14 +27,9 @@ // genetic deafness prevents the body from using the ears, even if healthy if(C.has_trait(TRAIT_DEAF)) deaf = max(deaf, 1) - else - if(C.ears && (C.ears.flags_2 & HEALS_EARS_2)) - deaf = max(deaf - 1, 1) - ear_damage = max(ear_damage - 0.1, 0) - // if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs. - if(ear_damage < UNHEALING_EAR_DAMAGE) - ear_damage = max(ear_damage - 0.05, 0) - deaf = max(deaf - 1, 0) + else if(ear_damage < UNHEALING_EAR_DAMAGE) // if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs. + ear_damage = max(ear_damage - 0.05, 0) + deaf = max(deaf - 1, 0) /obj/item/organ/ears/proc/restoreEars() deaf = 0 diff --git a/tgstation.dme b/tgstation.dme index 38bfdba28e6..0242d2c56b5 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -314,6 +314,7 @@ #include "code\datums\components\cleaning.dm" #include "code\datums\components\construction.dm" #include "code\datums\components\decal.dm" +#include "code\datums\components\earhealing.dm" #include "code\datums\components\forensics.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" @@ -335,6 +336,7 @@ #include "code\datums\components\stationloving.dm" #include "code\datums\components\swarming.dm" #include "code\datums\components\thermite.dm" +#include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\decals\blood.dm" #include "code\datums\components\storage\storage.dm"