diff --git a/code/game/objects/items/weapons/implants/implantreagent_ch.dm b/code/game/objects/items/weapons/implants/implantreagent_ch.dm
new file mode 100644
index 0000000000..b882dd6597
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implantreagent_ch.dm
@@ -0,0 +1,116 @@
+/obj/item/weapon/implant/reagent_generator/egg
+ name = "egg laying implant"
+ desc = "This is an implant that allows the user to lay eggs."
+ generated_reagents = list("egg" = 2)
+ usable_volume = 500
+ transfer_amount = 50
+ var/verb_descriptor = list("squeezes", "pushes", "hugs")
+ var/self_verb_descriptor = list("squeeze", "push", "hug")
+ var/short_emote_descriptor = list("lays", "forces out", "pushes out")
+ self_emote_descriptor = list("lay", "force out", "push out")
+ random_emote = list("lets out an embarrassed moan", "yelps in embarrassment", "quietly groans in a mixture of discomfort and pleasure")
+ assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_egg
+ var/eggtype = /obj/item/weapon/reagent_containers/food/snacks/egg
+
+/obj/item/weapon/implant/reagent_generator/egg/post_implant(mob/living/carbon/source)
+ START_PROCESSING(SSobj, src)
+ to_chat(source, "You implant [source] with \the [src].")
+ source.verbs |= assigned_proc
+ return 1
+
+/mob/living/carbon/human/proc/use_reagent_implant_egg()
+ set name = "Force Someone Adjacent To Lay An Egg, If Applicable!"
+ set desc = "Force someone adjacent to lay an egg by squeezing into their lower body! Whilst their reaction may vary, this is certainly going to overwhelm them for a moment!"
+ set category = "Local"
+ set src in view(1)
+ //do_reagent_implant(usr)
+ if(!isliving(usr) || !usr.checkClickCooldown())
+ return
+
+ if(usr.incapacitated() || usr.stat > CONSCIOUS)
+ return
+
+ var/obj/item/weapon/implant/reagent_generator/egg/rimplant
+ for(var/obj/item/organ/external/E in organs)
+ for(var/obj/item/weapon/implant/I in E.implants)
+ if(istype(I, /obj/item/weapon/implant/reagent_generator))
+ rimplant = I
+ break
+
+ rimplant.empty_message = list("Your lower belly feels smooth and empty, clearly there are no eggs left to be had!", "The reduced pressure in your lower belly tells you there are no eggs left, for now...")
+ rimplant.full_message = list("Your lower belly is a bit bloated, possessing a mildly bumpy texture if pressed against...", "Your lower abdomen feels really heavy, making it a bit hard to walk.")
+ rimplant.emote_descriptor = list("an egg right out of [src]'s lower belly!", "into [src]'s belly firmly, forcing them to lay an egg!", "[src] really tight, who promptly lays an egg!")
+
+ if(rimplant.reagents.total_volume >= rimplant.usable_volume*0.75)
+ if(usr != src)
+ to_chat(usr, "[src] is very full on eggs, squeezing them now may result in a cascade!")
+ to_chat(src, "[pick(rimplant.full_message)]")
+
+ if(rimplant.reagents.total_volume <= rimplant.transfer_amount)
+ if(usr != src)
+ to_chat(usr, "It seems that [src] is out of eggs!")
+ to_chat(src, "[pick(rimplant.empty_message)]")
+ return
+ visible_message("[usr] starts squeezing [src]'s lower body firmly...")
+ if (rimplant && do_after(usr,60))
+ var/egg = rimplant.eggtype
+ new egg(get_turf(src))
+ src.SetStunned(3)
+ playsound(src,'sound/vore/insert.ogg',50,1)
+ var/index = rand(1,3)
+
+ if (usr != src)
+ var/emote = rimplant.emote_descriptor[index]
+ var/verb_desc = rimplant.verb_descriptor[index]
+ var/self_verb_desc = rimplant.self_verb_descriptor[index]
+ visible_message("[usr] [verb_desc] [emote]",
+ "You [self_verb_desc] [emote]")
+ else
+ visible_message("[src] [pick(rimplant.short_emote_descriptor)] an egg.",
+ "You [pick(rimplant.self_emote_descriptor)] an egg.")
+
+ if(prob(15))
+ visible_message("[src] [pick(rimplant.random_emote)].")
+ rimplant.reagents.remove_any(rimplant.transfer_amount)
+
+ if(prob(70*rimplant.reagents.total_volume/rimplant.usable_volume))
+ to_chat(src, "You feel your legs quake as your muscles fail to stand strong!")
+ while(rimplant.reagents.total_volume >= rimplant.transfer_amount)
+ if(do_after(src,30))
+ src.SetStunned(5)
+ playsound(src,'sound/vore/insert.ogg',50,1)
+ src.apply_effect(10,STUTTER,0)
+ new egg(get_turf(src))
+ rimplant.reagents.remove_any(rimplant.transfer_amount)
+ if(prob(25))
+ visible_message("[src] [pick(rimplant.random_emote)].")
+
+/obj/item/weapon/implant/reagent_generator/egg/slow
+ name = "slow egg laying implant"
+ usable_volume = 3000
+ transfer_amount = 300
+
+/obj/item/weapon/implant/reagent_generator/egg/veryslow
+ name = "very slow egg laying implant"
+ usable_volume = 6000
+ transfer_amount = 600
+
+/obj/item/weapon/implant/reagent_generator/egg/hicap
+ name = "high capacity egg laying implant" // Note that the capacity does not affect the regeneration rate, rather, the transfer amount does
+ usable_volume = 1000 // Effectively, the transfer_amount is the cost/time of making an egg. Usable volume is simply the max number of eggs.
+ transfer_amount = 50
+
+/obj/item/weapon/implant/reagent_generator/egg/doublehicap
+ name = "extreme capacity egg laying implant"
+ usable_volume = 2000
+ transfer_amount = 50
+
+/obj/item/weapon/implant/reagent_generator/egg/slowlowcap
+ name = "slow, low capacity egg laying implant"
+ usable_volume = 3000
+ transfer_amount = 3000
+
+/obj/item/weapon/implant/reagent_generator/egg/veryslowlowcap
+ name = "very slow, low capacity egg laying implant"
+ usable_volume = 6000
+ transfer_amount = 6000
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility_ch.dm b/code/modules/client/preference_setup/loadout/loadout_utility_ch.dm
index 2cfd21ee37..3a882fb49f 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility_ch.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility_ch.dm
@@ -2,4 +2,17 @@
/datum/gear/utility/news_ch
display_name = "starcaster"
path = /obj/item/device/starcaster_news
- cost = 0
\ No newline at end of file
+ cost = 0
+
+/datum/gear/utility/implant/egg
+ display_name = "Egg implant"
+ path = /obj/item/weapon/implant/reagent_generator/egg
+ cost = 0
+
+/datum/gear/utility/implant/egg/New()
+ ..()
+ var/list/implants = list()
+ for(var/implant in typesof(/obj/item/weapon/implant/reagent_generator/egg))
+ var/obj/item/weapon/implant/reagent_generator/egg/implant_type = implant
+ implants[initial(implant_type.name)] = implant_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(implants))
\ No newline at end of file
diff --git a/code/modules/turbolift/turbolift_console_vr.dm b/code/modules/turbolift/turbolift_console_vr.dm
new file mode 100644
index 0000000000..a02730c08d
--- /dev/null
+++ b/code/modules/turbolift/turbolift_console_vr.dm
@@ -0,0 +1,7 @@
+// TFF 6/10/20 - Just a little thing to prevent the button
+ // and console from being destroyed by explosions.
+/obj/structure/lift/button/ex_act()
+ return
+
+/obj/structure/lift/panel/ex_act()
+ return
\ No newline at end of file
diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm
index df59ffb35d..d5ec12ee85 100644
--- a/code/modules/vore/eating/digest_act_vr.dm
+++ b/code/modules/vore/eating/digest_act_vr.dm
@@ -28,7 +28,7 @@
if(g_damage > digest_stage)
g_damage = digest_stage
digest_stage -= g_damage
- else
+ if(digest_stage <= 0)
for(var/obj/item/O in contents)
if(istype(O,/obj/item/weapon/storage/internal)) //Dump contents from dummy pockets.
for(var/obj/item/SO in O)
@@ -38,6 +38,8 @@
else if(item_storage)
O.forceMove(item_storage)
qdel(src)
+ if(g_damage > w_class)
+ return w_class
return g_damage
/////////////
diff --git a/icons/effects/lighting_overlay.dmi b/icons/effects/lighting_overlay.dmi
index bc3d25204c..80807db1e6 100644
Binary files a/icons/effects/lighting_overlay.dmi and b/icons/effects/lighting_overlay.dmi differ
diff --git a/maps/expedition_vr/space/_fueldepot.dm b/maps/expedition_vr/space/_fueldepot.dm
index 4ec3236dd0..1f3241aee7 100644
--- a/maps/expedition_vr/space/_fueldepot.dm
+++ b/maps/expedition_vr/space/_fueldepot.dm
@@ -35,4 +35,10 @@
/turf/simulated/floor/tiled/techmaint/airless
oxygen = 0
nitrogen = 0
- temperature = TCMB
\ No newline at end of file
+ temperature = TCMB
+
+/obj/machinery/atmospherics/pipe/tank/phoron/full
+ start_pressure = 15000
+
+/obj/machinery/atmospherics/pipe/tank/air/full
+ start_pressure = 15000
diff --git a/maps/expedition_vr/space/fueldepot.dmm b/maps/expedition_vr/space/fueldepot.dmm
index 86e6cee6c0..381d051574 100644
--- a/maps/expedition_vr/space/fueldepot.dmm
+++ b/maps/expedition_vr/space/fueldepot.dmm
@@ -644,7 +644,7 @@
/turf/simulated/shuttle/plating/airless,
/area/tether_away/fueldepot)
"bo" = (
-/obj/machinery/atmospherics/pipe/tank/phoron,
+/obj/machinery/atmospherics/pipe/tank/phoron/full,
/obj/effect/floor_decal/industrial/outline/red,
/turf/simulated/floor/tiled/techmaint/airless,
/area/tether_away/fueldepot)
@@ -1124,7 +1124,7 @@
/turf/simulated/shuttle/plating/airless,
/area/tether_away/fueldepot)
"cn" = (
-/obj/machinery/atmospherics/pipe/tank/air{
+/obj/machinery/atmospherics/pipe/tank/air/full{
icon_state = "air_map";
dir = 1
},
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index 039bbafcd2..87e1d4769e 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -11494,6 +11494,16 @@
},
/turf/simulated/floor/water/pool,
/area/tether/surfacebase/surface_one_hall)
+"atm" = (
+/obj/structure/bed/chair/wood,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/lino,
+/area/crew_quarters/visitor_dining)
"atn" = (
/obj/machinery/status_display{
pixel_x = 32;
@@ -17310,17 +17320,6 @@
},
/turf/simulated/floor/lino,
/area/crew_quarters/visitor_dining)
-"aIs" = (
-/obj/structure/bed/chair/wood,
-/obj/structure/bed/chair/wood,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/turf/simulated/floor/lino,
-/area/crew_quarters/visitor_dining)
"aIt" = (
/obj/structure/bed/chair/wood,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
@@ -46106,7 +46105,7 @@ aEK
aEK
aEK
aDu
-aIs
+atm
aCQ
aJV
aDu
diff --git a/tools/vr-merge-upstream-pull-request.sh b/tools/ch-merge-upstream-pull-request.sh
similarity index 97%
rename from tools/vr-merge-upstream-pull-request.sh
rename to tools/ch-merge-upstream-pull-request.sh
index 55f221b626..fdfa5db522 100644
--- a/tools/vr-merge-upstream-pull-request.sh
+++ b/tools/ch-merge-upstream-pull-request.sh
@@ -12,7 +12,7 @@ set -f # disable pathname expansion
set -C # noclobber
readonly BASE_BRANCH_NAME="upstream-merge-"
-readonly BASE_PULL_URL="https://api.github.com/repos/PolarisSS13/Polaris/pulls"
+readonly BASE_PULL_URL="https://api.github.com/repos/VOREStation/VOREStation/pulls"
# Ensure the current directory is a git directory
if [ ! -d .git ]; then
diff --git a/vorestation.dme b/vorestation.dme
index ffbc60397e..0a608dcb87 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1360,6 +1360,7 @@
#include "code\game\objects\items\weapons\implants\implantfreedom.dm"
#include "code\game\objects\items\weapons\implants\implantlanguage.dm"
#include "code\game\objects\items\weapons\implants\implantpad.dm"
+#include "code\game\objects\items\weapons\implants\implantreagent_ch.dm"
#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm"
#include "code\game\objects\items\weapons\implants\implantuplink.dm"
#include "code\game\objects\items\weapons\implants\neuralbasic.dm"
@@ -3816,6 +3817,7 @@
#include "code\modules\turbolift\turbolift.dm"
#include "code\modules\turbolift\turbolift_areas.dm"
#include "code\modules\turbolift\turbolift_console.dm"
+#include "code\modules\turbolift\turbolift_console_vr.dm"
#include "code\modules\turbolift\turbolift_door.dm"
#include "code\modules\turbolift\turbolift_door_vr.dm"
#include "code\modules\turbolift\turbolift_floor.dm"