From 430d7cb1830be07e61ea886718090ea6a258c5a3 Mon Sep 17 00:00:00 2001
From: TheGreatKitsune <88862343+TheGreatKitsune@users.noreply.github.com>
Date: Thu, 27 Nov 2025 04:46:58 -0600
Subject: [PATCH] Add AFK pred/prey and contaminate worn items preferences
(#18783)
* Add AFK pred/prey and contaminate worn items preferences
* Slight changes
---
code/__defines/vore_prefs.dm | 3 ++
code/_helpers/vore.dm | 4 ++
.../living/simple_mob/subtypes/vore/vore.dm | 3 ++
code/modules/vore/eating/bellymodes_vr.dm | 2 +-
code/modules/vore/eating/living_vr.dm | 5 +-
code/modules/vore/eating/mob_vr.dm | 3 ++
.../panel_databackend/vorepanel_pref_data.dm | 3 ++
code/modules/vore/eating/vore_procs.dm | 12 +++++
code/modules/vore/eating/vore_vr.dm | 15 ++++++
code/modules/vore/eating/vorepanel_vr.dm | 18 +++++++
.../VorePanelMainTabs/VoreUserPreferences.tsx | 50 +++++++++++++++++++
.../VoreUserPreferencesDevouring.tsx | 20 ++++++--
.../VoreUserPreferencesMechanical.tsx | 8 ++-
.../tgui/interfaces/VorePanel/types.ts | 6 +++
14 files changed, 145 insertions(+), 7 deletions(-)
diff --git a/code/__defines/vore_prefs.dm b/code/__defines/vore_prefs.dm
index c507d076b6d..28eed19fcd5 100644
--- a/code/__defines/vore_prefs.dm
+++ b/code/__defines/vore_prefs.dm
@@ -20,6 +20,8 @@
\
target.can_be_drop_prey = source.can_be_drop_prey; \
target.can_be_drop_pred = source.can_be_drop_pred; \
+ target.can_be_afk_prey = source.can_be_afk_prey; \
+ target.can_be_afk_pred = source.can_be_afk_pred; \
target.throw_vore = source.throw_vore; \
target.food_vore = source.food_vore; \
target.drop_vore = source.drop_vore; \
@@ -56,6 +58,7 @@
\
target.autotransferable = source.autotransferable; \
target.strip_pref = source.strip_pref; \
+ target.contaminate_pref = source.contaminate_pref; \
target.vore_sprite_multiply = source.vore_sprite_multiply; \
target.vore_sprite_color = source.vore_sprite_color; \
target.belly_rub_target = source.belly_rub_target; \
diff --git a/code/_helpers/vore.dm b/code/_helpers/vore.dm
index 84bb89af82f..77d88ff0646 100644
--- a/code/_helpers/vore.dm
+++ b/code/_helpers/vore.dm
@@ -17,6 +17,10 @@
return FALSE
if(!pred.vore_selected)
return FALSE
+ if(!pred.can_be_afk_pred && (!pred.client || pred.away_from_keyboard))
+ return FALSE
+ if(!prey.can_be_afk_prey && (!prey.client || prey.away_from_keyboard))
+ return FALSE
return TRUE
/// Basic spont vore check.
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 c829b4fefd8..6e1352176da 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
@@ -32,6 +32,8 @@
feeding = client.prefs_vr.feeding
can_be_drop_prey = client.prefs_vr.can_be_drop_prey
can_be_drop_pred = client.prefs_vr.can_be_drop_pred
+ can_be_afk_prey = client.prefs_vr.can_be_afk_prey
+ can_be_afk_pred = client.prefs_vr.can_be_afk_pred
throw_vore = client.prefs_vr.throw_vore
food_vore = client.prefs_vr.food_vore
consume_liquid_belly = client.prefs_vr.consume_liquid_belly
@@ -65,6 +67,7 @@
autotransferable = client.prefs_vr.autotransferable
noisy_full = client.prefs_vr.noisy_full
strip_pref = client.prefs_vr.strip_pref
+ contaminate_pref = client.prefs_vr.contaminate_pref
vore_sprite_color = client.prefs_vr.vore_sprite_color
vore_sprite_multiply = client.prefs_vr.vore_sprite_multiply
no_latejoin_vore_warning = client.prefs_vr.no_latejoin_vore_warning
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index ed0814463e1..62b91cbb089 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -210,7 +210,7 @@
H.forced_psay = FALSE
//Worn items flag
- if(mode_flags & DM_FLAG_AFFECTWORN)
+ if((mode_flags & DM_FLAG_AFFECTWORN) && H.contaminate_pref)
for(var/slot in slots)
var/obj/item/I = H.get_equipped_item(slot = slot)
if(I && I.canremove)
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index fac4cbf526a..d7ae220ee34 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -1059,10 +1059,13 @@
dat += span_bold("Affected by temperature:") + " [allowtemp ? span_green("Enabled") : span_red("Disabled")]
"
dat += span_bold("Autotransferable:") + " [autotransferable ? span_green("Enabled") : span_red("Disabled")]
"
dat += span_bold("Can be stripped:") + " [strip_pref ? span_green("Allowed") : span_red("Disallowed")]
"
+ dat += span_bold("Worn items can be contaminated:") + " [contaminate_pref ? span_green("Allowed") : span_red("Disallowed")]
"
dat += span_bold("Applying reagents:") + " [apply_reagents ? span_green("Allowed") : span_red("Disallowed")]
"
dat += span_bold("Leaves Remains:") + " [digest_leave_remains ? span_green("Enabled") : span_red("Disabled")]
"
- dat += span_bold("Spontaneous vore prey:") + " [can_be_drop_prey ? span_green("Enabled") : span_red("Disabled")]
"
+ dat += span_bold("Spontaneous vore prey:") + " [can_be_drop_prey ? span_green("Enabled") : span_red("Disabled")]
"
+ dat += span_bold("AFK/Disconnected vore prey:") + " [can_be_afk_prey ? span_green("Enabled") : span_red("Disabled")]
"
dat += span_bold("Spontaneous vore pred:") + " [can_be_drop_pred ? span_green("Enabled") : span_red("Disabled")]
"
+ dat += span_bold("AFK/Disconnected vore pred:") + " [can_be_afk_pred ? span_green("Enabled") : span_red("Disabled")]
"
if(can_be_drop_prey || can_be_drop_pred)
dat += span_bold("Drop Vore:") + " [drop_vore ? span_green("Enabled") : span_red("Disabled")]
"
dat += span_bold("Slip Vore:") + " [slip_vore ? span_green("Enabled") : span_red("Disabled")]
"
diff --git a/code/modules/vore/eating/mob_vr.dm b/code/modules/vore/eating/mob_vr.dm
index be5c0bea0e7..af2c079f179 100644
--- a/code/modules/vore/eating/mob_vr.dm
+++ b/code/modules/vore/eating/mob_vr.dm
@@ -23,6 +23,8 @@
var/digest_pain = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = FALSE
+ var/can_be_afk_prey = TRUE
+ var/can_be_afk_pred = TRUE
var/allow_spontaneous_tf = FALSE // Obviously.
var/show_vore_fx = TRUE // Show belly fullscreens
var/selective_preference = DM_DEFAULT // Preference for selective bellymode
@@ -80,6 +82,7 @@
var/noisy_full = FALSE //Enables belching when a mob has overeaten
var/phase_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
var/strip_pref = TRUE //Enables the ability for worn items to be stripped
+ var/contaminate_pref = TRUE //Enables the ability for worn items to be digested/contaminated.
var/no_latejoin_vore_warning = FALSE //Auto accepts pred spwan notifications (roundbased / saveable)
var/no_latejoin_prey_warning = FALSE //Auto accepts prey spawn notifications (roundbased / saveable)
var/no_latejoin_vore_warning_time = 15 //Time until accepting prey
diff --git a/code/modules/vore/eating/panel_databackend/vorepanel_pref_data.dm b/code/modules/vore/eating/panel_databackend/vorepanel_pref_data.dm
index 24333a13eb5..8fde893c2bf 100644
--- a/code/modules/vore/eating/panel_databackend/vorepanel_pref_data.dm
+++ b/code/modules/vore/eating/panel_databackend/vorepanel_pref_data.dm
@@ -12,6 +12,8 @@
"show_vore_fx" = owner.show_vore_fx,
"can_be_drop_prey" = owner.can_be_drop_prey,
"can_be_drop_pred" = owner.can_be_drop_pred,
+ "can_be_afk_prey" = owner.can_be_afk_prey,
+ "can_be_afk_pred" = owner.can_be_afk_pred,
"latejoin_vore" = owner.latejoin_vore,
"latejoin_prey" = owner.latejoin_prey,
"no_spawnpred_warning" = owner.no_latejoin_vore_warning,
@@ -24,6 +26,7 @@
"step_mechanics_active" = owner.step_mechanics_pref,
"pickup_mechanics_active" = owner.pickup_pref,
"strip_mechanics_active" = owner.strip_pref,
+ "contaminate_worn_items" = owner.contaminate_pref,
"noisy" = owner.noisy,
//liquid belly prefs
"liq_rec" = owner.receive_reagents,
diff --git a/code/modules/vore/eating/vore_procs.dm b/code/modules/vore/eating/vore_procs.dm
index 728e027f16c..eaddfc5356c 100644
--- a/code/modules/vore/eating/vore_procs.dm
+++ b/code/modules/vore/eating/vore_procs.dm
@@ -186,4 +186,16 @@
if(prey.absorbed || pred.absorbed)
to_chat(user, span_vwarning("They aren't aren't in a state to be devoured."))
return FALSE
+ if(!pred.can_be_afk_pred && (!pred.client || pred.away_from_keyboard))
+ if(user == pred)
+ to_chat(user, span_vwarning("You aren't set as being able to pred while AFK"))
+ return FALSE
+ to_chat(user, span_vnotice("The predator prefers not to be fed while AFK"))
+ return FALSE
+ if(!prey.can_be_afk_prey && (!prey.client || prey.away_from_keyboard))
+ if(user == prey)
+ to_chat(user, span_vwarning("You aren't set as being able to prey while AFK"))
+ return FALSE
+ to_chat(user, span_vnotice("The prey prefers not to be eaten while AFK"))
+ return FALSE
return TRUE
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index bc8f3489a8c..c6e694519da 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -41,6 +41,8 @@
var/feeding = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = FALSE
+ var/can_be_afk_prey = FALSE
+ var/can_be_afk_pred = FALSE
var/allow_spontaneous_tf = FALSE
var/digest_leave_remains = FALSE
var/allowmobvore = TRUE
@@ -78,6 +80,7 @@
var/latejoin_prey = FALSE
var/autotransferable = TRUE
var/strip_pref = FALSE
+ var/contaminate_pref = TRUE
var/no_latejoin_vore_warning = FALSE // Only load, when... no_latejoin_vore_warning_persists
var/no_latejoin_prey_warning = FALSE // Only load, when... no_latejoin_vore_warning_persists
var/no_latejoin_vore_warning_time = 15 // Only load, when... no_latejoin_vore_warning_persists
@@ -203,6 +206,8 @@
show_vore_fx = json_from_file["show_vore_fx"]
can_be_drop_prey = json_from_file["can_be_drop_prey"]
can_be_drop_pred = json_from_file["can_be_drop_pred"]
+ can_be_afk_prey = json_from_file["can_be_afk_prey"]
+ can_be_afk_pred = json_from_file["can_be_afk_pred"]
allow_spontaneous_tf = json_from_file["allow_spontaneous_tf"]
step_mechanics_pref = json_from_file["step_mechanics_pref"]
pickup_pref = json_from_file["pickup_pref"]
@@ -234,6 +239,7 @@
autotransferable = json_from_file["autotransferable"]
vore_sprite_multiply = json_from_file["vore_sprite_multiply"]
strip_pref = json_from_file["strip_pref"]
+ contaminate_pref = json_from_file["contaminate_pref"]
no_latejoin_vore_warning_persists = json_from_file["no_latejoin_vore_warning_persists"]
if(no_latejoin_vore_warning_persists)
@@ -278,6 +284,10 @@
can_be_drop_prey = FALSE
if(isnull(can_be_drop_pred))
can_be_drop_pred = FALSE
+ if(isnull(can_be_afk_prey))
+ can_be_afk_prey = FALSE
+ if(isnull(can_be_afk_pred))
+ can_be_afk_pred = FALSE
if(isnull(allow_spontaneous_tf))
allow_spontaneous_tf = FALSE
if(isnull(step_mechanics_pref))
@@ -363,6 +373,8 @@
vore_sprite_multiply = list("stomach" = FALSE, "taur belly" = FALSE)
if(isnull(strip_pref))
strip_pref = TRUE
+ if(isnull(contaminate_pref))
+ contaminate_pref = TRUE
if(isnull(no_latejoin_vore_warning))
no_latejoin_vore_warning = FALSE
if(isnull(no_latejoin_prey_warning))
@@ -410,6 +422,8 @@
"show_vore_fx" = show_vore_fx,
"can_be_drop_prey" = can_be_drop_prey,
"can_be_drop_pred" = can_be_drop_pred,
+ "can_be_afk_prey" = can_be_afk_prey,
+ "can_be_afk_pred" = can_be_afk_pred,
"latejoin_vore" = latejoin_vore,
"latejoin_prey" = latejoin_prey,
"allow_spontaneous_tf" = allow_spontaneous_tf,
@@ -437,6 +451,7 @@
"allow_mimicry" = allow_mimicry,
"vore_sprite_multiply" = vore_sprite_multiply,
"strip_pref" = strip_pref,
+ "contaminate_pref" = contaminate_pref,
"no_latejoin_vore_warning" = no_latejoin_vore_warning,
"no_latejoin_prey_warning" = no_latejoin_prey_warning,
"no_latejoin_vore_warning_time" = no_latejoin_vore_warning_time,
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 8bd72ab4d35..24cec3f5cf6 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -392,6 +392,18 @@
host.client.prefs_vr.can_be_drop_prey = host.can_be_drop_prey
unsaved_changes = TRUE
return TRUE
+ if("toggle_afk_pred")
+ host.can_be_afk_pred = !host.can_be_afk_pred
+ if(host.client.prefs_vr)
+ host.client.prefs_vr.can_be_afk_pred = host.can_be_afk_pred
+ unsaved_changes = TRUE
+ return TRUE
+ if("toggle_afk_prey")
+ host.can_be_afk_prey = !host.can_be_afk_prey
+ if(host.client.prefs_vr)
+ host.client.prefs_vr.can_be_afk_prey = host.can_be_afk_prey
+ unsaved_changes = TRUE
+ return TRUE
if("toggle_latejoin_vore")
host.latejoin_vore = !host.latejoin_vore
if(host.client.prefs_vr)
@@ -494,6 +506,12 @@
host.client.prefs_vr.strip_pref = host.strip_pref
unsaved_changes = TRUE
return TRUE
+ if("toggle_contaminate_pref")
+ host.contaminate_pref = !host.contaminate_pref
+ if(host.client.prefs_vr)
+ host.client.prefs_vr.contaminate_pref = host.contaminate_pref
+ unsaved_changes = TRUE
+ return TRUE
if("toggle_allow_mind_transfer")
host.allow_mind_transfer = !host.allow_mind_transfer
if(host.client.prefs_vr)
diff --git a/tgui/packages/tgui/interfaces/VorePanel/VorePanelMainTabs/VoreUserPreferences.tsx b/tgui/packages/tgui/interfaces/VorePanel/VorePanelMainTabs/VoreUserPreferences.tsx
index 679df1b4954..dc51f21bd3c 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/VorePanelMainTabs/VoreUserPreferences.tsx
+++ b/tgui/packages/tgui/interfaces/VorePanel/VorePanelMainTabs/VoreUserPreferences.tsx
@@ -21,6 +21,8 @@ export const VoreUserPreferences = (props: { prefs: prefData }) => {
permit_healbelly,
can_be_drop_prey,
can_be_drop_pred,
+ can_be_afk_prey,
+ can_be_afk_pred,
drop_vore,
slip_vore,
stumble_vore,
@@ -43,6 +45,7 @@ export const VoreUserPreferences = (props: { prefs: prefData }) => {
vore_death_privacy,
allow_mimicry,
strip_mechanics_active,
+ contaminate_worn_items,
autotransferable,
liq_rec,
liq_giv,
@@ -187,6 +190,36 @@ export const VoreUserPreferences = (props: { prefs: prefData }) => {
disabled: 'Spontaneous Pred Disabled',
},
},
+ afk_prey: {
+ action: 'toggle_afk_prey',
+ test: can_be_afk_prey,
+ tooltip: {
+ main:
+ 'This toggle is for vore interactions as prey while you' +
+ ' are disconnected or inactive for a period of time.',
+ enable: 'Click here to allow being AFK prey.',
+ disable: 'Click here to prevent being AFK prey.',
+ },
+ content: {
+ enabled: 'AFK Prey Enabled',
+ disabled: 'AFK Prey Disabled',
+ },
+ },
+ afk_pred: {
+ action: 'toggle_afk_pred',
+ test: can_be_afk_pred,
+ tooltip: {
+ main:
+ 'This toggle is for vore interactions as pred while you' +
+ ' are disconnected or inactive for a period of time.',
+ enable: 'Click here to allow being AFK pred.',
+ disable: 'Click here to prevent being AFK pred.',
+ },
+ content: {
+ enabled: 'AFK Pred Enabled',
+ disabled: 'AFK Pred Disabled',
+ },
+ },
toggle_drop_vore: {
action: 'toggle_drop_vore',
test: drop_vore,
@@ -487,6 +520,23 @@ export const VoreUserPreferences = (props: { prefs: prefData }) => {
disabled: 'Do Not Allow Worn Item Stripping',
},
},
+ contaminatepref: {
+ action: 'toggle_contaminate_pref',
+ test: contaminate_worn_items,
+ tooltip: {
+ main: '',
+ enable:
+ 'Regardless of Predator Setting, items worn by you will not be digested/contaminated inside their bellies.' +
+ ' Click this to allow worn item digestion/contamination.',
+ disable:
+ 'Your Predator must have this setting enabled in their belly modes to allow contaminating/digesting your worn gear,' +
+ ' if they do not, they will not contaminate/digest your gear, even with this on. Click to disable contamination/digestion.',
+ },
+ content: {
+ enabled: 'Allow Worn Item Digestion/Contamination',
+ disabled: 'Do Not Allow Worn Item Digestion/Contamination',
+ },
+ },
eating_privacy_global: {
action: 'toggle_global_privacy',
test: eating_privacy_global,
diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferencesTabs/VoreUserPreferencesDevouring.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferencesTabs/VoreUserPreferencesDevouring.tsx
index 9ddd2a4c1dd..f6ecf97a44a 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferencesTabs/VoreUserPreferencesDevouring.tsx
+++ b/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferencesTabs/VoreUserPreferencesDevouring.tsx
@@ -77,28 +77,40 @@ export const VoreUserPreferencesDevouring = (props: {
+
+
+
+
+
+
) : (
''
diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferencesTabs/VoreUserPreferencesMechanical.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferencesTabs/VoreUserPreferencesMechanical.tsx
index bb4e4ef97d9..68dc8350ac0 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferencesTabs/VoreUserPreferencesMechanical.tsx
+++ b/tgui/packages/tgui/interfaces/VorePanel/VoreUserPreferencesTabs/VoreUserPreferencesMechanical.tsx
@@ -89,12 +89,18 @@ export const VoreUserPreferencesMechanical = (props: {
tooltipPosition="right"
/>
-
+
+
+
+
);
diff --git a/tgui/packages/tgui/interfaces/VorePanel/types.ts b/tgui/packages/tgui/interfaces/VorePanel/types.ts
index b22f0c4d58e..e2b1d46c508 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/types.ts
+++ b/tgui/packages/tgui/interfaces/VorePanel/types.ts
@@ -310,6 +310,8 @@ export type prefData = {
show_vore_fx: BooleanLike;
can_be_drop_prey: BooleanLike;
can_be_drop_pred: BooleanLike;
+ can_be_afk_prey: BooleanLike;
+ can_be_afk_pred: BooleanLike;
latejoin_vore: BooleanLike;
latejoin_prey: BooleanLike;
no_spawnpred_warning: BooleanLike;
@@ -322,6 +324,7 @@ export type prefData = {
step_mechanics_active: BooleanLike;
pickup_mechanics_active: BooleanLike;
strip_mechanics_active: BooleanLike;
+ contaminate_worn_items: BooleanLike;
noisy: BooleanLike;
liq_rec: BooleanLike;
liq_giv: BooleanLike;
@@ -425,6 +428,8 @@ export type localPrefs = {
healbelly: preferenceData;
dropnom_prey: preferenceData;
dropnom_pred: preferenceData;
+ afk_prey: preferenceData;
+ afk_pred: preferenceData;
toggle_drop_vore: preferenceData;
toggle_slip_vore: preferenceData;
toggle_stumble_vore: preferenceData;
@@ -444,6 +449,7 @@ export type localPrefs = {
spontaneous_tf: preferenceData;
mind_transfer: preferenceData;
strippref: preferenceData;
+ contaminatepref: preferenceData;
eating_privacy_global: preferenceData;
vore_death_privacy: preferenceData;
allow_mimicry: preferenceData;