From 7da98fc4405e7badf7188a475e6370a7fb4901cd Mon Sep 17 00:00:00 2001 From: eghughguhhhhhh Date: Mon, 21 Apr 2025 00:43:35 -0300 Subject: [PATCH] Trash Eater Customization (#17315) * Automatic changelog compile [ci skip] * initial working. I HATE sourcetree I HATE git stash I WILL NOT be the stash jam boy * Automatic changelog compile [ci skip] * Get the actual work on it done * Revert "Automatic changelog compile [ci skip]" This reverts commit 651c1d6d1ef99262e7b3b2858fe6eb30c51d83c6. * finish the export/import junk. whoopsie. forgot. * cleanup * fucking changelogs * PR feedback * so long wayward ! * Update belly_obj_vr.dm --------- Co-authored-by: vorestation-ci[bot] <199609141+vorestation-ci[bot]@users.noreply.github.com> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> --- code/__defines/belly_messages.dm | 7 ++++-- code/modules/vore/eating/belly_import.dm | 10 +++++++++ code/modules/vore/eating/belly_messages.dm | 20 +++++++++++++++-- code/modules/vore/eating/belly_obj_vr.dm | 11 +++++++--- code/modules/vore/eating/exportpanel_vr.dm | 8 +++++++ code/modules/vore/eating/living_vr.dm | 2 +- code/modules/vore/eating/vorepanel_vr.dm | 16 ++++++++++++++ .../VoreSelectedBellyDescriptions.tsx | 22 ++++++++++++++++++- .../VorePanelExportBellyString.tsx | 17 +++++++++++++- .../tgui/interfaces/VorePanelExport/types.ts | 2 ++ 10 files changed, 105 insertions(+), 10 deletions(-) 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. - Only used in resist messages - item the prey is using to escape. + item the prey is using to escape in resist messages, or the item + ingested via trash eater Only used in transfer messages - belly prey is going to. @@ -209,6 +210,25 @@ export const VoreSelectedBellyDescriptions = (props: { Examine Message (with absorbed victims) + + + + {message_mode || escapable ? ( <> diff --git a/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportBellyString.tsx b/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportBellyString.tsx index 079d23e2dcf..80fb085e95f 100644 --- a/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportBellyString.tsx +++ b/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportBellyString.tsx @@ -94,7 +94,8 @@ export const generateBellyString = (belly: Belly, index: number) => { unabsorb_messages_prey, examine_messages, examine_messages_absorbed, - + trash_eater_in, + trash_eater_out, // emote_list, emotes_digest, emotes_hold, @@ -290,6 +291,8 @@ export const generateBellyString = (belly: Belly, index: number) => { result += 'Unabsorb Messages (Prey)'; result += 'Examine Messages'; result += 'Examine Messages (Absorbed)'; + result += 'Trash Eater Ingest Messages'; + result += 'Item Expel Messages'; result += ''; result += '
'; @@ -541,6 +544,18 @@ export const generateBellyString = (belly: Belly, index: number) => { }); result += '
'; + result += '
'; + trash_eater_in?.forEach((msg) => { + result += msg + '
'; + }); + result += '
'; + + result += '
'; + trash_eater_out?.forEach((msg) => { + result += msg + '
'; + }); + result += '
'; + result += ''; result += ''; result += ''; // End Div messagesTabpanel diff --git a/tgui/packages/tgui/interfaces/VorePanelExport/types.ts b/tgui/packages/tgui/interfaces/VorePanelExport/types.ts index d1141b42d17..d26612c65db 100644 --- a/tgui/packages/tgui/interfaces/VorePanelExport/types.ts +++ b/tgui/packages/tgui/interfaces/VorePanelExport/types.ts @@ -95,6 +95,8 @@ export type Belly = { unabsorb_messages_prey: string[]; examine_messages: string[]; examine_messages_absorbed: string[]; + trash_eater_in: string[]; + trash_eater_out: string[]; // emote_list: string[]; emotes_digest: string[];