diff --git a/code/game/objects/stumble_into_vr.dm b/code/game/objects/stumble_into_vr.dm
index 90a519b2a2..f1612be040 100644
--- a/code/game/objects/stumble_into_vr.dm
+++ b/code/game/objects/stumble_into_vr.dm
@@ -81,7 +81,11 @@
else
M.forceMove(get_turf(src))
-/obj/machinery/door/stumble_into(mob/living/M)
+/obj/machinery/door/window/stumble_into(mob/living/M)
+ ..()
+ bumpopen(M)
+
+/obj/machinery/door/airlock/stumble_into(mob/living/M)
..()
bumpopen(M)
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
index 6bc944552c..c41c482d10 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
@@ -33,10 +33,13 @@
/datum/gear/accessory/wallet_poly
display_name = "wallet, polychromic"
path = /obj/item/weapon/storage/wallet/poly
+ cost = 0 //VOREStation Edit
+
/datum/gear/accessory/wallet/womens
display_name = "wallet, womens"
path = /obj/item/weapon/storage/wallet/womens
+ cost = 0 //VOREStation Edit
/datum/gear/accessory/wallet/womens/New()
..()
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index 388760f81c..1078cd0de5 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -94,7 +94,7 @@
/datum/gear/utility/implant/tracking
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
- cost = 10
+ cost = 0 //VOREStation Edit. Changed cost to 0
slot = "implant"
exploitable = 1
diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm
index bc9feacf05..0aa5bf3195 100644
--- a/code/modules/client/preference_setup/vore/02_size.dm
+++ b/code/modules/client/preference_setup/vore/02_size.dm
@@ -9,8 +9,9 @@
var/size_multiplier = RESIZE_NORMAL
// Body weight stuff.
var/weight_vr = 137 // bodyweight of character (pounds, because I'm not doing the math again -Spades)
- var/weight_gain = 100 // bodyweight of character (pounds, because I'm not doing the math again -Spades)
- var/weight_loss = 50 // bodyweight of character (pounds, because I'm not doing the math again -Spades)
+ var/weight_gain = 100 // Weight gain rate.
+ var/weight_loss = 50 // Weight loss rate.
+ var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon. Default sharp.
// Definition of the stuff for Sizing
/datum/category_item/player_setup_item/vore/size
@@ -22,28 +23,34 @@
S["weight_vr"] >> pref.weight_vr
S["weight_gain"] >> pref.weight_gain
S["weight_loss"] >> pref.weight_loss
+ S["fuzzy"] >> pref.fuzzy
/datum/category_item/player_setup_item/vore/size/save_character(var/savefile/S)
S["size_multiplier"] << pref.size_multiplier
S["weight_vr"] << pref.weight_vr
S["weight_gain"] << pref.weight_gain
S["weight_loss"] << pref.weight_loss
+ S["fuzzy"] << pref.fuzzy
/datum/category_item/player_setup_item/vore/size/sanitize_character()
pref.size_multiplier = pref.size_multiplier
- pref.weight_vr = sanitize_integer(pref.weight_vr, WEIGHT_MIN, WEIGHT_MAX, initial(pref.weight_vr))
- pref.weight_gain = sanitize_integer(pref.weight_gain, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_gain))
- pref.weight_loss = sanitize_integer(pref.weight_loss, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_loss))
+ pref.weight_vr = sanitize_integer(pref.weight_vr, WEIGHT_MIN, WEIGHT_MAX, initial(pref.weight_vr))
+ pref.weight_gain = sanitize_integer(pref.weight_gain, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_gain))
+ pref.weight_loss = sanitize_integer(pref.weight_loss, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_loss))
+ pref.fuzzy = pref.fuzzy
/datum/category_item/player_setup_item/vore/size/copy_to_mob(var/mob/living/carbon/human/character)
character.resize(pref.size_multiplier, FALSE)
character.weight = pref.weight_vr
character.weight_gain = pref.weight_gain
character.weight_loss = pref.weight_loss
+ character.fuzzy = pref.fuzzy
+ character.appearance_flags |= pref.fuzzy*PIXEL_SCALE
/datum/category_item/player_setup_item/vore/size/content(var/mob/user)
. += "
"
. += "Scale: [round(pref.size_multiplier*100)]%
"
+ . += "Scaled Appearance: [pref.fuzzy ? "Sharp" : "Fuzzy"]
"
. += "
"
. += "Relative Weight: [pref.weight_vr]
"
. += "Weight Gain Rate: [pref.weight_gain]
"
@@ -60,6 +67,10 @@
pref.size_multiplier = (new_size/100)
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["toggle_fuzzy"])
+ pref.fuzzy = pref.fuzzy ? 0 : 1;
+ return TOPIC_REFRESH
+
else if(href_list["weight"])
var/new_weight = input(user, "Choose your character's relative body weight.\n\
This measurement should be set relative to a normal 5'10'' person's body and not the actual size of your character.\n\
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index 5195a8c198..804a146f7e 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -1,7 +1,7 @@
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04
/datum/event/ionstorm
- var/botEmagChance = 0.5
+ var/botEmagChance = 0 //VOREStation Edit
var/list/players = list()
/datum/event/ionstorm/announce()
diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
index 52d54f2139..e90de50279 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
@@ -386,3 +386,6 @@ datum/species/harpy
"You feel uncomfortably warm.",
"Your overheated skin itches."
)
+
+/datum/species/human/vatgrown
+ spawn_flags = SPECIES_IS_RESTRICTED
diff --git a/code/modules/mob/mob_defines_vr.dm b/code/modules/mob/mob_defines_vr.dm
index df9e1f8edd..ab1670560f 100644
--- a/code/modules/mob/mob_defines_vr.dm
+++ b/code/modules/mob/mob_defines_vr.dm
@@ -1,3 +1,5 @@
/mob
var/vantag_hud = 0 // Do I have the HUD enabled?
- var/flying = 0 //Allows flight
\ No newline at end of file
+ var/flying = 0 //Allows flight
+ var/can_be_drop_prey = 0
+ var/can_be_drop_pred = 1 //Mobs are pred by default.
\ No newline at end of file
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index f9a662e2e8..7f13cc25e9 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -352,6 +352,11 @@
"You hear something slam into \the [landing].")
playsound(loc, "punch", 25, 1, -1)
var/damage = 15 // Because wounds heal rather quickly, 15 should be enough to discourage jumping off but not be enough to ruin you, at least for the first time.
+ var/mob/living/carbon/human/pred = src //VOREStation Edit Start
+ var/belly = src.vore_selected
+ var/datum/belly/belly_target = pred.vore_organs[belly]
+ if(belly_target && belly_target.internal_contents.len != 0)
+ damage = 5 //VOREStation Edit End
apply_damage(rand(0, damage), BRUTE, BP_HEAD)
apply_damage(rand(0, damage), BRUTE, BP_TORSO)
apply_damage(rand(0, damage), BRUTE, BP_L_LEG)
diff --git a/code/modules/multiz/movement_vr.dm b/code/modules/multiz/movement_vr.dm
new file mode 100644
index 0000000000..20867e35e2
--- /dev/null
+++ b/code/modules/multiz/movement_vr.dm
@@ -0,0 +1,60 @@
+
+/mob/living/handle_fall(var/turf/landing)
+ var/mob/drop_mob= locate(/mob, loc)
+
+ if(locate(/obj/structure/stairs) in landing)
+ for(var/atom/A in landing)
+ if(!A.CanPass(src, src.loc, 1, 0))
+ return FALSE
+ Move(landing)
+ return 1
+
+ if(drop_mob && drop_mob != src && ismob(drop_mob)) //Shitload of checks. This is because the game finds various ways to screw me over.
+ drop_mob.fall_impact(src)
+
+ // Then call parent to have us actually fall
+ return ..()
+/mob/CheckFall(var/atom/movable/falling_atom)
+ return falling_atom.fall_impact(src)
+/* //Leaving this here to show my previous iterations which failed.
+/mob/living/fall_impact(var/atom/hit_atom) //This is called even when a humanoid falls. Dunno why, it just does.
+ if(isliving(hit_atom)) //THIS WEAKENS THE PERSON FALLING & NOMS THE PERSON FALLEN ONTO. SRC is person fallen onto. hit_atom is the person falling. Confusing.
+ var/mob/living/pred = hit_atom
+ pred.visible_message("\The [pred] falls onto \the [src]! FALL IMPACT MOB")
+ pred.Weaken(8) //Stun the person you're dropping onto! You /are/ suffering massive damage for a single stun.
+ if(isliving(hit_atom) && isliving(src))
+ var/mob/living/prey = src
+ if(pred.can_be_drop_pred && prey.can_be_drop_prey) //Is person falling pred & person being fallen onto prey?
+ pred.feed_grabbed_to_self_falling_nom(pred,prey)
+ else if(prey.can_be_drop_pred && pred.can_be_drop_prey) //Is person being fallen onto pred & person falling prey
+ pred.feed_grabbed_to_self_falling_nom(prey,pred) //oh, how the tables have turned.
+*/
+/mob/zshadow/fall_impact(var/atom/hit_atom) //You actually "fall" onto their shadow, first.
+ /*
+ var/floor_below = src.loc.below //holy fuck
+ for(var/mob/M in floor_below.contents)
+ if(M && M != src) //THIS WEAKENS THE MOBS YOU'RE FALLING ONTO
+ M.visible_message("\The [src] drops onto \the [M]! FALL IMPACT SHADOW WEAKEN 8")
+ M.Weaken(8)
+ */
+ if(isliving(hit_atom)) //THIS WEAKENS THE PERSON FALLING & NOMS THE PERSON FALLEN ONTO. SRC is person fallen onto. hit_atom is the person falling. Confusing.
+ var/mob/living/pred = hit_atom
+ pred.visible_message("\The [hit_atom] falls onto \the [src]!")
+ pred.Weaken(8) //Stun the person you're dropping onto! You /are/ suffering massive damage for a single stun.
+ var/mob/living/prey = src.owner //The shadow's owner
+ if(isliving(prey))
+ if(pred.can_be_drop_pred && prey.can_be_drop_prey) //Is person falling pred & person being fallen onto prey?
+ pred.feed_grabbed_to_self_falling_nom(pred,prey)
+ else if(prey.can_be_drop_pred && pred.can_be_drop_prey) //Is person being fallen onto pred & person falling prey
+ pred.feed_grabbed_to_self_falling_nom(prey,pred) //oh, how the tables have turned.
+ else
+ prey.Weaken(8) //Just fall onto them if neither of the above apply.
+
+/mob/proc/CanZPass(atom/A, direction)
+ if(z == A.z) //moving FROM this turf
+ return direction == UP //can't go below
+ else
+ if(direction == UP) //on a turf below, trying to enter
+ return 0
+ if(direction == DOWN) //on a turf above, trying to enter
+ return 1
\ No newline at end of file
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
index 518f7446a9..31b155cd3b 100644
--- a/code/modules/vore/appearance/sprite_accessories_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_vr.dm
@@ -468,6 +468,13 @@
desc = ""
icon_state = "snag-backplate"
+/datum/sprite_accessory/wing/nevrean
+ name = "nevrean wings/fantail"
+ desc = ""
+ icon_state = "nevrean_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/*
////////////////////////////
/ =--------------------= /
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 48380a7393..24c9b0db41 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -54,7 +54,7 @@
owner << "" + digest_alert_owner + ""
M << "" + digest_alert_prey + ""
- owner.nutrition += 20 // so eating dead mobs gives you *something*.
+ owner.nutrition += 20 // so eating dead mobs gives you *something* (that's 0.66u nutriment yo)
if(isrobot(owner))
s_owner = owner
s_owner.cell.charge += 200
@@ -101,8 +101,8 @@
items_preserved += ID
return
for(var/obj/item/SubItem in T)
- if(istype(SubItem,/obj/item/weapon/reagent_containers/food/snacks))
- var/obj/item/weapon/reagent_containers/food/snacks/SF = SubItem
+ if(istype(SubItem,/obj/item/weapon/reagent_containers/food))
+ var/obj/item/weapon/reagent_containers/food/SF = SubItem
if(istype(owner,/mob/living/carbon/human))
var/mob/living/carbon/human/howner = owner
SF.reagents.trans_to_holder(howner.ingested, (SF.reagents.total_volume * 0.3), 1, 0)
@@ -111,16 +111,16 @@
SubItem.gurglecontaminate()
if(istype(SubItem,/obj/item/weapon/storage))
for(var/obj/item/SubSubItem in SubItem)
- if(istype(SubSubItem,/obj/item/weapon/reagent_containers/food/snacks))
- var/obj/item/weapon/reagent_containers/food/snacks/SSF = SubSubItem
+ if(istype(SubSubItem,/obj/item/weapon/reagent_containers/food))
+ var/obj/item/weapon/reagent_containers/food/SSF = SubSubItem
if(istype(owner,/mob/living/carbon/human))
var/mob/living/carbon/human/howner = owner
SSF.reagents.trans_to_holder(howner.ingested, (SSF.reagents.total_volume * 0.3), 1, 0)
internal_contents -= SSF
qdel(SSF)
SubSubItem.gurglecontaminate()
- if(istype(T, /obj/item/weapon/reagent_containers/food/snacks)) // Weakgurgles still act on foodstuff. Hopefully your prey didn't load their bag with donk boxes.
- var/obj/item/weapon/reagent_containers/food/snacks/F = T
+ if(istype(T, /obj/item/weapon/reagent_containers/food)) // Weakgurgles still act on foodstuff. Hopefully your prey didn't load their bag with donk boxes.
+ var/obj/item/weapon/reagent_containers/food/F = T
if(istype(owner,/mob/living/carbon/human))
var/mob/living/carbon/human/howner = owner
F.reagents.trans_to_holder(howner.reagents, (F.reagents.total_volume * 0.3), 1, 0)
@@ -136,6 +136,9 @@
internal_contents += M
internal_contents -= H
qdel(H)
+ if(istype(T,/obj/item/organ))
+ owner.nutrition += (66)
+ qdel(T)
else
items_preserved += T
T.gurglecontaminate() // Someone got gurgled in this crap. You wouldn't wear/use it unwashed. :v
@@ -197,6 +200,9 @@
internal_contents += M
internal_contents -= H
qdel(H)
+ if(istype(T,/obj/item/organ))
+ owner.nutrition += (66)
+ qdel(T)
else
owner.nutrition += (1 * T.w_class)
if(isrobot(owner))
@@ -274,6 +280,9 @@
internal_contents += M
internal_contents -= H
qdel(H)
+ if(istype(T,/obj/item/organ))
+ owner.nutrition += (66)
+ qdel(T)
else
owner.nutrition += (1 * T.w_class)
if(isrobot(owner))
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 1a1ba7ff3f..b1363406f8 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -19,6 +19,7 @@
var/noisy = 0 // Toggle audible hunger.
var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr.
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
+ var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon.
//
// Hook for generic creation of stuff on new creatures
@@ -31,7 +32,7 @@
return 1
M.verbs += /mob/living/proc/insidePanel
- M.appearance_flags |= PIXEL_SCALE
+ //M.appearance_flags |= PIXEL_SCALE // Moved to 02_size.dm
//Tries to load prefs if a client is present otherwise gives freebie stomach
if(!M.vore_organs || !M.vore_organs.len)
@@ -235,6 +236,8 @@
P.vore_taste = src.vore_taste
P.nif_examine = src.nif_examine
P.conceal_nif = src.conceal_nif
+ P.can_be_drop_prey = src.can_be_drop_prey
+ P.can_be_drop_pred = src.can_be_drop_pred
return 1
@@ -253,6 +256,8 @@
src.vore_taste = P.vore_taste
src.nif_examine = P.nif_examine
src.conceal_nif = P.conceal_nif
+ src.can_be_drop_prey = P.can_be_drop_prey
+ src.can_be_drop_pred = P.can_be_drop_pred
for(var/I in P.belly_prefs)
var/datum/belly/Bp = P.belly_prefs[I]
@@ -511,3 +516,50 @@
B.internal_contents += src
return
return
+
+/mob/living/proc/feed_grabbed_to_self_falling_nom(var/mob/living/user, var/mob/living/prey)
+ var/belly = user.vore_selected
+ return perform_the_falling_nom(user, prey, user, belly)
+
+/mob/living/proc/perform_the_falling_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly) //For dropnoms.
+ //Sanity
+ belly = pred.vore_selected
+ if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
+ log_debug("[user] attempted to feed [prey] to [pred], via [belly] but it went wrong.")
+ return
+
+ // The belly selected at the time of noms
+ var/datum/belly/belly_target = pred.vore_organs[belly]
+ var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
+
+ //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros
+ var/user_to_pred = get_dist(get_turf(user),get_turf(pred))
+ var/user_to_prey = get_dist(get_turf(user),get_turf(prey))
+
+ if(user_to_pred > 1 || user_to_prey > 1)
+ return 0
+
+ // Prepare messages
+ if(user == pred) //Feeding someone to yourself
+ success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+ else //Feeding someone to another person. This shouldn't happen.
+ success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+
+ user.visible_message(success_msg)
+ if(belly_target.vore_sound)
+ playsound(user, belly_target.vore_sound, 100, 1)
+
+ // Actually shove prey into the belly.
+ belly_target.nom_mob(prey, user)
+ user.update_icons()
+
+ // Flavor handling
+ if(belly_target.can_taste && prey.get_taste_message(0))
+ to_chat(belly_target.owner, "[prey] tastes of [prey.get_taste_message(0)].")
+
+ // Inform Admins
+ if (pred == user)
+ msg_admin_attack("[key_name(pred)] ate [key_name(prey)] via dropnoms!. ([pred ? "JMP" : "null"])")
+ else
+ msg_admin_attack("[key_name(user)] forced [key_name(pred)] to eat [key_name(prey)] via dropnoms! ([pred ? "JMP" : "null"])")
+ return 1
\ No newline at end of file
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index 024e0ad4af..0440e927de 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -46,6 +46,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/vore_taste
var/conceal_nif
var/nif_examine
+ var/can_be_drop_prey
+ var/can_be_drop_pred
//Mechanically required
var/path
@@ -107,6 +109,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["vore_taste"] >> vore_taste
S["conceal_nif"] >> conceal_nif
S["nif_examine"] >> nif_examine
+ S["can_be_drop_prey"] >> can_be_drop_prey
+ S["can_be_drop_pred"] >> can_be_drop_pred
if(isnull(digestable))
digestable = 1
@@ -127,5 +131,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["vore_taste"] << vore_taste
S["conceal_nif"] << conceal_nif
S["nif_examine"] << nif_examine
+ S["can_be_drop_prey"] << can_be_drop_prey
+ S["can_be_drop_pred"] << can_be_drop_pred
return 1
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index b26a0d6aff..8e0d411eb4 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -284,6 +284,9 @@
dat += "
Set NIF concealment" //These two get their own, custom row.
dat += "Set NIF Examine Message."
+ dat += "
Toggle Drop-nom Prey Mode" //These two get their own, custom row, too.
+ dat += "Toggle Drop-nom Pred Mode"
+
//Returns the dat html to the vore_look
return dat
@@ -751,6 +754,26 @@
else //Returned null
return 0
+ if(href_list["toggle_dropnom_pred"])
+ var/choice = alert(user, "You are currently [user.can_be_drop_pred ? " able to eat prey that fall from above or that you fall onto" : "not able to eat prey that fall from above or that you fall onto."]", "", "Be Pred", "Cancel", "Don't be Pred")
+ switch(choice)
+ if("Cancel")
+ return 0
+ if("Be Pred")
+ user.can_be_drop_pred = 1
+ if("Don't be Pred")
+ user.can_be_drop_pred = 0
+
+ if(href_list["toggle_dropnom_prey"])
+ var/choice = alert(user, "You are currently [user.can_be_drop_prey ? "able to be eaten." : "not able to be eaten."]", "", "Be Prey", "Cancel", "Don't Be Prey")
+ switch(choice)
+ if("Cancel")
+ return 0
+ if("Be Prey")
+ user.can_be_drop_prey = 1
+ if("Don't Be Prey")
+ user.can_be_drop_prey = 0
+
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Don't abuse this button by toggling it back and forth to extend a scene or whatever, or you'll make the admins cry. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
switch(choice)
diff --git a/icons/mob/human_face_vr.dmi b/icons/mob/human_face_vr.dmi
index a54ca17f9a..00b2e58f72 100644
Binary files a/icons/mob/human_face_vr.dmi and b/icons/mob/human_face_vr.dmi differ
diff --git a/icons/mob/human_face_vr_add.dmi b/icons/mob/human_face_vr_add.dmi
index db641e74fe..9dc080e1f1 100644
Binary files a/icons/mob/human_face_vr_add.dmi and b/icons/mob/human_face_vr_add.dmi differ
diff --git a/icons/mob/human_races/r_fennec_vr.dmi b/icons/mob/human_races/r_fennec_vr.dmi
index d85bdb7e42..99fa60881c 100644
Binary files a/icons/mob/human_races/r_fennec_vr.dmi and b/icons/mob/human_races/r_fennec_vr.dmi differ
diff --git a/icons/mob/human_races/r_fox_vr.dmi b/icons/mob/human_races/r_fox_vr.dmi
index 7cf9c675b7..4517d58135 100644
Binary files a/icons/mob/human_races/r_fox_vr.dmi and b/icons/mob/human_races/r_fox_vr.dmi differ
diff --git a/icons/mob/human_races/r_harpy_vr.dmi b/icons/mob/human_races/r_harpy_vr.dmi
index 002ee25e8d..b8a12cf32e 100644
Binary files a/icons/mob/human_races/r_harpy_vr.dmi and b/icons/mob/human_races/r_harpy_vr.dmi differ
diff --git a/icons/mob/human_races/r_nevrean.dmi b/icons/mob/human_races/r_nevrean.dmi
index dc9a8ae774..d937299dc5 100644
Binary files a/icons/mob/human_races/r_nevrean.dmi and b/icons/mob/human_races/r_nevrean.dmi differ
diff --git a/icons/mob/human_races/r_spider.dmi b/icons/mob/human_races/r_spider.dmi
index 6d0501da40..11cd3507cf 100644
Binary files a/icons/mob/human_races/r_spider.dmi and b/icons/mob/human_races/r_spider.dmi differ
diff --git a/icons/mob/human_races/r_vulpkanin.dmi b/icons/mob/human_races/r_vulpkanin.dmi
index b054a0c4e2..6f4d013342 100644
Binary files a/icons/mob/human_races/r_vulpkanin.dmi and b/icons/mob/human_races/r_vulpkanin.dmi differ
diff --git a/icons/mob/human_races/r_xenomorph.dmi b/icons/mob/human_races/r_xenomorph.dmi
index eceea3145f..6807555300 100644
Binary files a/icons/mob/human_races/r_xenomorph.dmi and b/icons/mob/human_races/r_xenomorph.dmi differ
diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi
index f552f2b6c7..aedb041a01 100644
Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ
diff --git a/maps/tether/tether-01-surface.dmm b/maps/tether/tether-01-surface.dmm
index a7c013d9f6..8742e2944d 100644
--- a/maps/tether/tether-01-surface.dmm
+++ b/maps/tether/tether-01-surface.dmm
@@ -5598,6 +5598,8 @@
"cdH" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/mauve/border{dir = 10},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/tiled,/area/rnd/research)
"cdI" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/mauve/border{dir = 6},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/tiled,/area/rnd/research)
"cdJ" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/beige/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/beige/bordercorner2{dir = 6},/obj/structure/sign/department/bar{pixel_x = 32},/obj/structure/flora/pottedplant/xmas,/turf/simulated/floor/tiled,/area/hallway/lower/third_south)
+"cdK" = (/obj/structure/flora/ausbushes/ywflowers,/obj/machinery/light/small{dir = 8; pixel_x = 0},/turf/simulated/floor/grass,/area/tether/surfacebase/atrium_one)
+"cdL" = (/obj/structure/flora/ausbushes/ywflowers,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/grass,/area/tether/surfacebase/atrium_one)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaacaacaacaacaacaacaacaacaacaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -5643,7 +5645,7 @@ aaaaadaadaadaadaadaadaadaadaadaadaadaadakbakbalZaiyamaambaiyamcamdagUameamfamgam
aaaaadaadaadaadaadaadaadaadaadaadaadaadaahaahamDamDamDamDamDamEamEamEamEamFamFamFamFamFamGamHamIahlakVakXakXakXalJakXakXakXakVakVakVakVakVakVakVakVakVakVakVaktaktamJamKamLamMalgalOalgbykahXahXahXahXahXaahaahagMbcCakCajUamOalRalSalSalSalSalSalSalSalTamOajUajVakFagMalralralralralramPamPamQamPamRamPamSamSamTalYalYalYalraahaahaahaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaadaahaahaahamUamVamWamXamUamYamZanaamUanbancandaneanfangakoakpahlakVakXalJakXakXamlamlakXakXakXakVakVakVakVakVakVakVakVakVakVaktaktanhanianjalgankalOalOalgaahaahaahaahaahaahagManlakCajUamOalRalSalSanmanmanmalSalSalTamOajUajVannagMaahaahaahalranoanoalralralralralralralralralralralralraahaahaahaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaadaahaahaahamUanpanqanramUansantanuamUanvanwanwanxanyanzaiHanAahlanBakXalaakXakXakXakXalJalJalaakVakVakVakVakVakVakVakVakVakVakVaktaktaktaktalganCanDalOalgaahaahaahaahaahaahagManEakCajUamOalRalSalTanFanFanGalRalSalTamOajUajVanHagMaahaahaahalranIalralraahaahaahaahaahaahaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaaa
-aaaaadaadaadaadaadaadaadaadaadaadaadaahamUamUamUanJanKanLamUanManNanOamUanPbdyanRanSanTanUakoanVanWakXakXakXakXakXalJakXakXakXalaakVakVakVakVakVakVakVakVakVakVakVakVakVakVakValganXanYanZalgaahaahaahaahaahaahaoaalQaobajUamOalRalSalTanFbzAanFalRalSalTamOajUaocakFaodaoeaoeaoeaoeaofaoeaoeaoeaoeaoeaoeaahaahaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaaa
+aaaaadaadaadaadaadaadaadaadaadaadaadaahamUamUamUanJanKanLamUanManNanOamUanPbdyanRanSanTanUakoanVanWakXakXakXakXakXalJakXakXakXalaakVakVakVakVakVakVakVakVakVakVakVakVakVakVakValganXanYanZalgaahaahaahaahaahaahaoaalQaobajUamOalRalSalTcdKbzAcdLalRalSalTamOajUaocakFaodaoeaoeaoeaoeaofaoeaoeaoeaoeaoeaoeaahaahaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaadaahamUaogamUaohaoiaojamUaokaolaomamUamFamFamFamFamFaonaooaopaoqaoralJamlakXakXakXakXakXaosaotakVakVakVakVakValgalgalgalgalgalgalgalgalgalgalgalgalgaoualgalgalgalgalgalgalgagMalQakCajUamOalRalSalTanGanFanGalRalSalTamOajUajVakFaoeaovaowaoxaoyaozaoeaoAaoBaoCaoDaoeaahaahaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaahaahamUaoEaoFaoGaoHaoIaoJaoKaoLaoMamUaoNaoOaoPaoQahlaoRakoaoSahlaoTakXakXakXalJalJaoUakVakVakVakVakVakVakVakValgaoVaoWaoXalOalOaoYalOalOalOalOalOalOaoZapaapaapaapaapaapaapaapbapcakCajUamOalRalSalSaloaloaloalSalSalTamOajUajVaHgaoeapeapfapgaphapiaoeapjapkaoeaoeaoeaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaahaahamUarsaoFaoGapmapnapoappapmaoMamUapqaprapsaptahlapuapvakpahlapwakXakXalJapxakVakVakVakVakVakVakVakVakVakValgapyalOapzapAapAapAanCanCanCanCapBapCalgapDalgalgapEapFalgalgagMapGakCajUamOalRalSalSalSalSalSalSalSalTamOajUajVapHaoeapeapIapJapKapLaoeapMapNapOaoDaoeaahapPapPapPapPapPapPapPapQapRapRapSapTapTapTapTapSapRapRapUaaa
diff --git a/maps/tether/tether-07-misc.dmm b/maps/tether/tether-07-misc.dmm
index 754fe684d7..2e244f6e58 100644
--- a/maps/tether/tether-07-misc.dmm
+++ b/maps/tether/tether-07-misc.dmm
@@ -1066,10 +1066,10 @@
"uz" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/shuttle/floor{tag = "icon-floor_dred"; icon_state = "floor_dred"},/area/syndicate_station/start)
"uA" = (/obj/item/device/aicard,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{tag = "icon-floor_black"; icon_state = "floor_black"},/area/syndicate_station/start)
"uB" = (/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/effect/floor_decal/industrial/danger,/obj/machinery/door/airlock/glass_external/public{frequency = 1379; icon_state = "door_locked"; id_tag = "merc_south_airlock_outer"; locked = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "smindicate"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/floor{tag = "icon-floor_dred"; icon_state = "floor_dred"},/area/syndicate_station/start)
+"uC" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/table/rack,/turf/simulated/shuttle/floor{tag = "icon-floor_yellow"; icon_state = "floor_yellow"},/area/syndicate_station/start)
"uD" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
"uE" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
"uF" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 0; pixel_y = -32; subspace_transmission = 1; syndie = 1},/obj/structure/closet/syndicate,/obj/item/clothing/mask/gas/wwii,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/item/clothing/head/helmet,/obj/item/clothing/shoes/boots/jackboots,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/under/syndicate,/obj/item/clothing/gloves/black,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
-"uG" = (/obj/machinery/telecomms/allinone{intercept = 1},/obj/machinery/door/window/northright{name = "Telecoms Mainframe"; req_access = list(150)},/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{tag = "icon-floor_yellow"; icon_state = "floor_yellow"},/area/syndicate_station/start)
"uH" = (/obj/machinery/washing_machine,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
"uI" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
"uJ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
@@ -1187,7 +1187,7 @@ ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapap
ahaieGeGeGeGeGaiahappEqxpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapaphbhahcdCjLhdpihfhfdCdChfpjeyunprdCprprqfhUujhWhVhXaCfkflapapapapgp
ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRqKpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapgLhYuodCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCigigigigaCfkihapapapapgp
ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapgLiiuodCdCupdCdCdCdCdCdCdCuqdCdCdCdCdCdCuqigigigigaCfkihapapapapgp
-ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapikhaildCurcJuDisitdCdCituEeyuFprdCprprqfeyuGixiwizaCfkiAapapapapgp
+ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapikhaildCurcJuDisitdCdCituEeyuFprdCprprqfeyuCixiwizaCfkiAapapapapgp
ahaieGeGeGeGeGaiahappEqxpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapapgLgYgMiBaCaCaCeyumdCeyaCaCaCeyuleyaCaCaCaCaCaCaCaCcJfkiAapapapgp
ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRqKpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapaCaCaCaCaCaCaCfmfydCdCiFuHeyuIusdCususuJutiGiLiLiGiPaCcJfkiAapapgp
ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapuiaCuKiQcDjccJeDexdCdCdCdCuldCdCdCdCdCdCjdiGuvuuiGjsaCaCcJfkiAapgp
diff --git a/vorestation.dme b/vorestation.dme
index d1b5a5b37b..e75eec04a6 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2087,6 +2087,7 @@
#include "code\modules\multiz\basic.dm"
#include "code\modules\multiz\ladder_assembly_vr.dm"
#include "code\modules\multiz\movement.dm"
+#include "code\modules\multiz\movement_vr.dm"
#include "code\modules\multiz\open_space_controller.dm"
#include "code\modules\multiz\pipes.dm"
#include "code\modules\multiz\structures.dm"