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 <alfalfascout@users.noreply.github.com>

* Make soap reagent affect synthetics.

---------

Signed-off-by: Alan <alfalfascout@users.noreply.github.com>
Co-authored-by: CRUNCH <143041327+CRUNCH-Borg@users.noreply.github.com>
This commit is contained in:
Alan
2026-08-01 06:11:57 +00:00
committed by GitHub
co-authored by CRUNCH
parent 2d22c7faec
commit 2ba1dcb1da
4 changed files with 28 additions and 23 deletions
+10 -6
View File
@@ -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
+11 -9
View File
@@ -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)
@@ -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)
@@ -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)