diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index 862a562b39..7a49e8b387 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -108,30 +108,66 @@ var/global/list/fancy_release_sounds = list(
)
var/global/list/global_vore_egg_types = list(
- "Unathi" = UNATHI_EGG,
- "Tajaran" = TAJARAN_EGG,
- "Akula" = AKULA_EGG,
- "Skrell" = SKRELL_EGG,
- "Nevrean" = NEVREAN_EGG,
- "Sergal" = SERGAL_EGG,
- "Human" = HUMAN_EGG,
- "Slime" = SLIME_EGG,
- "Egg" = EGG_EGG,
- "Xenochimera" = XENOCHIMERA_EGG,
- "Xenomorph" = XENOMORPH_EGG)
+ "Unathi",
+ "Tajara",
+ "Akula",
+ "Skrell",
+ "Sergal",
+ "Nevrean",
+ "Human",
+ "Slime",
+ "Egg",
+ "Xenochimera",
+ "Xenomorph",
+ "Chocolate",
+ "Boney",
+ "Slime glob",
+ "Chicken",
+ "Synthetic",
+ "Cooking error",
+ "Escape pod",
+ "Web cocoon",
+ "Bug cocoon",
+ "Rock",
+ "Yellow",
+ "Blue",
+ "Green",
+ "Orange",
+ "Purple",
+ "Red",
+ "Rainbow",
+ "Spotted pink")
var/global/list/tf_vore_egg_types = list(
- "Unathi" = /obj/structure/closet/secure_closet/egg/unathi,
- "Tajara" = /obj/structure/closet/secure_closet/egg/tajaran,
- "Akula" = /obj/structure/closet/secure_closet/egg/shark,
- "Skrell" = /obj/structure/closet/secure_closet/egg/skrell,
- "Sergal" = /obj/structure/closet/secure_closet/egg/sergal,
- "Nevrean" = /obj/structure/closet/secure_closet/egg/nevrean,
- "Human" = /obj/structure/closet/secure_closet/egg/human,
- "Slime" = /obj/structure/closet/secure_closet/egg/slime,
- "Egg" = /obj/structure/closet/secure_closet/egg,
- "Xenochimera" = /obj/structure/closet/secure_closet/egg/scree,
- "Xenomorph" = /obj/structure/closet/secure_closet/egg/xenomorph)
+ "Unathi" = /obj/item/weapon/storage/vore_egg/unathi,
+ "Tajara" = /obj/item/weapon/storage/vore_egg/tajaran,
+ "Akula" = /obj/item/weapon/storage/vore_egg/shark,
+ "Skrell" = /obj/item/weapon/storage/vore_egg/skrell,
+ "Sergal" = /obj/item/weapon/storage/vore_egg/sergal,
+ "Nevrean" = /obj/item/weapon/storage/vore_egg/nevrean,
+ "Human" = /obj/item/weapon/storage/vore_egg/human,
+ "Slime" = /obj/item/weapon/storage/vore_egg/slime,
+ "Egg" = /obj/item/weapon/storage/vore_egg,
+ "Xenochimera" = /obj/item/weapon/storage/vore_egg/scree,
+ "Xenomorph" = /obj/item/weapon/storage/vore_egg/xenomorph,
+ "Chocolate" = /obj/item/weapon/storage/vore_egg/chocolate,
+ "Boney" = /obj/item/weapon/storage/vore_egg/owlpellet,
+ "Slime glob" = /obj/item/weapon/storage/vore_egg/slimeglob,
+ "Chicken" = /obj/item/weapon/storage/vore_egg/chicken,
+ "Synthetic" = /obj/item/weapon/storage/vore_egg/synthetic,
+ "Cooking error" = /obj/item/weapon/storage/vore_egg/badrecipe,
+ "Escape pod" = /obj/item/weapon/storage/vore_egg/escapepod,
+ "Web cocoon" = /obj/item/weapon/storage/vore_egg/cocoon,
+ "Bug cocoon" = /obj/item/weapon/storage/vore_egg/bugcocoon,
+ "Rock" = /obj/item/weapon/storage/vore_egg/rock,
+ "Yellow" = /obj/item/weapon/storage/vore_egg/yellow,
+ "Blue" = /obj/item/weapon/storage/vore_egg/blue,
+ "Green" = /obj/item/weapon/storage/vore_egg/green,
+ "Orange" = /obj/item/weapon/storage/vore_egg/orange,
+ "Purple" = /obj/item/weapon/storage/vore_egg/purple,
+ "Red" = /obj/item/weapon/storage/vore_egg/red,
+ "Rainbow" = /obj/item/weapon/storage/vore_egg/rainbow,
+ "Spotted pink" = /obj/item/weapon/storage/vore_egg/pinkspots)
var/global/list/edible_trash = list(/obj/item/broken_device,
/obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars,
@@ -182,7 +218,8 @@ var/global/list/edible_trash = list(/obj/item/broken_device,
/obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/fancy/crayons,
/obj/item/weapon/storage/fancy/egg_box,
- /obj/item/weapon/storage/wallet)
+ /obj/item/weapon/storage/wallet,
+ /obj/item/weapon/storage/vore_egg)
var/global/list/contamination_flavors = list(
"Generic" = contamination_flavors_generic,
diff --git a/code/game/objects/items/weapons/storage/egg_vr.dm b/code/game/objects/items/weapons/storage/egg_vr.dm
new file mode 100644
index 0000000000..0ea3b673e1
--- /dev/null
+++ b/code/game/objects/items/weapons/storage/egg_vr.dm
@@ -0,0 +1,182 @@
+//Item type vorepanel egg release containers.
+
+/obj/item/weapon/storage/vore_egg
+ name = "egg"
+ desc = "It's an egg; it's smooth to the touch." //This is the default egg.
+ icon = 'icons/obj/egg_new_vr.dmi'
+ icon_state = "egg"
+ var/open_egg_icon = 'icons/obj/egg_open_vr.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi',
+ )
+ w_class = 2
+ max_w_class = 0
+ show_messages = 0
+ allow_quick_empty = TRUE
+ use_sound = 'sound/items/drop/flesh.ogg'
+
+/obj/item/weapon/storage/vore_egg/open(mob/user as mob)
+ icon = open_egg_icon
+ ..()
+
+/obj/item/weapon/storage/vore_egg/proc/hatch(mob/living/user as mob)
+ visible_message("\The [src] begins to shake as something pushes out from within!")
+ animate_shake()
+ if(do_after(user, 50))
+ if(use_sound)
+ playsound(src, src.use_sound, 50, 0, -5)
+ animate_shake()
+ drop_contents()
+ icon = open_egg_icon
+
+/obj/item/weapon/storage/vore_egg/proc/animate_shake()
+ var/init_px = pixel_x
+ var/shake_dir = pick(-1, 1)
+ animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
+ animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
+
+/obj/item/weapon/storage/vore_egg/unathi
+ name = "unathi egg"
+ desc = "Some species of Unathi apparently lay soft-shelled eggs!"
+ icon_state = "egg_unathi"
+
+/obj/item/weapon/storage/vore_egg/nevrean
+ name = "nevrean egg"
+ desc = "Most Nevreans lay hard-shelled eggs!"
+ icon_state = "egg_nevrean"
+
+/obj/item/weapon/storage/vore_egg/human
+ name = "human egg"
+ desc = "Some humans lay eggs that are--wait, what?"
+ icon_state = "egg_human"
+
+/obj/item/weapon/storage/vore_egg/tajaran
+ name = "tajaran egg"
+ desc = "Apparently that's what a Tajaran egg looks like. Weird."
+ icon_state = "egg_tajaran"
+
+/obj/item/weapon/storage/vore_egg/skrell
+ name = "skrell egg"
+ desc = "Its soft and squishy"
+ icon_state = "egg_skrell"
+
+/obj/item/weapon/storage/vore_egg/shark
+ name = "akula egg"
+ desc = "Its soft and slimy to the touch"
+ icon_state = "egg_akula"
+
+/obj/item/weapon/storage/vore_egg/sergal
+ name = "sergal egg"
+ desc = "An egg with a slightly fuzzy exterior, and a hard layer beneath."
+ icon_state = "egg_sergal"
+
+/obj/item/weapon/storage/vore_egg/slime
+ name = "slime egg"
+ desc = "An egg with a soft and squishy interior, coated with slime."
+ icon_state = "egg_slime"
+
+/obj/item/weapon/storage/vore_egg/special //Not actually used, but the sprites are in, and it's there in case any admins need to spawn in the egg for any specific reasons.
+ name = "special egg"
+ desc = "This egg has a very unique look to it."
+ icon_state = "egg_unique"
+
+/obj/item/weapon/storage/vore_egg/scree
+ name = "Chimera egg"
+ desc = "...You don't know what type of creature laid this egg."
+ icon_state = "egg_scree"
+
+/obj/item/weapon/storage/vore_egg/xenomorph
+ name = "Xenomorph egg"
+ desc = "Some type of pitch black egg. It has a slimy exterior coating."
+ icon_state = "egg_xenomorph"
+
+/obj/item/weapon/storage/vore_egg/chocolate
+ name = "chocolate egg"
+ desc = "Delicious. May contain a choking hazard."
+ icon_state = "egg_chocolate"
+
+/obj/item/weapon/storage/vore_egg/owlpellet
+ name = "boney egg"
+ desc = "Can an egg shell be made of bones and hair?"
+ icon_state = "egg_pellet"
+
+/obj/item/weapon/storage/vore_egg/slimeglob
+ name = "glob of slime"
+ desc = "Very squishy."
+ icon_state = "egg_slimeglob"
+
+/obj/item/weapon/storage/vore_egg/chicken
+ name = "chicken egg"
+ desc = "Looks like chickens come in all sizes and shapes."
+ icon_state = "egg_chicken"
+
+/obj/item/weapon/storage/vore_egg/synthetic
+ name = "synthetic egg"
+ desc = "Can robots lay eggs?"
+ icon_state = "egg_synthetic"
+
+/obj/item/weapon/storage/vore_egg/badrecipe
+ name = "Burned mess"
+ desc = "Someone didn't cook this egg quite right..."
+ icon_state = "egg_badrecipe"
+
+/obj/item/weapon/storage/vore_egg/escapepod
+ name = "small escape pod"
+ desc = "Someone left in a hurry."
+ icon_state = "egg_escapepod"
+
+/obj/item/weapon/storage/vore_egg/cocoon
+ name = "web cocoon"
+ desc = "It straight up smells like spiders in here."
+ icon_state = "egg_cocoon"
+
+/obj/item/weapon/storage/vore_egg/bugcocoon
+ name = "bug cocoon"
+ desc = "Metamorphosis!"
+ icon_state = "egg_bugcocoon"
+
+/obj/item/weapon/storage/vore_egg/rock
+ name = "rock egg"
+ desc = "It looks like a small boulder."
+ icon_state = "egg_rock"
+
+/obj/item/weapon/storage/vore_egg/yellow
+ name = "yellow egg"
+ desc = "It is a nice yellow egg."
+ icon_state = "egg_yellow"
+
+/obj/item/weapon/storage/vore_egg/blue
+ name = "blue egg"
+ desc = "It is a nice blue egg."
+ icon_state = "egg_blue"
+
+/obj/item/weapon/storage/vore_egg/green
+ name = "green egg"
+ desc = "It is a nice green egg."
+ icon_state = "egg_green"
+
+/obj/item/weapon/storage/vore_egg/orange
+ name = "orange egg"
+ desc = "It is a nice orange egg."
+ icon_state = "egg_orange"
+
+/obj/item/weapon/storage/vore_egg/purple
+ name = "purple egg"
+ desc = "It is a nice purple egg."
+ icon_state = "egg_purple"
+
+/obj/item/weapon/storage/vore_egg/red
+ name = "red egg"
+ desc = "It is a nice red egg."
+ icon_state = "egg_red"
+
+/obj/item/weapon/storage/vore_egg/rainbow
+ name = "rainbow egg"
+ desc = "It looks so colorful."
+ icon_state = "egg_rainbow"
+
+/obj/item/weapon/storage/vore_egg/pinkspots
+ name = "spotted pink egg"
+ desc = "It is a cute pink egg with white spots."
+ icon_state = "egg_pinkspots"
diff --git a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm
index ba0809f638..dabc8fd88b 100644
--- a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm
+++ b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm
@@ -36,11 +36,11 @@
icon_opened = "egg_unathi_open"
/obj/structure/closet/secure_closet/egg/nevrean
- name = "nevarean egg"
- desc = "Most Nevareans lay hard-shelled eggs!"
- icon_state = "egg_nevarean"
- icon_closed = "egg_nevarean"
- icon_opened = "egg_nevarean_open"
+ name = "nevrean egg"
+ desc = "Most Nevreans lay hard-shelled eggs!"
+ icon_state = "egg_nevrean"
+ icon_closed = "egg_nevrean"
+ icon_opened = "egg_nevrean_open"
/obj/structure/closet/secure_closet/egg/human
name = "human egg"
diff --git a/code/modules/client/preference_setup/vore/03_egg.dm b/code/modules/client/preference_setup/vore/03_egg.dm
index 648b31b399..6c090478d5 100644
--- a/code/modules/client/preference_setup/vore/03_egg.dm
+++ b/code/modules/client/preference_setup/vore/03_egg.dm
@@ -1,15 +1,3 @@
-var/UNATHI_EGG = "Unathi"
-var/TAJARAN_EGG = "Tajaran"
-var/AKULA_EGG = "Akula"
-var/SKRELL_EGG = "Skrell"
-var/SERGAL_EGG = "Sergal"
-var/HUMAN_EGG = "Human"
-var/NEVREAN_EGG = "nevrean"
-var/SLIME_EGG = "Slime"
-var/EGG_EGG = "Egg"
-var/XENOCHIMERA_EGG = "Xenochimera"
-var/XENOMORPH_EGG = "Xenomorph"
-
// Define a place to save appearance in character setup
/datum/preferences
var/vore_egg_type = "Egg" //The egg type they have.
@@ -26,8 +14,7 @@ var/XENOMORPH_EGG = "Xenomorph"
S["vore_egg_type"] << pref.vore_egg_type
/datum/category_item/player_setup_item/vore/egg/sanitize_character()
- var/valid_vore_egg_types = global_vore_egg_types
- pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, valid_vore_egg_types, initial(pref.vore_egg_type))
+ pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, global_vore_egg_types, initial(pref.vore_egg_type))
/datum/category_item/player_setup_item/vore/egg/copy_to_mob(var/mob/living/carbon/human/character)
character.vore_egg_type = pref.vore_egg_type
@@ -44,7 +31,7 @@ var/XENOMORPH_EGG = "Xenomorph"
var/list/vore_egg_types = global_vore_egg_types
var/selection = input(user, "Choose your character's egg type:", "Character Preference", pref.vore_egg_type) as null|anything in vore_egg_types
if(selection)
- pref.vore_egg_type = vore_egg_types[selection]
+ pref.vore_egg_type = selection
return TOPIC_REFRESH
else
return
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index bf753d7cb2..f8abbb477a 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -38,6 +38,9 @@
var/fancy_vore = FALSE // Using the new sounds?
var/is_wet = TRUE // Is this belly's insides made of slimy parts?
var/wet_loop = TRUE // Does the belly have a fleshy loop playing?
+ var/obj/item/weapon/storage/vore_egg/ownegg // Is this belly creating an egg?
+ var/egg_type = "egg" // Default egg type and path.
+ var/egg_path = /obj/item/weapon/storage/vore_egg
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
//Actual full digest modes
@@ -341,6 +344,11 @@
if (!(M in contents))
return 0 // They weren't in this belly anyway
+ for(var/mob/living/L in M.contents)
+ L.muffled = 0
+ for(var/obj/item/weapon/holder/H in M.contents)
+ H.held_mob.muffled = 0
+
//Place them into our drop_location
M.forceMove(drop_location())
@@ -601,9 +609,10 @@
//Handle a mob struggling
// Called from /mob/living/carbon/relaymove()
-/obj/belly/proc/relay_resist(mob/living/R)
+/obj/belly/proc/relay_resist(mob/living/R, obj/item/C)
if (!(R in contents))
- return // User is not in this belly
+ if(!C)
+ return // User is not in this belly
R.setClickCooldown(50)
@@ -612,9 +621,13 @@
to_chat(owner, "Someone is attempting to climb out of your [lowertext(name)]!")
if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED))
- if((owner.stat || escapable) && (R.loc == src)) //Can still escape?
- release_specific_contents(R)
- return
+ if((owner.stat || escapable)) //Can still escape?
+ if(C)
+ release_specific_contents(C)
+ return
+ if(R.loc == src)
+ release_specific_contents(R)
+ return
else if(R.loc != src) //Aren't even in the belly. Quietly fail.
return
else //Belly became inescapable or mob revived
@@ -657,6 +670,13 @@
to_chat(R, "You start to climb out of \the [lowertext(name)].")
to_chat(owner, "Someone is attempting to climb out of your [lowertext(name)]!")
if(do_after(R, escapetime))
+ if(escapable && C)
+ release_specific_contents(C)
+ to_chat(R,"Your struggles successfully cause [owner] to squeeze your container out of their \the [lowertext(name)].")
+ to_chat(owner,"[C] suddenly slips out of your [lowertext(name)]!")
+ for(var/mob/M in hearers(4, owner))
+ M.show_message("[C] suddenly slips out of [owner]'s [lowertext(name)]!", 2)
+ return
if((escapable) && (R.loc == src) && !R.absorbed) //Does the owner still have escapable enabled?
release_specific_contents(R)
to_chat(R,"You climb out of \the [lowertext(name)].")
@@ -687,6 +707,9 @@
to_chat(R, "Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!")
to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!")
+ if(C)
+ transfer_contents(C, dest_belly)
+ return
transfer_contents(R, dest_belly)
return
diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm
index 8b46a660ba..6d97729767 100644
--- a/code/modules/vore/eating/bellymodes_datum_vr.dm
+++ b/code/modules/vore/eating/bellymodes_datum_vr.dm
@@ -14,6 +14,9 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/proc/process_mob(obj/belly/B, mob/living/L)
return null
+/datum/digest_mode/proc/handle_atoms(obj/belly/B, list/touchable_atoms)
+ return FALSE
+
/datum/digest_mode/digest
id = DM_DIGEST
noise_chance = 50
@@ -156,8 +159,69 @@ GLOBAL_LIST_INIT(digest_modes, list())
// E G G
/datum/digest_mode/egg
id = DM_EGG
-
+/*
/datum/digest_mode/egg/process_mob(obj/belly/B, mob/living/carbon/human/H)
if(!istype(H) || H.stat == DEAD || H.absorbed)
return null
- B.put_in_egg(H, 1)
+ B.put_in_egg(H, 1)*/
+
+/datum/digest_mode/egg/handle_atoms(obj/belly/B, list/touchable_atoms)
+ var/list/egg_contents = list()
+ for(var/E in touchable_atoms)
+ if(istype(E, /obj/item/weapon/storage/vore_egg)) // Don't egg other eggs.
+ continue
+ if(isliving(E))
+ var/mob/living/L = E
+ if(L.absorbed)
+ continue
+ egg_contents += L
+ if(isitem(E))
+ egg_contents += E
+ if(egg_contents.len)
+ if(!B.ownegg)
+ if(B.owner.vore_egg_type in tf_vore_egg_types)
+ B.egg_type = B.owner.vore_egg_type
+ B.egg_path = tf_vore_egg_types[B.egg_type]
+ B.ownegg = new B.egg_path(B)
+ for(var/atom/movable/C in egg_contents)
+ if(isitem(C) && egg_contents.len == 1) //Only egging one item
+ var/obj/item/I = C
+ B.ownegg.w_class = I.w_class
+ B.ownegg.max_storage_space = B.ownegg.w_class
+ I.forceMove(B.ownegg)
+ B.ownegg.icon_scale_x = 0.2 * B.ownegg.w_class
+ B.ownegg.icon_scale_y = 0.2 * B.ownegg.w_class
+ B.ownegg.update_transform()
+ egg_contents -= I
+ B.ownegg = null
+ return
+ if(isliving(C))
+ var/mob/living/M = C
+ B.ownegg.w_class = M.size_multiplier * 4 //Egg size and weight scaled to match occupant.
+ var/obj/item/weapon/holder/H = new M.holder_type(B.ownegg)
+ H.held_mob = M
+ M.forceMove(H)
+ H.sync(M)
+ B.ownegg.max_storage_space = H.w_class
+ B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class
+ B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class
+ B.ownegg.update_transform()
+ egg_contents -= M
+ if(B.ownegg.w_class > 4)
+ B.ownegg.slowdown = B.ownegg.w_class - 4
+ B.ownegg = null
+ return
+ C.forceMove(B.ownegg)
+ if(isitem(C))
+ var/obj/item/I = C
+ B.ownegg.w_class += I.w_class //Let's assume a regular outfit can reach total w_class of 16.
+ B.ownegg.calibrate_size()
+ B.ownegg.orient2hud()
+ B.ownegg.w_class = clamp(B.ownegg.w_class * 0.25, 1, 8) //A total w_class of 16 will result in a backpack sized egg.
+ B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class
+ B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class
+ B.ownegg.update_transform()
+ if(B.ownegg.w_class > 4)
+ B.ownegg.slowdown = B.ownegg.w_class - 4
+ B.ownegg = null
+ return
\ No newline at end of file
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 95162dfb15..9d4b5309c8 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -32,6 +32,14 @@
if(!length(touchable_atoms))
return
+ var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
+ if(!DM)
+ log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!")
+ return FALSE
+ if(DM.handle_atoms(src, touchable_atoms))
+ updateVRPanels()
+ return
+
var/list/touchable_mobs = null
var/list/hta_returns = handle_touchable_atoms(touchable_atoms)
@@ -55,11 +63,6 @@
continue // don't give digesty messages to indigestible people
to_chat(M, "[pick(EL)]")
- var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
- if(!DM)
- log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!")
- return FALSE
-
if(!digestion_noise_chance)
digestion_noise_chance = DM.noise_chance
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index ccf3535d25..0b902e82bc 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -158,7 +158,7 @@
"belly_fullscreen" = selected.belly_fullscreen,
"possible_fullscreens" = icon_states('icons/mob/screen_full_vore.dmi'),
"vorespawn_blacklist" = selected.vorespawn_blacklist
- )
+ ) //CHOMP Addition: vorespawn blacklist
data["selected"]["addons"] = list()
for(var/flag_name in selected.mode_flag_list)
@@ -929,7 +929,8 @@
qdel(host.vore_selected)
host.vore_selected = host.vore_organs[1]
. = TRUE
- if("b_vorespawn_blacklist")
+
+ if("b_vorespawn_blacklist") //CHOMP Addition
host.vore_selected.vorespawn_blacklist = !host.vore_selected.vorespawn_blacklist
. = TRUE
@@ -1107,4 +1108,4 @@
if(new_message)
host.vore_selected.set_reagent_messages(new_message,"full5")
. = TRUE
-//CHOMPedit end
\ No newline at end of file
+//CHOMPedit end
diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm
index 4e7b63e0b9..b0bfbcc5b4 100644
--- a/code/modules/vore/resizing/holder_micro_vr.dm
+++ b/code/modules/vore/resizing/holder_micro_vr.dm
@@ -48,3 +48,23 @@
..()
for(var/mob/living/carbon/human/I in contents)
item_state = lowertext(I.species.name)
+
+//Egg features.
+/obj/item/weapon/holder/attack_hand(mob/living/user as mob)
+ if(istype(src.loc, /obj/item/weapon/storage/vore_egg)) //Don't scoop up the egged mob
+ src.pickup(user)
+ user.drop_from_inventory(src)
+ return
+ ..()
+
+/obj/item/weapon/holder/container_resist(mob/living/held)
+ if(!istype(src.loc, /obj/item/weapon/storage/vore_egg))
+ ..()
+ else
+ var/obj/item/weapon/storage/vore_egg/E = src.loc
+ if(isbelly(E.loc))
+ var/obj/belly/B = E.loc
+ B.relay_resist(held, E)
+ return
+ E.hatch(held)
+ return
diff --git a/icons/obj/egg_new_vr.dmi b/icons/obj/egg_new_vr.dmi
new file mode 100644
index 0000000000..b9804d69ba
Binary files /dev/null and b/icons/obj/egg_new_vr.dmi differ
diff --git a/icons/obj/egg_open_vr.dmi b/icons/obj/egg_open_vr.dmi
new file mode 100644
index 0000000000..e3faabb4dc
Binary files /dev/null and b/icons/obj/egg_open_vr.dmi differ
diff --git a/icons/obj/egg_vr.dmi b/icons/obj/egg_vr.dmi
index c54ac62b10..14c17920f8 100644
Binary files a/icons/obj/egg_vr.dmi and b/icons/obj/egg_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 6c2e2a5a6e..c3a7726028 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1428,6 +1428,7 @@
#include "code\game\objects\items\weapons\storage\boxes_ch.dm"
#include "code\game\objects\items\weapons\storage\boxes_vr.dm"
#include "code\game\objects\items\weapons\storage\briefcase.dm"
+#include "code\game\objects\items\weapons\storage\egg_vr.dm"
#include "code\game\objects\items\weapons\storage\fancy.dm"
#include "code\game\objects\items\weapons\storage\fancy_ch.dm"
#include "code\game\objects\items\weapons\storage\fancy_yw.dm"