diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
index ca99f6ec32f..fb761a167bb 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
@@ -28,6 +28,7 @@
selective_preference = client.prefs_vr.selective_preference
appendage_color = client.prefs_vr.appendage_color
appendage_alt_setting = client.prefs_vr.appendage_alt_setting
+ eating_privacy_global = client.prefs_vr.eating_privacy_global
drop_vore = client.prefs_vr.drop_vore
stumble_vore = client.prefs_vr.stumble_vore
diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
index 63aa9f57540..9db4b297827 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
@@ -916,4 +916,11 @@
icon_state = "zaprat"
extra_overlay = "zaprat-tips"
do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
\ No newline at end of file
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/kara //SatinIsle Fluff Item
+ name = "Pterokara horn"
+ desc = ""
+ icon = 'icons/mob/vore/ears_vr.dmi'
+ icon_state = "kara_horn"
+ ckeys_allowed = list("satinisle")
\ No newline at end of file
diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
index 85bb90c1cba..08c0d4e0152 100644
--- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
@@ -975,3 +975,9 @@
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_R_LEG, BP_L_LEG, BP_GROIN)
+/datum/sprite_accessory/marking/vr/nevrean_long
+ name = "Long Snout"
+ icon = 'icons/mob/human_races/markings_vr.dmi'
+ icon_state = "nevrean_long"
+ color_blend_mode = ICON_MULTIPLY
+ body_parts = list(BP_HEAD)
diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
index 8e3e3f7c12a..bc29290da62 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
@@ -1337,6 +1337,12 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+/datum/sprite_accessory/tail/kara //SatinIsle fluff item
+ name = "Pterokara Tail"
+ icon = 'icons/mob/vore/tails_vr.dmi'
+ icon_state = "kara_tail"
+ ckeys_allowed = list("satinisle")
+
//LONG TAILS ARE NOT TAUR BUTTS >:O
/datum/sprite_accessory/tail/longtail
name = "You should not see this..."
diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
index aba84d495bd..94db4dee96f 100644
--- a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
@@ -319,3 +319,10 @@
icon_state = "sectdrone_wing"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/kara //SatinIsle Fluff Item
+ name = "Pterokara wings"
+ desc = ""
+ icon = 'icons/mob/vore/wings_vr.dmi'
+ icon_state = "feathered_kara"
+ ckeys_allowed = list("satinisle")
\ No newline at end of file
diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm
index cfd8db13688..88e7c90a0fb 100644
--- a/code/modules/tgui/external.dm
+++ b/code/modules/tgui/external.dm
@@ -1,7 +1,8 @@
-/**
- * tgui external
+/*!
+ * External tgui definitions, such as src_object APIs.
*
- * Contains all external tgui declarations.
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
*/
/**
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index 5a66efc090d..ab80a41bd50 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -1,6 +1,9 @@
-/**
+/*!
* Base state and helpers for states. Just does some sanity checks,
* implement a proper state for in-depth checks.
+ *
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
*/
/**
diff --git a/code/modules/tgui/states/admin.dm b/code/modules/tgui/states/admin.dm
index 7009f6f8844..bfa877bc096 100644
--- a/code/modules/tgui/states/admin.dm
+++ b/code/modules/tgui/states/admin.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: admin_state
*
diff --git a/code/modules/tgui/states/always.dm b/code/modules/tgui/states/always.dm
index 30915785442..9095d043505 100644
--- a/code/modules/tgui/states/always.dm
+++ b/code/modules/tgui/states/always.dm
@@ -1,3 +1,7 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
/**
* tgui state: always_state
diff --git a/code/modules/tgui/states/conscious.dm b/code/modules/tgui/states/conscious.dm
index 6bc0c7ec031..7213a99be7f 100644
--- a/code/modules/tgui/states/conscious.dm
+++ b/code/modules/tgui/states/conscious.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: conscious_state
*
diff --git a/code/modules/tgui/states/contained.dm b/code/modules/tgui/states/contained.dm
index c2fbd0b6b06..e16159c5e54 100644
--- a/code/modules/tgui/states/contained.dm
+++ b/code/modules/tgui/states/contained.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: contained_state
*
diff --git a/code/modules/tgui/states/deep_inventory.dm b/code/modules/tgui/states/deep_inventory.dm
index 14419874538..3d0913cf82f 100644
--- a/code/modules/tgui/states/deep_inventory.dm
+++ b/code/modules/tgui/states/deep_inventory.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: deep_inventory_state
*
diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm
index 93ba1df55f7..2fe058f3e09 100644
--- a/code/modules/tgui/states/default.dm
+++ b/code/modules/tgui/states/default.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: default_state
*
diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm
index 0981b5d6ec7..9d742a4ab0b 100644
--- a/code/modules/tgui/states/hands.dm
+++ b/code/modules/tgui/states/hands.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: hands_state
*
diff --git a/code/modules/tgui/states/human_adjacent.dm b/code/modules/tgui/states/human_adjacent.dm
index 8164d5f9cee..845459e0717 100644
--- a/code/modules/tgui/states/human_adjacent.dm
+++ b/code/modules/tgui/states/human_adjacent.dm
@@ -1,3 +1,7 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
/**
* tgui state: human_adjacent_state
diff --git a/code/modules/tgui/states/inventory.dm b/code/modules/tgui/states/inventory.dm
index 92274cc1f2e..042ca7264cc 100644
--- a/code/modules/tgui/states/inventory.dm
+++ b/code/modules/tgui/states/inventory.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: inventory_state
*
diff --git a/code/modules/tgui/states/not_incapacitated.dm b/code/modules/tgui/states/not_incapacitated.dm
index 1185b516478..49f6d0097a8 100644
--- a/code/modules/tgui/states/not_incapacitated.dm
+++ b/code/modules/tgui/states/not_incapacitated.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: not_incapacitated_state
*
diff --git a/code/modules/tgui/states/notcontained.dm b/code/modules/tgui/states/notcontained.dm
index 56b789e3c04..452d0f649bc 100644
--- a/code/modules/tgui/states/notcontained.dm
+++ b/code/modules/tgui/states/notcontained.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: notcontained_state
*
diff --git a/code/modules/tgui/states/observer.dm b/code/modules/tgui/states/observer.dm
index bdfe690dbaa..f20bb1b71ff 100644
--- a/code/modules/tgui/states/observer.dm
+++ b/code/modules/tgui/states/observer.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: observer_state
*
@@ -12,4 +17,3 @@ GLOBAL_DATUM_INIT(tgui_observer_state, /datum/tgui_state/observer_state, new)
if(check_rights(R_ADMIN|R_EVENT, 0, src))
return STATUS_INTERACTIVE
return STATUS_CLOSE
-
diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm
index 9712090b5da..dc7f93d2ee7 100644
--- a/code/modules/tgui/states/physical.dm
+++ b/code/modules/tgui/states/physical.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: physical_state
*
@@ -72,4 +77,4 @@ GLOBAL_DATUM_INIT(tgui_physical_state_bigscreen, /datum/tgui_state/physical_bigs
return max(STATUS_UPDATE, shared_living_tgui_distance_bigscreen(src_object)) // Silicons can always see.
/mob/living/silicon/ai/physical_can_use_tgui_topic(src_object)
- return STATUS_UPDATE // AIs are not physical.
\ No newline at end of file
+ return STATUS_UPDATE // AIs are not physical.
diff --git a/code/modules/tgui/states/self.dm b/code/modules/tgui/states/self.dm
index 109fd6ae440..064b1b0ce66 100644
--- a/code/modules/tgui/states/self.dm
+++ b/code/modules/tgui/states/self.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: self_state
*
diff --git a/code/modules/tgui/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm
index a589a4b64d7..3e7d84e2621 100644
--- a/code/modules/tgui/states/zlevel.dm
+++ b/code/modules/tgui/states/zlevel.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: z_state
*
diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm
index 74d16a2e33d..29431c42f3b 100644
--- a/code/modules/tgui/tgui.dm
+++ b/code/modules/tgui/tgui.dm
@@ -1,7 +1,6 @@
-/**
- * tgui
- *
- * /tg/station user interface library
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
*/
/**
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 2ae59893136..02960e0a4bd 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -54,6 +54,7 @@
var/emote_active = TRUE // Are we even giving emotes out at all or not?
var/next_emote = 0 // When we're supposed to print our next emote, as a world.time
var/selective_preference = DM_DIGEST // Which type of selective bellymode do we default to?
+ var/eating_privacy_local = "default" //Overrides eating_privacy_global if not "default". Determines if attempt/success messages are subtle/loud
// Generally just used by AI
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
@@ -226,7 +227,8 @@
"belly_fullscreen_color",
"colorization_enabled",
"egg_type",
- "save_digest_mode"
+ "save_digest_mode",
+ "eating_privacy_local"
)
if (save_digest_mode == 1)
@@ -391,16 +393,28 @@
if(!ishuman(owner))
owner.update_icons()
+ //Determines privacy
+ var/privacy_range = world.view
+ var/privacy_volume = 100
+ switch(eating_privacy_local) //Third case of if("loud") not defined, as it'd just leave privacy_range and volume untouched
+ if("default")
+ if(owner.eating_privacy_global)
+ privacy_range = 1
+ privacy_volume = 25
+ if("subtle")
+ privacy_range = 1
+ privacy_volume = 25
+
//Print notifications/sound if necessary
if(!silent && count)
- owner.visible_message("[owner] [release_verb] everything from their [lowertext(name)]!")
+ owner.visible_message("[owner] [release_verb] everything from their [lowertext(name)]!", range = privacy_range)
var/soundfile
if(!fancy_vore)
soundfile = classic_release_sounds[release_sound]
else
soundfile = fancy_release_sounds[release_sound]
if(soundfile)
- playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
+ playsound(src, soundfile, vol = privacy_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
return count
@@ -459,16 +473,28 @@
if(!ishuman(owner))
owner.update_icons()
+ //Determines privacy
+ var/privacy_range = world.view
+ var/privacy_volume = 100
+ switch(eating_privacy_local) //Third case of if("loud") not defined, as it'd just leave privacy_range and volume untouched
+ if("default")
+ if(owner.eating_privacy_global)
+ privacy_range = 1
+ privacy_volume = 25
+ if("subtle")
+ privacy_range = 1
+ privacy_volume = 25
+
//Print notifications/sound if necessary
if(!silent)
- owner.visible_message("[owner] [release_verb] [M] from their [lowertext(name)]!")
+ owner.visible_message("[owner] [release_verb] [M] from their [lowertext(name)]!",range = privacy_range)
var/soundfile
if(!fancy_vore)
soundfile = classic_release_sounds[release_sound]
else
soundfile = fancy_release_sounds[release_sound]
if(soundfile)
- playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
+ playsound(src, soundfile, vol = privacy_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
//Should fix your view not following you out of mobs sometimes!
if(ismob(M))
var/mob/ourmob = M
@@ -1187,6 +1213,7 @@
dupe.emote_active = emote_active
dupe.selective_preference = selective_preference
dupe.save_digest_mode = save_digest_mode
+ dupe.eating_privacy_local = eating_privacy_local
//// Object-holding variables
//struggle_messages_outside - strings
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 9e37b888cea..66739c747b6 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -50,6 +50,7 @@
var/selective_preference = DM_DEFAULT // Preference for selective bellymode
var/appendage_color = "#e03997" //Default pink. Used for the 'long_vore' trait.
var/appendage_alt_setting = FALSE // Dictates if 'long_vore' user pulls prey to them or not. 1 = user thrown towards target.
+ var/eating_privacy_global = FALSE //Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var
var/regen_sounds = list(
'sound/effects/mob_effects/xenochimera/regen_1.ogg',
'sound/effects/mob_effects/xenochimera/regen_2.ogg',
@@ -286,6 +287,7 @@
P.slip_vore = src.slip_vore
P.throw_vore = src.throw_vore
P.stumble_vore = src.stumble_vore
+ P.eating_privacy_global = src.eating_privacy_global
P.nutrition_message_visible = src.nutrition_message_visible
P.nutrition_messages = src.nutrition_messages
@@ -335,6 +337,7 @@
slip_vore = P.slip_vore
throw_vore = P.throw_vore
stumble_vore = P.stumble_vore
+ eating_privacy_global = P.eating_privacy_global
nutrition_message_visible = P.nutrition_message_visible
nutrition_messages = P.nutrition_messages
@@ -600,6 +603,18 @@
to_chat(user, "They aren't aren't in a state to be devoured.")
return FALSE
+ //Determining vore attempt privacy
+ var/message_range = world.view
+ if(!pred.is_slipping && !prey.is_slipping) //We only care about privacy preference if it's NOT a spontaneous vore.
+ switch(belly.eating_privacy_local) //if("loud") case not added, as it would not modify message_range
+ if("default")
+ if(pred.eating_privacy_global)
+ message_range = 1
+ if("subtle")
+ message_range = 1
+
+
+
// Slipnoms from chompstation downstream, credit to cadyn for the original PR.
// Prepare messages
if(prey.is_slipping)
@@ -616,7 +631,10 @@
success_msg = "[user] manages to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!"
// Announce that we start the attempt!
- user.visible_message(attempt_msg)
+
+
+ user.visible_message(attempt_msg, range = message_range)
+
// Now give the prey time to escape... return if they did
var/swallow_time
@@ -633,7 +651,7 @@
return FALSE // Prey escpaed (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it!
- user.visible_message(success_msg)
+ user.visible_message(success_msg, range = message_range)
// Actually shove prey into the belly.
if(istype(prey.loc, /obj/item/weapon/holder))
@@ -1079,6 +1097,7 @@
dispvoreprefs += "Spontaneous transformation: [allow_spontaneous_tf ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Can be stepped on/over: [step_mechanics_pref ? "Allowed" : "Disallowed"]
"
dispvoreprefs += "Can be picked up: [pickup_pref ? "Allowed" : "Disallowed"]
"
+ dispvoreprefs += "Global Vore Privacy is: [eating_privacy_global ? "Subtle" : "Loud"]
"
user << browse("
Vore prefs: [src][dispvoreprefs]", "window=[name]mvp;size=300x400;can_resize=1;can_minimize=0")
onclose(user, "[name]")
return
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index 2228c9cfb68..7911fcc09f1 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -55,6 +55,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/allowmobvore = TRUE
var/permit_healbelly = TRUE
var/noisy = FALSE
+ var/eating_privacy_global = FALSE //Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var
// These are 'modifier' prefs, do nothing on their own but pair with drop_prey/drop_pred settings.
var/drop_vore = TRUE
@@ -192,6 +193,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
nutrition_messages = json_from_file["nutrition_messages"]
weight_message_visible = json_from_file["weight_message_visible"]
weight_messages = json_from_file["weight_messages"]
+ eating_privacy_global = json_from_file["eating_privacy_global"]
//Quick sanitize
if(isnull(digestable))
@@ -246,6 +248,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
nutrition_message_visible = TRUE
if(isnull(weight_message_visible))
weight_message_visible = TRUE
+ if(isnull(eating_privacy_global))
+ eating_privacy_global = FALSE
if(isnull(nutrition_messages))
nutrition_messages = list(
"They are starving! You can hear their stomach snarling from across the room!",
@@ -316,6 +320,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"nutrition_messages" = nutrition_messages,
"weight_message_visible" = weight_message_visible,
"weight_messages" = weight_messages,
+ "eating_privacy_global" = eating_privacy_global,
)
//List to JSON
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 54c0dc25a52..4a222d72ce2 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -191,6 +191,7 @@
"belly_fullscreen" = selected.belly_fullscreen,
"belly_fullscreen_color" = selected.belly_fullscreen_color,
"colorization_enabled" = selected.colorization_enabled,
+ "eating_privacy_local" = selected.eating_privacy_local
)
var/list/addons = list()
@@ -284,7 +285,8 @@
"nutrition_message_visible" = host.nutrition_message_visible,
"nutrition_messages" = host.nutrition_messages,
"weight_message_visible" = host.weight_message_visible,
- "weight_messages" = host.weight_messages
+ "weight_messages" = host.weight_messages,
+ "eating_privacy_global" = host.eating_privacy_global
)
return data
@@ -450,6 +452,12 @@
host.client.prefs_vr.digestable = host.digestable
unsaved_changes = TRUE
return TRUE
+ if("toggle_global_privacy")
+ host.eating_privacy_global = !host.eating_privacy_global
+ if(host.client.prefs_vr)
+ host.eating_privacy_global = host.eating_privacy_global
+ unsaved_changes = TRUE
+ return TRUE
if("toggle_devour")
host.devourable = !host.devourable
if(host.client.prefs_vr)
@@ -1101,6 +1109,12 @@
host.vore_selected.release_verb = new_release_verb
. = TRUE
+ if("b_eating_privacy")
+ var/privacy_choice = tgui_input_list(usr, "Choose your belly-specific preference. Default uses global preference!", "Eating message privacy", list("default", "subtle", "loud"), "default")
+ if(privacy_choice == null)
+ return FALSE
+ host.vore_selected.eating_privacy_local = privacy_choice
+ . = TRUE
if("b_fancy_sound")
host.vore_selected.fancy_vore = !host.vore_selected.fancy_vore
host.vore_selected.vore_sound = "Gulp"
diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm
index 20ea7baa0be..eb98a0ae762 100644
--- a/code/modules/vore/mouseray.dm
+++ b/code/modules/vore/mouseray.dm
@@ -245,6 +245,7 @@
new_mob.vore_smell = vore_smell
new_mob.nutrition_message_visible = nutrition_message_visible
new_mob.allow_spontaneous_tf = allow_spontaneous_tf
+ new_mob.eating_privacy_global = eating_privacy_global
/////SUBTYPES/////
diff --git a/icons/inventory/face/mob_vr_fennec.dmi b/icons/inventory/face/mob_vr_fennec.dmi
index e956562a590..4179157c787 100644
Binary files a/icons/inventory/face/mob_vr_fennec.dmi and b/icons/inventory/face/mob_vr_fennec.dmi differ
diff --git a/icons/inventory/face/mob_vr_fox.dmi b/icons/inventory/face/mob_vr_fox.dmi
index aed2ae8eced..1f3ed5263b9 100644
Binary files a/icons/inventory/face/mob_vr_fox.dmi and b/icons/inventory/face/mob_vr_fox.dmi differ
diff --git a/icons/inventory/face/mob_vr_sergal.dmi b/icons/inventory/face/mob_vr_sergal.dmi
index 99d4a069ef4..6a2fdb781df 100644
Binary files a/icons/inventory/face/mob_vr_sergal.dmi and b/icons/inventory/face/mob_vr_sergal.dmi differ
diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi
index 672985eeec6..755050fe4af 100644
Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ
diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi
index 0da5ddb7266..a9a4980b58d 100644
Binary files a/icons/mob/vore/ears_vr.dmi and b/icons/mob/vore/ears_vr.dmi differ
diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi
index d55293ae14f..a842bfd6ce8 100644
Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ
diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi
index cdcac1d4cde..3eb91889e58 100644
Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ
diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm
index 4938e34bf91..9b433defd3d 100644
--- a/maps/stellar_delight/stellar_delight1.dmm
+++ b/maps/stellar_delight/stellar_delight1.dmm
@@ -10741,6 +10741,7 @@
/turf/simulated/floor/tiled/dark,
/area/security/security_lockerroom)
"wf" = (
+/obj/machinery/alarm/angled,
/turf/simulated/floor,
/area/maintenance/security_port)
"wg" = (
diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js
index cdd511d6873..f4cb7514193 100644
--- a/tgui/packages/tgui/interfaces/VorePanel.js
+++ b/tgui/packages/tgui/interfaces/VorePanel.js
@@ -451,6 +451,7 @@ const VoreSelectedBellyOptions = (props, context) => {
egg_type,
selective_preference,
save_digest_mode,
+ eating_privacy_local,
} = belly;
return (
@@ -512,6 +513,12 @@ const VoreSelectedBellyOptions = (props, context) => {
content={display_absorbed_examine ? 'True' : 'False'}
/>
+
+