From 4863c4bd7fdef297c4de0785a74ab64e2289e91a Mon Sep 17 00:00:00 2001 From: Cameron Lennox Date: Sun, 13 Jul 2025 04:20:13 -0400 Subject: [PATCH] Few fixes (#17993) Fixes changeling stings becoming unusable after using them once Fixes transformation sting not being selectable due to having been swapped to absorbed DNA Fixes extraction sting from not being selectable due to old logic. --- .../antags/changeling/changeling.dm | 15 ++++++---- .../changeling/powers/extract_dna_sting.dm | 7 ----- .../changeling/powers/transform_sting.dm | 29 ++++++++++++------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/code/datums/components/antags/changeling/changeling.dm b/code/datums/components/antags/changeling/changeling.dm index 69b5a21cf2d..6ecc280d8b6 100644 --- a/code/datums/components/antags/changeling/changeling.dm +++ b/code/datums/components/antags/changeling/changeling.dm @@ -74,12 +74,15 @@ var/list/datum/power/changeling/powerinstances = list() ///Handles the cooldown for the power. Returns TRUE if the cooldown has passed. FALSE if it's still on cooldown. ///This is just a general anti-spam thing and not really a true cooldown -/datum/component/antag/changeling/proc/handle_cooldown() + +/datum/component/antag/changeling/proc/check_cooldown() if(world.time > last_used_sting_time+cooldown_time) - last_used_sting_time = world.time return TRUE return FALSE +/datum/component/antag/changeling/proc/set_sting_cooldown() + last_used_sting_time = world.time + /datum/component/antag/changeling/proc/get_cooldown(id) return changeling_cooldowns[id] @@ -221,7 +224,7 @@ var/list/datum/power/changeling/powerinstances = list() /mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0) if(!src.mind) return - if(!iscarbon(src)) return + if(!isliving(src)) return var/datum/component/antag/changeling/comp = is_changeling(src) if(!comp) @@ -276,7 +279,7 @@ var/list/datum/power/changeling/powerinstances = list() var/datum/component/antag/changeling/comp = changeling_power(required_chems) if(!comp) return - if(!comp.handle_cooldown()) + if(!comp.check_cooldown()) to_chat(src, span_warning("We are still recovering from our last sting.")) return @@ -286,8 +289,9 @@ var/list/datum/power/changeling/powerinstances = list() var/mob/living/carbon/T = tgui_input_list(src, "Who will we sting?", "Sting!", victims) if(!T) + to_chat(src, span_warning("We have no targets in range to sting!")) return - if(!comp.handle_cooldown())//Check again in case we have multiple windows open at once. + if(!comp.check_cooldown())//Check again in case we have multiple windows open at once. to_chat(src, span_warning("We are still recovering from our last sting.")) return if(T.isSynthetic()) @@ -299,6 +303,7 @@ var/list/datum/power/changeling/powerinstances = list() comp.chem_charges -= required_chems comp.sting_range = 1 + comp.set_sting_cooldown() to_chat(src, span_notice("We stealthily sting [T].")) var/datum/component/antag/changeling/target_comp = is_changeling(T) diff --git a/code/datums/components/antags/changeling/powers/extract_dna_sting.dm b/code/datums/components/antags/changeling/powers/extract_dna_sting.dm index bbf8d8b11fb..37d6c402b67 100644 --- a/code/datums/components/antags/changeling/powers/extract_dna_sting.dm +++ b/code/datums/components/antags/changeling/powers/extract_dna_sting.dm @@ -13,14 +13,7 @@ set name = "Extract DNA Sting (40)" set desc="Stealthily sting a target to extract their DNA." - var/datum/component/antag/changeling/changeling = null - if(src.mind && changeling) - changeling = changeling - if(!changeling) - return FALSE - var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting) - if(!T) return diff --git a/code/datums/components/antags/changeling/powers/transform_sting.dm b/code/datums/components/antags/changeling/powers/transform_sting.dm index 158f6173835..1c1a5bb8c7e 100644 --- a/code/datums/components/antags/changeling/powers/transform_sting.dm +++ b/code/datums/components/antags/changeling/powers/transform_sting.dm @@ -12,32 +12,41 @@ set name = "Transformation sting (40)" set desc="Sting target" - var/datum/component/antag/changeling/changeling = changeling_power(40) + var/datum/component/antag/changeling/changeling = changeling_power(40, 1, 100, CONSCIOUS) if(!changeling) + to_world("Changeling = false)") return FALSE var/list/names = list() - for(var/datum/dna/DNA in changeling.absorbed_dna) - names += "[DNA.real_name]" + for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna) + names += "[DNA.name]" + if(!LAZYLEN(names)) + to_chat(src, "We have no DNA to select from!)") + return FALSE + var/S + if(LAZYLEN(names) > 1) + tgui_input_list(src, "Select the target DNA:", "Target DNA", names) + to_world("dna > 1") + else + to_world("dna == 1") + S = names[1] - var/S = tgui_input_list(src, "Select the target DNA:", "Target DNA", names) - if(!S) - return - - var/datum/dna/chosen_dna = changeling.GetDNA(S) + var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S) if(!chosen_dna) + to_world("CD = false)") return var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting) if(!T) + to_world("T = false)") return FALSE if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T))) to_chat(src, span_warning("Our sting appears ineffective against its DNA.")) return FALSE add_attack_logs(src,T,"Transformation sting (changeling)") T.visible_message(span_warning("[T] transforms!")) - qdel_swap(T.dna, chosen_dna.Clone()) - T.real_name = chosen_dna.real_name + qdel_swap(T.dna, chosen_dna.dna.Clone()) + T.real_name = chosen_dna.dna.real_name T.UpdateAppearance() domutcheck(T, null) feedback_add_details("changeling_powers","TS")