From be6c9fda9a1e9b84b3b5fe2441a7ca2d853bd02c Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Sun, 28 Sep 2025 14:02:06 +0300 Subject: [PATCH 1/7] seal those mouths shut! --- .../mutepeoplewithsuture/code/suture.dm | 90 +++++++++++++++++++ .../features/mutepeoplewithsuture/includes.dm | 10 +++ .../features/mutepeoplewithsuture/readme.md | 13 +++ modular_meta/main_modular_include.dm | 1 + 4 files changed, 114 insertions(+) create mode 100644 modular_meta/features/mutepeoplewithsuture/code/suture.dm create mode 100644 modular_meta/features/mutepeoplewithsuture/includes.dm create mode 100644 modular_meta/features/mutepeoplewithsuture/readme.md diff --git a/modular_meta/features/mutepeoplewithsuture/code/suture.dm b/modular_meta/features/mutepeoplewithsuture/code/suture.dm new file mode 100644 index 000000000000..d9b17fd74a1a --- /dev/null +++ b/modular_meta/features/mutepeoplewithsuture/code/suture.dm @@ -0,0 +1,90 @@ +/obj/item/stack/medical/suture/proc/try_mute(mob/living/mutedone, mob/living/user, healed_zone) + var/x = mutedone.staminaloss //I skipped my math classes + var/stamina_modifier = 5 / (x + 1) // trying some fancy math here, for the first time. + to_chat(user, span_notice("muted")) + if(DOING_INTERACTION_WITH_TARGET(user, mutedone)) + return FALSE + if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) + balloon_alert(user, "Sewing mouth shut...") + to_chat(user, span_alert("You begin trying to suture up [mutedone]'s mouth")) + to_chat(mutedone, span_big ("[user.p_theyre()] is trying to sew your mouth shut with [src]")) + playsound(src, heal_begin_sound, 100) + if(do_after(user, ((1.5 SECONDS + stamina_modifier) / (mouth_sewing_force) SECONDS), mutedone)) + playsound(src, heal_end_sound, 100) + mutedone.apply_status_effect(/datum/status_effect/mouth_sewed_up) + to_chat(mutedone, span_danger("mutedforreal")) + log_combat(user, mutedone, "muted", src) + return + +/obj/item/stack/medical/suture/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) + return NONE + if(!try_mute(interacting_with, user)) + return NONE + return ITEM_INTERACT_SUCCESS + +/datum/status_effect/mouth_sewed_up + id = "mouth_sewed_up" + duration = STATUS_EFFECT_PERMANENT + tick_interval = STATUS_EFFECT_NO_TICK + alert_type = /atom/movable/screen/alert/status_effect/mouth_sewed_up + +/datum/status_effect/mouth_sewed_up/get_examine_text() + . = ..() + return span_danger("[owner.p_Their()] mouth appears to be sewed shut with some suture!") + +/atom/movable/screen/alert/status_effect/mouth_sewed_up + name = "Mute!" + desc = "Whoops! Someone has sewed your mouth shut, \ + press resist to try break the suture by your mouth \ + or use any sharp item to tear it away!" + icon_state = "mind_control" + +/datum/status_effect/mouth_sewed_up/on_apply() + if(ishuman(owner)) + owner.add_traits(list(TRAIT_MUTE), REF(src)) + return TRUE + +/datum/status_effect/mouth_sewed_up/on_remove() + if(ishuman(owner)) + owner.remove_traits(list(TRAIT_MUTE), REF(src)) + return TRUE + +/// Used for removing the "muted" status effect from our "bedolajecka" +/obj/item/proc/try_remove_sutures(obj/item/item_used, mob/living/carbon/human/the_muted_one, mob/living/carbon/human/unmuter = usr) + item_used = unmuter.get_active_held_item() + if(!istype(the_muted_one, /mob/living/)) // just in case, duh + return + if(the_muted_one.has_status_effect(/datum/status_effect/mouth_sewed_up) && \ + item_used.get_sharpness() == SHARP_EDGED || item_used.get_sharpness() == SHARP_POINTY) //Yes, you can tear sutures with a pen, they're not that sturdy (at least, I believe so.) + balloon_alert(unmuter, "Tearing away sutures...") + if(do_after(unmuter, 1.5 SECONDS, the_muted_one)) + playsound(src, 'sound/items/weapons/slice.ogg', 55) + the_muted_one.remove_status_effect(/datum/status_effect/mouth_sewed_up) + the_muted_one.visible_message( + message = span_danger("[unmuter] begins to cut sutures away from [the_muted_one.p_theirs()] mouth!"), + self_message = span_danger("You begin to cut away sutures from [the_muted_one.p_theirs()]'s mouth!") + ) + else + to_chat(the_muted_one, span_alert("You try to remove sutures from your sewed mouth, but there's none... Wait, what?")) + return + +//looks sketchy, right? +/obj/item/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + . = ..() + if(user.grab_state == GRAB_AGGRESSIVE \ + && user.zone_selected == BODY_ZONE_PRECISE_MOUTH \ + && user.pulling == target) + if(!try_remove_sutures()) // I was high, don't mind me + return SECONDARY_ATTACK_CALL_NORMAL + try_remove_sutures(the_muted_one = target) + return COMPONENT_SKIP_ATTACK // To keep our target unattacked after removal of the sutures. + +/obj/item/stack/medical/suture + var/mouth_sewing_force = 2 + +/obj/item/stack/medical/suture/medicated + mouth_sewing_force = 5 + + +//TODO: Forbid felinids to use their mouth/bite attack as if restrained or as if their mouth has been covered by a mask. diff --git a/modular_meta/features/mutepeoplewithsuture/includes.dm b/modular_meta/features/mutepeoplewithsuture/includes.dm new file mode 100644 index 000000000000..0b3a67abcd38 --- /dev/null +++ b/modular_meta/features/mutepeoplewithsuture/includes.dm @@ -0,0 +1,10 @@ +#include "code\suture.dm" + +/datum/modpack/mutepeoplewithsuture + name = "Зашиваем рот неугодным!" + desc = "Отныне можно использовать медицинские швы для удержания правды! \ + Шучу, конечно-же для того, что-бы обезопасить блохастых(котов) и обезъян" + id = "MUTEPEOPLEWITHSUTURE" + group = "Features" + author = "Bruh24" + diff --git a/modular_meta/features/mutepeoplewithsuture/readme.md b/modular_meta/features/mutepeoplewithsuture/readme.md new file mode 100644 index 000000000000..6207f1cd054c --- /dev/null +++ b/modular_meta/features/mutepeoplewithsuture/readme.md @@ -0,0 +1,13 @@ +## Module ID: MUTEPEOPLEWITHSUTURE + +### Defines: + +- N/A + +### TG Proc/File Changes: + +- N/A + +### TGUI Files: + +- N/A diff --git a/modular_meta/main_modular_include.dm b/modular_meta/main_modular_include.dm index 6329dbb141af..0cfa37571f30 100644 --- a/modular_meta/main_modular_include.dm +++ b/modular_meta/main_modular_include.dm @@ -41,6 +41,7 @@ #include "features\countdown_antimov_sfx\includes.dm" #include "features\novichok\includes.dm" #include "features\jukeboxes_to_bartender\includes.dm" +#include "features\mutepeoplewithsuture\includes.dm" /* --- Reverts --- */ From 930453fc419a72add6d5894c3c529b5324e28714 Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Sun, 28 Sep 2025 14:04:53 +0300 Subject: [PATCH 2/7] just in case --- modular_meta/features/mutepeoplewithsuture/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_meta/features/mutepeoplewithsuture/readme.md b/modular_meta/features/mutepeoplewithsuture/readme.md index 6207f1cd054c..a95af7896178 100644 --- a/modular_meta/features/mutepeoplewithsuture/readme.md +++ b/modular_meta/features/mutepeoplewithsuture/readme.md @@ -6,7 +6,7 @@ ### TG Proc/File Changes: -- N/A +-/obj/item/stack/medical/suture/interact_with_atom_secondary ---> this changed, though modularized ### TGUI Files: From 38e37f7b8b2eb681f564ab58728b324f18d691c0 Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Sun, 28 Sep 2025 17:38:31 +0300 Subject: [PATCH 3/7] I kinda forgot to delete this shi --- modular_meta/features/mutepeoplewithsuture/code/suture.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/modular_meta/features/mutepeoplewithsuture/code/suture.dm b/modular_meta/features/mutepeoplewithsuture/code/suture.dm index d9b17fd74a1a..426101d71f87 100644 --- a/modular_meta/features/mutepeoplewithsuture/code/suture.dm +++ b/modular_meta/features/mutepeoplewithsuture/code/suture.dm @@ -1,7 +1,6 @@ /obj/item/stack/medical/suture/proc/try_mute(mob/living/mutedone, mob/living/user, healed_zone) var/x = mutedone.staminaloss //I skipped my math classes var/stamina_modifier = 5 / (x + 1) // trying some fancy math here, for the first time. - to_chat(user, span_notice("muted")) if(DOING_INTERACTION_WITH_TARGET(user, mutedone)) return FALSE if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) @@ -86,5 +85,4 @@ /obj/item/stack/medical/suture/medicated mouth_sewing_force = 5 - //TODO: Forbid felinids to use their mouth/bite attack as if restrained or as if their mouth has been covered by a mask. From 25804274b431c40ce4dedc26e2de3e41848d8a80 Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Sun, 28 Sep 2025 17:41:35 +0300 Subject: [PATCH 4/7] And this needed to be deleted too --- modular_meta/features/mutepeoplewithsuture/code/suture.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modular_meta/features/mutepeoplewithsuture/code/suture.dm b/modular_meta/features/mutepeoplewithsuture/code/suture.dm index 426101d71f87..fe2e9ca62f89 100644 --- a/modular_meta/features/mutepeoplewithsuture/code/suture.dm +++ b/modular_meta/features/mutepeoplewithsuture/code/suture.dm @@ -1,8 +1,6 @@ /obj/item/stack/medical/suture/proc/try_mute(mob/living/mutedone, mob/living/user, healed_zone) var/x = mutedone.staminaloss //I skipped my math classes var/stamina_modifier = 5 / (x + 1) // trying some fancy math here, for the first time. - if(DOING_INTERACTION_WITH_TARGET(user, mutedone)) - return FALSE if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) balloon_alert(user, "Sewing mouth shut...") to_chat(user, span_alert("You begin trying to suture up [mutedone]'s mouth")) @@ -38,6 +36,7 @@ press resist to try break the suture by your mouth \ or use any sharp item to tear it away!" icon_state = "mind_control" +// TODO: add a resist action to it, for now it can be only removed by someone's help and a sharp knife. /datum/status_effect/mouth_sewed_up/on_apply() if(ishuman(owner)) From d1720e5fbe5875dc9bb32700b0d885c361bbdff1 Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Thu, 19 Feb 2026 14:35:40 +0300 Subject: [PATCH 5/7] ebatoria.mp4 adds suture mute mechanic yeah yeah cool also changes datum/modpack/reskins description // --- .../features/more_clothes/includes.dm | 9 +- .../code/status_effect.dm | 188 ++++++++++++++++++ .../mute_people_with_suture/code/suture.dm | 5 + .../includes.dm | 3 +- .../mute_people_with_suture/readme.md | 13 ++ .../mutepeoplewithsuture/code/suture.dm | 87 -------- .../features/mutepeoplewithsuture/readme.md | 13 -- modular_meta/main_modular_include.dm | 2 +- 8 files changed, 213 insertions(+), 107 deletions(-) create mode 100644 modular_meta/features/mute_people_with_suture/code/status_effect.dm create mode 100644 modular_meta/features/mute_people_with_suture/code/suture.dm rename modular_meta/features/{mutepeoplewithsuture => mute_people_with_suture}/includes.dm (85%) create mode 100644 modular_meta/features/mute_people_with_suture/readme.md delete mode 100644 modular_meta/features/mutepeoplewithsuture/code/suture.dm delete mode 100644 modular_meta/features/mutepeoplewithsuture/readme.md diff --git a/modular_meta/features/more_clothes/includes.dm b/modular_meta/features/more_clothes/includes.dm index a87854523419..ad4d40be6e74 100644 --- a/modular_meta/features/more_clothes/includes.dm +++ b/modular_meta/features/more_clothes/includes.dm @@ -15,8 +15,7 @@ id = "RESKINS" name = "Рескины одежды" group = "Features" - desc = " Добавляет Уже - нет. \ - https://github.com/tgstation/tgstation/pull/93775 \ - Не добавляет, а изменяет наши старые модульные рескины \ - под манер новейшего рефактора от апстрима #93775" - author = "Artemchik542(Dracoder) && Bruh24" + desc = "Добавляет старую одежду \ + Добавляет секурюрити маске защиту от перца \ + Добавляет одежду из якудзы(Glamyrio) \" + author = "Artemchik542(Dracoder) && Bruh24 && Glamyrio" diff --git a/modular_meta/features/mute_people_with_suture/code/status_effect.dm b/modular_meta/features/mute_people_with_suture/code/status_effect.dm new file mode 100644 index 000000000000..1611eb332164 --- /dev/null +++ b/modular_meta/features/mute_people_with_suture/code/status_effect.dm @@ -0,0 +1,188 @@ +/obj/item/stack/medical/suture/proc/try_mute(mob/living/mutedone, mob/living/user, healed_zone) + var/x = mutedone.staminaloss //I skipped my math classes + var/stamina_modifier = 5 / (x + 1) // trying some fancy math here, for the first time. + var/obj/item/stack/medical/suture/sew_thing = user.get_active_held_item() + if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) + if(sew_thing.amount < 2) + to_chat(user, span_danger("You don't have enough of [sew_thing] to do that!")) + return ITEM_INTERACT_BLOCKING + + if(mutedone.has_status_effect(/datum/status_effect/mouth_sewed_up)) + to_chat(user, span_alert(pick("You can't...", "Their mouth is already sewed..", "Hurr-durr... they are already..", "No...", "This isn't right.."))) + return ITEM_INTERACT_BLOCKING + + user.visible_message( + span_danger("[user] is trying to sew [mutedone]'s mouth shut with [sew_thing]"), + span_danger("You begin trying to suture up [mutedone]'s mouth") + ) + balloon_alert(user, "sewing mouth shut...") + playsound(mutedone, heal_begin_sound, 100) + to_chat(mutedone, span_userdanger("[user] is trying to sew your mouth shut with [sew_thing]")) + + if(do_after(user, (7 SECONDS + stamina_modifier SECONDS) / mouth_sewing_force, mutedone)) + user.visible_message( + span_danger("[user] sews [mutedone]'s mouth shut"), + span_danger("You succesfully sew [mutedone]'s mouth with the [sew_thing]") + ) + to_chat(mutedone, span_userdanger("[user] has sewed your mouth shut with the [sew_thing]!")) + mutedone.emote("scream", forced = TRUE) + mutedone.apply_status_effect(/datum/status_effect/mouth_sewed_up) + //to_chat(mutedone, span_danger("mutedforreal")) + playsound(mutedone, heal_end_sound, 100) + + log_combat(user, mutedone, "[user] has used [sew_thing] on [mutedone] to prevent them from speaking", sew_thing) + sew_thing.amount -= 2 + sew_thing.update_appearance() + return + +/obj/item/stack/medical/suture/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) + return NONE + if(!try_mute(interacting_with, user)) + return NONE + return ITEM_INTERACT_SUCCESS + +/datum/status_effect/mouth_sewed_up + id = "mouth_sewed_up" + duration = STATUS_EFFECT_PERMANENT + tick_interval = STATUS_EFFECT_NO_TICK + alert_type = /atom/movable/screen/alert/status_effect/mouth_sewed_up + +/datum/status_effect/mouth_sewed_up/get_examine_text() + . = ..() + return span_danger("[owner.p_Their()] mouth appears to be sewed shut with some suture!") + +/atom/movable/screen/alert/status_effect/mouth_sewed_up + name = "Mute!" + desc = "Whoops! Someone has sewed your mouth shut, \ + press resist to try break the suture by your mouth \ + or use any sharp item to tear it away!" + overlay_state = "mind_control" + attached_effect = /datum/status_effect/mouth_sewed_up + +/datum/status_effect/mouth_sewed_up/on_apply() + if(ishuman(owner)) + // owner.add_traits(list(TRAIT_MUTE), REF(src)) + RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(muzzle_talk)) + // RegisterSignal(owner, COMSIG_MOB_PRE_EMOTED, PROC_REF(emote_override)) // Wait, why did we ctrl+c ctrl+v this blindly? Does having your mouth sewed prevent you from moving your hands or emoting? - No. + RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(handle_resist)) + RegisterSignal(owner, COMSIG_ATOM_ATTACKBY, PROC_REF(someone_removing_sutures)) + return TRUE + +/datum/status_effect/mouth_sewed_up/on_remove() + if(ishuman(owner)) + owner.remove_traits(list(TRAIT_MUTE), REF(src)) + UnregisterSignal(owner, list(COMSIG_MOB_SAY, COMSIG_MOB_PRE_EMOTED, COMSIG_LIVING_RESIST, COMSIG_ATOM_ATTACKBY)) + return TRUE + + +/* see comment on on_apply() +/datum/status_effect/mouth_sewed_up/proc/emote_override(mob/living/source, key, params, type_override, intentional, datum/emote/emote) //thx to whoever made muffles_speech.dm + SIGNAL_HANDLER + if(!emote.hands_use_check && (emote.emote_type & EMOTE_AUDIBLE)) + source.audible_message("makes a [pick("strong ", "weak ", "")]noise.", audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE) + return COMPONENT_CANT_EMOTE + return NONE +*/ + +/datum/status_effect/mouth_sewed_up/proc/muzzle_talk(datum/source, list/speech_args) //thx to whoever made muffles_speech.dm + SIGNAL_HANDLER + if(HAS_TRAIT(source, TRAIT_SIGN_LANG)) + return + var/spoken_message = speech_args[SPEECH_MESSAGE] + if(spoken_message) + var/list/words = splittext(spoken_message, " ") + var/yell_suffix = copytext(spoken_message, findtext(spoken_message, "!")) + spoken_message = "" + + for(var/ind = 1 to length(words)) + var/new_word = "" + for(var/i = 1 to length(words[ind]) + rand(-1,1)) + new_word += "m" + new_word += "f" + words[ind] = yell_suffix ? uppertext(new_word) : new_word + spoken_message = "[jointext(words, " ")][yell_suffix]" + speech_args[SPEECH_MESSAGE] = spoken_message + +/datum/status_effect/mouth_sewed_up/proc/handle_resist(datum/source) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(handle_resist_async), source) + return COMPONENT_BLOCK_MISC_HELP + +// resist out of the, uhh.. sutures? +/datum/status_effect/mouth_sewed_up/proc/handle_resist_async(mob/living/carbon/muteman) + muteman.visible_message( + message = span_warning("[muteman] starts tearing at the sutures on [muteman.p_their()] mouth!"), + self_message = span_danger("You start tearing at the sutures on your mouth... This will hurt!") + ) + if(do_after(muteman, 20 SECONDS, target = muteman)) //Yeah, those take some time.. those are surgery grade. + if(!muteman.has_status_effect(/datum/status_effect/mouth_sewed_up)) + return + playsound(muteman, 'sound/items/weapons/slice.ogg', 55, TRUE) + muteman.visible_message( + message = span_danger("[muteman] tears the sutures off [muteman.p_their()] mouth!"), + self_message = span_userdanger("You tear the sutures off your mouth! AGH!") + ) + if(ishuman(muteman)) + var/obj/item/bodypart/golova = muteman.get_bodypart(BODY_ZONE_HEAD) + if(golova) + muteman.apply_damage(10, BRUTE, BODY_ZONE_HEAD) + muteman.cause_wound_of_type_and_severity(WOUND_SLASH, golova, WOUND_SEVERITY_TRIVIAL, WOUND_SEVERITY_MODERATE) + muteman.emote("scream", forced = TRUE) + qdel(src) // delete status effect + +//TODO: Forbid felinids to use their mouth/bite attack as if restrained or as if their mouth has been covered by a mask. + +/datum/status_effect/mouth_sewed_up/proc/someone_removing_sutures(atom/source, obj/item/weapon, mob/living/user, list/modifiers) + SIGNAL_HANDLER + // what are we targeting? + if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH) + return NONE + // is it sharp? + if(!weapon) + return NONE + + var/sharpness = weapon.get_sharpness() + if(sharpness != SHARP_EDGED && sharpness != SHARP_POINTY) + return NONE + + INVOKE_ASYNC(src, PROC_REF(try_remove_sutures_async), user, weapon) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/datum/status_effect/mouth_sewed_up/proc/try_remove_sutures_async(mob/living/helper, obj/item/tool) + if(DOING_INTERACTION(helper, id)) + return + helper.visible_message( + span_warning("[helper] starts cutting the sutures on [owner] mouth with [tool]!"), + span_notice("You start cutting the sutures on [owner] mouth with [tool]!"), + ) + + if(do_after(helper, 5.5 SECONDS, owner, extra_checks = CALLBACK(src, PROC_REF(try_remove_sutures_checks)), interaction_key = id)) + playsound(owner, 'sound/items/weapons/slice.ogg', 55, TRUE) + owner.visible_message( + span_danger("[helper] cuts the sutures from [owner]'s mouth!"), + span_danger("You cut the sutures from [owner]'s mouth!"), + ) + qdel(src) + else + var/mob/living/carbon/carbon_owner = owner // cause_wound_of_type_and_severity() works only for carbons and carbons only + var/obj/item/bodypart/bashka = carbon_owner.get_bodypart(BODY_ZONE_HEAD) + if(bashka) + carbon_owner.apply_damage(3, BRUTE, BODY_ZONE_HEAD) + playsound(owner, 'sound/effects/wounds/pierce1.ogg', 50, TRUE) + if(prob(50)) + carbon_owner.cause_wound_of_type_and_severity(WOUND_SLASH, bashka, WOUND_SEVERITY_TRIVIAL, WOUND_SEVERITY_MODERATE) + owner.visible_message( + span_danger("[helper] cuts the sutures from [owner]'s mouth, but [helper]'s hand slips, leaving their face with a nasty cut in process!"), + span_danger("You cut open [owner]'s mouth free. But your hands slips and cuts their face, leaving a nasty cut!") + ) + return + +/datum/status_effect/mouth_sewed_up/proc/try_remove_sutures_checks() + return !QDELETED(src) // code\modules\projectiles\projectile\energy\stun.dm ln. 339-340 - I dunno what it's really for, but I suppose it's there for a reason + +/// Override is_mouth_covered() to prevent felinid bite attacks when mouth is sewed +/mob/living/carbon/human/is_mouth_covered(check_flags = ALL) + if(has_status_effect(/datum/status_effect/mouth_sewed_up)) + return src + return ..() diff --git a/modular_meta/features/mute_people_with_suture/code/suture.dm b/modular_meta/features/mute_people_with_suture/code/suture.dm new file mode 100644 index 000000000000..773ed3a67f77 --- /dev/null +++ b/modular_meta/features/mute_people_with_suture/code/suture.dm @@ -0,0 +1,5 @@ +/obj/item/stack/medical/suture + var/mouth_sewing_force = 2 + +/obj/item/stack/medical/suture/medicated + mouth_sewing_force = 5 diff --git a/modular_meta/features/mutepeoplewithsuture/includes.dm b/modular_meta/features/mute_people_with_suture/includes.dm similarity index 85% rename from modular_meta/features/mutepeoplewithsuture/includes.dm rename to modular_meta/features/mute_people_with_suture/includes.dm index 0b3a67abcd38..87a0d395b60b 100644 --- a/modular_meta/features/mutepeoplewithsuture/includes.dm +++ b/modular_meta/features/mute_people_with_suture/includes.dm @@ -1,6 +1,7 @@ #include "code\suture.dm" +#include "code\status_effect.dm" -/datum/modpack/mutepeoplewithsuture +/datum/modpack/mute_people_with_suture name = "Зашиваем рот неугодным!" desc = "Отныне можно использовать медицинские швы для удержания правды! \ Шучу, конечно-же для того, что-бы обезопасить блохастых(котов) и обезъян" diff --git a/modular_meta/features/mute_people_with_suture/readme.md b/modular_meta/features/mute_people_with_suture/readme.md new file mode 100644 index 000000000000..f1beffa845f8 --- /dev/null +++ b/modular_meta/features/mute_people_with_suture/readme.md @@ -0,0 +1,13 @@ +## Module ID: MUTE_PEOPLE_WITH_SUTURE + +### Defines: + +- N/A + +### TG Proc/File Changes: + +code\modules\mob\living\carbon\carbon_defense.dm - ln. 35-41 proc redefine in mute_people_with_suture\code\status_effect.dm ln 185-189 + +### TGUI Files: + +- N/A diff --git a/modular_meta/features/mutepeoplewithsuture/code/suture.dm b/modular_meta/features/mutepeoplewithsuture/code/suture.dm deleted file mode 100644 index fe2e9ca62f89..000000000000 --- a/modular_meta/features/mutepeoplewithsuture/code/suture.dm +++ /dev/null @@ -1,87 +0,0 @@ -/obj/item/stack/medical/suture/proc/try_mute(mob/living/mutedone, mob/living/user, healed_zone) - var/x = mutedone.staminaloss //I skipped my math classes - var/stamina_modifier = 5 / (x + 1) // trying some fancy math here, for the first time. - if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) - balloon_alert(user, "Sewing mouth shut...") - to_chat(user, span_alert("You begin trying to suture up [mutedone]'s mouth")) - to_chat(mutedone, span_big ("[user.p_theyre()] is trying to sew your mouth shut with [src]")) - playsound(src, heal_begin_sound, 100) - if(do_after(user, ((1.5 SECONDS + stamina_modifier) / (mouth_sewing_force) SECONDS), mutedone)) - playsound(src, heal_end_sound, 100) - mutedone.apply_status_effect(/datum/status_effect/mouth_sewed_up) - to_chat(mutedone, span_danger("mutedforreal")) - log_combat(user, mutedone, "muted", src) - return - -/obj/item/stack/medical/suture/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) - if(!isliving(interacting_with)) - return NONE - if(!try_mute(interacting_with, user)) - return NONE - return ITEM_INTERACT_SUCCESS - -/datum/status_effect/mouth_sewed_up - id = "mouth_sewed_up" - duration = STATUS_EFFECT_PERMANENT - tick_interval = STATUS_EFFECT_NO_TICK - alert_type = /atom/movable/screen/alert/status_effect/mouth_sewed_up - -/datum/status_effect/mouth_sewed_up/get_examine_text() - . = ..() - return span_danger("[owner.p_Their()] mouth appears to be sewed shut with some suture!") - -/atom/movable/screen/alert/status_effect/mouth_sewed_up - name = "Mute!" - desc = "Whoops! Someone has sewed your mouth shut, \ - press resist to try break the suture by your mouth \ - or use any sharp item to tear it away!" - icon_state = "mind_control" -// TODO: add a resist action to it, for now it can be only removed by someone's help and a sharp knife. - -/datum/status_effect/mouth_sewed_up/on_apply() - if(ishuman(owner)) - owner.add_traits(list(TRAIT_MUTE), REF(src)) - return TRUE - -/datum/status_effect/mouth_sewed_up/on_remove() - if(ishuman(owner)) - owner.remove_traits(list(TRAIT_MUTE), REF(src)) - return TRUE - -/// Used for removing the "muted" status effect from our "bedolajecka" -/obj/item/proc/try_remove_sutures(obj/item/item_used, mob/living/carbon/human/the_muted_one, mob/living/carbon/human/unmuter = usr) - item_used = unmuter.get_active_held_item() - if(!istype(the_muted_one, /mob/living/)) // just in case, duh - return - if(the_muted_one.has_status_effect(/datum/status_effect/mouth_sewed_up) && \ - item_used.get_sharpness() == SHARP_EDGED || item_used.get_sharpness() == SHARP_POINTY) //Yes, you can tear sutures with a pen, they're not that sturdy (at least, I believe so.) - balloon_alert(unmuter, "Tearing away sutures...") - if(do_after(unmuter, 1.5 SECONDS, the_muted_one)) - playsound(src, 'sound/items/weapons/slice.ogg', 55) - the_muted_one.remove_status_effect(/datum/status_effect/mouth_sewed_up) - the_muted_one.visible_message( - message = span_danger("[unmuter] begins to cut sutures away from [the_muted_one.p_theirs()] mouth!"), - self_message = span_danger("You begin to cut away sutures from [the_muted_one.p_theirs()]'s mouth!") - ) - else - to_chat(the_muted_one, span_alert("You try to remove sutures from your sewed mouth, but there's none... Wait, what?")) - return - -//looks sketchy, right? -/obj/item/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) - . = ..() - if(user.grab_state == GRAB_AGGRESSIVE \ - && user.zone_selected == BODY_ZONE_PRECISE_MOUTH \ - && user.pulling == target) - if(!try_remove_sutures()) // I was high, don't mind me - return SECONDARY_ATTACK_CALL_NORMAL - try_remove_sutures(the_muted_one = target) - return COMPONENT_SKIP_ATTACK // To keep our target unattacked after removal of the sutures. - -/obj/item/stack/medical/suture - var/mouth_sewing_force = 2 - -/obj/item/stack/medical/suture/medicated - mouth_sewing_force = 5 - -//TODO: Forbid felinids to use their mouth/bite attack as if restrained or as if their mouth has been covered by a mask. diff --git a/modular_meta/features/mutepeoplewithsuture/readme.md b/modular_meta/features/mutepeoplewithsuture/readme.md deleted file mode 100644 index a95af7896178..000000000000 --- a/modular_meta/features/mutepeoplewithsuture/readme.md +++ /dev/null @@ -1,13 +0,0 @@ -## Module ID: MUTEPEOPLEWITHSUTURE - -### Defines: - -- N/A - -### TG Proc/File Changes: - --/obj/item/stack/medical/suture/interact_with_atom_secondary ---> this changed, though modularized - -### TGUI Files: - -- N/A diff --git a/modular_meta/main_modular_include.dm b/modular_meta/main_modular_include.dm index db82d7926eeb..1804ddb9b62a 100644 --- a/modular_meta/main_modular_include.dm +++ b/modular_meta/main_modular_include.dm @@ -41,7 +41,7 @@ #include "features\soundtrack_modpack\includes.dm" #include "features\novichok\includes.dm" #include "features\jukeboxes_to_bartender\includes.dm" -#include "features\mutepeoplewithsuture\includes.dm" +#include "features\mute_people_with_suture\includes.dm" /* --- Reverts --- */ From e02f4cab0276c0e8819458372ba36a2b9118b59e Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Thu, 19 Feb 2026 14:39:46 +0300 Subject: [PATCH 6/7] forgor.avi --- modular_meta/features/mute_people_with_suture/includes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_meta/features/mute_people_with_suture/includes.dm b/modular_meta/features/mute_people_with_suture/includes.dm index 87a0d395b60b..4874c33bca3d 100644 --- a/modular_meta/features/mute_people_with_suture/includes.dm +++ b/modular_meta/features/mute_people_with_suture/includes.dm @@ -5,7 +5,7 @@ name = "Зашиваем рот неугодным!" desc = "Отныне можно использовать медицинские швы для удержания правды! \ Шучу, конечно-же для того, что-бы обезопасить блохастых(котов) и обезъян" - id = "MUTEPEOPLEWITHSUTURE" + id = "MUTE_PEOPLE_WITH_SUTURE" group = "Features" author = "Bruh24" From d70307538c4d42b78850cc141ff148d8327a1448 Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Fri, 20 Feb 2026 01:20:09 +0300 Subject: [PATCH 7/7] cleanup --- .../features/more_clothes/includes.dm | 2 +- .../code/status_effect.dm | 19 ++----------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/modular_meta/features/more_clothes/includes.dm b/modular_meta/features/more_clothes/includes.dm index ad4d40be6e74..8fe08a013d31 100644 --- a/modular_meta/features/more_clothes/includes.dm +++ b/modular_meta/features/more_clothes/includes.dm @@ -17,5 +17,5 @@ group = "Features" desc = "Добавляет старую одежду \ Добавляет секурюрити маске защиту от перца \ - Добавляет одежду из якудзы(Glamyrio) \" + Добавляет одежду из якудзы(Glamyrio)" author = "Artemchik542(Dracoder) && Bruh24 && Glamyrio" diff --git a/modular_meta/features/mute_people_with_suture/code/status_effect.dm b/modular_meta/features/mute_people_with_suture/code/status_effect.dm index 1611eb332164..47ab52e4c43e 100644 --- a/modular_meta/features/mute_people_with_suture/code/status_effect.dm +++ b/modular_meta/features/mute_people_with_suture/code/status_effect.dm @@ -27,12 +27,12 @@ to_chat(mutedone, span_userdanger("[user] has sewed your mouth shut with the [sew_thing]!")) mutedone.emote("scream", forced = TRUE) mutedone.apply_status_effect(/datum/status_effect/mouth_sewed_up) - //to_chat(mutedone, span_danger("mutedforreal")) + playsound(mutedone, heal_end_sound, 100) log_combat(user, mutedone, "[user] has used [sew_thing] on [mutedone] to prevent them from speaking", sew_thing) sew_thing.amount -= 2 - sew_thing.update_appearance() + sew_thing.update_appearance() // Otherwise the "counter" overlay wouldn't change. It'll show "10" when it's actually eight or six return /obj/item/stack/medical/suture/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) @@ -62,9 +62,7 @@ /datum/status_effect/mouth_sewed_up/on_apply() if(ishuman(owner)) - // owner.add_traits(list(TRAIT_MUTE), REF(src)) RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(muzzle_talk)) - // RegisterSignal(owner, COMSIG_MOB_PRE_EMOTED, PROC_REF(emote_override)) // Wait, why did we ctrl+c ctrl+v this blindly? Does having your mouth sewed prevent you from moving your hands or emoting? - No. RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(handle_resist)) RegisterSignal(owner, COMSIG_ATOM_ATTACKBY, PROC_REF(someone_removing_sutures)) return TRUE @@ -75,16 +73,6 @@ UnregisterSignal(owner, list(COMSIG_MOB_SAY, COMSIG_MOB_PRE_EMOTED, COMSIG_LIVING_RESIST, COMSIG_ATOM_ATTACKBY)) return TRUE - -/* see comment on on_apply() -/datum/status_effect/mouth_sewed_up/proc/emote_override(mob/living/source, key, params, type_override, intentional, datum/emote/emote) //thx to whoever made muffles_speech.dm - SIGNAL_HANDLER - if(!emote.hands_use_check && (emote.emote_type & EMOTE_AUDIBLE)) - source.audible_message("makes a [pick("strong ", "weak ", "")]noise.", audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE) - return COMPONENT_CANT_EMOTE - return NONE -*/ - /datum/status_effect/mouth_sewed_up/proc/muzzle_talk(datum/source, list/speech_args) //thx to whoever made muffles_speech.dm SIGNAL_HANDLER if(HAS_TRAIT(source, TRAIT_SIGN_LANG)) @@ -131,8 +119,6 @@ muteman.emote("scream", forced = TRUE) qdel(src) // delete status effect -//TODO: Forbid felinids to use their mouth/bite attack as if restrained or as if their mouth has been covered by a mask. - /datum/status_effect/mouth_sewed_up/proc/someone_removing_sutures(atom/source, obj/item/weapon, mob/living/user, list/modifiers) SIGNAL_HANDLER // what are we targeting? @@ -181,7 +167,6 @@ /datum/status_effect/mouth_sewed_up/proc/try_remove_sutures_checks() return !QDELETED(src) // code\modules\projectiles\projectile\energy\stun.dm ln. 339-340 - I dunno what it's really for, but I suppose it's there for a reason -/// Override is_mouth_covered() to prevent felinid bite attacks when mouth is sewed /mob/living/carbon/human/is_mouth_covered(check_flags = ALL) if(has_status_effect(/datum/status_effect/mouth_sewed_up)) return src