diff --git a/code/__DEFINES/~~bubber_defines/traits/declarations.dm b/code/__DEFINES/~~bubber_defines/traits/declarations.dm index 31dc4193e6c..4c562e5747f 100644 --- a/code/__DEFINES/~~bubber_defines/traits/declarations.dm +++ b/code/__DEFINES/~~bubber_defines/traits/declarations.dm @@ -33,3 +33,6 @@ // makes the mob immune to crusher marks even if they are within the required mob size #define TRAIT_CRUSHER_MARK_IMMUNE "crusher_mark_immune" +// makes it so cult cannot get another blood stone from this mob +#define TRAIT_HAS_BEEN_CULT_SACRIFICED "has_been_cult_sacrificed" + diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index a0d68661edd..974278b8b80 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -281,6 +281,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HALT_RADIATION_EFFECTS" = TRAIT_HALT_RADIATION_EFFECTS, "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, + "TRAIT_HAS_BEEN_CULT_SACRIFICED" = TRAIT_HAS_BEEN_CULT_SACRIFICED, //Bubber edit "TRAIT_HAS_BEEN_KIDNAPPED" = TRAIT_HAS_BEEN_KIDNAPPED, "TRAIT_HAS_CRANIAL_FISSURE" = TRAIT_HAS_CRANIAL_FISSURE, "TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 07f95d1463a..cfccfe8284d 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -128,6 +128,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, + "TRAIT_HAS_BEEN_CULT_SACRIFICED" = TRAIT_HAS_BEEN_CULT_SACRIFICED, //Bubber edit "TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS, "TRAIT_HEAVY_DRINKER" = TRAIT_HEAVY_DRINKER, "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 8fb661fd432..3ed6d15e97b 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -390,12 +390,35 @@ structure_check() searches for nearby cultist structures required for the invoca sacrificial.investigate_log("has been sacrificially dusted by the cult.", INVESTIGATE_DEATHS) sacrificial.dust(TRUE, FALSE, TRUE) else if (sacrificial) - var/obj/item/soulstone/stone = new(loc) - if(sacrificial.mind && !HAS_TRAIT(sacrificial, TRAIT_SUICIDED)) - stone.capture_soul(sacrificial, invokers[1], forced = TRUE) - playsound(sacrificial, 'sound/effects/magic/disintegrate.ogg', 100, TRUE) - sacrificial.investigate_log("has been sacrificially gibbed by the cult.", INVESTIGATE_DEATHS) - sacrificial.gib(DROP_ALL_REMAINS) + //BUBBER EDIT BEGIN: removes force gib from cult + if(!HAS_TRAIT(sacrificial, TRAIT_HAS_BEEN_CULT_SACRIFICED)) + ADD_TRAIT(sacrificial, TRAIT_HAS_BEEN_CULT_SACRIFICED, MAGIC_TRAIT) + var/obj/item/soulstone/stone = new(loc) + + var/shard_choice = tgui_alert( + user = sacrificial, + message = "Do you wish to become a soul shard for the cult, selecting yes will gib you and you will play as a soul shard, selecting no will husk you and your body will stay intact.", + title = "Choose your fate", + buttons = list("Decline", "Accept"), + timeout = 10 SECONDS, + autofocus = TRUE + ) + if(shard_choice == "Accept") + if(sacrificial.mind && !HAS_TRAIT(sacrificial, TRAIT_SUICIDED)) + stone.capture_soul(sacrificial, invokers[1], forced = TRUE) + playsound(sacrificial, 'sound/effects/magic/disintegrate.ogg', 100, TRUE) + sacrificial.investigate_log("has been sacrificially gibbed by the cult.", INVESTIGATE_DEATHS) + sacrificial.gib(DROP_ALL_REMAINS) + else + sacrificial.death(FALSE) + sacrificial.become_husk(BURN) + sacrificial.investigate_log("has been sacrificially husked by the cult.", INVESTIGATE_DEATHS) + stone.capture_ghost(sacrificial, invokers[1]) + else + sacrificial.death(FALSE) + sacrificial.become_husk(BURN) + sacrificial.investigate_log("has been sacrificially husked by the cult.", INVESTIGATE_DEATHS) + //BUBBER EDIT END try_spawn_sword() // after sharding and gibbing, which potentially dropped a null rod diff --git a/modular_zubbers/code/modules/antagonists/wizard/soulstone.dm b/modular_zubbers/code/modules/antagonists/wizard/soulstone.dm new file mode 100644 index 00000000000..8cc06acfda1 --- /dev/null +++ b/modular_zubbers/code/modules/antagonists/wizard/soulstone.dm @@ -0,0 +1,13 @@ +/obj/item/soulstone/proc/capture_ghost(mob/living/carbon/victim, user) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + check_jobban = ROLE_CULTIST, + poll_time = 20 SECONDS, + checked_target = src, + ignore_category = POLL_IGNORE_SHADE, + alert_pic = /mob/living/basic/shade, + jump_target = src, + role_name_text = "a shade", + chat_text_border_icon = /mob/living/basic/shade, + ) + on_poll_concluded(user, victim, chosen_one) + return TRUE //it'll probably get someone ;) diff --git a/tgstation.dme b/tgstation.dme index d6f11f0bc0a..71885af112f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8927,6 +8927,7 @@ #include "modular_zubbers\code\modules\antagonists\wizard\events_removal.dm" #include "modular_zubbers\code\modules\antagonists\wizard\events_rework.dm" #include "modular_zubbers\code\modules\antagonists\wizard\grand_finale_removal.dm" +#include "modular_zubbers\code\modules\antagonists\wizard\soulstone.dm" #include "modular_zubbers\code\modules\arcades\assets\arcade.dm" #include "modular_zubbers\code\modules\arcades\code\loot\arcade_weights_classic.dm" #include "modular_zubbers\code\modules\arcades\code\loot\arcade_weights_mechanical.dm"