diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 93243739868..095206e4f56 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -14,6 +14,8 @@ #define COMSIG_ORGAN_SURGICALLY_REMOVED "organ_surgically_removed" /// Called when an organ gets surgically removed (mob/living/user, mob/living/carbon/new_owner, target_zone, obj/item/tool) #define COMSIG_ORGAN_SURGICALLY_INSERTED "organ_surgically_inserted" +/// Called when an organ finishes inserting into a bodypart (obj/item/bodypart/limb, movement_flags) +#define COMSIG_ORGAN_BODYPART_INSERTED "organ_bodypart_inserted" ///Called when movement intent is toggled. #define COMSIG_MOVE_INTENT_TOGGLED "move_intent_toggled" diff --git a/code/datums/elements/organ_set_bonus.dm b/code/datums/elements/organ_set_bonus.dm index 3e8f030a13d..fa6b272897a 100644 --- a/code/datums/elements/organ_set_bonus.dm +++ b/code/datums/elements/organ_set_bonus.dm @@ -30,7 +30,7 @@ var/datum/status_effect/organ_set_bonus/set_bonus = receiver.has_status_effect(bonus_type) if(!set_bonus) set_bonus = receiver.apply_status_effect(bonus_type) - set_bonus.set_organs(set_bonus.organs + 1) + set_bonus.set_organs(set_bonus.organs + 1, target) /datum/element/organ_set_bonus/proc/on_removed(obj/item/organ/target, mob/living/carbon/loser) SIGNAL_HANDLER @@ -38,7 +38,7 @@ //get status effect or remove it var/datum/status_effect/organ_set_bonus/set_bonus = loser.has_status_effect(bonus_type) if(set_bonus) - set_bonus.set_organs(set_bonus.organs - 1) + set_bonus.set_organs(set_bonus.organs - 1, target) /datum/status_effect/organ_set_bonus id = "organ_set_bonus" @@ -66,17 +66,17 @@ /// Color priority for limb overlay var/color_overlay_priority -/datum/status_effect/organ_set_bonus/proc/set_organs(new_value) +/datum/status_effect/organ_set_bonus/proc/set_organs(new_value, obj/item/organ/organ) organs = new_value if(!organs) //initial value but won't kick in without calling the setter qdel(src) if(organs >= organs_needed) if(!bonus_active) - INVOKE_ASYNC(src, PROC_REF(enable_bonus)) + INVOKE_ASYNC(src, PROC_REF(enable_bonus), organ) else if(bonus_active) - INVOKE_ASYNC(src, PROC_REF(disable_bonus)) + INVOKE_ASYNC(src, PROC_REF(disable_bonus), organ) -/datum/status_effect/organ_set_bonus/proc/enable_bonus() +/datum/status_effect/organ_set_bonus/proc/enable_bonus(obj/item/organ/inserted_organ) SHOULD_CALL_PARENT(TRUE) if(required_biotype) if(!(owner.mob_biotypes & required_biotype)) @@ -113,7 +113,7 @@ carbon_owner.update_body() return TRUE -/datum/status_effect/organ_set_bonus/proc/disable_bonus() +/datum/status_effect/organ_set_bonus/proc/disable_bonus(obj/item/organ/removed_organ) SHOULD_CALL_PARENT(TRUE) bonus_active = FALSE @@ -150,7 +150,7 @@ /datum/status_effect/organ_set_bonus/proc/texture_limb(atom/source, obj/item/bodypart/limb) SIGNAL_HANDLER - // Not updating because enable/disable_bonus() call it down the line, and calls coming from comsigs update the owner's body themselves + // Not updating because enable/disable_bonus(obj/item/organ/removed_organ) call it down the line, and calls coming from comsigs update the owner's body themselves limb.add_bodypart_overlay(new limb_overlay(), update = FALSE) if(color_overlay_priority) limb.add_color_override(COLOR_WHITE, color_overlay_priority) diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index 3fcfe55a772..745131ee019 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -31,7 +31,7 @@ /// Are we at all five organs? var/color_active = FALSE -/datum/status_effect/organ_set_bonus/fish/enable_bonus() +/datum/status_effect/organ_set_bonus/fish/enable_bonus(obj/item/organ/inserted_organ) . = ..() if(!.) return @@ -55,7 +55,7 @@ owner.mind?.adjust_experience(/datum/skill/fishing, SKILL_EXP_JOURNEYMAN, silent = TRUE) owner.grant_language(/datum/language/carptongue, ALL, type) -/datum/status_effect/organ_set_bonus/fish/disable_bonus() +/datum/status_effect/organ_set_bonus/fish/disable_bonus(obj/item/organ/removed_organ) . = ..() UnregisterSignal(owner, list( COMSIG_CARBON_GAIN_ORGAN, @@ -80,7 +80,7 @@ owner.mind?.adjust_experience(/datum/skill/fishing, -SKILL_EXP_JOURNEYMAN, silent = TRUE) owner.remove_language(/datum/language/carptongue, ALL, type) -/datum/status_effect/organ_set_bonus/fish/set_organs(new_value) +/datum/status_effect/organ_set_bonus/fish/set_organs(new_value, obj/item/organ/organ) . = ..() if (!iscarbon(owner)) return diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm index 646290db0e2..1d9c8bdc743 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm @@ -8,14 +8,27 @@ bonus_activate_text = null bonus_deactivate_text = null -/datum/status_effect/organ_set_bonus/fly/enable_bonus() +/datum/status_effect/organ_set_bonus/fly/enable_bonus(obj/item/organ/inserted_organ) . = ..() if(!. || !ishuman(owner)) return var/mob/living/carbon/human/new_fly = owner if(isflyperson(new_fly)) return - //okay you NEED to be a fly + // This is ugly as sin, but we're called before the organ finishes inserting into the bodypart + // so if we swap species directly the bodypart will be replaced and we'll be gone + // so we need to delay species change until we're fully inserted + RegisterSignal(inserted_organ, COMSIG_ORGAN_BODYPART_INSERTED, PROC_REF(flyify)) + +/datum/status_effect/organ_set_bonus/fly/proc/flyify(obj/item/organ/source, obj/item/bodypart/limb, movement_flags) + SIGNAL_HANDLER + var/mob/living/carbon/human/new_fly = owner + // just in case? + if(isflyperson(new_fly)) + return + // needs to be done before the species is set + UnregisterSignal(source, COMSIG_ORGAN_BODYPART_INSERTED) + // okay you NEED to be a fly to_chat(new_fly, span_danger("Too much fly DNA! Your skin begins to discolor into a horrible black as you become more fly than person!")) new_fly.set_species(/datum/species/fly) diff --git a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm index 2e28fd94d84..4988ad4d638 100644 --- a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm @@ -20,7 +20,7 @@ /// Armor type attached to the owner's physiology var/datum/armor/given_armor = /datum/armor/roach_internal_armor -/datum/status_effect/organ_set_bonus/roach/enable_bonus() +/datum/status_effect/organ_set_bonus/roach/enable_bonus(obj/item/organ/inserted_organ) . = ..() if(!ishuman(owner)) return @@ -28,7 +28,7 @@ var/mob/living/carbon/human/human_owner = owner human_owner.physiology.armor = human_owner.physiology.armor.add_other_armor(given_armor) -/datum/status_effect/organ_set_bonus/roach/disable_bonus() +/datum/status_effect/organ_set_bonus/roach/disable_bonus(obj/item/organ/removed_organ) . = ..() if(!ishuman(owner) || QDELETED(owner)) return diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 177a2ded6c8..681d68e6282 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -578,13 +578,13 @@ bonus_deactivate_text = span_notice("You can no longer force open airlocks with your bare hands.") required_biotype = NONE -/datum/status_effect/organ_set_bonus/strongarm/enable_bonus() +/datum/status_effect/organ_set_bonus/strongarm/enable_bonus(obj/item/organ/inserted_organ) . = ..() if(!.) return owner.AddElement(/datum/element/door_pryer, pry_time = 6 SECONDS, interaction_key = DOAFTER_SOURCE_STRONGARM_INTERACTION) -/datum/status_effect/organ_set_bonus/strongarm/disable_bonus() +/datum/status_effect/organ_set_bonus/strongarm/disable_bonus(obj/item/organ/removed_organ) . = ..() owner.RemoveElement(/datum/element/door_pryer, pry_time = 6 SECONDS, interaction_key = DOAFTER_SOURCE_STRONGARM_INTERACTION) diff --git a/code/modules/surgery/organs/organ_movement.dm b/code/modules/surgery/organs/organ_movement.dm index d31c3e5e0b2..fb63d46eb26 100644 --- a/code/modules/surgery/organs/organ_movement.dm +++ b/code/modules/surgery/organs/organ_movement.dm @@ -144,6 +144,8 @@ if(bodypart_overlay) limb.add_bodypart_overlay(bodypart_overlay) + SEND_SIGNAL(src, COMSIG_ORGAN_BODYPART_INSERTED, limb, movement_flags) + /* * Remove the organ from the select mob. *