From bc5fb226d1d60fcf9e6617925ccfa32d419f5723 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 3c2a4f1095a..e0244a59b29 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -551,7 +551,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)) @@ -565,7 +565,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( @@ -598,7 +604,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 4859bb547ab..8a21b8274ea 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()