From ad486a13d70204d232b961cafaebda734c7494f7 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 18 Aug 2026 02:02:16 -0700 Subject: [PATCH 01/21] stuff --- code/__DEFINES/language.dm | 1 + code/modules/language/beast.dm | 16 ++++++++++++++++ modular_darkpack/modules/frenzy/code/frenzy.dm | 13 ++++++++++++- .../powers/code/discipline/__discipline_power.dm | 2 ++ .../powers/code/discipline/dominate/dominate.dm | 3 +++ .../powers/code/discipline/presence/presence.dm | 3 +++ 6 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 code/modules/language/beast.dm diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 1ae7d8982038..776fea0ccecd 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -54,6 +54,7 @@ #define LANGUAGE_EMP "emp" #define LANGUAGE_TONGUE "tongue" #define LANGUAGE_BLOOD_WORM "blood_worm" +#define LANGUAGE_FRENZY "frenzy" // Language flags. Used in granting and removing languages. /// This language can be spoken. diff --git a/code/modules/language/beast.dm b/code/modules/language/beast.dm new file mode 100644 index 000000000000..3c3c1d9c1b59 --- /dev/null +++ b/code/modules/language/beast.dm @@ -0,0 +1,16 @@ +/datum/language/frenzy + name = "Frenzy" + desc = "The language of the Beast." + key = "q" + flags = LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD + space_chance = 100 + sentence_chance = 0 + between_word_sentence_chance = 0 + between_word_space_chance = 100 + additional_syllable_low = 0 + additional_syllable_high = 0 + syllables = list("raaagh", "hiss") //What are hungry noises? + default_priority = 100 + always_use_default_namelist = TRUE // Shouldn't generate names for this anyways + + icon_state = "animal" diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 7043bc95d5b8..adf1628a3c84 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -7,11 +7,17 @@ if(IS_UNCONSCIOUS(src)) return add_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), FRENZY_TRAIT) + + add_blocked_language(subtypesof(/datum/language) - /datum/language/frenzy, LANGUAGE_FRENZY) + grant_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) + AddComponentFrom("frenzy", /datum/component/speechmod, replacements = list("." = "!"), end_string = "!!", uppercase = TRUE) //Not perfect as two vampires in frenzy could have a legible conversation with each other, maybe if a fire happened and every vampire went rotschreck. + message_admins("[ADMIN_LOOKUPFLW(src)] has entered frenzy[target ? " targeting [ADMIN_LOOKUPFLW(target)]": ""]. ([source])") log_combat(src, (src || target), "has frenzied on because of \"[source]\" on") if(fleeing) to_chat(src, span_danger("FLEE.")) + add_trait(src, TRAIT_PACIFISM, FRENZY_TRAIT) //Lore inaccurate, but this forces them to flee instead of ignoring rotshreck and continuing to fight. else to_chat(src, span_bolddanger("FRENZY.")) @@ -25,9 +31,14 @@ /mob/living/proc/exit_frenzy_mode() if(!HAS_TRAIT(src, TRAIT_IN_FRENZY)) return - remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), FRENZY_TRAIT) + remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM), FRENZY_TRAIT) log_message("exited frenzy.", LOG_ATTACK, color="red") + RemoveComponentSource("frenzy", /datum/component/speechmod) + + remove_blocked_language(subtypesof(/datum/language), source = LANGUAGE_FRENZY) + remove_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) + remove_status_effect(/datum/status_effect/frenzy) /datum/storyteller_roll/frenzy diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm index 78508bef81a1..6a79b653d2a4 100644 --- a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm +++ b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm @@ -31,6 +31,8 @@ var/hostile = FALSE /// If use of this power creates a visible Masquerade breach. var/violates_masquerade = FALSE + /// Can this be used while in frenzy + var/frenzy = TRUE /* HOW AND WHEN IT'S ACTIVATED AND DEACTIVATED */ /// If this Discipline doesn't automatically expire, but rather periodically drains blood. diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm index 80076d4ffb7a..123f1a366f5c 100644 --- a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm +++ b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm @@ -122,6 +122,9 @@ if(HAS_TRAIT(target, TRAIT_WEAK_WILLED)) theirpower -= 2 + if(HAS_TRAIT(target, TRAIT_IN_FRENZY)) + theirpower += 2 + if((!(owner.obscured_slots & HIDEFACE))&(HAS_TRAIT(owner, TRAIT_DISFIGURED_APPEARANCE))) // Are we visibly disfigured? theirpower += 2 diff --git a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm index e9826e510354..64d7a60fa163 100644 --- a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm +++ b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm @@ -39,6 +39,9 @@ if((!(owner.obscured_slots & HIDEFACE))&(HAS_TRAIT(owner, TRAIT_DISFIGURED_APPEARANCE))) // Are we visibly disfigured? theirpower += 2 // Increase the difficulty by two. + if(HAS_TRAIT(target, TRAIT_IN_FRENZY)) + theirpower += 2 + if(!get_kindred_splat(target)) // Is our target mortal? if(HAS_TRAIT(owner, TRAIT_GRAVE_SMELL)) // Are we stinky? theirpower += 1 From 048ec795e6bdec0cb01e07c5b637ad883841dee8 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 18 Aug 2026 04:59:30 -0700 Subject: [PATCH 02/21] Now you cant use various disciplines while in frenzy --- .../modules/powers/code/discipline/__discipline_power.dm | 4 ++++ modular_darkpack/modules/powers/code/discipline/animalism.dm | 1 + .../modules/powers/code/discipline/auspex/auspex.dm | 3 +++ .../modules/powers/code/discipline/daimonion/daimonion.dm | 2 ++ .../modules/powers/code/discipline/dominate/dominate.dm | 1 + .../modules/powers/code/discipline/healer_valeren.dm | 3 +++ .../modules/powers/code/discipline/melpominee.dm | 1 + .../modules/powers/code/discipline/mytherceria.dm | 5 +++++ .../modules/powers/code/discipline/necromancy.dm | 1 + .../modules/powers/code/discipline/obeah/obeah.dm | 4 ++++ .../modules/powers/code/discipline/obfuscate/obfuscate.dm | 1 + .../powers/code/discipline/obtenebration/obtenebration.dm | 1 + .../modules/powers/code/discipline/presence/presence.dm | 4 ++++ .../modules/powers/code/discipline/quietus/quietus.dm | 1 + modular_darkpack/modules/powers/code/discipline/serpentis.dm | 2 ++ .../modules/powers/code/discipline/temporis/temporis.dm | 2 ++ .../modules/powers/code/discipline/thanatosis/thanatosis.dm | 2 ++ .../powers/code/discipline/thaumaturgy/path_of_blood.dm | 3 +++ modular_darkpack/modules/powers/code/discipline/valeren.dm | 2 ++ .../powers/code/discipline/vicissitude/vicissitude.dm | 2 ++ .../modules/powers/code/discipline/visceratika.dm | 3 +++ 21 files changed, 48 insertions(+) diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm index 6a79b653d2a4..5db5c1b18542 100644 --- a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm +++ b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm @@ -271,6 +271,10 @@ //feedback is sent by the proc preventing activation return FALSE + if(HAS_TRAIT(owner, TRAIT_IN_FRENZY)) + to_chat(owner, span_warning("You cannot do this while in frenzy!")) + return FALSE + //can't activate if the owner isn't capable of it if (!can_activate_untargeted(alert)) return FALSE diff --git a/modular_darkpack/modules/powers/code/discipline/animalism.dm b/modular_darkpack/modules/powers/code/discipline/animalism.dm index 94de633a1a76..f65c485a4c6c 100644 --- a/modular_darkpack/modules/powers/code/discipline/animalism.dm +++ b/modular_darkpack/modules/powers/code/discipline/animalism.dm @@ -13,6 +13,7 @@ name = "Animalism power name" desc = "Animalism power description" effect_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg' + frenzy = FALSE //SUMMON RAT /datum/discipline_power/animalism/summon_rat diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm index 717542a2312b..0d83189eea94 100644 --- a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm +++ b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm @@ -159,6 +159,7 @@ check_flags = DISC_CHECK_CONSCIOUS vitae_cost = 0 cooldown_length = 1 TURNS + frenzy = FALSE toggled = TRUE @@ -274,6 +275,7 @@ var/datum/storyteller_roll/disguise_voice_roll/disguise_roll COOLDOWN_DECLARE(mind_read_cd) COOLDOWN_DECLARE(implant_tht_cd) + frenzy = FALSE /datum/storyteller_roll/telepathy_success bumper_text = "mind reading" @@ -416,6 +418,7 @@ check_flags = DISC_CHECK_CONSCIOUS vitae_cost = 0 cooldown_length = 1 TURNS + frenzy = FALSE /datum/discipline_power/auspex/psychic_projection/activate() . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm index 8fa7afb7c649..3d5732e75083 100644 --- a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm +++ b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm @@ -27,6 +27,7 @@ range = 7 level = 1 vitae_cost = 0 + frenzy = FALSE cancelable = TRUE var/datum/storyteller_roll/sense_the_sin/sense_the_sin_roll @@ -260,6 +261,7 @@ vitae_cost = 0 var/datum/storyteller_roll/condemnation/condemnation_roll var/list/available_curses + frenzy = FALSE /datum/storyteller_roll/condemnation bumper_text = "condemnation" diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm index 123f1a366f5c..beac12f45bfc 100644 --- a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm +++ b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm @@ -59,6 +59,7 @@ name = "Dominate power name" desc = "Dominate power description" vitae_cost = 0 //No Dominate 1-5 abilities cost blood. + frenzy = FALSE activate_sound = 'modular_darkpack/modules/powers/sounds/dominate.ogg' diff --git a/modular_darkpack/modules/powers/code/discipline/healer_valeren.dm b/modular_darkpack/modules/powers/code/discipline/healer_valeren.dm index 8556a1f3fccb..065d8aeaea99 100644 --- a/modular_darkpack/modules/powers/code/discipline/healer_valeren.dm +++ b/modular_darkpack/modules/powers/code/discipline/healer_valeren.dm @@ -48,6 +48,7 @@ aggravating = TRUE hostile = TRUE + frenzy = FALSE cooldown_length = 20 SECONDS @@ -71,6 +72,7 @@ range = 1 violates_masquerade = TRUE + frenzy = FALSE cooldown_length = 5 SECONDS @@ -112,6 +114,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND target_type = TARGET_LIVING range = 1 + frenzy = FALSE cooldown_length = 5 SECONDS diff --git a/modular_darkpack/modules/powers/code/discipline/melpominee.dm b/modular_darkpack/modules/powers/code/discipline/melpominee.dm index 1764b123a98c..cbaec6c06a8c 100644 --- a/modular_darkpack/modules/powers/code/discipline/melpominee.dm +++ b/modular_darkpack/modules/powers/code/discipline/melpominee.dm @@ -19,6 +19,7 @@ vitae_cost = 1 // All Melpominee powers below 5 dots cost blood except for Missing Voice var/obj/effect/abstract/particle_holder/particle_generator + frenzy = FALSE /datum/discipline_power/melpominee/proc/setup_particles() if(!particle_generator) diff --git a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm index 1b52be5811b2..ab782702b987 100644 --- a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm +++ b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm @@ -25,6 +25,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE target_type = TARGET_MOB range = 7 + frenzy = FALSE cooldown_length = 10 SECONDS @@ -45,6 +46,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND | DISC_CHECK_LYING target_type = TARGET_LIVING range = 3 + frenzy = FALSE cooldown_length = 30 SECONDS @@ -78,6 +80,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND target_type = TARGET_MOB range = 5 + frenzy = FALSE aggravating = TRUE hostile = TRUE @@ -154,6 +157,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE target_type = TARGET_LIVING range = 5 + frenzy = FALSE aggravating = TRUE hostile = TRUE @@ -175,6 +179,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_SPEAK target_type = TARGET_LIVING range = 7 + frenzy = FALSE cooldown_length = 0 diff --git a/modular_darkpack/modules/powers/code/discipline/necromancy.dm b/modular_darkpack/modules/powers/code/discipline/necromancy.dm index ea90656ca714..e0a196f4b05c 100644 --- a/modular_darkpack/modules/powers/code/discipline/necromancy.dm +++ b/modular_darkpack/modules/powers/code/discipline/necromancy.dm @@ -32,6 +32,7 @@ /datum/discipline_power/necromancy name = "Necromancy power name" desc = "Necromancy power description" + frenzy = FALSE //SHROUDSIGHT V20 p. 163 /datum/storyteller_roll/shroudsight diff --git a/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm b/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm index 3faefe9bb145..7802a3f6e1e7 100644 --- a/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm +++ b/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm @@ -174,6 +174,7 @@ var/successes = 0 var/datum/storyteller_roll/anesthetic_touch/touch_roll // these are defined in valeren.dm var/datum/storyteller_roll/anesthetic_touch/unwilling/touch_roll_unwilling + frenzy = FALSE /datum/discipline_power/obeah/anesthetic_touch/pre_activation_checks(mob/living/target) . = ..() @@ -222,6 +223,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE target_type = TARGET_LIVING range = 1 + frenzy = FALSE violates_masquerade = TRUE cooldown_length = 1 TURNS @@ -249,6 +251,7 @@ willpower_cost = 2 cancelable = TRUE var/datum/proximity_monitor/advanced/shepherds_watch/area_of_effect + frenzy = FALSE /datum/discipline_power/obeah/shepherds_watch/activate(atom/target) . = ..() @@ -282,6 +285,7 @@ target_type = TARGET_LIVING range = 1 var/datum/storyteller_roll/mens_sana/discipline_roll + frenzy = FALSE /datum/storyteller_roll/mens_sana bumper_text = "mens sana" diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm index e76f6a3188f8..428c41a29bc9 100644 --- a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm +++ b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm @@ -355,6 +355,7 @@ level = 5 check_flags = DISC_CHECK_CAPABLE vitae_cost = 0 + frenzy = FALSE toggled = TRUE diff --git a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm index 59c3410b92de..7e9d9ab8a0c9 100644 --- a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm +++ b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm @@ -51,6 +51,7 @@ multi_activate = TRUE duration_length = 1 SCENES cooldown_length = 1 TURNS + frenzy = FALSE var/list/shadows = list() // A list of all active shadows var/datum/action/clear_shadows/cbutton // The button to clear everything diff --git a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm index 64d7a60fa163..3e915a3290d0 100644 --- a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm +++ b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm @@ -105,6 +105,7 @@ vitae_cost = 1 var/successes = 0 var/list/affected_targets = list() + frenzy = FALSE /datum/discipline_power/presence/awe/pre_activation_checks() . = ..() @@ -224,6 +225,7 @@ duration_length = 5 SECONDS vitae_cost = 1 var/successes = 0 + frenzy = FALSE /datum/discipline_power/presence/entrancement/pre_activation_checks(mob/living/target) @@ -268,6 +270,7 @@ vitae_cost = 1 var/successes = 0 var/mob/living/carbon/human/summon_target + frenzy = FALSE /datum/discipline_power/presence/summon/pre_activation_checks(mob/living/target) var/summon_target_name = tgui_input_text(owner, "Summon Target:", "Summon Target") @@ -338,6 +341,7 @@ willpower_cost = 1 violates_masquerade = TRUE var/list/affected_targets = list() + frenzy = FALSE /datum/discipline_power/presence/majesty/pre_activation_checks(mob/living/target) return TRUE diff --git a/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm b/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm index a66d799ce87f..eb1fdb014f33 100644 --- a/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm +++ b/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm @@ -30,6 +30,7 @@ duration_length = 1 SCENES cooldown_length = 2 SCENES var/datum/proximity_monitor/advanced/silence_of_death/silence_field + frenzy = FALSE /datum/discipline_power/quietus/silence_of_death/activate() . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/serpentis.dm b/modular_darkpack/modules/powers/code/discipline/serpentis.dm index 2548b1162b65..b1ffd1e72887 100644 --- a/modular_darkpack/modules/powers/code/discipline/serpentis.dm +++ b/modular_darkpack/modules/powers/code/discipline/serpentis.dm @@ -31,6 +31,7 @@ aggravating = FALSE hostile = FALSE violates_masquerade = TRUE + frenzy = FALSE multi_activate = TRUE duration_length = 5 SECONDS @@ -266,6 +267,7 @@ vitae_cost = 0 violates_masquerade = TRUE + frenzy = FALSE cooldown_length = 20 SECONDS diff --git a/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm index 9ce9fff065f5..fe944052c365 100644 --- a/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm +++ b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm @@ -81,6 +81,7 @@ vitae_cost = 0 //You *can* spend a BP to boost this, but it'd extend time to hours or a day. hostile = TRUE + frenzy = FALSE cooldown_length = 15 SECONDS @@ -125,6 +126,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE violates_masquerade = TRUE + frenzy = FALSE cancelable = TRUE duration_length = 10 SECONDS diff --git a/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm b/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm index fd0a16f90192..3510049c5e08 100644 --- a/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm +++ b/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm @@ -29,6 +29,7 @@ cancelable = TRUE duration_length = 1 HOURS var/datum/storyteller_roll/hags_wrinkles/hags_wrinkles_roll + frenzy = FALSE /datum/storyteller_roll/hags_wrinkles bumper_text = "hag's wrinkles" @@ -156,6 +157,7 @@ cancelable = TRUE duration_length = 0 cooldown_length = 1 TURNS + frenzy = FALSE var/datum/action/cooldown/spell/shapeshift/samedi_ash/dust_transformation diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm index b790df7aae90..cfe22e53ad8c 100644 --- a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm +++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm @@ -86,6 +86,7 @@ aggravating = FALSE hostile = FALSE violates_masquerade = FALSE + frenzy = FALSE grouped_powers = list( /datum/discipline_power/thaumaturgy/blood_rage, @@ -163,6 +164,7 @@ aggravating = FALSE hostile = FALSE violates_masquerade = FALSE + frenzy = FALSE grouped_powers = list( /datum/discipline_power/thaumaturgy/a_taste_for_blood, @@ -199,6 +201,7 @@ aggravating = FALSE hostile = FALSE violates_masquerade = FALSE + frenzy = FALSE grouped_powers = list() var/activated = FALSE diff --git a/modular_darkpack/modules/powers/code/discipline/valeren.dm b/modular_darkpack/modules/powers/code/discipline/valeren.dm index 049bf87a9aee..827b1dc2723f 100644 --- a/modular_darkpack/modules/powers/code/discipline/valeren.dm +++ b/modular_darkpack/modules/powers/code/discipline/valeren.dm @@ -196,6 +196,7 @@ var/successes = 0 var/datum/storyteller_roll/anesthetic_touch/touch_roll var/datum/storyteller_roll/anesthetic_touch/unwilling/touch_roll_unwilling + frenzy = FALSE /datum/discipline_power/valeren/anesthetic_touch/pre_activation_checks(mob/living/target) . = ..() @@ -441,6 +442,7 @@ check_flags = DISC_CHECK_CAPABLE toggled = TRUE duration_length = 1 TURNS + frenzy = FALSE /datum/discipline_power/valeren/vengeance_of_samiel/activate() . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm index 59c01f28be5d..5f3da978797d 100644 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm @@ -45,6 +45,7 @@ cooldown_length = 1 TURNS vitae_cost = 1 toggled = FALSE + frenzy = FALSE /datum/discipline_power/vicissitude/malleable_visage/activate(atom/target) . = ..() @@ -64,6 +65,7 @@ range = 1 toggled = FALSE cooldown_length = 1 TURNS + frenzy = FALSE /datum/discipline_power/vicissitude/fleshcrafting/activate(atom/movable/target) . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/visceratika.dm b/modular_darkpack/modules/powers/code/discipline/visceratika.dm index 894eb7c6c1db..3621bf30a968 100644 --- a/modular_darkpack/modules/powers/code/discipline/visceratika.dm +++ b/modular_darkpack/modules/powers/code/discipline/visceratika.dm @@ -34,6 +34,7 @@ duration_length = 1 SCENES cancelable = TRUE vitae_cost = 1 + frenzy = FALSE /datum/discipline_power/visceratika/skin_of_the_chameleon/activate() . = ..() @@ -66,6 +67,7 @@ toggled = TRUE var/datum/storyteller_roll/scry_the_hearthstone/scry_roll var/area/monitoring_area + frenzy = FALSE /datum/storyteller_roll/scry_the_hearthstone bumper_text = "scry the hearthstone" @@ -185,6 +187,7 @@ cooldown_length = 10 SECONDS var/datum/weakref/exit_turf var/datum/weakref/stone_turf + frenzy = FALSE /datum/discipline_power/visceratika/bond_with_the_mountain/pre_activation_checks() . = ..() From 2e097e5133c6d67ceb2a07f1a21263fb68b1b7ae Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 18 Aug 2026 05:13:03 -0700 Subject: [PATCH 03/21] Update frenzy.dm --- modular_darkpack/modules/frenzy/code/frenzy.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index adf1628a3c84..1ec0f1d3dcbc 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -8,6 +8,8 @@ return add_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), FRENZY_TRAIT) + set_jitter_if_lower(1 SCENES) + add_blocked_language(subtypesof(/datum/language) - /datum/language/frenzy, LANGUAGE_FRENZY) grant_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) AddComponentFrom("frenzy", /datum/component/speechmod, replacements = list("." = "!"), end_string = "!!", uppercase = TRUE) //Not perfect as two vampires in frenzy could have a legible conversation with each other, maybe if a fire happened and every vampire went rotschreck. From 7a6e93c7891e274bc34996c98dbe3b3c4c03ac54 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 18 Aug 2026 05:18:08 -0700 Subject: [PATCH 04/21] Update frenzy.dm --- modular_darkpack/modules/frenzy/code/frenzy.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 1ec0f1d3dcbc..3167db41837b 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -22,6 +22,7 @@ add_trait(src, TRAIT_PACIFISM, FRENZY_TRAIT) //Lore inaccurate, but this forces them to flee instead of ignoring rotshreck and continuing to fight. else to_chat(src, span_bolddanger("FRENZY.")) + add_trait(src, TRAIT_PERMAFANGS, FRENZY_TRAIT) //You're hangry and can't wait to eat. SEND_SOUND(src, sound('modular_darkpack/modules/frenzy/sounds/frenzy.ogg', volume = 50)) @@ -33,7 +34,7 @@ /mob/living/proc/exit_frenzy_mode() if(!HAS_TRAIT(src, TRAIT_IN_FRENZY)) return - remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM), FRENZY_TRAIT) + remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS), FRENZY_TRAIT) log_message("exited frenzy.", LOG_ATTACK, color="red") RemoveComponentSource("frenzy", /datum/component/speechmod) From 3d720ddbb752110c6f494774b1d4e498427b0a08 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:46:48 -0700 Subject: [PATCH 05/21] Apply suggestions from code review Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- .../modules/powers/code/discipline/__discipline_power.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm index 5db5c1b18542..a49e494a9dac 100644 --- a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm +++ b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm @@ -32,7 +32,7 @@ /// If use of this power creates a visible Masquerade breach. var/violates_masquerade = FALSE /// Can this be used while in frenzy - var/frenzy = TRUE + var/frenzy_usable = TRUE /* HOW AND WHEN IT'S ACTIVATED AND DEACTIVATED */ /// If this Discipline doesn't automatically expire, but rather periodically drains blood. @@ -271,7 +271,7 @@ //feedback is sent by the proc preventing activation return FALSE - if(HAS_TRAIT(owner, TRAIT_IN_FRENZY)) + if(!frenzy_usable && HAS_TRAIT(owner, TRAIT_IN_FRENZY)) to_chat(owner, span_warning("You cannot do this while in frenzy!")) return FALSE From c35fbdca3053e8a234f89a14b0d9aa95b9204348 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:59:12 -0700 Subject: [PATCH 06/21] Fixes --- .../modules/frenzy/code/beast_language.dm | 0 modular_darkpack/modules/frenzy/code/frenzy.dm | 2 +- .../modules/powers/code/discipline/animalism.dm | 2 +- .../modules/powers/code/discipline/auspex/auspex.dm | 6 +++--- .../modules/powers/code/discipline/daimonion/daimonion.dm | 4 ++-- .../modules/powers/code/discipline/dominate/dominate.dm | 2 +- .../modules/powers/code/discipline/melpominee.dm | 2 +- .../modules/powers/code/discipline/mytherceria.dm | 8 ++++---- .../modules/powers/code/discipline/necromancy.dm | 2 +- .../modules/powers/code/discipline/obeah/obeah.dm | 8 ++++---- .../modules/powers/code/discipline/obfuscate/obfuscate.dm | 5 ++++- .../powers/code/discipline/obtenebration/obtenebration.dm | 2 +- .../modules/powers/code/discipline/presence/presence.dm | 8 ++++---- .../modules/powers/code/discipline/quietus/quietus.dm | 2 +- .../modules/powers/code/discipline/serpentis.dm | 4 ++-- .../modules/powers/code/discipline/temporis/temporis.dm | 4 ++-- .../powers/code/discipline/thanatosis/thanatosis.dm | 2 +- .../powers/code/discipline/thaumaturgy/path_of_blood.dm | 6 +++--- .../modules/powers/code/discipline/valeren.dm | 4 ++-- .../powers/code/discipline/vicissitude/vicissitude.dm | 4 ++-- .../modules/powers/code/discipline/visceratika.dm | 6 +++--- tgstation.dme | 1 + 22 files changed, 44 insertions(+), 40 deletions(-) rename code/modules/language/beast.dm => modular_darkpack/modules/frenzy/code/beast_language.dm (100%) diff --git a/code/modules/language/beast.dm b/modular_darkpack/modules/frenzy/code/beast_language.dm similarity index 100% rename from code/modules/language/beast.dm rename to modular_darkpack/modules/frenzy/code/beast_language.dm diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 3167db41837b..7ec0806af7e9 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -11,7 +11,7 @@ set_jitter_if_lower(1 SCENES) add_blocked_language(subtypesof(/datum/language) - /datum/language/frenzy, LANGUAGE_FRENZY) - grant_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) + grant_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) AddComponentFrom("frenzy", /datum/component/speechmod, replacements = list("." = "!"), end_string = "!!", uppercase = TRUE) //Not perfect as two vampires in frenzy could have a legible conversation with each other, maybe if a fire happened and every vampire went rotschreck. message_admins("[ADMIN_LOOKUPFLW(src)] has entered frenzy[target ? " targeting [ADMIN_LOOKUPFLW(target)]": ""]. ([source])") diff --git a/modular_darkpack/modules/powers/code/discipline/animalism.dm b/modular_darkpack/modules/powers/code/discipline/animalism.dm index f65c485a4c6c..0c0b1344f03c 100644 --- a/modular_darkpack/modules/powers/code/discipline/animalism.dm +++ b/modular_darkpack/modules/powers/code/discipline/animalism.dm @@ -13,7 +13,7 @@ name = "Animalism power name" desc = "Animalism power description" effect_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg' - frenzy = FALSE + frenzy_usable = FALSE //SUMMON RAT /datum/discipline_power/animalism/summon_rat diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm index 0d83189eea94..f955fb6fb2fe 100644 --- a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm +++ b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm @@ -159,7 +159,7 @@ check_flags = DISC_CHECK_CONSCIOUS vitae_cost = 0 cooldown_length = 1 TURNS - frenzy = FALSE + frenzy_usable = FALSE toggled = TRUE @@ -275,7 +275,7 @@ var/datum/storyteller_roll/disguise_voice_roll/disguise_roll COOLDOWN_DECLARE(mind_read_cd) COOLDOWN_DECLARE(implant_tht_cd) - frenzy = FALSE + frenzy_usable = FALSE /datum/storyteller_roll/telepathy_success bumper_text = "mind reading" @@ -418,7 +418,7 @@ check_flags = DISC_CHECK_CONSCIOUS vitae_cost = 0 cooldown_length = 1 TURNS - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/auspex/psychic_projection/activate() . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm index 3d5732e75083..c887b1856e99 100644 --- a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm +++ b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm @@ -27,7 +27,7 @@ range = 7 level = 1 vitae_cost = 0 - frenzy = FALSE + frenzy_usable = FALSE cancelable = TRUE var/datum/storyteller_roll/sense_the_sin/sense_the_sin_roll @@ -261,7 +261,7 @@ vitae_cost = 0 var/datum/storyteller_roll/condemnation/condemnation_roll var/list/available_curses - frenzy = FALSE + frenzy_usable = FALSE /datum/storyteller_roll/condemnation bumper_text = "condemnation" diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm index beac12f45bfc..52a91f7bc066 100644 --- a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm +++ b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm @@ -59,7 +59,7 @@ name = "Dominate power name" desc = "Dominate power description" vitae_cost = 0 //No Dominate 1-5 abilities cost blood. - frenzy = FALSE + frenzy_usable = FALSE activate_sound = 'modular_darkpack/modules/powers/sounds/dominate.ogg' diff --git a/modular_darkpack/modules/powers/code/discipline/melpominee.dm b/modular_darkpack/modules/powers/code/discipline/melpominee.dm index cbaec6c06a8c..ed78dc9a2fa9 100644 --- a/modular_darkpack/modules/powers/code/discipline/melpominee.dm +++ b/modular_darkpack/modules/powers/code/discipline/melpominee.dm @@ -19,7 +19,7 @@ vitae_cost = 1 // All Melpominee powers below 5 dots cost blood except for Missing Voice var/obj/effect/abstract/particle_holder/particle_generator - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/melpominee/proc/setup_particles() if(!particle_generator) diff --git a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm index ab782702b987..e2eeb5e1421d 100644 --- a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm +++ b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm @@ -25,7 +25,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE target_type = TARGET_MOB range = 7 - frenzy = FALSE + frenzy_usable = FALSE cooldown_length = 10 SECONDS @@ -80,7 +80,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND target_type = TARGET_MOB range = 5 - frenzy = FALSE + frenzy_usable = FALSE aggravating = TRUE hostile = TRUE @@ -157,7 +157,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE target_type = TARGET_LIVING range = 5 - frenzy = FALSE + frenzy_usable = FALSE aggravating = TRUE hostile = TRUE @@ -179,7 +179,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_SPEAK target_type = TARGET_LIVING range = 7 - frenzy = FALSE + frenzy_usable = FALSE cooldown_length = 0 diff --git a/modular_darkpack/modules/powers/code/discipline/necromancy.dm b/modular_darkpack/modules/powers/code/discipline/necromancy.dm index e0a196f4b05c..d8e15c521709 100644 --- a/modular_darkpack/modules/powers/code/discipline/necromancy.dm +++ b/modular_darkpack/modules/powers/code/discipline/necromancy.dm @@ -32,7 +32,7 @@ /datum/discipline_power/necromancy name = "Necromancy power name" desc = "Necromancy power description" - frenzy = FALSE + frenzy_usable = FALSE //SHROUDSIGHT V20 p. 163 /datum/storyteller_roll/shroudsight diff --git a/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm b/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm index 7802a3f6e1e7..8fe1d909461d 100644 --- a/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm +++ b/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm @@ -174,7 +174,7 @@ var/successes = 0 var/datum/storyteller_roll/anesthetic_touch/touch_roll // these are defined in valeren.dm var/datum/storyteller_roll/anesthetic_touch/unwilling/touch_roll_unwilling - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/obeah/anesthetic_touch/pre_activation_checks(mob/living/target) . = ..() @@ -223,7 +223,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE target_type = TARGET_LIVING range = 1 - frenzy = FALSE + frenzy_usable = FALSE violates_masquerade = TRUE cooldown_length = 1 TURNS @@ -251,7 +251,7 @@ willpower_cost = 2 cancelable = TRUE var/datum/proximity_monitor/advanced/shepherds_watch/area_of_effect - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/obeah/shepherds_watch/activate(atom/target) . = ..() @@ -285,7 +285,7 @@ target_type = TARGET_LIVING range = 1 var/datum/storyteller_roll/mens_sana/discipline_roll - frenzy = FALSE + frenzy_usable = FALSE /datum/storyteller_roll/mens_sana bumper_text = "mens sana" diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm index 428c41a29bc9..ddb7ddaa0048 100644 --- a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm +++ b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm @@ -94,6 +94,7 @@ /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, /datum/discipline_power/obfuscate/cloak_the_gathering ) + frenzy_usable = FALSE /datum/discipline_power/obfuscate/cloak_of_shadows/pre_activation_checks() . = ..() @@ -136,6 +137,7 @@ level = 2 check_flags = DISC_CHECK_CAPABLE vitae_cost = 0 + frenzy_usable = FALSE toggled = TRUE @@ -189,6 +191,7 @@ level = 3 check_flags = DISC_CHECK_CAPABLE vitae_cost = 0 // vitae cost handled in activate() + frenzy_usable = FALSE toggled = TRUE grouped_powers = list( @@ -355,7 +358,7 @@ level = 5 check_flags = DISC_CHECK_CAPABLE vitae_cost = 0 - frenzy = FALSE + frenzy_usable = FALSE toggled = TRUE diff --git a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm index 7e9d9ab8a0c9..786dcfda8630 100644 --- a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm +++ b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm @@ -51,7 +51,7 @@ multi_activate = TRUE duration_length = 1 SCENES cooldown_length = 1 TURNS - frenzy = FALSE + frenzy_usable = FALSE var/list/shadows = list() // A list of all active shadows var/datum/action/clear_shadows/cbutton // The button to clear everything diff --git a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm index 3e915a3290d0..e769ddcfea60 100644 --- a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm +++ b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm @@ -105,7 +105,7 @@ vitae_cost = 1 var/successes = 0 var/list/affected_targets = list() - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/presence/awe/pre_activation_checks() . = ..() @@ -225,7 +225,7 @@ duration_length = 5 SECONDS vitae_cost = 1 var/successes = 0 - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/presence/entrancement/pre_activation_checks(mob/living/target) @@ -270,7 +270,7 @@ vitae_cost = 1 var/successes = 0 var/mob/living/carbon/human/summon_target - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/presence/summon/pre_activation_checks(mob/living/target) var/summon_target_name = tgui_input_text(owner, "Summon Target:", "Summon Target") @@ -341,7 +341,7 @@ willpower_cost = 1 violates_masquerade = TRUE var/list/affected_targets = list() - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/presence/majesty/pre_activation_checks(mob/living/target) return TRUE diff --git a/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm b/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm index eb1fdb014f33..cb0351f65bbc 100644 --- a/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm +++ b/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm @@ -30,7 +30,7 @@ duration_length = 1 SCENES cooldown_length = 2 SCENES var/datum/proximity_monitor/advanced/silence_of_death/silence_field - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/quietus/silence_of_death/activate() . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/serpentis.dm b/modular_darkpack/modules/powers/code/discipline/serpentis.dm index b1ffd1e72887..b93fcc8b64e0 100644 --- a/modular_darkpack/modules/powers/code/discipline/serpentis.dm +++ b/modular_darkpack/modules/powers/code/discipline/serpentis.dm @@ -31,7 +31,7 @@ aggravating = FALSE hostile = FALSE violates_masquerade = TRUE - frenzy = FALSE + frenzy_usable = FALSE multi_activate = TRUE duration_length = 5 SECONDS @@ -267,7 +267,7 @@ vitae_cost = 0 violates_masquerade = TRUE - frenzy = FALSE + frenzy_usable = FALSE cooldown_length = 20 SECONDS diff --git a/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm index fe944052c365..328b92b4ad0c 100644 --- a/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm +++ b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm @@ -81,7 +81,7 @@ vitae_cost = 0 //You *can* spend a BP to boost this, but it'd extend time to hours or a day. hostile = TRUE - frenzy = FALSE + frenzy_usable = FALSE cooldown_length = 15 SECONDS @@ -126,7 +126,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE violates_masquerade = TRUE - frenzy = FALSE + frenzy_usable = FALSE cancelable = TRUE duration_length = 10 SECONDS diff --git a/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm b/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm index 3510049c5e08..93f08106421e 100644 --- a/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm +++ b/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm @@ -157,7 +157,7 @@ cancelable = TRUE duration_length = 0 cooldown_length = 1 TURNS - frenzy = FALSE + frenzy_usable = FALSE var/datum/action/cooldown/spell/shapeshift/samedi_ash/dust_transformation diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm index cfe22e53ad8c..b91ed6258d88 100644 --- a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm +++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm @@ -86,7 +86,7 @@ aggravating = FALSE hostile = FALSE violates_masquerade = FALSE - frenzy = FALSE + frenzy_usable = FALSE grouped_powers = list( /datum/discipline_power/thaumaturgy/blood_rage, @@ -164,7 +164,7 @@ aggravating = FALSE hostile = FALSE violates_masquerade = FALSE - frenzy = FALSE + frenzy_usable = FALSE grouped_powers = list( /datum/discipline_power/thaumaturgy/a_taste_for_blood, @@ -201,7 +201,7 @@ aggravating = FALSE hostile = FALSE violates_masquerade = FALSE - frenzy = FALSE + frenzy_usable = FALSE grouped_powers = list() var/activated = FALSE diff --git a/modular_darkpack/modules/powers/code/discipline/valeren.dm b/modular_darkpack/modules/powers/code/discipline/valeren.dm index 827b1dc2723f..4351cf48c724 100644 --- a/modular_darkpack/modules/powers/code/discipline/valeren.dm +++ b/modular_darkpack/modules/powers/code/discipline/valeren.dm @@ -196,7 +196,7 @@ var/successes = 0 var/datum/storyteller_roll/anesthetic_touch/touch_roll var/datum/storyteller_roll/anesthetic_touch/unwilling/touch_roll_unwilling - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/valeren/anesthetic_touch/pre_activation_checks(mob/living/target) . = ..() @@ -442,7 +442,7 @@ check_flags = DISC_CHECK_CAPABLE toggled = TRUE duration_length = 1 TURNS - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/valeren/vengeance_of_samiel/activate() . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm index 5f3da978797d..7b0ff7428811 100644 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm @@ -45,7 +45,7 @@ cooldown_length = 1 TURNS vitae_cost = 1 toggled = FALSE - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/vicissitude/malleable_visage/activate(atom/target) . = ..() @@ -65,7 +65,7 @@ range = 1 toggled = FALSE cooldown_length = 1 TURNS - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/vicissitude/fleshcrafting/activate(atom/movable/target) . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/visceratika.dm b/modular_darkpack/modules/powers/code/discipline/visceratika.dm index 3621bf30a968..5d91c47ee82a 100644 --- a/modular_darkpack/modules/powers/code/discipline/visceratika.dm +++ b/modular_darkpack/modules/powers/code/discipline/visceratika.dm @@ -34,7 +34,7 @@ duration_length = 1 SCENES cancelable = TRUE vitae_cost = 1 - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/visceratika/skin_of_the_chameleon/activate() . = ..() @@ -67,7 +67,7 @@ toggled = TRUE var/datum/storyteller_roll/scry_the_hearthstone/scry_roll var/area/monitoring_area - frenzy = FALSE + frenzy_usable = FALSE /datum/storyteller_roll/scry_the_hearthstone bumper_text = "scry the hearthstone" @@ -187,7 +187,7 @@ cooldown_length = 10 SECONDS var/datum/weakref/exit_turf var/datum/weakref/stone_turf - frenzy = FALSE + frenzy_usable = FALSE /datum/discipline_power/visceratika/bond_with_the_mountain/pre_activation_checks() . = ..() diff --git a/tgstation.dme b/tgstation.dme index 81fbe8c2615c..9e7223f5d682 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7561,6 +7561,7 @@ #include "modular_darkpack\modules\forensics\code\forensic_gatherer.dm" #include "modular_darkpack\modules\forensics\code\serial_number_log.dm" #include "modular_darkpack\modules\forensics\code\serial_numbering.dm" +#include "modular_darkpack\modules\frenzy\code\beast_language.dm" #include "modular_darkpack\modules\frenzy\code\frenzy.dm" #include "modular_darkpack\modules\frenzy\code\frenzy_helpers.dm" #include "modular_darkpack\modules\frenzy\code\status_effect.dm" From a610197480d982b3b9dff96e926ebf2f95864a9b Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 18 Aug 2026 12:03:51 -0700 Subject: [PATCH 07/21] forgot this --- modular_darkpack/modules/powers/code/discipline/mytherceria.dm | 2 +- .../modules/powers/code/discipline/thanatosis/thanatosis.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm index e2eeb5e1421d..277d142fd1fb 100644 --- a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm +++ b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm @@ -46,7 +46,7 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND | DISC_CHECK_LYING target_type = TARGET_LIVING range = 3 - frenzy = FALSE + frenzy_usable = FALSE cooldown_length = 30 SECONDS diff --git a/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm b/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm index 93f08106421e..bd010b6300db 100644 --- a/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm +++ b/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm @@ -29,7 +29,7 @@ cancelable = TRUE duration_length = 1 HOURS var/datum/storyteller_roll/hags_wrinkles/hags_wrinkles_roll - frenzy = FALSE + frenzy_usable = FALSE /datum/storyteller_roll/hags_wrinkles bumper_text = "hag's wrinkles" From 88debee511d57ae1566f20717fd320d2c0955fd9 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:07:15 -0700 Subject: [PATCH 08/21] Update frenzy.dm --- modular_darkpack/modules/frenzy/code/frenzy.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 7ec0806af7e9..5d7f13962aa8 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -19,10 +19,10 @@ if(fleeing) to_chat(src, span_danger("FLEE.")) - add_trait(src, TRAIT_PACIFISM, FRENZY_TRAIT) //Lore inaccurate, but this forces them to flee instead of ignoring rotshreck and continuing to fight. + add_traits(list(TRAIT_PACIFISM), FRENZY_TRAIT) //Lore inaccurate, but this forces them to flee instead of ignoring rotshreck and continuing to fight. else to_chat(src, span_bolddanger("FRENZY.")) - add_trait(src, TRAIT_PERMAFANGS, FRENZY_TRAIT) //You're hangry and can't wait to eat. + add_traits(list(TRAIT_PERMAFANGS), FRENZY_TRAIT) //You're hangry and can't wait to eat. SEND_SOUND(src, sound('modular_darkpack/modules/frenzy/sounds/frenzy.ogg', volume = 50)) From 76187bdf8e85c2d7c440a80278e961919126208e Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 20 Aug 2026 10:56:00 -0700 Subject: [PATCH 09/21] Language stuff --- code/__DEFINES/language.dm | 2 +- modular_darkpack/modules/frenzy/code/frenzy.dm | 16 +++++++++++++++- .../modules/powers/code/discipline/animalism.dm | 1 - 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 776fea0ccecd..c2c3eabbd7f4 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -54,7 +54,7 @@ #define LANGUAGE_EMP "emp" #define LANGUAGE_TONGUE "tongue" #define LANGUAGE_BLOOD_WORM "blood_worm" -#define LANGUAGE_FRENZY "frenzy" +#define LANGUAGE_FRENZY "frenzy" //DARKPACK EDIT: ADDS FRENZY LANGUAGE FOR VAMPIRES // Language flags. Used in granting and removing languages. /// This language can be spoken. diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 37a4ff87726e..13b59becfe97 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -12,7 +12,8 @@ add_blocked_language(subtypesof(/datum/language) - /datum/language/frenzy, LANGUAGE_FRENZY) grant_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) - AddComponentFrom("frenzy", /datum/component/speechmod, replacements = list("." = "!"), end_string = "!!", uppercase = TRUE) //Not perfect as two vampires in frenzy could have a legible conversation with each other, maybe if a fire happened and every vampire went rotschreck. + RegisterSignal(src, COMSIG_MOB_SAY, PROC_REF(handle_frenzy_speech)) + AddComponentFrom("frenzy", /datum/component/speechmod, replacements = list("." = "!"), end_string = "!!", uppercase = TRUE) message_admins("[ADMIN_LOOKUPFLW(src)] has entered frenzy[target ? " targeting [ADMIN_LOOKUPFLW(target)]": ""]. ([source])") log_combat(src, (src || target), "has frenzied on because of \"[source]\" on") @@ -38,12 +39,25 @@ log_message("exited frenzy.", LOG_ATTACK, color="red") RemoveComponentSource("frenzy", /datum/component/speechmod) + UnregisterSignal(src, list(COMSIG_MOB_SAY)) remove_blocked_language(subtypesof(/datum/language), source = LANGUAGE_FRENZY) remove_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) remove_status_effect(/datum/status_effect/frenzy) +/mob/living/proc/handle_frenzy_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + var/message = speech_args[SPEECH_MESSAGE] + if(message) + var/list/message_split = splittext(message, " ") + var/list/new_message = list() + for(var/word in message_split) + new_message += pick("HISS!!!","RAAAGH!!!", "FFFFF!!!") + + message = jointext(new_message, " ") + /datum/storyteller_roll/frenzy abstract_type = /datum/storyteller_roll/frenzy bumper_text = "frenzy" diff --git a/modular_darkpack/modules/powers/code/discipline/animalism.dm b/modular_darkpack/modules/powers/code/discipline/animalism.dm index 0c0b1344f03c..94de633a1a76 100644 --- a/modular_darkpack/modules/powers/code/discipline/animalism.dm +++ b/modular_darkpack/modules/powers/code/discipline/animalism.dm @@ -13,7 +13,6 @@ name = "Animalism power name" desc = "Animalism power description" effect_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg' - frenzy_usable = FALSE //SUMMON RAT /datum/discipline_power/animalism/summon_rat From c9ba310e2ee3f76228ce0127d2004a506bc05377 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 20 Aug 2026 11:01:40 -0700 Subject: [PATCH 10/21] Update frenzy.dm --- modular_darkpack/modules/frenzy/code/frenzy.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 13b59becfe97..ace96401da4d 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -23,6 +23,8 @@ add_traits(list(TRAIT_PACIFISM), FRENZY_TRAIT) //Lore inaccurate, but this forces them to flee instead of ignoring rotshreck and continuing to fight. else to_chat(src, span_bolddanger("FRENZY.")) + if(!HAS_TRAIT(src, TRAIT_PERMAFANGS)) //If you already have fangs, you don't grow them suddenly. + src.balloon_alert_to_viewers("grows fangs!") add_traits(list(TRAIT_PERMAFANGS), FRENZY_TRAIT) //You're hangry and can't wait to eat. SEND_SOUND(src, sound('modular_darkpack/modules/frenzy/sounds/frenzy.ogg', volume = 50)) From 3c6a2727b9020f83c17c4f728358b86bd264bb76 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 21 Aug 2026 22:00:29 -0700 Subject: [PATCH 11/21] Update _tongue.dm --- code/modules/surgery/organs/internal/tongue/_tongue.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index b42ce46c0675..1ee7e1aa3299 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -104,6 +104,7 @@ /datum/language/nekomimetic, /datum/language/garou_tongue, /datum/language/primal_tongue, + /datum/language/frenzy ) for(var/datum/language/lang as anything in subtypesof(/datum/language)) if(lang.restricted) From a2112cdd68129ede3ee286352897d638d6acac96 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sat, 22 Aug 2026 22:19:41 -0700 Subject: [PATCH 12/21] Update frenzy.dm --- modular_darkpack/modules/frenzy/code/frenzy.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index ace96401da4d..529424b76515 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -25,7 +25,7 @@ to_chat(src, span_bolddanger("FRENZY.")) if(!HAS_TRAIT(src, TRAIT_PERMAFANGS)) //If you already have fangs, you don't grow them suddenly. src.balloon_alert_to_viewers("grows fangs!") - add_traits(list(TRAIT_PERMAFANGS), FRENZY_TRAIT) //You're hangry and can't wait to eat. + add_traits(list(TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER), FRENZY_TRAIT) //You're hangry and can't wait to eat. SEND_SOUND(src, sound('modular_darkpack/modules/frenzy/sounds/frenzy.ogg', volume = 50)) @@ -37,7 +37,7 @@ /mob/living/proc/exit_frenzy_mode() if(!HAS_TRAIT(src, TRAIT_IN_FRENZY)) return - remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS), FRENZY_TRAIT) + remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER), FRENZY_TRAIT) log_message("exited frenzy.", LOG_ATTACK, color="red") RemoveComponentSource("frenzy", /datum/component/speechmod) From 5f2f0d0465f0c803d0c651f692bebb0c4550c0c6 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:01:25 -0700 Subject: [PATCH 13/21] Finally Now you cannot speak while in frenzy --- .../code/modules/mob/living/living_say.dm | 5 +++++ modular_darkpack/modules/frenzy/code/frenzy.dm | 17 ----------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/modular_darkpack/master_files/code/modules/mob/living/living_say.dm b/modular_darkpack/master_files/code/modules/mob/living/living_say.dm index 019d54697b00..aab3a158a925 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/living_say.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/living_say.dm @@ -1,4 +1,9 @@ /mob/living/send_speech(message_raw, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language = null, list/message_mods = list(), forced = null, tts_message, list/tts_filter) + if(HAS_TRAIT(src, TRAIT_IN_FRENZY)) + var/list/random_emote = list("growl", "hiss") //I would include *scream but for some reason it isn't working. + emote(pick(random_emote)) + return + . = ..() if(!blooper) return diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 529424b76515..521879cb8e12 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -12,8 +12,6 @@ add_blocked_language(subtypesof(/datum/language) - /datum/language/frenzy, LANGUAGE_FRENZY) grant_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) - RegisterSignal(src, COMSIG_MOB_SAY, PROC_REF(handle_frenzy_speech)) - AddComponentFrom("frenzy", /datum/component/speechmod, replacements = list("." = "!"), end_string = "!!", uppercase = TRUE) message_admins("[ADMIN_LOOKUPFLW(src)] has entered frenzy[target ? " targeting [ADMIN_LOOKUPFLW(target)]": ""]. ([source])") log_combat(src, (src || target), "has frenzied on because of \"[source]\" on") @@ -40,26 +38,11 @@ remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER), FRENZY_TRAIT) log_message("exited frenzy.", LOG_ATTACK, color="red") - RemoveComponentSource("frenzy", /datum/component/speechmod) - UnregisterSignal(src, list(COMSIG_MOB_SAY)) - remove_blocked_language(subtypesof(/datum/language), source = LANGUAGE_FRENZY) remove_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) remove_status_effect(/datum/status_effect/frenzy) -/mob/living/proc/handle_frenzy_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - var/message = speech_args[SPEECH_MESSAGE] - if(message) - var/list/message_split = splittext(message, " ") - var/list/new_message = list() - for(var/word in message_split) - new_message += pick("HISS!!!","RAAAGH!!!", "FFFFF!!!") - - message = jointext(new_message, " ") - /datum/storyteller_roll/frenzy abstract_type = /datum/storyteller_roll/frenzy bumper_text = "frenzy" From 92332ff3c3cc0e11a7eb34788f08b16204c3b61d Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 28 Aug 2026 03:48:43 -0700 Subject: [PATCH 14/21] It works --- code/datums/status_effects/debuffs/debuffs.dm | 44 ++++++++++++------- code/game/say.dm | 14 +++--- .../surgery/organs/internal/tongue/_tongue.dm | 1 - .../modules/frenzy/code/beast_language.dm | 16 ------- .../modules/frenzy/code/frenzy.dm | 6 --- .../modules/frenzy/code/status_effect.dm | 9 ++++ tgstation.dme | 1 - 7 files changed, 46 insertions(+), 45 deletions(-) delete mode 100644 modular_darkpack/modules/frenzy/code/beast_language.dm diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index b12dfb54e5ae..19d376f5a1cd 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -153,12 +153,10 @@ /datum/status_effect/knocked_out/on_apply() owner.become_blind(TRAIT_STATUS_EFFECT(id)) owner.apply_status_effect(/datum/status_effect/grouped/see_no_names, TRAIT_STATUS_EFFECT(id)) + owner.apply_status_effect(/datum/status_effect/grouped/static_look, TRAIT_STATUS_EFFECT(id)) owner.add_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_BLOCK_SECHUD, TRAIT_BLOCK_MEDHUD, TRAIT_INCAPACITATED, TRAIT_FLOORED), TRAIT_STATUS_EFFECT(id)) owner.update_eyes() // updates eyelids RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_mob_statchange)) - RegisterSignal(owner, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(show_unconscious_hud)) - if(GET_CLIENT(owner)) // let's not waste time giving the hud to non-player characters - show_unconscious_hud(owner) return TRUE /datum/status_effect/knocked_out/on_creation(mob/living/new_owner, ...) @@ -171,35 +169,51 @@ /datum/status_effect/knocked_out/on_remove() owner.cure_blind(TRAIT_STATUS_EFFECT(id)) owner.remove_status_effect(/datum/status_effect/grouped/see_no_names, TRAIT_STATUS_EFFECT(id)) + owner.remove_status_effect(/datum/status_effect/grouped/static_look, TRAIT_STATUS_EFFECT(id)) owner.remove_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_BLOCK_SECHUD, TRAIT_BLOCK_MEDHUD, TRAIT_INCAPACITATED, TRAIT_FLOORED), TRAIT_STATUS_EFFECT(id)) owner.update_eyes() // updates eyelids - UnregisterSignal(owner, list(COMSIG_MOB_CLIENT_LOGIN, COMSIG_MOB_STATCHANGE)) - if(GET_CLIENT(owner)) - hide_unconscious_hud(owner) + UnregisterSignal(owner, list(COMSIG_MOB_STATCHANGE)) /datum/status_effect/knocked_out/tick(seconds_between_ticks) owner.adjust_stamina_loss(-3 * seconds_between_ticks) +/datum/status_effect/knocked_out/proc/on_mob_statchange(mob/living/source, ...) + SIGNAL_HANDLER + if(owner.stat == DEAD) + stop_ticking() + else + start_ticking() + +//CANNOT RECOGNIZE ANYONE +/datum/status_effect/grouped/static_look + id = "static look" + duration = STATUS_EFFECT_PERMANENT + +/datum/status_effect/grouped/static_look/on_apply() + . = ..() + RegisterSignal(owner, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(show_unconscious_hud)) + if(GET_CLIENT(owner)) // let's not waste time giving the hud to non-player characters + show_unconscious_hud(owner) + +/datum/status_effect/grouped/static_look/on_remove() + UnregisterSignal(owner, list(COMSIG_MOB_CLIENT_LOGIN)) + if(GET_CLIENT(owner)) + hide_unconscious_hud(owner) + return ..() + /// Global list of images that correspond to a mob's unconscious appearance GLOBAL_LIST_EMPTY(unconscious_appearances) -/datum/status_effect/knocked_out/proc/show_unconscious_hud(mob/living/source) +/datum/status_effect/grouped/static_look/proc/show_unconscious_hud(mob/living/source) SIGNAL_HANDLER source.client?.images += (GLOB.unconscious_appearances - source.unconscious_appearance) -/datum/status_effect/knocked_out/proc/hide_unconscious_hud(mob/living/source) +/datum/status_effect/grouped/static_look/proc/hide_unconscious_hud(mob/living/source) SIGNAL_HANDLER source.client?.images -= GLOB.unconscious_appearances -/datum/status_effect/knocked_out/proc/on_mob_statchange(mob/living/source, ...) - SIGNAL_HANDLER - if(owner.stat == DEAD) - stop_ticking() - else - start_ticking() - //SLEEPING /datum/status_effect/incapacitating/sleeping id = "sleeping" diff --git a/code/game/say.dm b/code/game/say.dm index a59a884ca6d3..79c519db31db 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -310,12 +310,14 @@ GLOBAL_LIST_INIT(freqtospan, list( if(!has_language(language)) var/list/mutual_languages - // Get what we can kinda understand, factor in any bonuses passed in from say mods - var/list/partially_understood_languages = get_partially_understood_languages() - if(LAZYLEN(partially_understood_languages)) - mutual_languages = partially_understood_languages.Copy() - for(var/bonus_language in message_mods[LANGUAGE_MUTUAL_BONUS]) - mutual_languages[bonus_language] = max(message_mods[LANGUAGE_MUTUAL_BONUS][bonus_language], mutual_languages[bonus_language]) + + if(!HAS_TRAIT(src, TRAIT_IN_FRENZY)) //DARKPACK EDIT: IF IN FRENZY YOU DONT UNDERSTAND ANY LANGUAGE. I would prefer to just remove languages in frenzy.dm but apparently that doesn't work. + // Get what we can kinda understand, factor in any bonuses passed in from say mods + var/list/partially_understood_languages = get_partially_understood_languages() + if(LAZYLEN(partially_understood_languages)) + mutual_languages = partially_understood_languages.Copy() + for(var/bonus_language in message_mods[LANGUAGE_MUTUAL_BONUS]) + mutual_languages[bonus_language] = max(message_mods[LANGUAGE_MUTUAL_BONUS][bonus_language], mutual_languages[bonus_language]) var/datum/language/dialect = GLOB.language_datum_instances[language] raw_message = dialect.scramble_paragraph(raw_message, mutual_languages) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 1ee7e1aa3299..b42ce46c0675 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -104,7 +104,6 @@ /datum/language/nekomimetic, /datum/language/garou_tongue, /datum/language/primal_tongue, - /datum/language/frenzy ) for(var/datum/language/lang as anything in subtypesof(/datum/language)) if(lang.restricted) diff --git a/modular_darkpack/modules/frenzy/code/beast_language.dm b/modular_darkpack/modules/frenzy/code/beast_language.dm deleted file mode 100644 index 3c3c1d9c1b59..000000000000 --- a/modular_darkpack/modules/frenzy/code/beast_language.dm +++ /dev/null @@ -1,16 +0,0 @@ -/datum/language/frenzy - name = "Frenzy" - desc = "The language of the Beast." - key = "q" - flags = LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD - space_chance = 100 - sentence_chance = 0 - between_word_sentence_chance = 0 - between_word_space_chance = 100 - additional_syllable_low = 0 - additional_syllable_high = 0 - syllables = list("raaagh", "hiss") //What are hungry noises? - default_priority = 100 - always_use_default_namelist = TRUE // Shouldn't generate names for this anyways - - icon_state = "animal" diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 521879cb8e12..c4ccb465e2d7 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -10,9 +10,6 @@ set_jitter_if_lower(1 SCENES) - add_blocked_language(subtypesof(/datum/language) - /datum/language/frenzy, LANGUAGE_FRENZY) - grant_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) - message_admins("[ADMIN_LOOKUPFLW(src)] has entered frenzy[target ? " targeting [ADMIN_LOOKUPFLW(target)]": ""]. ([source])") log_combat(src, (src || target), "has frenzied on because of \"[source]\" on") @@ -38,9 +35,6 @@ remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER), FRENZY_TRAIT) log_message("exited frenzy.", LOG_ATTACK, color="red") - remove_blocked_language(subtypesof(/datum/language), source = LANGUAGE_FRENZY) - remove_language(/datum/language/frenzy, source = LANGUAGE_FRENZY) - remove_status_effect(/datum/status_effect/frenzy) /datum/storyteller_roll/frenzy diff --git a/modular_darkpack/modules/frenzy/code/status_effect.dm b/modular_darkpack/modules/frenzy/code/status_effect.dm index 4d321f53b2b9..ff5d15717bca 100644 --- a/modular_darkpack/modules/frenzy/code/status_effect.dm +++ b/modular_darkpack/modules/frenzy/code/status_effect.dm @@ -11,6 +11,12 @@ var/datum/weakref/frenzy_overlay_ref var/seconds_alone = 0 +/datum/status_effect/frenzy/on_apply() + owner.apply_status_effect(/datum/status_effect/grouped/see_no_names, TRAIT_STATUS_EFFECT(id)) + owner.apply_status_effect(/datum/status_effect/grouped/static_look, TRAIT_STATUS_EFFECT(id)) + owner.add_blocked_language(subtypesof(/datum/language), language_flags = UNDERSTOOD_LANGUAGE, source = id) + return TRUE + /datum/status_effect/frenzy/on_creation(mob/living/new_owner, atom/frenzy_target) . = ..() if(!.) @@ -35,6 +41,9 @@ owner.remove_client_colour(FRENZY_TRAIT) var/mob/living/carbon/carbon_owner = astype(owner) carbon_owner?.exit_frenzy_mode() + owner.remove_status_effect(/datum/status_effect/grouped/see_no_names, TRAIT_STATUS_EFFECT(id)) + owner.remove_status_effect(/datum/status_effect/grouped/static_look, TRAIT_STATUS_EFFECT(id)) + owner.remove_blocked_language(subtypesof(/datum/language), language_flags = UNDERSTOOD_LANGUAGE, source = id) return ..() /datum/status_effect/frenzy/tick(seconds_between_ticks) diff --git a/tgstation.dme b/tgstation.dme index 06a74a9fb403..b5efb0fa633b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7573,7 +7573,6 @@ #include "modular_darkpack\modules\forensics\code\forensic_gatherer.dm" #include "modular_darkpack\modules\forensics\code\serial_number_log.dm" #include "modular_darkpack\modules\forensics\code\serial_numbering.dm" -#include "modular_darkpack\modules\frenzy\code\beast_language.dm" #include "modular_darkpack\modules\frenzy\code\frenzy.dm" #include "modular_darkpack\modules\frenzy\code\frenzy_helpers.dm" #include "modular_darkpack\modules\frenzy\code\status_effect.dm" From 2ee888fca4537dc908f7abd2291f1983dd83ff1f Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 28 Aug 2026 04:03:48 -0700 Subject: [PATCH 15/21] cant examine while in frenzy --- code/__DEFINES/~darkpack/traits/declarations.dm | 3 +++ code/modules/mob/living/carbon/examine.dm | 2 +- modular_darkpack/modules/frenzy/code/frenzy.dm | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 419d5dcca57b..1043ef9e7478 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -111,6 +111,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // Allows the user to pass through doors #define TRAIT_IN_FRENZY "in_frenzy" +// Can't examine people +#define TRAIT_CANNOT_FOCUS "cannot_focus" + // Is the mob silenced (by Quietus 1 for example) #define TRAIT_SILENCED "silenced" // is the vampire weak to Dominate? diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 1270028e53d6..7bfa8077950b 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -5,7 +5,7 @@ return null /mob/living/carbon/examine(mob/user) - if(HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE) && !isobserver(user)) + if((HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE) || HAS_TRAIT(user, TRAIT_CANNOT_FOCUS)) && !isobserver(user)) //DARKPACK EDIT ADD: TRAIT THAT MAKES YOU UNABLE TO EXAMINE PEOPLE return list(span_warning("You're struggling to make out any details...")) var/t_He = p_They() diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index c4ccb465e2d7..83ffd5240c41 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -6,7 +6,7 @@ return if(IS_UNCONSCIOUS(src)) return - add_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), FRENZY_TRAIT) + add_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_CANNOT_FOCUS), FRENZY_TRAIT) set_jitter_if_lower(1 SCENES) @@ -32,7 +32,7 @@ /mob/living/proc/exit_frenzy_mode() if(!HAS_TRAIT(src, TRAIT_IN_FRENZY)) return - remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER), FRENZY_TRAIT) + remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER, TRAIT_CANNOT_FOCUS), FRENZY_TRAIT) log_message("exited frenzy.", LOG_ATTACK, color="red") remove_status_effect(/datum/status_effect/frenzy) From 0483c557009e2b0fa9458a099547eeb0946ffba1 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 28 Aug 2026 04:15:59 -0700 Subject: [PATCH 16/21] Update _traits.dm --- code/_globalvars/traits/_traits.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 44ae6dace8fa..3043e2c7cce7 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -232,6 +232,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, "TRAIT_CANNOT_CRYSTALIZE" = TRAIT_CANNOT_CRYSTALIZE, + "TRAIT_CANNOT_FOCUS" = TRAIT_CANNOT_FOCUS, "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_CANT_RIDE" = TRAIT_CANT_RIDE, "TRAIT_CAN_GET_AI_TRACKING_MESSAGE" = TRAIT_CAN_GET_AI_TRACKING_MESSAGE, From 3f362dbbbbb683fd7bf6580e04b731e9efd11e18 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 28 Aug 2026 05:09:02 -0700 Subject: [PATCH 17/21] Update language.dm --- code/__DEFINES/language.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index c2c3eabbd7f4..1ae7d8982038 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -54,7 +54,6 @@ #define LANGUAGE_EMP "emp" #define LANGUAGE_TONGUE "tongue" #define LANGUAGE_BLOOD_WORM "blood_worm" -#define LANGUAGE_FRENZY "frenzy" //DARKPACK EDIT: ADDS FRENZY LANGUAGE FOR VAMPIRES // Language flags. Used in granting and removing languages. /// This language can be spoken. From 1febb90edcceb15095aacff5dcfdfa2b20614758 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 28 Aug 2026 05:18:29 -0700 Subject: [PATCH 18/21] Update say.dm --- code/game/say.dm | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/code/game/say.dm b/code/game/say.dm index 79c519db31db..a59a884ca6d3 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -310,14 +310,12 @@ GLOBAL_LIST_INIT(freqtospan, list( if(!has_language(language)) var/list/mutual_languages - - if(!HAS_TRAIT(src, TRAIT_IN_FRENZY)) //DARKPACK EDIT: IF IN FRENZY YOU DONT UNDERSTAND ANY LANGUAGE. I would prefer to just remove languages in frenzy.dm but apparently that doesn't work. - // Get what we can kinda understand, factor in any bonuses passed in from say mods - var/list/partially_understood_languages = get_partially_understood_languages() - if(LAZYLEN(partially_understood_languages)) - mutual_languages = partially_understood_languages.Copy() - for(var/bonus_language in message_mods[LANGUAGE_MUTUAL_BONUS]) - mutual_languages[bonus_language] = max(message_mods[LANGUAGE_MUTUAL_BONUS][bonus_language], mutual_languages[bonus_language]) + // Get what we can kinda understand, factor in any bonuses passed in from say mods + var/list/partially_understood_languages = get_partially_understood_languages() + if(LAZYLEN(partially_understood_languages)) + mutual_languages = partially_understood_languages.Copy() + for(var/bonus_language in message_mods[LANGUAGE_MUTUAL_BONUS]) + mutual_languages[bonus_language] = max(message_mods[LANGUAGE_MUTUAL_BONUS][bonus_language], mutual_languages[bonus_language]) var/datum/language/dialect = GLOB.language_datum_instances[language] raw_message = dialect.scramble_paragraph(raw_message, mutual_languages) From 63141cc2597ee69ef39dd42393012d5ebafd1206 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 28 Aug 2026 17:08:35 -0700 Subject: [PATCH 19/21] Update _traits.dm --- code/_globalvars/traits/_traits.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 549e53b2d3a3..8d6af594edd2 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -232,7 +232,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, "TRAIT_CANNOT_CRYSTALIZE" = TRAIT_CANNOT_CRYSTALIZE, - "TRAIT_CANNOT_FOCUS" = TRAIT_CANNOT_FOCUS, + "TRAIT_CANNOT_FOCUS" = TRAIT_CANNOT_FOCUS, "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_CANT_RIDE" = TRAIT_CANT_RIDE, "TRAIT_CAN_GET_AI_TRACKING_MESSAGE" = TRAIT_CAN_GET_AI_TRACKING_MESSAGE, From 3b643d3414fdddb8719975fa10ffb989bac0e9f8 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 28 Aug 2026 19:54:41 -0700 Subject: [PATCH 20/21] cannot read while in frenzy --- modular_darkpack/modules/frenzy/code/frenzy.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 83ffd5240c41..8b96daa151c0 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -6,7 +6,7 @@ return if(IS_UNCONSCIOUS(src)) return - add_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_CANNOT_FOCUS), FRENZY_TRAIT) + add_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_CANNOT_FOCUS, TRAIT_ILLITERATE), FRENZY_TRAIT) set_jitter_if_lower(1 SCENES) @@ -32,7 +32,7 @@ /mob/living/proc/exit_frenzy_mode() if(!HAS_TRAIT(src, TRAIT_IN_FRENZY)) return - remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER, TRAIT_CANNOT_FOCUS), FRENZY_TRAIT) + remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_PACIFISM, TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER, TRAIT_CANNOT_FOCUS, TRAIT_ILLITERATE), FRENZY_TRAIT) log_message("exited frenzy.", LOG_ATTACK, color="red") remove_status_effect(/datum/status_effect/frenzy) From d74148ca3f705d6939f4da749f4df3be033623c5 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 30 Aug 2026 21:39:04 -0700 Subject: [PATCH 21/21] Apply batched suggestions from code review Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- .../modules/powers/code/discipline/__discipline_power.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm index a49e494a9dac..4c0d0de45404 100644 --- a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm +++ b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm @@ -272,7 +272,8 @@ return FALSE if(!frenzy_usable && HAS_TRAIT(owner, TRAIT_IN_FRENZY)) - to_chat(owner, span_warning("You cannot do this while in frenzy!")) + if(alert) + to_chat(owner, span_warning("You cannot do this while in frenzy!")) return FALSE //can't activate if the owner isn't capable of it