From 2ba1dcb1da7dd07a53e7dcb350a8a89ed40abcab Mon Sep 17 00:00:00 2001 From: Alan Date: Sat, 1 Aug 2026 02:11:57 -0400 Subject: [PATCH] Add appropriate soap-washing message for mouthless IPCs. (#32280) * Add appropriate soap-washing message for mouthless IPCs. * Tweak soap message conditions. * Broaden the scope of mouth-related changes. * Apply suggestion from CRUNCH review. Co-authored-by: CRUNCH <143041327+CRUNCH-Borg@users.noreply.github.com> Signed-off-by: Alan * Make soap reagent affect synthetics. --------- Signed-off-by: Alan Co-authored-by: CRUNCH <143041327+CRUNCH-Borg@users.noreply.github.com> --- code/game/objects/items/soap.dm | 16 +++++++++------ code/game/objects/items/tape.dm | 20 ++++++++++--------- .../mob/living/carbon/human/human_mob.dm | 14 ++++++------- .../chemistry/reagents/food_reagents.dm | 1 + 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/code/game/objects/items/soap.dm b/code/game/objects/items/soap.dm index f1355dd9601..4cd7bf5281d 100644 --- a/code/game/objects/items/soap.dm +++ b/code/game/objects/items/soap.dm @@ -33,21 +33,25 @@ if(!ishuman(target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH) return ..() // Cleaning mobs is done on attack() so they get visibly bonked by the soap. + var/mob/living/carbon/human/human_target = target // Mmm, delicious soap! if(isdrask(target) && user == target && user.a_intent == INTENT_GRAB) - var/mob/living/carbon/human/muncher = target - eat_soap(muncher) + eat_soap(human_target) user.changeNext_move(CLICK_CD_MELEE) return ITEM_INTERACT_COMPLETE + var/mouth_term = "mouth out" + if(!human_target.check_has_mouth()) + mouth_term = "speaker grille" + user.visible_message( - SPAN_WARNING("[user] starts washing [target == user ? "[target.p_their()] own" : "[target]'s"] mouth out with [src]!"), - SPAN_NOTICE("You start washing [target == user ? "your own" : "[target]'s"] mouth out with [src]!") + SPAN_WARNING("[user] starts washing [target == user ? "[target.p_their()] own" : "[target]'s"] [mouth_term] with [src]!"), + SPAN_NOTICE("You start washing [target == user ? "your own" : "[target]'s"] [mouth_term] with [src]!") ) if(do_after_once(user, cleanspeed, target = target)) user.visible_message( - SPAN_WARNING("[user] washes [target == user ? "[target.p_their()] own" : "[target]'s"] mouth out with [src]!"), - SPAN_WARNING("You wash [target == user ? "your own" : "[target]'s"] mouth out with [src]!") + SPAN_WARNING("[user] washes [target == user ? "[target.p_their()] own" : "[target]'s"] [mouth_term] with [src]!"), + SPAN_WARNING("You wash [target == user ? "your own" : "[target]'s"] [mouth_term] with [src]!") ) target.reagents.add_reagent("soapreagent", 6) return ITEM_INTERACT_COMPLETE diff --git a/code/game/objects/items/tape.dm b/code/game/objects/items/tape.dm index 1c293dc5f0c..eeaba717092 100644 --- a/code/game/objects/items/tape.dm +++ b/code/game/objects/items/tape.dm @@ -12,7 +12,7 @@ . = ..() update_icon(UPDATE_ICON_STATE) -/obj/item/stack/tape_roll/interact_with_atom(atom/target, mob/living/user, list/modifiers) +/obj/item/stack/tape_roll/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(!ishuman(target)) // What good is a duct tape mask if you are unable to speak? return ..() @@ -25,28 +25,30 @@ to_chat(user, SPAN_WARNING("You'll need more tape for this!")) return ITEM_INTERACT_COMPLETE + var/mouth_term = "mouth" if(!H.check_has_mouth()) - to_chat(user, "[H.p_they(TRUE)] [H.p_have()] no mouth to tape over!") - return ITEM_INTERACT_COMPLETE + mouth_term = "speaker grille" user.visible_message( - SPAN_WARNING("[user] is taping [H]'s mouth closed!"), - SPAN_NOTICE("You try to tape [H == user ? "your own" : "[H]'s"] mouth shut!"), + SPAN_WARNING("[user] is taping over [H]'s [mouth_term]!"), + SPAN_NOTICE("You try to tape over [H == user ? "your own" : "[H]'s"] [mouth_term]!"), SPAN_WARNING("You hear tape ripping.") ) if(!do_after(user, 5 SECONDS, target = H)) return ITEM_INTERACT_COMPLETE if(!use(2)) - to_chat(user, SPAN_NOTICE("You don't have enough tape!")) + to_chat(user, SPAN_WARNING("You don't have enough tape!")) return ITEM_INTERACT_COMPLETE if(H.wear_mask) - to_chat(user, SPAN_NOTICE("[H == user ? user : H]'s mouth is already covered!")) + to_chat(user, SPAN_WARNING("[H == user ? user : H]'s [mouth_term] is already covered!")) return ITEM_INTERACT_COMPLETE - user.visible_message(SPAN_WARNING("[user] tapes [H]'s mouth shut!"), - SPAN_NOTICE("You cover [H == user ? "your own" : "[H]'s"] mouth with a piece of duct tape.[H == user ? null : " That will shut them up."]")) + user.visible_message( + SPAN_WARNING("[user] tapes over [H]'s [mouth_term]!"), + SPAN_NOTICE("You cover [H == user ? "your own" : "[H]'s"] [mouth_term] with a piece of duct tape.[H == user ? null : " That will shut them up."]") + ) var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag H.equip_to_slot(G, ITEM_SLOT_MASK) G.add_fingerprint(user) diff --git a/code/modules/mob/living/carbon/human/human_mob.dm b/code/modules/mob/living/carbon/human/human_mob.dm index f8c07d3389b..47ee885dc52 100644 --- a/code/modules/mob/living/carbon/human/human_mob.dm +++ b/code/modules/mob/living/carbon/human/human_mob.dm @@ -1152,7 +1152,7 @@ /mob/living/carbon/human/proc/check_has_mouth() // Todo, check stomach organ when implemented. var/obj/item/organ/external/head/H = get_organ("head") - if(!H || !H.can_intake_reagents) + if(!H || (!H.can_intake_reagents && !HAS_TRAIT(src, TRAIT_IPC_CAN_EAT))) return FALSE return TRUE @@ -1994,17 +1994,15 @@ Eyes need to have significantly high darksight to shine unless the mob has the X /mob/living/carbon/human/selfFeed(obj/item/food/toEat, fullness) if(!check_has_mouth()) - if(!ismachineperson(src) || (ismachineperson(src) && !HAS_TRAIT(src, TRAIT_IPC_CAN_EAT))) - to_chat(src, SPAN_NOTICE("Where do you intend to put [toEat]? You don't have a mouth!")) - return FALSE + to_chat(src, SPAN_NOTICE("Where do you intend to put [toEat]? You don't have a mouth!")) + return FALSE return ..() /mob/living/carbon/human/forceFed(obj/item/food/toEat, mob/user, fullness) if(!check_has_mouth()) - if(!ismachineperson(src) || !HAS_TRAIT(src, TRAIT_IPC_CAN_EAT)) - if(!((istype(toEat, /obj/item/reagent_containers/drinks) && (ismachineperson(src))))) - to_chat(user, SPAN_NOTICE("Where do you intend to put [toEat]? \The [src] doesn't have a mouth!")) - return FALSE + if(!((istype(toEat, /obj/item/reagent_containers/drinks) && (ismachineperson(src))))) + to_chat(user, SPAN_NOTICE("Where do you intend to put [toEat]? [src] doesn't have a mouth!")) + return FALSE return ..() /mob/living/carbon/human/selfDrink(obj/item/reagent_containers/drinks/toDrink) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index b8360221c99..48db2ba7c06 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -986,6 +986,7 @@ color = "#FFFFFF" taste_description = "soap" yuck_description = "grime in your gears" + process_flags = ORGANIC | SYNTHETIC /datum/reagent/soap/on_mob_add(mob/living/L) ADD_TRAIT(L, TRAIT_SOAPY_MOUTH, id)