Fixes fly infusion deleting the last infused organ upon activation (#92267)

## About The Pull Request

Closes #92234

## Changelog
🆑
fix: Fixed fly infusion deleting the last infused organ upon activation
/🆑
This commit is contained in:
SmArtKar
2025-07-30 09:22:32 +02:00
committed by GitHub
parent 111f986070
commit efd8b7200a
7 changed files with 34 additions and 17 deletions
@@ -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"
+8 -8
View File
@@ -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)
@@ -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
@@ -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)
@@ -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
@@ -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)
@@ -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.
*