From 99f0bd6e1d7b73d4a80b45789e0b6d3184e4bb5f Mon Sep 17 00:00:00 2001
From: CHOMPStation2StaffMirrorBot
<94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com>
Date: Fri, 23 Jan 2026 18:11:50 -0700
Subject: [PATCH] [MIRROR] Allows stripping people by resizing (#12315)
Co-authored-by: SatinIsle <98125273+SatinIsle@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
---
code/__defines/size.dm | 5 ++
code/__defines/vore_prefs.dm | 1 +
code/controllers/subsystems/ticker.dm | 6 +--
code/datums/ghost_spawn.dm | 3 +-
.../clothing/accessories/accessory_vr.dm | 15 +++---
.../mob/living/carbon/human/inventory.dm | 10 ++++
.../living/silicon/robot/robot_ui_module.dm | 3 +-
.../simple_mob/subtypes/vore/morph/morph.dm | 2 +-
.../living/simple_mob/subtypes/vore/vore.dm | 1 +
code/modules/organs/subtypes/machine.dm | 2 +-
.../tgui/modules/admin/player_notes.dm | 6 ++-
.../tgui/modules/appearance_changer.dm | 18 ++++---
code/modules/tgui/modules/crew_manifest.dm | 3 +-
code/modules/tgui/modules/law_manager.dm | 3 +-
code/modules/tgui/modules/overmap.dm | 3 +-
code/modules/vore/eating/belly_obj.dm | 2 +
code/modules/vore/eating/living_vr.dm | 1 +
code/modules/vore/eating/mob_vr.dm | 1 +
.../panel_databackend/vorepanel_pref_data.dm | 5 +-
code/modules/vore/eating/vore_vr.dm | 5 ++
code/modules/vore/eating/vorepanel_vr.dm | 17 +++++--
code/modules/vore/resizing/crackers.dm | 2 +-
code/modules/vore/resizing/resize_vr.dm | 14 ++++--
code/modules/vore/resizing/sizegun_slow_vr.dm | 11 ++++
code/modules/vore/resizing/sizegun_vr.dm | 2 +-
.../VoreUserPreferenceItem.tsx | 50 ++++++++++++++++---
.../VorePanelMainTabs/VoreUserPreferences.tsx | 11 ++--
.../VoreUserPreferencesDevouring.tsx | 31 +++++-------
.../VoreUserPreferencesMechanical.tsx | 19 +++++--
.../tgui/interfaces/VorePanel/constants.ts | 31 ++++++++++++
.../tgui/interfaces/VorePanel/types.ts | 17 ++++++-
31 files changed, 232 insertions(+), 68 deletions(-)
diff --git a/code/__defines/size.dm b/code/__defines/size.dm
index d9418b700e..faadfbbf98 100644
--- a/code/__defines/size.dm
+++ b/code/__defines/size.dm
@@ -1,3 +1,8 @@
#define MAX_VOICE_FREQ 70000
#define MIN_VOICE_FREQ 15000
+
+//Size change stripping options
+#define SIZESTRIP_NONE 0 //Default, no dropping items on size change
+#define SIZESTRIP_ITEMS 1 //Drop all inventory slots on size change
+#define SIZESTRIP_ALL 2 //Drop all inventory and remove underwear on size change
diff --git a/code/__defines/vore_prefs.dm b/code/__defines/vore_prefs.dm
index a1ded3bf27..ca81c2b8ac 100644
--- a/code/__defines/vore_prefs.dm
+++ b/code/__defines/vore_prefs.dm
@@ -12,6 +12,7 @@
target.noisy = source.noisy; \
target.show_vore_fx = source.show_vore_fx; \
target.selective_preference = source.selective_preference; \
+ target.size_strip_preference = source.size_strip_preference; \
target.digest_leave_remains = source.digest_leave_remains; \
target.digest_pain = source.digest_pain; \
target.noisy_full = source.noisy_full; \
diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm
index 8b09845462..cb0c008eff 100644
--- a/code/controllers/subsystems/ticker.dm
+++ b/code/controllers/subsystems/ticker.dm
@@ -511,12 +511,12 @@ SUBSYSTEM_DEF(ticker)
/datum/controller/subsystem/ticker/proc/announce_countdown(remaining_time)
remaining_time -= 60 SECONDS
- if(remaining_time >= 60 SECONDS)
+ if(remaining_time > 60 SECONDS)
to_chat(world, span_boldannounce("Rebooting World in [DisplayTimeText(remaining_time)]."))
countdown_timer = addtimer(CALLBACK(src, PROC_REF(announce_countdown), remaining_time), 60 SECONDS)
return
- if(remaining_time > 0)
- countdown_timer = addtimer(CALLBACK(src, PROC_REF(announce_countdown), 0), remaining_time)
+ if(remaining_time <= 60 SECONDS && remaining_time > 0)
+ countdown_timer = addtimer(CALLBACK(src, PROC_REF(announce_countdown), remaining_time - 1 SECOND), remaining_time)
return
if(!delay_end)
to_chat(world, span_boldannounce("Rebooting World."))
diff --git a/code/datums/ghost_spawn.dm b/code/datums/ghost_spawn.dm
index 3a5f5e2965..801adab04c 100644
--- a/code/datums/ghost_spawn.dm
+++ b/code/datums/ghost_spawn.dm
@@ -18,7 +18,8 @@ GLOBAL_VAR_INIT(allowed_ghost_spawns, 2)
if(isobserver(user))
var/mob/observer/dead/observer = user
observer.selecting_ghostrole = FALSE
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/ghost_spawn_menu/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
. = ..()
diff --git a/code/modules/clothing/accessories/accessory_vr.dm b/code/modules/clothing/accessories/accessory_vr.dm
index c1db38bbfb..a8f29c0e4c 100644
--- a/code/modules/clothing/accessories/accessory_vr.dm
+++ b/code/modules/clothing/accessories/accessory_vr.dm
@@ -213,7 +213,8 @@
. = TRUE
if("power")
on = !on
- icon_state = "collar_shk[on]"
+ if(!istype(src, /obj/item/clothing/accessory/collar/shock/bluespace))
+ icon_state = "collar_shk[on]"
. = TRUE
if("tag")
var/sanitized = tgui_input_text(ui.user, "Tag text?", "Set Tag", "", MAX_NAME_LEN, encode = TRUE)
@@ -417,7 +418,7 @@
return
last_activated = world.time
original_size = H.size_multiplier
- H.resize(target_size, ignore_prefs = FALSE) //In case someone else tries to put it on you.
+ H.resize(target_size, ignore_prefs = FALSE, allow_stripping = TRUE) //In case someone else tries to put it on you.
H.visible_message(span_warning("The space around [H] distorts as they change size!"),span_notice("The space around you distorts as you change size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
s.set_up(3, 1, M)
@@ -427,7 +428,7 @@
H.visible_message(span_warning("The space around [H] twists and turns for a moment but then nothing happens."),span_notice("The space around you distorts but stay the same size."))
return
last_activated = world.time
- H.resize(original_size, ignore_prefs = FALSE)
+ H.resize(original_size, ignore_prefs = FALSE, allow_stripping = TRUE)
original_size = null
H.visible_message(span_warning("The space around [H] distorts as they return to their original size!"),span_notice("The space around you distorts as you return to your original size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
@@ -518,7 +519,7 @@
return
last_activated = world.time
original_size = H.size_multiplier
- H.resize(target_size, ignore_prefs = FALSE) //In case someone else tries to put it on you.
+ H.resize(target_size, ignore_prefs = FALSE, allow_stripping = TRUE) //In case someone else tries to put it on you.
H.visible_message(span_warning("The space around [H] distorts as they change size!"),span_notice("The space around you distorts as you change size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
s.set_up(3, 1, M)
@@ -528,7 +529,7 @@
H.visible_message(span_warning("The space around [H] twists and turns for a moment but then nothing happens."),span_notice("The space around you distorts but stay the same size."))
return
last_activated = world.time
- H.resize(original_size, ignore_prefs = FALSE)
+ H.resize(original_size, ignore_prefs = FALSE, allow_stripping = TRUE)
original_size = null
H.visible_message(span_warning("The space around [H] distorts as they return to their original size!"),span_notice("The space around you distorts as you return to your original size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
@@ -591,7 +592,7 @@
last_activated = world.time
original_size = H.size_multiplier
currently_shrinking = 1
- H.resize(target_size, ignore_prefs = FALSE) //In case someone else tries to put it on you.
+ H.resize(target_size, ignore_prefs = FALSE, allow_stripping = TRUE) //In case someone else tries to put it on you.
H.visible_message(span_warning("The space around [H] distorts as they change size!"),span_notice("The space around you distorts as you change size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
s.set_up(3, 1, M)
@@ -601,7 +602,7 @@
H.visible_message(span_warning("The space around [H] twists and turns for a moment but then nothing happens."),span_notice("The space around you distorts but stay the same size."))
return
last_activated = world.time
- H.resize(original_size, ignore_prefs = FALSE)
+ H.resize(original_size, ignore_prefs = FALSE, allow_stripping = TRUE)
original_size = null
currently_shrinking = 0
H.visible_message(span_warning("The space around [H] distorts as they return to their original size!"),span_notice("The space around you distorts as you return to your original size!"))
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index b41278833f..eb7a85a833 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -432,3 +432,13 @@ This saves us from having to call add_fingerprint() any time something is put in
. += l_hand
if(r_hand)
. += r_hand
+
+/mob/living/carbon/human/proc/drop_all_clothing(var/remove_underwear = FALSE)
+ for(var/obj/item/equipped_thing in worn_clothing)
+ if(istype(equipped_thing,/obj/item/clothing/accessory/collar/shock/bluespace))
+ continue
+ drop_from_inventory(equipped_thing)
+ if(remove_underwear)
+ for(var/datum/category_group/underwear/UWC in global_underwear.categories)
+ hide_underwear[UWC.name] = TRUE
+ update_underwear(1)
diff --git a/code/modules/mob/living/silicon/robot/robot_ui_module.dm b/code/modules/mob/living/silicon/robot/robot_ui_module.dm
index 3fa820e4da..f7e0436494 100644
--- a/code/modules/mob/living/silicon/robot/robot_ui_module.dm
+++ b/code/modules/mob/living/silicon/robot/robot_ui_module.dm
@@ -14,7 +14,8 @@
if(isrobot(user))
var/mob/living/silicon/robot/R = user
R.selecting_module = FALSE
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/robot_ui_module/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
. = ..()
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
index a89756a291..559f251fdb 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
@@ -196,7 +196,7 @@
/mob/living/simple_mob/vore/morph/will_show_tooltip()
return (!morphed)
-/mob/living/simple_mob/vore/morph/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = FALSE) //CHOMPEdit - Disable aura_animation. Too expensive for something you can't even see.
+/mob/living/simple_mob/vore/morph/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = FALSE, var/allow_stripping = FALSE) //CHOMPEdit - Disable aura_animation. Too expensive for something you can't even see.
if(morphed && !ismob(form))
return
return ..()
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 d8cb7be7dd..2646fc84a6 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
@@ -47,6 +47,7 @@
permit_healbelly = client.prefs_vr.permit_healbelly
noisy = client.prefs_vr.noisy
selective_preference = client.prefs_vr.selective_preference
+ size_strip_preference = client.prefs_vr.size_strip_preference
eating_privacy_global = client.prefs_vr.eating_privacy_global
allow_mimicry = client.prefs_vr.allow_mimicry
allowtemp = client.prefs_vr.allowtemp
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
index 616be3d280..aadd1644f5 100644
--- a/code/modules/organs/subtypes/machine.dm
+++ b/code/modules/organs/subtypes/machine.dm
@@ -20,7 +20,7 @@
/obj/item/organ/internal/cell/emp_act(severity, recursive)
..()
- owner.adjust_nutrition(-rand(10 / severity, 50 / severity))
+ owner?.adjust_nutrition(-rand(10 / severity, 50 / severity))
/obj/item/organ/internal/cell/machine/handle_organ_proc_special()
..()
diff --git a/code/modules/tgui/modules/admin/player_notes.dm b/code/modules/tgui/modules/admin/player_notes.dm
index 183ce66d4b..8a15f16fb5 100644
--- a/code/modules/tgui/modules/admin/player_notes.dm
+++ b/code/modules/tgui/modules/admin/player_notes.dm
@@ -13,7 +13,8 @@
/datum/tgui_module/player_notes/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/player_notes/proc/filter_ckeys(var/page, var/filter)
var/savefile/S=new("data/player_notes.sav")
@@ -112,7 +113,8 @@
/datum/tgui_module/player_notes_info/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/player_notes_info/tgui_state(mob/user)
return ADMIN_STATE(R_ADMIN|R_EVENT|R_DEBUG)
diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm
index 24acb83258..7a2335e69d 100644
--- a/code/modules/tgui/modules/appearance_changer.dm
+++ b/code/modules/tgui/modules/appearance_changer.dm
@@ -1028,7 +1028,8 @@
/datum/tgui_module/appearance_changer/vore/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/appearance_changer/vore/update_active_camera_screen()
cam_screen.vis_contents = list(owner)
@@ -1038,7 +1039,8 @@
/datum/tgui_module/appearance_changer/vore/tgui_close(mob/user)
. = ..()
- QDEL_IN(src, 1)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/appearance_changer/vore/changed_hook(flag)
var/mob/living/carbon/human/M = owner
@@ -1074,7 +1076,8 @@
/datum/tgui_module/appearance_changer/cocoon/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/appearance_changer/cocoon/tgui_status(mob/user, datum/tgui_state/state)
if(!istype(owner.loc, /obj/item/holder/micro))
@@ -1091,7 +1094,8 @@
/datum/tgui_module/appearance_changer/superpower/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/appearance_changer/superpower/tgui_status(mob/user, datum/tgui_state/state)
var/datum/gene/G = get_gene_from_trait(/datum/trait/positive/superpower_morph)
@@ -1109,7 +1113,8 @@
/datum/tgui_module/appearance_changer/innate/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/appearance_changer/innate/tgui_status(mob/user, datum/tgui_state/state)
if(owner.stat != CONSCIOUS)
@@ -1170,4 +1175,5 @@
/datum/tgui_module/appearance_changer/self_deleting
/datum/tgui_module/appearance_changer/self_deleting/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
diff --git a/code/modules/tgui/modules/crew_manifest.dm b/code/modules/tgui/modules/crew_manifest.dm
index 212de20ee9..46037f297a 100644
--- a/code/modules/tgui/modules/crew_manifest.dm
+++ b/code/modules/tgui/modules/crew_manifest.dm
@@ -22,7 +22,8 @@
/datum/tgui_module/crew_manifest/self_deleting/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/crew_manifest/self_deleting/tgui_state(mob/user)
return GLOB.tgui_always_state
diff --git a/code/modules/tgui/modules/law_manager.dm b/code/modules/tgui/modules/law_manager.dm
index d0e98d7dd5..00d5d970e7 100644
--- a/code/modules/tgui/modules/law_manager.dm
+++ b/code/modules/tgui/modules/law_manager.dm
@@ -220,4 +220,5 @@
/datum/tgui_module/law_manager/admin/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
diff --git a/code/modules/tgui/modules/overmap.dm b/code/modules/tgui/modules/overmap.dm
index 738e118714..9b037224bd 100644
--- a/code/modules/tgui/modules/overmap.dm
+++ b/code/modules/tgui/modules/overmap.dm
@@ -161,7 +161,8 @@
/datum/tgui_module/ship/fullmonty/tgui_close(mob/user)
. = ..()
- qdel(src)
+ if(!QDELETED(src))
+ qdel(src)
/datum/tgui_module/ship/fullmonty/New(host, obj/effect/overmap/visitable/ship/new_linked)
. = ..()
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index db76b306fb..764fc55939 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -296,6 +296,7 @@
"digest_tox",
"digest_clone",
"bellytemperature",
+ "temperature_damage",
"immutable",
"can_taste",
"escapable",
@@ -1320,6 +1321,7 @@
dupe.digest_tox = digest_tox
dupe.digest_clone = digest_clone
dupe.bellytemperature = bellytemperature
+ dupe.temperature_damage = temperature_damage
dupe.immutable = immutable
dupe.can_taste = can_taste
dupe.escapable = escapable
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 2aa4aa2bb0..1be21c530b 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -1083,6 +1083,7 @@
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("Size Change Strip Mode Pref:") + " [src.size_strip_preference]
"
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")]
"
diff --git a/code/modules/vore/eating/mob_vr.dm b/code/modules/vore/eating/mob_vr.dm
index 6fa146655e..c7cf01986e 100644
--- a/code/modules/vore/eating/mob_vr.dm
+++ b/code/modules/vore/eating/mob_vr.dm
@@ -32,6 +32,7 @@
var/allow_spontaneous_tf = FALSE // Obviously.
var/show_vore_fx = TRUE // Show belly fullscreens
var/selective_preference = DM_DEFAULT // Preference for selective bellymode
+ var/size_strip_preference = SIZESTRIP_NONE // Preference for size change stripping
var/eating_privacy_global = FALSE // Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var
var/vore_death_privacy = FALSE // Chooses whether to announce prey death when digested to ghosts.
var/allow_mimicry = TRUE // Allows mimicking their character
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 5e289505a9..5b47e75e4d 100644
--- a/code/modules/vore/eating/panel_databackend/vorepanel_pref_data.dm
+++ b/code/modules/vore/eating/panel_databackend/vorepanel_pref_data.dm
@@ -34,7 +34,6 @@
"liq_apply" = owner.apply_reagents,
"autotransferable" = owner.autotransferable,
"noisy_full" = owner.noisy_full, //Belching while full
- "selective_active" = owner.selective_preference, //Reveal active selective mode in prefs
"allow_mind_transfer" = owner.allow_mind_transfer,
"drop_vore" = owner.drop_vore,
@@ -58,6 +57,10 @@
"soulcatcher_allow_takeover" = owner.soulcatcher_pref_flags & SOULCATCHER_ALLOW_TAKEOVER,
"soulcatcher_allow_deletion" = (global_flag_check(owner.soulcatcher_pref_flags, SOULCATCHER_ALLOW_DELETION) + global_flag_check(owner.soulcatcher_pref_flags, SOULCATCHER_ALLOW_DELETION_INSTANT)),
"max_voreoverlay_alpha" = owner.max_voreoverlay_alpha,
+ "dropdown_preferences" = list(
+ "strip_active" = owner.size_strip_preference,
+ "selective_active" = owner.selective_preference, //Reveal active selective mode in prefs
+ )
)
#define SET_TASTE "Set Taste"
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index a566ea2070..969b3d9010 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -102,6 +102,7 @@
var/vore_smell = "nothing in particular"
var/selective_preference = DM_DEFAULT
+ var/size_strip_preference = SIZESTRIP_NONE
var/nutrition_message_visible = TRUE
@@ -207,6 +208,7 @@
permit_healbelly = json_from_file["permit_healbelly"]
noisy = json_from_file["noisy"]
selective_preference = json_from_file["selective_preference"]
+ size_strip_preference = json_from_file["size_strip_preference"]
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"]
@@ -284,6 +286,8 @@
permit_healbelly = TRUE
if(isnull(selective_preference))
selective_preference = DM_DEFAULT
+ if(isnull(size_strip_preference))
+ size_strip_preference = SIZESTRIP_NONE
if (isnull(noisy))
noisy = FALSE
if(isnull(show_vore_fx))
@@ -427,6 +431,7 @@
"noisy" = noisy,
"noisy_full" = noisy_full,
"selective_preference" = selective_preference,
+ "size_strip_preference" = size_strip_preference,
"show_vore_fx" = show_vore_fx,
"can_be_drop_prey" = can_be_drop_prey,
"can_be_drop_pred" = can_be_drop_pred,
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 7334d952a8..aca0df8b1a 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -649,13 +649,24 @@
unsaved_changes = TRUE
return TRUE
if("switch_selective_mode_pref")
- host.selective_preference = tgui_input_list(ui.user, "What would you prefer happen to you with selective bellymode?","Selective Bellymode", list(DM_DEFAULT, DM_DIGEST, DM_ABSORB, DM_DRAIN))
- if(!(host.selective_preference))
- host.selective_preference = DM_DEFAULT
+ var/new_selective_preference = params["val"]
+ if(new_selective_preference == host.selective_preference)
+ return FALSE
+ host.selective_preference = new_selective_preference
if(host.client.prefs_vr)
host.client.prefs_vr.selective_preference = host.selective_preference
unsaved_changes = TRUE
return TRUE
+ if("switch_strip_mode_pref")
+ var/new_size_strip_pref = text2num(params["val"])
+ new_size_strip_pref = clamp(new_size_strip_pref, SIZESTRIP_NONE, SIZESTRIP_ALL)
+ if(new_size_strip_pref == host.size_strip_preference)
+ return FALSE
+ host.size_strip_preference = new_size_strip_pref
+ if(host.client.prefs_vr)
+ host.client.prefs_vr.size_strip_preference = host.size_strip_preference
+ unsaved_changes = TRUE
+ return TRUE
if("toggle_nutrition_ex")
host.nutrition_message_visible = !host.nutrition_message_visible
unsaved_changes = TRUE
diff --git a/code/modules/vore/resizing/crackers.dm b/code/modules/vore/resizing/crackers.dm
index c9283f623f..0c036ae147 100644
--- a/code/modules/vore/resizing/crackers.dm
+++ b/code/modules/vore/resizing/crackers.dm
@@ -100,7 +100,7 @@
winner.visible_message(span_notice("\The [winner] wins the cracker prize!"),span_notice("You win the cracker prize!"))
switch(prize)
if(SHRINKING_CRACKER)
- winner.resize(0.25)
+ winner.resize(0.25, allow_stripping = TRUE)
winner.visible_message(span_bold("\The [winner]") + " shrinks suddenly!")
if(GROWING_CRACKER)
winner.resize(2)
diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm
index f71eb53df5..b2b4496053 100644
--- a/code/modules/vore/resizing/resize_vr.dm
+++ b/code/modules/vore/resizing/resize_vr.dm
@@ -89,8 +89,9 @@
* * uncapped - CHANGE_ME. Default: FALSE
* * ignore_prefs - CHANGE_ME. Default: FALSE
* * aura_animation - CHANGE_ME. Default: TRUE
+ * * allow_stripping - CHANGE_ME. Default: FALSE
*/
-/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = FALSE) //CHOMPEdit - Disable aura_animation. Too expensive for something you can't even see.
+/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = FALSE, var/allow_stripping = FALSE) //CHOMPEdit - Disable aura_animation. Too expensive for something you can't even see.
if(!uncapped)
if((z in using_map.station_levels) && CONFIG_GET(flag/pixel_size_limit))
var/size_diff = ((runechat_y_offset() / size_multiplier) * new_size) // This returns 32 multiplied with the new size
@@ -147,10 +148,17 @@
else
update_transform() //Lame way
-/mob/living/carbon/human/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = FALSE) //CHOMPEdit - Disable aura_animation. Too expensive for something you can't even see.
+/mob/living/carbon/human/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = FALSE, var/allow_stripping = FALSE) //CHOMPEdit - Disable aura_animation. Too expensive for something you can't even see.
if(!resizable && !ignore_prefs)
return 1
+ var/previous_scale = size_multiplier
. = ..()
+ var/size_difference = previous_scale - size_multiplier
+ if((allow_stripping == TRUE) && (size_difference >= 0.3) || (size_difference <= -0.3))
+ if(size_strip_preference == SIZESTRIP_ITEMS)
+ drop_all_clothing(FALSE)
+ else if(size_strip_preference == SIZESTRIP_ALL)
+ drop_all_clothing(TRUE)
if(!ishuman(temporary_form) && isliving(temporary_form))
var/mob/living/temp_form = temporary_form
temp_form.resize(new_size, animate, uncapped, ignore_prefs, aura_animation)
@@ -162,7 +170,7 @@
apply_hud(index, HI)
// Optimize mannequins - never a point to animating or doing HUDs on these.
-/mob/living/carbon/human/dummy/mannequin/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = TRUE)
+/mob/living/carbon/human/dummy/mannequin/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = TRUE, var/allow_stripping = FALSE)
size_multiplier = new_size
/**
diff --git a/code/modules/vore/resizing/sizegun_slow_vr.dm b/code/modules/vore/resizing/sizegun_slow_vr.dm
index 08f0f7750b..9deb0c8a89 100644
--- a/code/modules/vore/resizing/sizegun_slow_vr.dm
+++ b/code/modules/vore/resizing/sizegun_slow_vr.dm
@@ -138,6 +138,7 @@
playsound(src, 'sound/weapons/wave.ogg', 50)
var/active_hand = user.get_active_hand()
+ var/previous_scale = L.size_multiplier
if (trading == 0)
while(!should_stop(target, user, active_hand))
@@ -161,6 +162,16 @@
busy = FALSE
current_target = null
+ if(ishuman(L))
+ var/mob/living/carbon/human/our_target = L
+ var/size_difference = previous_scale - our_target.size_multiplier
+ if((size_difference >= 0.3) || (size_difference <= -0.3))
+ if(our_target.size_strip_preference == SIZESTRIP_ITEMS)
+ our_target.drop_all_clothing(FALSE)
+ else if(our_target.size_strip_preference == SIZESTRIP_ALL)
+ our_target.drop_all_clothing(TRUE)
+
+
// Now clean up the effects.
update_icon()
QDEL_NULL(scan_beam)
diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm
index 30e8b5f594..e3f4d14c93 100644
--- a/code/modules/vore/resizing/sizegun_vr.dm
+++ b/code/modules/vore/resizing/sizegun_vr.dm
@@ -213,7 +213,7 @@
if(istype(H.gloves, /obj/item/clothing/gloves/bluespace))
M.visible_message(span_warning("\The [H]'s bracelet flashes and absorbs the beam!"),span_notice("Your bracelet flashes and absorbs the beam!"))
return
- if(!M.resize(set_size, uncapped = M.has_large_resize_bounds(), ignore_prefs = ignoring_prefs))
+ if(!M.resize(set_size, uncapped = M.has_large_resize_bounds(), ignore_prefs = ignoring_prefs, allow_stripping = TRUE))
to_chat(M, span_blue("The beam fires into your body, changing your size!"))
M.update_icon()
return
diff --git a/tgui/packages/tgui/interfaces/VorePanel/VorePanelElements/VoreUserPreferenceItem.tsx b/tgui/packages/tgui/interfaces/VorePanel/VorePanelElements/VoreUserPreferenceItem.tsx
index cb0fe42fdc..fb7c9080e3 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/VorePanelElements/VoreUserPreferenceItem.tsx
+++ b/tgui/packages/tgui/interfaces/VorePanel/VorePanelElements/VoreUserPreferenceItem.tsx
@@ -1,15 +1,22 @@
+import type { ComponentProps } from 'react';
import { useBackend } from 'tgui/backend';
-import { Button } from 'tgui-core/components';
-
-import type { PreferenceData } from '../types';
+import { Button, type Floating } from 'tgui-core/components';
+import type {
+ DropdownEntry,
+ PreferenceData,
+ PreferenceDropdown,
+} from '../types';
+import { VorePanelEditDropdown } from './VorePanelEditDropdown';
export const VoreUserPreferenceItem = (props: {
+ /** The preference data object */
spec: PreferenceData;
- [rest: string]: any;
+ /** Position of the tooltip */
+ tooltipPosition: ComponentProps['placement'];
}) => {
const { act } = useBackend();
- const { spec, ...rest } = props;
+ const { spec, tooltipPosition } = props;
const { action, test, tooltip, content, fluid = true, back_color } = spec;
return (
@@ -22,9 +29,40 @@ export const VoreUserPreferenceItem = (props: {
back_color ? (test ? back_color.enabled : back_color.disabled) : ''
}
tooltip={`${tooltip.main} ${test ? tooltip.disable : tooltip.enable}`}
- {...rest}
+ tooltipPosition={tooltipPosition}
>
{test ? content.enabled : content.disabled}
);
};
+
+export const VoreUserPreferenceDropdown = (props: {
+ /** The currently selected entry */
+ currentActive: string;
+ /** The preference data object */
+ spec: PreferenceDropdown;
+ /** Position of the tooltip */
+ tooltipPosition: ComponentProps['placement'];
+}) => {
+ const { currentActive, spec, tooltipPosition } = props;
+
+ const options: DropdownEntry[] = Object.entries(spec.data).map(
+ ([key, entry]) => ({
+ displayText: entry.displayText,
+ value: key,
+ }),
+ );
+
+ return (
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/VorePanel/VorePanelMainTabs/VoreUserPreferences.tsx b/tgui/packages/tgui/interfaces/VorePanel/VorePanelMainTabs/VoreUserPreferences.tsx
index f44c1ccb97..7693049874 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/VorePanelMainTabs/VoreUserPreferences.tsx
+++ b/tgui/packages/tgui/interfaces/VorePanel/VorePanelMainTabs/VoreUserPreferences.tsx
@@ -1,6 +1,5 @@
import { Section } from 'tgui-core/components';
-import { digestModeToColor } from '../constants';
import type { LocalPrefs, PrefData } from '../types';
import { VoreUserPreferencesDevouring } from '../VoreUserPreferencesTabs/VoreUserPreferencesDevouring';
import { VoreUserPreferencesFX } from '../VoreUserPreferencesTabs/VoreUserPreferencesFX';
@@ -57,7 +56,7 @@ export const VoreUserPreferences = (props: { prefs: PrefData }) => {
no_spawnprey_warning_time,
no_spawnpred_warning_save,
no_spawnprey_warning_save,
- selective_active,
+ dropdown_preferences,
soulcatcher_allow_capture,
soulcatcher_allow_transfer,
soulcatcher_allow_deletion,
@@ -760,12 +759,14 @@ export const VoreUserPreferences = (props: { prefs: PrefData }) => {
return (
-
+
;
- selective_active: string;
preferences: LocalPrefs;
+ dropdownPreferences: DropdownPrefernces;
}) => {
- const { act } = useBackend();
- const { devourable, digestModeToColor, selective_active, preferences } =
- props;
+ const { devourable, dropdownPreferences, preferences } = props;
return (
-
+ />
{
- const { preferences } = props;
+ const { preferences, dropdownPreferences } = props;
return (
@@ -101,6 +105,13 @@ export const VoreUserPreferencesMechanical = (props: {
tooltipPosition="left"
/>
+
+
+
);
diff --git a/tgui/packages/tgui/interfaces/VorePanel/constants.ts b/tgui/packages/tgui/interfaces/VorePanel/constants.ts
index 9d4451a65c..4a9209a5f4 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/constants.ts
+++ b/tgui/packages/tgui/interfaces/VorePanel/constants.ts
@@ -1,3 +1,5 @@
+import type { PreferenceDropdown } from './types';
+
export const stats = [undefined, 'average', 'bad'] as const;
export const vorespawnAbsorbedText = ['No', 'Yes', 'Prey Choice'];
@@ -39,6 +41,35 @@ export const reagentToColor = {
Ethanol: undefined,
} as const;
+export const selectiveModeModel: PreferenceDropdown = {
+ action: 'switch_selective_mode_pref',
+ prefix: 'Selective Mode Preference',
+ tooltip:
+ 'Allows to set the personal belly mode preference for selective bellies.',
+ data: {
+ Default: { displayText: 'Default' },
+ Digest: { displayText: 'Digest', color: 'red', enabled: true },
+ Absorb: { displayText: 'Absorb', color: 'purple', enabled: true },
+ Drain: { displayText: 'Drain', color: 'orange', enabled: true },
+ },
+};
+
+export const stripModeModel: PreferenceDropdown = {
+ action: 'switch_strip_mode_pref',
+ prefix: 'Size Stripping',
+ tooltip:
+ 'Allows you to set if you should get stripped while being resized and how much should get stripped.',
+ data: {
+ '0': { displayText: 'Drop Nothing' },
+ '1': { displayText: 'Drop Equipment', color: 'green', enabled: true },
+ '2': {
+ displayText: 'Drop Equipment and Underwear',
+ color: 'green',
+ enabled: true,
+ },
+ },
+};
+
export const digestModeToPreyMode = {
Hold: 'being held.',
Digest: 'being digested.',
diff --git a/tgui/packages/tgui/interfaces/VorePanel/types.ts b/tgui/packages/tgui/interfaces/VorePanel/types.ts
index 939a2e5a45..536ae3e39d 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/types.ts
+++ b/tgui/packages/tgui/interfaces/VorePanel/types.ts
@@ -336,7 +336,7 @@ export type PrefData = {
consume_liquid_belly: BooleanLike;
autotransferable: BooleanLike;
noisy_full: BooleanLike;
- selective_active: string;
+ dropdown_preferences: DropdownPrefernces;
allow_mind_transfer: BooleanLike;
drop_vore: BooleanLike;
slip_vore: BooleanLike;
@@ -355,6 +355,11 @@ export type PrefData = {
max_voreoverlay_alpha: number;
};
+export type DropdownPrefernces = {
+ strip_active: number;
+ selective_active: string;
+};
+
export type ScMessageData = {
sc_subtab: string;
possible_messages: string[];
@@ -510,3 +515,13 @@ export type IntentData = {
grab: BooleanLike;
harm: BooleanLike;
};
+
+export type PreferenceDropdown = {
+ action: string;
+ prefix: string;
+ tooltip: string;
+ data: Record<
+ string,
+ { displayText: string; color?: string; enabled?: boolean }
+ >;
+};