From eb669bf0c1ca5ed92900d38f13a1f1d12fc291ad Mon Sep 17 00:00:00 2001 From: Cameron Lennox Date: Mon, 11 Aug 2025 14:30:04 -0400 Subject: [PATCH] Fixes spam-clicking on Nar'Sie destroying eardrums (#92470) ## About The Pull Request Fixes #92454 by making it so Nar'Sie can't be spam-clicked at the speed of light to spawn infinite cult shells and blow up your ears. Instead, clicking on Nar'Sie will now give you an input box asking if you want to become a harvester or not. Additionally, cultbanned individuals can no longer interact with her either. ![dreamseeker_2025-08-07_00-15-01](https://github.com/user-attachments/assets/4bcd9876-eb35-4cf9-a7b3-8c43437b155e) ## Why It's Good For The Game Nar'Sie no longer escapes into the real world and does grievous bodily harm to your ears when some joker decides to spam-click her. Additionally, it feels smoother to click Nar'Sie and be able to immediately become a harvester, versus clicking Nar'sie and then having to twiddle your thumbs for 10 seconds waiting for the ghost query to end. ## Changelog :cl: fix: Nar'Sie can no longer be spam-clicked as a ghost and destroy ears via infinite shell creation. fix: Cult-banned players can no longer interact with Nar'Sie qol: Interacting with Nar'Sie as a ghost no longer creates a ghost query and instead allows you to immediately become a harvester after confirming you wish to become a harvester. /:cl: --- .../antagonists/wizard/equipment/soulstone.dm | 12 +++++++++--- code/modules/power/singularity/narsie.dm | 7 +++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 4db1dc6f335..79798ec1f5e 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -546,7 +546,7 @@ else make_new_construct(/mob/living/basic/construct/harvester, target, creator, cultoverride, loc_override) -/proc/make_new_construct(mob/living/basic/construct/ctype, mob/target, mob/stoner = null, cultoverride = FALSE, loc_override = null) +/proc/make_new_construct(mob/living/basic/construct/ctype, mob/target, mob/stoner = null, cultoverride = FALSE, loc_override = null, ghost_activated = FALSE) if(QDELETED(target)) return var/mob/living/basic/construct/newstruct = new ctype(loc_override || get_turf(target)) @@ -560,7 +560,13 @@ var/datum/action/innate/seek_master/seek_master = new seek_master.Grant(newstruct) - if (!target.ckey || isnull(target.mind) || is_banned_from(target.ckey, ROLE_CULTIST)) + if(ghost_activated) + if(isnull(target.mind)) + newstruct.PossessByPlayer(target.ckey) + else + target.mind.transfer_to(newstruct, force_key_move = TRUE) + + else if (!target.ckey || isnull(target.mind) || is_banned_from(target.ckey, ROLE_CULTIST)) to_chat(stoner, span_userdanger("Shell imbuement failed!")) to_chat(stoner, span_warning("The soul has already fled its mortal frame. You attempt to bring it back...")) target = SSpolling.poll_ghosts_for_target( @@ -593,7 +599,7 @@ var/atom/movable/screen/alert/bloodsense/sense_alert if(newstruct.mind && !IS_CULTIST(newstruct) && ((stoner && IS_CULTIST(stoner)) || cultoverride) && SSticker.HasRoundStarted()) newstruct.mind.add_antag_datum(/datum/antagonist/cult/construct) - if(IS_CULTIST(stoner) || cultoverride) + if(cultoverride || (stoner && IS_CULTIST(stoner))) to_chat(newstruct, span_cult_bold("You are still bound to serve the cult[stoner ? " and [stoner]" : ""], follow [stoner?.p_their() || "their"] orders and help [stoner?.p_them() || "them"] complete [stoner?.p_their() || "their"] goals at all costs.")) else if(stoner) to_chat(newstruct, span_boldwarning("You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 09e380aca17..2e2d9058087 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -146,8 +146,11 @@ log_admin("[key_name(usr)] has triggered the Nar'Sie roundender.") start_ending_the_round() -/obj/narsie/attack_ghost(mob/user) - make_new_construct(/mob/living/basic/construct/harvester, user, cultoverride = TRUE, loc_override = loc) +/obj/narsie/attack_ghost(mob/dead/observer/user) + if(is_banned_from(user.ckey, ROLE_CULTIST)) + return + if(tgui_alert(user, "Do you wish to become an occult harvester?", "Become Harvester?", list("Yes", "No"), timeout = 10 SECONDS) == "Yes") + make_new_construct(/mob/living/basic/construct/harvester, user, cultoverride = TRUE, loc_override = loc, ghost_activated = TRUE) /obj/narsie/process() var/datum/component/singularity/singularity_component = singularity.resolve()