diff --git a/code/modules/emotes/custom_emote.dm b/code/modules/emotes/custom_emote.dm index aea3d418578..58dc74901be 100644 --- a/code/modules/emotes/custom_emote.dm +++ b/code/modules/emotes/custom_emote.dm @@ -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]") diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 0d96a103982..6b2f57811e7 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -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) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index f46cb9f203b..df89326d692 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -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 @@ -272,6 +280,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) @@ -286,7 +295,15 @@ f = TRUE else if(M.absorbed && isbelly(M.loc)) pb = M.loc.loc - to_chat(pb, span_psay("\The [M] thinks, \"[message]\"")) //To our pred if absorbed + 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)) pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE @@ -303,7 +320,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)) L << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE @@ -312,14 +329,14 @@ 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)) db << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE 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)) L << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE @@ -339,7 +356,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 @@ -368,6 +385,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) @@ -383,7 +401,15 @@ else if(M.absorbed && isbelly(M.loc)) pb = M.loc.loc - to_chat(pb, span_pemote("\The [M] [message]")) //To our pred if absorbed + 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)) pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE @@ -393,14 +419,14 @@ 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)) db << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE 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)) L << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE @@ -409,21 +435,21 @@ 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)) db << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE 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)) L << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE 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)) M << sound('sound/talksounds/subtle_sound.ogg', volume = 50) else @@ -436,7 +462,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 diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index b1a0204219d..c69f74421f3 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -23,6 +23,10 @@ BB = new projectile_type(src) randpixel_xy() +/obj/item/ammo_casing/Destroy() + QDEL_NULL(BB) + return ..() + //removes the projectile from the ammo casing /obj/item/ammo_casing/proc/expend() . = BB diff --git a/code/modules/vore/eating/belly_import.dm b/code/modules/vore/eating/belly_import.dm index 7d4ec769748..daec2fb835b 100644 --- a/code/modules/vore/eating/belly_import.dm +++ b/code/modules/vore/eating/belly_import.dm @@ -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"))) diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index ead8d0c807c..56239200d77 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -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", diff --git a/code/modules/vore/eating/exportpanel_vr.dm b/code/modules/vore/eating/exportpanel_vr.dm index 449e522299a..0a8b3d32d5f 100644 --- a/code/modules/vore/eating/exportpanel_vr.dm +++ b/code/modules/vore/eating/exportpanel_vr.dm @@ -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 diff --git a/code/modules/vore/eating/panel_databackend/vorepanel_set_attribute.dm b/code/modules/vore/eating/panel_databackend/vorepanel_set_attribute.dm index 6c72dd464dd..25624702c96 100644 --- a/code/modules/vore/eating/panel_databackend/vorepanel_set_attribute.dm +++ b/code/modules/vore/eating/panel_databackend/vorepanel_set_attribute.dm @@ -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 diff --git a/code/modules/vore/eating/panel_databackend/vorepanel_vore_data.dm b/code/modules/vore/eating/panel_databackend/vorepanel_vore_data.dm index 5d886ff8fa7..2bc1a5fdfb2 100644 --- a/code/modules/vore/eating/panel_databackend/vorepanel_vore_data.dm +++ b/code/modules/vore/eating/panel_databackend/vorepanel_vore_data.dm @@ -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, ) diff --git a/tgui/packages/tgui/interfaces/TicketsPanel.tsx b/tgui/packages/tgui/interfaces/TicketsPanel.tsx index 7710d2e81e3..aeaf41ecee1 100644 --- a/tgui/packages/tgui/interfaces/TicketsPanel.tsx +++ b/tgui/packages/tgui/interfaces/TicketsPanel.tsx @@ -182,15 +182,8 @@ export const TicketsPanel = (props) => { - {ticket.ishandled ? ( - - {availableLevel[ticket.level]} - - ) : ( + {!ticket.ishandled && + ticket.state === State.open ? ( { {availableLevel[ticket.level]} + ) : ( + + {availableLevel[ticket.level]} + )} {ticket.name} diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/OptionTab/BellyOptionsLeft.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/OptionTab/BellyOptionsLeft.tsx index 7686d491735..b3fd4597c1f 100644 --- a/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/OptionTab/BellyOptionsLeft.tsx +++ b/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/OptionTab/BellyOptionsLeft.tsx @@ -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: { } /> + + + + {!!absorbedrename_enabled && ( + + + + )}