From fa6fb47fdb9024f96a1f5b3c07f20cac6cc482b0 Mon Sep 17 00:00:00 2001 From: Runa Dacino Date: Sat, 20 May 2023 14:42:07 +0200 Subject: [PATCH] Adds new preference for vore privacy * Adds a "global" pref to set default belly privacy behaviour * "global" pref shows up with prefs like "devourable" * Adds per-belly pref that, if changed from "default", overrides "global" pref * per-belly pref in "options" of belly, same column as "save digestion" * Global options: True/False (subtle/loud) * Per-belly options: "default", "subtle", "loud" * Governs attempting to ingest * Governs successful ingestion * Governs expelling one/all contents * does NOT work for slipvore * Ingestion only works for /mob/living * Expulsion also works for objects * Expulsion also has its volume lowered * Involves touching TGUI --- .../living/simple_mob/subtypes/vore/vore.dm | 1 + code/modules/vore/eating/belly_obj_vr.dm | 37 ++++++++++++++++--- code/modules/vore/eating/living_vr.dm | 23 +++++++++++- code/modules/vore/eating/vore_vr.dm | 5 +++ code/modules/vore/eating/vorepanel_vr.dm | 16 +++++++- code/modules/vore/mouseray.dm | 1 + tgui/packages/tgui/interfaces/VorePanel.js | 27 ++++++++++++++ tgui/public/tgui.bundle.js | 2 +- 8 files changed, 103 insertions(+), 9 deletions(-) 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/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/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'} /> + +