diff --git a/code/__defines/belly_messages.dm b/code/__defines/belly_messages.dm
index 69eaff17d50..030665e2864 100644
--- a/code/__defines/belly_messages.dm
+++ b/code/__defines/belly_messages.dm
@@ -72,7 +72,10 @@
#define BELLY_MODE_GROW "im_grow"
#define BELLY_MODE_UNABSORB "im_unabsorb"
-#define VB_MESSAGE_SANIRY(type) ASSERT(type == STRUGGLE_OUTSIDE || type == STRUGGLE_INSIDE || type == ABSORBED_STRUGGLE_OUSIDE || type == ABSORBED_STRUGGLE_INSIDE || type == ESCAPE_ATTEMPT_OWNER || type == ESCAPE_ATTEMPT_PREY ||\
+#define BELLY_TRASH_EATER_IN "te_in"
+#define BELLY_TRASH_EATER_OUT "te_out"
+
+#define VB_MESSAGE_SANITY(type) ASSERT(type == STRUGGLE_OUTSIDE || type == STRUGGLE_INSIDE || type == ABSORBED_STRUGGLE_OUSIDE || type == ABSORBED_STRUGGLE_INSIDE || type == ESCAPE_ATTEMPT_OWNER || type == ESCAPE_ATTEMPT_PREY ||\
type == ESCAPE_PREY || type == ESCAPE_OWNER || type == ESCAPE_OUTSIDE || type == ESCAPE_ITEM_PREY || type == ESCAPE_ITEM_OWNER || type == ESCAPE_ITEM_OUTSIDE || type == ESCAPE_FAIL_PREY ||\
type == ESCAPE_FAIL_OWNER || type == ABSORBED_ESCAPE_ATTEMPT_OWNER || type == ABSORBED_ESCAPE_ATTEMPT_PREY || type == ABSORBED_ESCAPE_PREY || type == ABSORBED_ESCAPE_OWNER ||\
type == ABSORBED_ESCAPE_OUTSIDE || type == FULL_ABSORBED_ESCAPE_PREY || type == FULL_ABSORBED_ESCAPE_OWNER || type == PRIMARY_TRANSFER_PREY || type == PRIMARY_TRANSFER_OWNER ||\
@@ -80,4 +83,4 @@
type == SECONDARY_AUTO_TRANSFER_OWNER || type == DIGEST_CHANCE_PREY || type == DIGEST_CHANCE_OWNER || type == ABSORB_CHANCE_PREY || type == ABSORB_CHANCE_OWNER || type == DIGEST_OWNER ||\
type == DIGEST_PREY || type == ABSORB_OWNER || type == ABSORB_PREY || type == UNABSORBS_OWNER || type == UNABSORBS_PREY || type == EXAMINES || type == EXAMINES_ABSORBED ||\
type == BELLY_MODE_DIGEST || type == BELLY_MODE_HOLD || type == BELLY_MODE_HOLD_ABSORB || type == BELLY_MODE_ABSORB || type == BELLY_MODE_HEAL || type == BELLY_MODE_DRAIN ||\
- type == BELLY_MODE_STEAL || type == BELLY_MODE_EGG || type == BELLY_MODE_SHRINK || type == BELLY_MODE_GROW || type == BELLY_MODE_UNABSORB)
+ type == BELLY_MODE_STEAL || type == BELLY_MODE_EGG || type == BELLY_MODE_SHRINK || type == BELLY_MODE_GROW || type == BELLY_MODE_UNABSORB || type == BELLY_TRASH_EATER_IN || type==BELLY_TRASH_EATER_OUT)
diff --git a/code/modules/vore/eating/belly_import.dm b/code/modules/vore/eating/belly_import.dm
index 4e829c99b75..4952d78a295 100644
--- a/code/modules/vore/eating/belly_import.dm
+++ b/code/modules/vore/eating/belly_import.dm
@@ -365,6 +365,16 @@
if(new_emotes_digest)
new_belly.set_messages(new_emotes_digest,BELLY_MODE_DIGEST, limit = MAX_MESSAGE_LEN / 4)
+ if(islist(belly_data["trash_eater_in"]))
+ var/new_trash_eater_in = sanitize(jointext(belly_data["trash_eater_in"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
+ if(new_trash_eater_in)
+ new_belly.set_messages(new_trash_eater_in ,BELLY_TRASH_EATER_IN, limit = MAX_MESSAGE_LEN / 2)
+
+ if(islist(belly_data["trash_eater_out"]))
+ var/new_trash_eater_out = sanitize(jointext(belly_data["trash_eater_out"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
+ if(new_trash_eater_out)
+ new_belly.set_messages(new_trash_eater_out,BELLY_TRASH_EATER_OUT, limit = MAX_MESSAGE_LEN / 2)
+
if(islist(belly_data["emotes_hold"]))
var/new_emotes_hold = sanitize(jointext(belly_data["emotes_hold"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_hold)
diff --git a/code/modules/vore/eating/belly_messages.dm b/code/modules/vore/eating/belly_messages.dm
index f95b41aeb20..82ddedadf16 100644
--- a/code/modules/vore/eating/belly_messages.dm
+++ b/code/modules/vore/eating/belly_messages.dm
@@ -167,6 +167,13 @@
"Their body looks somewhat larger than usual around the area of their %belly.",
"Their %belly looks larger than usual.")
+ var/list/trash_eater_in = list(
+ "%pred demonstrates their voracious capabilities by swallowing %item whole!"
+ )
+ var/list/trash_eater_out = list( //handles all item expulsions regardless of whether they have the trash perk
+ "%pred expels %item from their %belly!"
+ )
+
GLOBAL_LIST_INIT(vore_words_goo, list("muck","goo","sludge","slime","mire","ectoplasm","quagmire","glop","jelly","ooze","slush","mush","quicksand"))//%goo
GLOBAL_LIST_INIT(vore_words_hbellynoises, list("gurgle","gloorp","squelch","gloosh","squish","groan","grrrrrrn","sloooooOrp","slooosh","grrrbles","worbles"))//%happybelly
GLOBAL_LIST_INIT(vore_words_fat, list("love handles","fat","pudge","plumpness","squish","chunk","meat","softness","blubber","flab","paunch","hip dip","mass","dough","chub","marshmellowy goodness","girth","fluff","thickness","jello","adipose "))//%fat
@@ -277,7 +284,7 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
// This is useful in customization boxes and such. The delimiter right now is \n\n so
// in message boxes, this looks nice and is easily delimited.
/obj/belly/proc/get_messages(type, delim = "\n\n")
- VB_MESSAGE_SANIRY(type)
+ VB_MESSAGE_SANITY(type)
var/list/raw_messages
switch(type)
@@ -385,6 +392,11 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
raw_messages = emote_lists[DM_GROW]
if(BELLY_MODE_UNABSORB)
raw_messages = emote_lists[DM_UNABSORB]
+ if(BELLY_TRASH_EATER_IN)
+ raw_messages = trash_eater_in
+ if(BELLY_TRASH_EATER_OUT)
+ raw_messages = trash_eater_out
+
var/messages = null
if(raw_messages)
messages = raw_messages.Join(delim)
@@ -397,7 +409,7 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
/obj/belly/proc/set_messages(raw_text, type, delim = "\n\n", limit)
if(!limit)
CRASH("[src] set message called without limit!")
- VB_MESSAGE_SANIRY(type)
+ VB_MESSAGE_SANITY(type)
var/list/raw_list
@@ -534,3 +546,7 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
emote_lists[DM_GROW] = raw_list
if(BELLY_MODE_UNABSORB)
emote_lists[DM_UNABSORB] = raw_list
+ if(BELLY_TRASH_EATER_IN)
+ trash_eater_in = raw_list
+ if(BELLY_TRASH_EATER_OUT)
+ trash_eater_out = raw_list
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index d68f6b5d29d..35be4c4330d 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -460,7 +460,9 @@
"item_multiplier",
"undergarment_chosen",
"undergarment_if_none",
- "undergarment_color"
+ "undergarment_color",
+ "trash_eater_in",
+ "trash_eater_out"
)
if (save_digest_mode == 1)
@@ -918,10 +920,13 @@
//privacy_volume = 25
//Print notifications/sound if necessary
- if(istype(M, /mob/observer))
+ if(isobserver(M))
silent = TRUE
if(!silent)
- owner.visible_message(span_vnotice(span_green(span_bold("[owner] [release_verb] [M] from their [lowertext(name)]!"))),range = privacy_range)
+ if(isitem(M))
+ owner.visible_message(span_vnotice(span_green(span_bold(belly_format_string(trash_eater_out, M, item=M)))),range = privacy_range) //double dip. prey = item, item = prey. sanity check in case they use %prey in the message.
+ else
+ owner.visible_message(span_vnotice(span_green(span_bold("[owner] [release_verb] [M] from their [lowertext(name)]!"))),range = privacy_range)
var/soundfile
if(!fancy_vore)
soundfile = GLOB.classic_release_sounds[release_sound]
diff --git a/code/modules/vore/eating/exportpanel_vr.dm b/code/modules/vore/eating/exportpanel_vr.dm
index 175a1d28b96..449e522299a 100644
--- a/code/modules/vore/eating/exportpanel_vr.dm
+++ b/code/modules/vore/eating/exportpanel_vr.dm
@@ -219,6 +219,14 @@
for(var/msg in B.examine_messages_absorbed)
belly_data["examine_messages_absorbed"] += msg
+ belly_data["trash_eater_in"] = list()
+ for(var/msg in B.trash_eater_in)
+ belly_data["trash_eater_in"] += msg
+
+ belly_data["trash_eater_out"] = list()
+ for(var/msg in B.trash_eater_out)
+ belly_data["trash_eater_out"] += msg
+
//belly_data["emote_list"] = list()
//for(var/EL in B.emote_lists)
// for(var/msg in B.emote_lists[EL])
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 66147246201..5305a43c929 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -908,7 +908,7 @@
updateVRPanel()
log_admin("VORE: [src] used Eat Trash to swallow [I].")
I.after_trash_eaten(src)
- visible_message(span_vwarning("[src] demonstrates the voracious capabilities of their [lowertext(vore_selected.name)] by making [I] disappear!"))
+ visible_message(span_vwarning(src.vore_selected.belly_format_string(src.vore_selected.trash_eater_in, I, item=I)))
return
to_chat(src, span_notice("This snack is too powerful to go down that easily."))
return
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index f067b0dfec8..43576cc6943 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -2179,6 +2179,8 @@
host.vore_selected.examine_messages = default_belly.examine_messages.Copy()
host.vore_selected.examine_messages_absorbed = default_belly.examine_messages_absorbed.Copy()
host.vore_selected.emote_lists = default_belly.emote_lists.Copy()
+ host.vore_selected.trash_eater_in = default_belly.trash_eater_in.Copy()
+ host.vore_selected.trash_eater_out = default_belly.trash_eater_out.Copy()
qdel(default_belly)
. = TRUE
if("b_verb")
@@ -2836,6 +2838,20 @@
if(newcolor)
host.vore_selected.tail_extra_overlay2 = newcolor
. = TRUE
+ if("b_trasheater")
+ var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' AND '%item will be replaced with the item's name. '%belly' will be replaced with your belly's name. '%count' will be replaced with the number of anything in your belly. '%countprey' will be replaced with the number of living prey in your belly."
+ switch(params["msgtype"])
+ if("in")
+ var/new_message = sanitize(tgui_input_text(user,"This is sent upon eating anything with the trash eater perk. Write them in 3rd person ('%pred demonstrates their voracious capabilities by swallowing %item whole!') Try to keep it brief!"+help,"Trash Eater Insert",host.vore_selected.get_messages(BELLY_TRASH_EATER_IN), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
+ if(new_message)
+ host.vore_selected.set_messages(new_message,BELLY_TRASH_EATER_IN, limit = MAX_MESSAGE_LEN / 4)
+ . = TRUE
+ if("out")
+ var/new_message = sanitize(tgui_input_text(user,"This is sent upon expeling any item in your belly. Write them in 3rd person ('%pred expels %item from their %belly!') Try to keep it brief!"+help,"Item Expel",host.vore_selected.get_messages(BELLY_TRASH_EATER_OUT), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
+ if(new_message)
+ host.vore_selected.set_messages(new_message,BELLY_TRASH_EATER_OUT, limit = MAX_MESSAGE_LEN / 4)
+ . = TRUE
+
if(.)
unsaved_changes = TRUE
diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyDescriptions.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyDescriptions.tsx
index bb7697d7cd2..c3f4dc31449 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyDescriptions.tsx
+++ b/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyDescriptions.tsx
@@ -116,7 +116,8 @@ export const VoreSelectedBellyDescriptions = (props: {
Number of prey digested in this belly.