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 } + >; +};