diff --git a/code/__defines/belly_modes_ch.dm b/code/__defines/belly_modes_ch.dm
index 78a030e53b..d243f721e6 100644
--- a/code/__defines/belly_modes_ch.dm
+++ b/code/__defines/belly_modes_ch.dm
@@ -40,3 +40,7 @@
#define AT_FLAG_ORES 0x40
#define AT_FLAG_CLOTHES 0x80
#define AT_FLAG_FOOD 0x100
+
+//Vorespawn flags
+#define VS_FLAG_ABSORB_YES 0x1
+#define VS_FLAG_ABSORB_PREY 0x2
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index c19e1868e0..f048cd4793 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -673,6 +673,7 @@ var/global/datum/controller/occupations/job_master
var/datum/spawnpoint/spawnpos
var/fail_deadly = FALSE
var/obj/belly/vore_spawn_gut
+ var/absorb_choice = FALSE //CHOMPAdd - Ability to start absorbed with vorespawn
var/mob/living/prey_to_nomph
var/obj/item/item_to_be //CHOMPEdit - Item TF spawning
var/mob/living/item_carrier //CHOMPEdit - Capture crystal spawning
@@ -708,6 +709,10 @@ var/global/datum/controller/occupations/job_master
for(var/obj/belly/Y in pred.vore_organs)
if(Y.vorespawn_blacklist)
continue
+ //CHOMPAdd Start
+ if(LAZYLEN(Y.vorespawn_whitelist) && !(C.ckey in Y.vorespawn_whitelist))
+ continue
+ //CHOMPAdd End
available_bellies += Y
var/backup = alert(C, "Do you want a mind backup?", "Confirm", "Yes", "No")
if(backup == "Yes")
@@ -715,6 +720,15 @@ var/global/datum/controller/occupations/job_master
vore_spawn_gut = input(C, "Choose a Belly.", "Belly Spawnpoint") as null|anything in available_bellies
if(!vore_spawn_gut)
return
+ //CHOMPAdd Start
+ if(vore_spawn_gut.vorespawn_absorbed & VS_FLAG_ABSORB_YES)
+ absorb_choice = TRUE
+ if(vore_spawn_gut.vorespawn_absorbed & VS_FLAG_ABSORB_PREY)
+ if(alert(C, "Do you want to start absorbed into [pred]'s [vore_spawn_gut]?", "Confirm", "Yes", "No") != "Yes")
+ absorb_choice = FALSE
+ else if(alert(C, "[pred]'s [vore_spawn_gut] will start with you absorbed. Continue?", "Confirm", "Yes", "No") != "Yes")
+ return
+ //CHOMPAdd End
to_chat(C, "[pred] has received your spawn request. Please wait.")
log_admin("[key_name(C)] has requested to vore spawn into [key_name(pred)]")
message_admins("[key_name(C)] has requested to vore spawn into [key_name(pred)]")
@@ -722,11 +736,21 @@ var/global/datum/controller/occupations/job_master
var/confirm
if(pred.no_latejoin_vore_warning)
if(pred.no_latejoin_vore_warning_time > 0)
- confirm = tgui_alert(pred, "[C.prefs.real_name] is attempting to spawn into your [vore_spawn_gut]. Let them?", "Confirm", list("No", "Yes"), pred.no_latejoin_vore_warning_time SECONDS)
+ //CHOMPEdit Start
+ if(absorb_choice)
+ confirm = tgui_alert(pred, "[C.prefs.real_name] is attempting to spawn absorbed as your [vore_spawn_gut]. Let them?", "Confirm", list("No", "Yes"), pred.no_latejoin_vore_warning_time SECONDS)
+ else
+ confirm = tgui_alert(pred, "[C.prefs.real_name] is attempting to spawn into your [vore_spawn_gut]. Let them?", "Confirm", list("No", "Yes"), pred.no_latejoin_vore_warning_time SECONDS)
+ //CHOMPEdit End
if(!confirm)
confirm = "Yes"
else
- confirm = alert(pred, "[C.prefs.real_name] is attempting to spawn into your [vore_spawn_gut]. Let them?", "Confirm", "No", "Yes")
+ //CHOMPEdit Start
+ if(absorb_choice)
+ confirm = alert(pred, "[C.prefs.real_name] is attempting to spawn absorbed as your [vore_spawn_gut]. Let them?", "Confirm", "No", "Yes")
+ else
+ confirm = alert(pred, "[C.prefs.real_name] is attempting to spawn into your [vore_spawn_gut]. Let them?", "Confirm", "No", "Yes")
+ //CHOMPEdit End
if(confirm != "Yes")
to_chat(C, "[pred] has declined your spawn request.")
var/message = sanitizeSafe(input(pred,"Do you want to leave them a message?")as text|null)
@@ -784,6 +808,10 @@ var/global/datum/controller/occupations/job_master
vore_spawn_gut = input(C, "Choose your Belly.", "Belly Spawnpoint") as null|anything in available_bellies
if(!vore_spawn_gut)
return
+ //CHOMPAdd Start
+ if(alert(C, "Do you want to instantly absorb them?", "Confirm", "Yes", "No") == "Yes")
+ absorb_choice = TRUE
+ //CHOMPAdd End
to_chat(C, "[prey] has received your spawn request. Please wait.")
log_admin("[key_name(C)] has requested to pred spawn onto [key_name(prey)]")
message_admins("[key_name(C)] has requested to pred spawn onto [key_name(prey)]")
@@ -791,11 +819,21 @@ var/global/datum/controller/occupations/job_master
var/confirm
if(prey.no_latejoin_prey_warning)
if(prey.no_latejoin_prey_warning_time > 0)
- confirm = tgui_alert(prey, "[C.prefs.real_name] is attempting to televore you into their [vore_spawn_gut]. Let them?", "Confirm", list("No", "Yes"), prey.no_latejoin_prey_warning_time SECONDS)
+ //CHOMPEdit Start
+ if(absorb_choice)
+ confirm = tgui_alert(prey, "[C.prefs.real_name] is attempting to televore and instantly absorb you with their [vore_spawn_gut]. Let them?", "Confirm", list("No", "Yes"), prey.no_latejoin_prey_warning_time SECONDS)
+ else
+ confirm = tgui_alert(prey, "[C.prefs.real_name] is attempting to televore you into their [vore_spawn_gut]. Let them?", "Confirm", list("No", "Yes"), prey.no_latejoin_prey_warning_time SECONDS)
+ //CHOMPEdit End
if(!confirm)
confirm = "Yes"
else
- confirm = alert(prey, "[C.prefs.real_name] is attempting to televore you into their [vore_spawn_gut]. Let them?", "Confirm", "No", "Yes")
+ //CHOMPEdit Start
+ if(absorb_choice)
+ confirm = alert(prey, "[C.prefs.real_name] is attempting to televore and instantly absorb you with their [vore_spawn_gut]. Let them?", "Confirm", "No", "Yes")
+ else
+ confirm = alert(prey, "[C.prefs.real_name] is attempting to televore you into their [vore_spawn_gut]. Let them?", "Confirm", "No", "Yes")
+ //CHOMPEdit End
if(confirm != "Yes")
to_chat(C, "[prey] has declined your spawn request.")
var/message = sanitizeSafe(input(prey,"Do you want to leave them a message?")as text|null)
@@ -932,6 +970,7 @@ var/global/datum/controller/occupations/job_master
. = list("turf","msg", "voreny", "prey", "itemtf", "vorgans", "carrier") //CHOMPEdit - Item TF spawnpoints, spawn as mob
if(vore_spawn_gut)
.["voreny"] = vore_spawn_gut
+ .["absorb"] = absorb_choice //CHOMPAdd
if(prey_to_nomph)
.["prey"] = prey_to_nomph //We pass this on later to reverse the vorespawn in new_player.dm
//CHOMPEdit Start - Item TF spawnpoints
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index da07f976f0..6218202489 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -587,6 +587,7 @@
if(imp.handle_implant(character,character.zone_sel.selecting))
imp.post_implant(character)
var/gut = join_props["voreny"]
+ var/start_absorbed = join_props["absorb"] //CHOMPAdd
var/mob/living/prey = join_props["prey"]
//CHOMPEdit Start - Item TF
if(itemtf && istype(itemtf, /obj/item/capture_crystal))
@@ -613,9 +614,17 @@
tele.set_up("#00FFFF", get_turf(prey))
tele.start()
character.forceMove(get_turf(prey))
+ //CHOMPAdd Start
+ if(start_absorbed)
+ prey.absorbed = 1
+ //CHOMPAdd End
prey.forceMove(gut_to_enter)
else
if(gut)
+ //CHOMPAdd Start
+ if(start_absorbed)
+ character.absorbed = 1
+ //CHOMPAdd End
character.forceMove(gut)
character.client.init_verbs() // init verbs for the late join
diff --git a/code/modules/vore/eating/belly_obj_ch.dm b/code/modules/vore/eating/belly_obj_ch.dm
index fd2d6315e5..0aa26692da 100644
--- a/code/modules/vore/eating/belly_obj_ch.dm
+++ b/code/modules/vore/eating/belly_obj_ch.dm
@@ -55,6 +55,8 @@
var/liquid_fullness4_messages = FALSE
var/liquid_fullness5_messages = FALSE
var/vorespawn_blacklist = FALSE
+ var/vorespawn_whitelist = list()
+ var/vorespawn_absorbed = 0
var/list/fullness1_messages = list(
"%pred's %belly looks empty"
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 7245de2a77..a2982c5afd 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -430,6 +430,8 @@
"fullness4_messages",
"fullness5_messages",
"vorespawn_blacklist",
+ "vorespawn_whitelist",
+ "vorespawn_absorbed",
"vore_sprite_flags",
"affects_vore_sprites",
"count_absorbed_prey_for_sprite",
@@ -2586,6 +2588,8 @@
dupe.reagent_transfer_verb = reagent_transfer_verb
dupe.custom_max_volume = custom_max_volume
dupe.vorespawn_blacklist = vorespawn_blacklist
+ dupe.vorespawn_whitelist = vorespawn_whitelist
+ dupe.vorespawn_absorbed = vorespawn_absorbed
dupe.vore_sprite_flags = vore_sprite_flags
dupe.affects_vore_sprites = affects_vore_sprites
dupe.count_absorbed_prey_for_sprite = count_absorbed_prey_for_sprite
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 22336287d3..a7df061831 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -282,6 +282,8 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
"custom_ingested_color" = selected.custom_ingested_color,
"custom_ingested_alpha" = selected.custom_ingested_alpha,
"vorespawn_blacklist" = selected.vorespawn_blacklist,
+ "vorespawn_whitelist" = selected.vorespawn_whitelist,
+ "vorespawn_absorbed" = (global_flag_check(selected.vorespawn_absorbed, VS_FLAG_ABSORB_YES) + global_flag_check(selected.vorespawn_absorbed, VS_FLAG_ABSORB_PREY)),
"sound_volume" = selected.sound_volume,
"affects_voresprite" = selected.affects_vore_sprites,
"absorbed_voresprite" = selected.count_absorbed_prey_for_sprite,
@@ -1148,6 +1150,20 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
if(new_vorespawn_blacklist == 1)
new_belly.vorespawn_blacklist = TRUE
+ if(islist(belly_data["vorespawn_whitelist"]))
+ var/new_vorespawn_whitelist = splittext(sanitize(lowertext(jointext(belly_data["vorespawn_whitelist"],"\n")),MAX_MESSAGE_LEN,0,0,0),"\n")
+ new_belly.vorespawn_whitelist = new_vorespawn_whitelist
+
+ if(isnum(belly_data["vorespawn_absorbed"]))
+ var/new_vorespawn_absorbed = 0
+ var/updated_vorespawn_absorbed = belly_data["vorespawn_absorbed"]
+ if(updated_vorespawn_absorbed & VS_FLAG_ABSORB_YES)
+ new_vorespawn_absorbed |= VS_FLAG_ABSORB_YES
+ if(updated_vorespawn_absorbed & VS_FLAG_ABSORB_PREY)
+ new_vorespawn_absorbed |= VS_FLAG_ABSORB_YES
+ new_vorespawn_absorbed |= VS_FLAG_ABSORB_PREY
+ new_belly.vorespawn_absorbed = new_vorespawn_absorbed
+
if(istext(belly_data["egg_type"]))
var/new_egg_type = sanitize(belly_data["egg_type"],MAX_MESSAGE_LEN,0,0,0)
if(new_egg_type)
@@ -2198,10 +2214,8 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
if(1)
host.soulcatcher_pref_flags ^= SOULCATCHER_ALLOW_DELETION_INSTANT
if(2)
- if(host.soulcatcher_pref_flags & SOULCATCHER_ALLOW_DELETION)
- host.soulcatcher_pref_flags ^= SOULCATCHER_ALLOW_DELETION
- if(host.soulcatcher_pref_flags & SOULCATCHER_ALLOW_DELETION_INSTANT)
- host.soulcatcher_pref_flags ^= SOULCATCHER_ALLOW_DELETION_INSTANT
+ host.soulcatcher_pref_flags &= ~(SOULCATCHER_ALLOW_DELETION)
+ host.soulcatcher_pref_flags &= ~(SOULCATCHER_ALLOW_DELETION_INSTANT)
if(host.client.prefs_vr)
host.client.prefs_vr.soulcatcher_pref_flags = host.soulcatcher_pref_flags
unsaved_changes = TRUE
@@ -3848,6 +3862,25 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
if("b_vorespawn_blacklist") //CHOMP Addition
host.vore_selected.vorespawn_blacklist = !host.vore_selected.vorespawn_blacklist
. = TRUE
+ if("b_vorespawn_whitelist") //CHOMP Addition
+ var/new_vorespawn_whitelist = sanitize(tgui_input_text(user,"Input ckeys allowed to vorespawn on separate lines. Cancel will clear the list.","Allowed Players",jointext(host.vore_selected.vorespawn_whitelist,"\n"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
+ if(new_vorespawn_whitelist)
+ host.vore_selected.vorespawn_whitelist = splittext(lowertext(new_vorespawn_whitelist),"\n")
+ else
+ host.vore_selected.vorespawn_whitelist = list()
+ . = TRUE
+ if("b_vorespawn_absorbed") //CHOMP Addition
+ var/current_number = global_flag_check(host.vore_selected.vorespawn_absorbed, VS_FLAG_ABSORB_YES) + global_flag_check(host.vore_selected.vorespawn_absorbed, VS_FLAG_ABSORB_PREY)
+ switch(current_number)
+ if(0)
+ host.vore_selected.vorespawn_absorbed |= VS_FLAG_ABSORB_YES
+ if(1)
+ host.vore_selected.vorespawn_absorbed |= VS_FLAG_ABSORB_PREY
+ if(2)
+ host.vore_selected.vorespawn_absorbed &= ~(VS_FLAG_ABSORB_YES)
+ host.vore_selected.vorespawn_absorbed &= ~(VS_FLAG_ABSORB_PREY)
+ unsaved_changes = TRUE
+ return TRUE
if("b_belly_sprite_to_affect") //CHOMP Addition
var/belly_choice = tgui_input_list(user, "Which belly sprite do you want your [lowertext(host.vore_selected.name)] to affect?","Select Region", host.vore_icon_bellies) //ChompEDIT - user, not usr
if(!belly_choice) //They cancelled, no changes
diff --git a/modular_chomp/code/modules/vore/eating/exportpanel_ch.dm b/modular_chomp/code/modules/vore/eating/exportpanel_ch.dm
index b2c8236462..8a8def2ed4 100644
--- a/modular_chomp/code/modules/vore/eating/exportpanel_ch.dm
+++ b/modular_chomp/code/modules/vore/eating/exportpanel_ch.dm
@@ -290,6 +290,8 @@
belly_data["emote_time"] = B.emote_time
belly_data["shrink_grow_size"] = B.shrink_grow_size
belly_data["vorespawn_blacklist"] = B.vorespawn_blacklist
+ belly_data["vorespawn_whitelist"] = B.vorespawn_whitelist
+ belly_data["vorespawn_absorbed"] = B.vorespawn_absorbed
belly_data["egg_type"] = B.egg_type
belly_data["egg_name"] = B.egg_name
belly_data["egg_size"] = B.egg_size
diff --git a/tgui/packages/tgui/interfaces/chompstation/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyOptions.tsx b/tgui/packages/tgui/interfaces/chompstation/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyOptions.tsx
index 293db04234..3f5d5d9055 100644
--- a/tgui/packages/tgui/interfaces/chompstation/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyOptions.tsx
+++ b/tgui/packages/tgui/interfaces/chompstation/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyOptions.tsx
@@ -2,6 +2,7 @@ import { capitalize } from 'common/string';
import { useBackend } from '../../../../backend';
import { Button, Flex, LabeledList } from '../../../../components';
+import { vorespawnAbsorbedColor, vorespawnAbsorbedText } from '../constants';
import { hostMob, selectedData } from '../types';
import { VoreSelectedMobTypeBellyButtons } from './VoreSelectedMobTypeBellyButtons';
@@ -40,6 +41,8 @@ export const VoreSelectedBellyOptions = (props: {
save_digest_mode,
eating_privacy_local,
vorespawn_blacklist,
+ vorespawn_whitelist,
+ vorespawn_absorbed,
private_struggle,
drainmode,
} = belly;
@@ -256,6 +259,35 @@ export const VoreSelectedBellyOptions = (props: {
{vorespawn_blacklist ? 'Yes' : 'No'}
+ {vorespawn_blacklist ? (
+ ''
+ ) : (
+ <>
+
+
+
+
+
+
+ >
+ )}