[MIRROR] Absorb Prey Names (#11411)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
Co-authored-by: fracshun <fracshun@gmail.com>
Co-authored-by: vorestation-ci[bot] <199609141+vorestation-ci[bot]@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aroliacue <96730930+Aroliacue@users.noreply.github.com>
Co-authored-by: Aroliacue <avaylaiss34@gmail.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-08-13 15:42:48 -07:00
committed by GitHub
parent 67587a10a0
commit b0f1c1a115
11 changed files with 132 additions and 21 deletions

View File

@@ -65,6 +65,14 @@
/mob/proc/build_the_emote(m_type, message, input, range, runemessage)
if(client)
message = span_emote(span_bold("[src]") + " [input]")
if(src.absorbed && isbelly(src.loc))
var/obj/belly/B = src.loc
if(B.absorbedrename_enabled)
var/formatted_name = B.absorbedrename_name
formatted_name = replacetext(formatted_name,"%pred",B.owner)
formatted_name = replacetext(formatted_name,"%belly",B.name)
formatted_name = replacetext(formatted_name,"%prey",name)
message = span_emote(span_bold("[formatted_name]") + " [input]")
else
message = span_npc_emote(span_bold("[src]") + " [input]")

View File

@@ -2,6 +2,10 @@
var/datum/component/shadekin/SK = get_shadekin_component()
if(SK && SK.in_phase)
return ""
if(absorbed && isbelly(loc))
var/obj/belly/B = loc
if(B.absorbedrename_enabled)
return "" // Don't use alt name if under absorbed rename.
if(name != GetVoice())
return " (as [get_id_name("Unknown")])"
@@ -107,6 +111,14 @@
return comp.mimicing
if(GetSpecialVoice())
return GetSpecialVoice()
if(absorbed && isbelly(loc)) // If absorbed in a belly, check and apply absorbed rename if applicable.
var/obj/belly/B = loc
if(B.absorbedrename_enabled)
var/formatted_name = B.absorbedrename_name
formatted_name = replacetext(formatted_name,"%pred",B.owner)
formatted_name = replacetext(formatted_name,"%belly",B.name)
formatted_name = replacetext(formatted_name,"%prey",name)
return formatted_name
return real_name
/mob/living/carbon/human/proc/SetSpecialVoice(var/new_voice)

View File

@@ -76,6 +76,14 @@
if(input)
log_subtle(message,src)
message = span_emote_subtle(span_bold("[src]") + " " + span_italics("[input]"))
if(src.absorbed && isbelly(src.loc))
var/obj/belly/B = src.loc
if(B.absorbedrename_enabled)
var/formatted_name = B.absorbedrename_name
formatted_name = replacetext(formatted_name,"%pred",B.owner)
formatted_name = replacetext(formatted_name,"%belly",B.name)
formatted_name = replacetext(formatted_name,"%prey",name)
message = span_emote_subtle(span_bold("[formatted_name]") + " " + span_italics("[input]"))
if(!(subtle_mode == "Adjacent Turfs (Default)"))
message = span_bold("(T) ") + message
else
@@ -273,6 +281,7 @@
var/f = FALSE //did we find someone to send the message to other than ourself?
var/mob/living/pb //predator body
var/mob/living/M = src
var/formatted_name = "\The [M]"
if(istype(M, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = M
if(db.loc != db.pred_body)
@@ -288,6 +297,14 @@
f = TRUE
else if(M.absorbed && isbelly(M.loc))
pb = M.loc.loc
var/obj/belly/B = M.loc
if(B.absorbedrename_enabled)
formatted_name = B.absorbedrename_name
formatted_name = replacetext(formatted_name,"%pred",B.owner)
formatted_name = replacetext(formatted_name,"%belly",B.name)
formatted_name = replacetext(formatted_name,"%prey","\The [M]")
to_chat(pb, span_psay("[formatted_name] thinks, \"[message]\""))
else
to_chat(pb, span_psay("\The [M] thinks, \"[message]\"")) //To our pred if absorbed
if(pb.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
@@ -307,7 +324,7 @@
for(var/B in pb.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed && L != M && L.ckey)
to_chat(L, span_psay("\The [M] thinks, \"[message]\"")) //To any absorbed people in the pred
to_chat(L, span_psay("[formatted_name] thinks, \"[message]\"")) //To any absorbed people in the pred
if(L.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
L << sound(pick(voice_sounds_list), volume = 25)
@@ -317,7 +334,7 @@
for(var/I in M.contents)
if(istype(I, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = I
to_chat(db, span_psay(span_bold("\The [M] thinks, \"[message]\""))) //To any dominated brains inside us
to_chat(db, span_psay(span_bold("[formatted_name] thinks, \"[message]\""))) //To any dominated brains inside us
if(db.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
db << sound(pick(voice_sounds_list), volume = 25)
@@ -325,7 +342,7 @@
for(var/B in M.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed)
to_chat(L, span_psay(span_bold("\The [M] thinks, \"[message]\""))) //To any absorbed people inside us
to_chat(L, span_psay(span_bold("[formatted_name] thinks, \"[message]\""))) //To any absorbed people inside us
if(L.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
L << sound(pick(voice_sounds_list), volume = 25)
@@ -348,7 +365,7 @@
else if(isobserver(G) && G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_ears) && \
G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle))
if(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || check_rights_for(G.client, R_HOLDER))
to_chat(G, span_psay("\The [M] thinks, \"[message]\""))
to_chat(G, span_psay("[formatted_name] thinks, \"[message]\""))
log_say(message,M)
else //There wasn't anyone to send the message to, pred or prey, so let's just say it instead and correct our psay just in case.
M.forced_psay = FALSE
@@ -377,6 +394,7 @@
var/f = FALSE //did we find someone to send the message to other than ourself?
var/mob/living/pb //predator body
var/mob/living/M = src
var/formatted_name = "\The [M]"
if(istype(M, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = M
if(db.loc != db.pred_body)
@@ -393,6 +411,14 @@
else if(M.absorbed && isbelly(M.loc))
pb = M.loc.loc
var/obj/belly/B = M.loc
if(B.absorbedrename_enabled)
formatted_name = B.absorbedrename_name
formatted_name = replacetext(formatted_name,"%pred",B.owner)
formatted_name = replacetext(formatted_name,"%belly",B.name)
formatted_name = replacetext(formatted_name,"%prey","\The [M]")
to_chat(pb, span_pemote("[formatted_name] [message]"))
else
to_chat(pb, span_pemote("\The [M] [message]")) //To our pred if absorbed
if(pb.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
@@ -404,7 +430,7 @@
for(var/I in pb.contents)
if(istype(I, /mob/living/dominated_brain) && I != M)
var/mob/living/dominated_brain/db = I
to_chat(db, span_pemote("\The [M] [message]")) //To any dominated brains in the pred
to_chat(db, span_pemote("[formatted_name] [message]")) //To any dominated brains in the pred
if(db.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
pb << sound(pick(voice_sounds_list), volume = 25)
@@ -412,7 +438,7 @@
for(var/B in pb.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed && L != M && L.ckey)
to_chat(L, span_pemote("\The [M] [message]")) //To any absorbed people in the pred
to_chat(L, span_pemote("[formatted_name] [message]")) //To any absorbed people in the pred
if(L.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
L << sound(pick(voice_sounds_list), volume = 25)
@@ -422,7 +448,7 @@
for(var/I in M.contents)
if(istype(I, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = I
to_chat(db, span_pemote(span_bold("\The [M] [message]"))) //To any dominated brains inside us
to_chat(db, span_pemote(span_bold("[formatted_name] [message]"))) //To any dominated brains inside us
if(db.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
db << sound(pick(voice_sounds_list), volume = 25)
@@ -430,7 +456,7 @@
for(var/B in M.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed)
to_chat(L, span_pemote(span_bold("\The [M] [message]"))) //To any absorbed people inside us
to_chat(L, span_pemote(span_bold("[formatted_name] [message]"))) //To any absorbed people inside us
if(L.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
L << sound(pick(voice_sounds_list), volume = 25)
@@ -438,7 +464,7 @@
if(f) //We found someone to send the message to
if(pb)
to_chat(M, span_pemote("\The [M] [message]")) //To us if we are the prey
to_chat(M, span_pemote("[formatted_name] [message]")) //To us if we are the prey
if(M.read_preference(/datum/preference/toggle/subtle_sounds))
if(voice_sounds_list) //CHOMPEdit, changes subtle emote sound to use mob voice instead
M << sound(pick(voice_sounds_list), volume = 25)
@@ -453,7 +479,7 @@
else if(isobserver(G) && G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_ears) && \
G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle))
if(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || check_rights_for(G.client, R_HOLDER))
to_chat(G, span_pemote("\The [M] [message]"))
to_chat(G, span_pemote("[formatted_name] [message]"))
log_say(message,M)
else //There wasn't anyone to send the message to, pred or prey, so let's just emote it instead and correct our psay just in case.
M.forced_psay = FALSE

View File

@@ -604,6 +604,18 @@
if(new_private_struggle == 1)
new_belly.private_struggle = TRUE
if(isnum(belly_data["absorbedrename_enabled"]))
var/new_absorbedrename_enabled = belly_data["absorbedrename_enabled"]
if(new_absorbedrename_enabled == 0)
new_belly.absorbedrename_enabled = FALSE
if(new_absorbedrename_enabled == 1)
new_belly.absorbedrename_enabled = TRUE
if(istext(belly_data["absorbedrename_name"]))
var/new_absorbedrename_name = sanitize(belly_data["absorbedrename_name"],MAX_MESSAGE_LEN,0,0,0)
if(new_absorbedrename_name)
new_belly.absorbedrename_name = new_absorbedrename_name
if(istext(belly_data["eating_privacy_local"]))
var/new_eating_privacy_local = html_encode(belly_data["eating_privacy_local"])
if(new_eating_privacy_local && (new_eating_privacy_local in list("default","subtle","loud")))

View File

@@ -68,6 +68,8 @@
var/belly_overall_mult = 1 //Multiplier applied ontop of any other specific multipliers
var/private_struggle = FALSE // If struggles are made public or not
var/prevent_saving = FALSE // Can this belly be saved? For special bellies that mobs and adminbus might have.
var/absorbedrename_enabled = FALSE // If absorbed prey are renamed.
var/absorbedrename_name = "%pred's %belly" // What absorbed prey are renamed to.
var/vore_sprite_flags = DM_FLAG_VORESPRITE_BELLY
@@ -439,6 +441,8 @@
"entrance_logs",
"noise_freq",
"private_struggle",
"absorbedrename_enabled",
"absorbedrename_name",
"item_digest_logs",
"show_fullness_messages",
"digest_max",

View File

@@ -311,6 +311,8 @@
belly_data["item_digest_logs"] = B.item_digest_logs
belly_data["eating_privacy_local"] = B.eating_privacy_local
belly_data["private_struggle"] = B.private_struggle
belly_data["absorbedrename_enabled"] = B.absorbedrename_enabled
belly_data["absorbedrename_name"] = B.absorbedrename_name
// Sounds
belly_data["is_wet"] = B.is_wet

View File

@@ -877,6 +877,14 @@
if("b_private_struggle")
host.vore_selected.private_struggle = !host.vore_selected.private_struggle
. = TRUE
if("b_absorbedrename_enabled")
host.vore_selected.absorbedrename_enabled = !host.vore_selected.absorbedrename_enabled
. = TRUE
if("b_absorbedrename_name")
var/new_absorbedrename_name = sanitize(params["val"], MAX_MESSAGE_LEN, FALSE, TRUE, FALSE)
if(new_absorbedrename_name)
host.vore_selected.absorbedrename_name = new_absorbedrename_name
. = TRUE
if("b_vorespawn_blacklist")
host.vore_selected.vorespawn_blacklist = !host.vore_selected.vorespawn_blacklist
. = TRUE

View File

@@ -184,6 +184,10 @@
"vorespawn_whitelist" = selected.vorespawn_whitelist,
"vorespawn_absorbed" = (global_flag_check(selected.vorespawn_absorbed, VS_FLAG_ABSORB_YES) + global_flag_check(selected.vorespawn_absorbed, VS_FLAG_ABSORB_PREY)),
"private_struggle" = selected.private_struggle,
"absorbedrename_enabled" = selected.absorbedrename_enabled,
"absorbedrename_name" = selected.absorbedrename_name,
"absorbedrename_name_max" = BELLIES_NAME_MAX,
"absorbedrename_name_min" = BELLIES_NAME_MIN,
"drainmode" = selected.drainmode,
"drainmode_options" = selected.drainmodes,
)

View File

@@ -182,15 +182,8 @@ export const TicketsPanel = (props) => {
<Stack.Item>
<Stack align="center">
<Stack.Item>
{ticket.ishandled ? (
<Box
textColor="white"
className="TicketPanel__Label"
backgroundColor={LevelColor[ticket.level]}
>
{availableLevel[ticket.level]}
</Box>
) : (
{!ticket.ishandled &&
ticket.state === State.open ? (
<Blink>
<Box
textColor="white"
@@ -200,6 +193,14 @@ export const TicketsPanel = (props) => {
{availableLevel[ticket.level]}
</Box>
</Blink>
) : (
<Box
textColor="white"
className="TicketPanel__Label"
backgroundColor={LevelColor[ticket.level]}
>
{availableLevel[ticket.level]}
</Box>
)}
</Stack.Item>
<Stack.Item>{ticket.name}</Stack.Item>

View File

@@ -7,6 +7,7 @@ import { VorePanelColorBox } from '../../VorePanelElements/VorePanelCommonElemen
import { VorePanelEditDropdown } from '../../VorePanelElements/VorePanelEditDropdown';
import { VorePanelEditNumber } from '../../VorePanelElements/VorePanelEditNumber';
import { VorePanelEditSwitch } from '../../VorePanelElements/VorePanelEditSwitch';
import { VorePanelEditText } from '../../VorePanelElements/VorePanelEditText';
import { VoreSelectedWhitelist } from '../VisualTab/VoreSelecetedWhitelist';
export const BellyOptionsLeft = (props: {
@@ -27,6 +28,10 @@ export const BellyOptionsLeft = (props: {
save_digest_mode,
eating_privacy_local,
private_struggle,
absorbedrename_enabled,
absorbedrename_name,
absorbedrename_name_max,
absorbedrename_name_min,
vorespawn_blacklist,
vorespawn_whitelist,
vorespawn_absorbed,
@@ -163,6 +168,31 @@ export const BellyOptionsLeft = (props: {
}
/>
</LabeledList.Item>
<LabeledList.Item label="Toggle Absorbed Rename">
<VorePanelEditSwitch
action="set_attribute"
subAction="b_absorbedrename_enabled"
editMode={editMode}
active={!!absorbedrename_enabled}
tooltip={
(absorbedrename_enabled ? 'Dis' : 'En') +
'ables renaming absorbed prey. Please keep in mind bystander consent when enabling this setting. This is your only warning.'
}
/>
</LabeledList.Item>
{!!absorbedrename_enabled && (
<LabeledList.Item label="Absorbed Prey Name">
<VorePanelEditText
action="set_attribute"
subAction="b_absorbedrename_name"
editMode={editMode}
limit={absorbedrename_name_max}
min={absorbedrename_name_min}
entry={absorbedrename_name}
tooltip="Name your absorbed prey, works with %pred, %prey and %belly."
/>
</LabeledList.Item>
)}
<LabeledList.Item label="Save Digest Mode">
<VorePanelEditSwitch
action="set_attribute"

View File

@@ -131,6 +131,10 @@ export type bellyOptionData = {
vorespawn_whitelist: string[];
vorespawn_absorbed: number;
private_struggle: BooleanLike;
absorbedrename_enabled: BooleanLike;
absorbedrename_name: string;
absorbedrename_name_max: number;
absorbedrename_name_min: number;
drainmode_options: string[];
drainmode: string;
};