diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index d8fd784b007..e21789fccbf 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -45,3 +45,6 @@ /// From /obj/item/organ/external/take_damage. Updates the limb's colour matrix. Very laggy, so we do it on reaction to stuff. #define COMSIG_UPDATE_LIMB_IMAGE "update_limb_image" + +/// For when bone is fixed with surgery +#define COMSIG_BEGIN_SURGERY "begin_surgery" diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 61d487b0c13..90dea2dd4bd 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -2087,6 +2087,38 @@ All custom items with worn sprites must follow the contained sprite system: http else collapse() +/obj/item/organ/internal/augment/fluff/kath_legbrace/Initialize() + . = ..() + if(!owner) + return + RegisterSignal(owner, COMSIG_BEGIN_SURGERY, PROC_REF(negate_healing), override = TRUE) + var/obj/item/organ/external/parent = owner.get_organ(parent_organ) + parent.fracture(TRUE) + +/obj/item/organ/internal/augment/fluff/kath_legbrace/replaced() + . = ..() + if(!owner) + return + RegisterSignal(owner, COMSIG_BEGIN_SURGERY, PROC_REF(negate_healing), override = TRUE) + var/obj/item/organ/external/parent = owner.get_organ(parent_organ) + parent.fracture(TRUE) + +/obj/item/organ/internal/augment/fluff/kath_legbrace/removed() + if(!owner) + return ..() + UnregisterSignal(owner, COMSIG_BEGIN_SURGERY) + return ..() + +/obj/item/organ/internal/augment/fluff/kath_legbrace/proc/negate_healing(var/owner, var/canceled, var/obj/item/organ/external/affected, var/mob/living/user, var/singleton/surgery_step/surgery) + SIGNAL_HANDLER + if(!istype(surgery, /singleton/surgery_step/glue_bone) && !istype(surgery, /singleton/surgery_step/set_bone)) + return + if(affected.limb_name != parent_organ) + return + *canceled = TRUE + user.visible_message(SPAN_WARNING("[user] seems to be unable to set the bone in [owner]'s [affected.name]."), \ + SPAN_WARNING("The bone in [owner]'s [affected.name] appears to be impossible to set correctly!")) + /obj/item/organ/internal/augment/fluff/kath_legbrace/proc/collapse(var/prob_chance = 20, var/weaken_strength = 2, var/pain_strength = 40) if(prob(prob_chance)) var/obj/item/organ/external/E = owner.organs_by_name[parent_organ] diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 715e2196301..e485b741ab3 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -53,6 +53,13 @@ /singleton/surgery_step/proc/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if(!ishuman(target)) return FALSE + + var/obj/item/organ/external/affected = target.get_organ(target_zone) + var/canceled = FALSE + SEND_SIGNAL(target, COMSIG_BEGIN_SURGERY, &canceled, affected, user, src) + if(canceled) + return FALSE + return TRUE /// Does stuff to begin the step, usually just printing messages. Moved germs transfering and bloodying here too diff --git a/html/changelogs/LegBreaker.yml b/html/changelogs/LegBreaker.yml new file mode 100644 index 00000000000..c6a668f005a --- /dev/null +++ b/html/changelogs/LegBreaker.yml @@ -0,0 +1,6 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - rscadd: "A signal was added to bone fixing surgery, for potential future uses where a bone repair surgery might not work."