diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
index ee1379ac288..61ace40879b 100644
--- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm
+++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
@@ -1,4 +1,4 @@
-//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively,
+//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively,
//but it does not permit gas to flow back from the environment into the injector. Can be turned off to prevent any gas flow.
//When it receives the "inject" signal, it will try to pump it's entire contents into the environment regardless of pressure, using power.
@@ -13,7 +13,7 @@
use_power = 0
idle_power_usage = 150 //internal circuitry, friction losses and stuff
power_rating = 15000 //15000 W ~ 20 HP
-
+
var/injecting = 0
var/volume_rate = 50 //flow rate limit
@@ -26,7 +26,7 @@
/obj/machinery/atmospherics/unary/outlet_injector/New()
..()
- air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
+ air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
/obj/machinery/atmospherics/unary/outlet_injector/Destroy()
unregister_radio(src, frequency)
@@ -60,21 +60,21 @@
if((stat & (NOPOWER|BROKEN)) || !use_power)
return
-
+
var/power_draw = -1
var/datum/gas_mixture/environment = loc.return_air()
-
+
if(environment && air_contents.temperature > 0)
var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit
power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating)
-
+
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
-
+
if(network)
network.update = 1
-
+
return 1
/obj/machinery/atmospherics/unary/outlet_injector/proc/inject()
@@ -84,7 +84,7 @@
var/datum/gas_mixture/environment = loc.return_air()
if (!environment)
return 0
-
+
injecting = 1
if(air_contents.temperature > 0)
@@ -155,4 +155,23 @@
update_icon()
/obj/machinery/atmospherics/unary/outlet_injector/hide(var/i)
- update_underlays()
\ No newline at end of file
+ update_underlays()
+
+/obj/machinery/atmospherics/unary/outlet_injector/attack_hand(mob/user as mob)
+ to_chat(user, "You toggle \the [src].")
+ injecting = !injecting
+ use_power = injecting
+ update_icon()
+
+/obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
+ if (!W.is_wrench())
+ return ..()
+
+ playsound(src, W.usesound, 50, 1)
+ to_chat(user, "You begin to unfasten \the [src]...")
+ if (do_after(user, 40 * W.toolspeed))
+ user.visible_message( \
+ "\The [user] unfastens \the [src].", \
+ "You have unfastened \the [src].", \
+ "You hear a ratchet.")
+ deconstruct()
\ No newline at end of file
diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm
index a741869b5b3..9938fa20eb0 100644
--- a/code/controllers/subsystems/garbage.dm
+++ b/code/controllers/subsystems/garbage.dm
@@ -240,9 +240,9 @@ SUBSYSTEM_DEF(garbage)
time = TICK_DELTA_TO_MS(tick)/100
if (time > highest_del_time)
highest_del_time = time
- if (time > 10)
- log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)")
- message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).")
+ if (time > 20) //VOREStation Edit
+ log_game("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete)") //VOREStation Edit
+ message_admins("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete).") //VOREStation Edit
postpone(time)
/datum/controller/subsystem/garbage/proc/HardQueue(datum/D)
diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm
index b77d442e82f..bf5b8ba53b4 100644
--- a/code/datums/supplypacks/misc.dm
+++ b/code/datums/supplypacks/misc.dm
@@ -143,4 +143,30 @@
)
cost = 25
containertype = /obj/structure/closet/crate
- containername = "Glucose Hypo Crate"
\ No newline at end of file
+ containername = "Glucose Hypo Crate"
+
+/datum/supply_pack/misc/mre_rations
+ num_contained = 6
+ name = "Emergency - MREs"
+ contains = list(/obj/item/weapon/storage/mre,
+ /obj/item/weapon/storage/mre/menu2,
+ /obj/item/weapon/storage/mre/menu3,
+ /obj/item/weapon/storage/mre/menu4,
+ /obj/item/weapon/storage/mre/menu5,
+ /obj/item/weapon/storage/mre/menu6,
+ /obj/item/weapon/storage/mre/menu7,
+ /obj/item/weapon/storage/mre/menu8,
+ /obj/item/weapon/storage/mre/menu9,
+ /obj/item/weapon/storage/mre/menu10)
+ cost = 50
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "ready to eat rations"
+
+/datum/supply_pack/misc/paste_rations
+ name = "Emergency - Paste"
+ contains = list(
+ /obj/item/weapon/storage/mre/menu11 = 2
+ )
+ cost = 25
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "emergency rations"
diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm
index 613a01cfd46..9e4ee3879d5 100644
--- a/code/datums/supplypacks/misc_vr.dm
+++ b/code/datums/supplypacks/misc_vr.dm
@@ -13,24 +13,6 @@
containername = "Belt-miner gear crate"
access = access_mining
-/datum/supply_pack/misc/rations
- name = "Emergency rations"
- contains = list(
- /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4,
- )
- cost = 20
- containertype = /obj/structure/closet/crate/freezer
- containername = "emergency rations"
-
-/datum/supply_pack/misc/proteinrations
- name = "Emergency meat rations"
- contains = list(
- /obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 4,
- )
- cost = 30
- containertype = /obj/structure/closet/crate/freezer
- containername = "emergency meat rations"
-
/datum/supply_pack/misc/eva_rig
name = "eva hardsuit (empty)"
contains = list(
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 3d9c4ea140c..dd3ddb29caf 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -76,6 +76,10 @@
name = "\improper \"LiquidFood\" ration"
icon_state = "liquidfood"
+/obj/item/trash/liquidprotein
+ name = "\improper \"LiquidProtein\" ration"
+ icon_state = "liquidprotein"
+
/obj/item/trash/tastybread
name = "bread tube"
icon_state = "tastybread"
diff --git a/code/game/objects/items/trash_vr.dm b/code/game/objects/items/trash_vr.dm
index 43cadda3f70..20f7e32c4c4 100644
--- a/code/game/objects/items/trash_vr.dm
+++ b/code/game/objects/items/trash_vr.dm
@@ -26,11 +26,6 @@
return
..()
-/obj/item/trash/liquidprotein
- name = "\improper \"LiquidProtein\" ration"
- icon = 'icons/obj/trash_vr.dmi'
- icon_state = "liquidprotein"
-
/obj/item/trash/fancyplate
name = "dirty fancy plate"
icon = 'icons/obj/trash_vr.dmi'
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 7d754d8f147..1d1934bf8a8 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -67,6 +67,7 @@
item_state = "candlebox5"
throwforce = 2
slot_flags = SLOT_BELT
+ max_storage_space = ITEMSIZE_COST_SMALL * 5
starts_with = list(/obj/item/weapon/flame/candle = 5)
/obj/item/weapon/storage/fancy/whitecandle_box
@@ -78,6 +79,7 @@
item_state = "whitecandlebox5"
throwforce = 2
slot_flags = SLOT_BELT
+ max_storage_space = ITEMSIZE_COST_SMALL * 5
starts_with = list(/obj/item/weapon/flame/candle/white = 5)
/obj/item/weapon/storage/fancy/blackcandle_box
@@ -89,6 +91,7 @@
item_state = "blackcandlebox5"
throwforce = 2
slot_flags = SLOT_BELT
+ max_storage_space = ITEMSIZE_COST_SMALL * 5
starts_with = list(/obj/item/weapon/flame/candle/black = 5)
@@ -179,6 +182,21 @@
return
..()
+/*
+ * Cracker Packet
+ */
+
+/obj/item/weapon/storage/fancy/crackers
+ name = "\improper Getmore Crackers"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "crackerbox"
+ icon_type = "cracker"
+ max_storage_space = ITEMSIZE_COST_TINY * 6
+ max_w_class = ITEMSIZE_TINY
+ w_class = ITEMSIZE_SMALL
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cracker)
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 6)
+
////////////
//CIG PACK//
////////////
diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm
new file mode 100644
index 00000000000..c3adc484e0f
--- /dev/null
+++ b/code/game/objects/items/weapons/storage/mre.dm
@@ -0,0 +1,276 @@
+/*
+MRE Stuff
+ */
+
+/obj/item/weapon/storage/mre
+ name = "standard MRE"
+ desc = "A vacuum-sealed bag containing a day's worth of nutrients for an adult in strenuous situations. There is no visible expiration date on the package."
+ icon = 'icons/obj/food.dmi'
+ icon_state = "mre"
+ max_storage_space = ITEMSIZE_COST_SMALL * 6
+ max_w_class = ITEMSIZE_SMALL
+ var/opened = FALSE
+ var/meal_desc = "This one is menu 1, meat pizza."
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/examine(mob/user)
+ . = ..()
+ to_chat(user, meal_desc)
+
+/obj/item/weapon/storage/mre/update_icon()
+ if(opened)
+ icon_state = "[initial(icon_state)][opened]"
+ . = ..()
+
+/obj/item/weapon/storage/mre/attack_self(mob/user)
+ open(user)
+
+/obj/item/weapon/storage/mre/open(mob/user)
+ if(!opened)
+ to_chat(usr, "You tear open the bag, breaking the vacuum seal.")
+ opened = 1
+ update_icon()
+ . = ..()
+
+/obj/item/weapon/storage/mre/menu2
+ meal_desc = "This one is menu 2, margherita."
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu2,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu3
+ meal_desc = "This one is menu 3, vegetable pizza."
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu3,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu4
+ meal_desc = "This one is menu 4, hamburger."
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu4,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu5
+ meal_desc = "This one is menu 5, taco."
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu5,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu6
+ meal_desc = "This one is menu 6, meatbread."
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu6,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu7
+ meal_desc = "This one is menu 7, salad."
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu7,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu8
+ meal_desc = " This one is menu 8, hot chili."
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu8,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu9
+ name = "vegan MRE"
+ meal_desc = "This one is menu 9, boiled rice (skrell-safe)."
+ icon_state = "vegmre"
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu9,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert/menu9,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread/vegan,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce/vegan,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu10
+ name = "protein MRE"
+ meal_desc = "This one is menu 10, protein."
+ icon_state = "meatmre"
+ starts_with = list(
+ /obj/item/weapon/storage/mrebag/menu10,
+ /obj/item/weapon/storage/mrebag/menu10,
+ /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/protein,
+ /obj/random/mre/sauce/sugarfree,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mre/menu11
+ name = "emergency MRE"
+ meal_desc = "This one is menu 11, nutriment paste. Only for emergencies."
+ icon_state = "crayonmre"
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/food/snacks/liquidfood,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidfood,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidfood,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidfood,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
+ )
+
+/obj/item/weapon/storage/mre/menu12
+ name = "crayon MRE"
+ meal_desc = "This one doesn't have a menu listing. How very odd."
+ icon_state = "crayonmre"
+ starts_with = list(
+ /obj/item/weapon/storage/fancy/crayons,
+ /obj/item/weapon/storage/mrebag/dessert/menu11,
+ /obj/random/mre/sauce/crayon,
+ /obj/random/mre/sauce/crayon,
+ /obj/random/mre/sauce/crayon
+ )
+
+/obj/item/weapon/storage/mre/random
+ meal_desc = "The menu label is faded out."
+ starts_with = list(
+ /obj/random/mre/main,
+ /obj/item/weapon/storage/mrebag/side,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/storage/fancy/crackers,
+ /obj/random/mre/spread,
+ /obj/random/mre/drink,
+ /obj/random/mre/sauce,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
+/obj/item/weapon/storage/mrebag
+ name = "main course"
+ desc = "A vacuum-sealed bag containing the MRE's main course. Self-heats when opened."
+ icon = 'icons/obj/food.dmi'
+ icon_state = "pouch_medium"
+ storage_slots = 1
+ w_class = ITEMSIZE_SMALL
+ max_w_class = ITEMSIZE_SMALL
+ var/opened = FALSE
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatpizza/filled)
+
+/obj/item/weapon/storage/mrebag/Initialize()
+ . = ..()
+
+/obj/item/weapon/storage/mrebag/update_icon()
+ if(opened)
+ icon_state = "[initial(icon_state)][opened]"
+ . = ..()
+
+/obj/item/weapon/storage/mrebag/attack_self(mob/user)
+ open(user)
+
+/obj/item/weapon/storage/mrebag/open(mob/user)
+ if(!opened)
+ to_chat(usr, "The pouch heats up as you break the vaccum seal.")
+ opened = 1
+ update_icon()
+ . = ..()
+
+/obj/item/weapon/storage/mrebag/menu2
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/margherita/filled)
+
+/obj/item/weapon/storage/mrebag/menu3
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/vegetablepizza/filled)
+
+/obj/item/weapon/storage/mrebag/menu4
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeyburger)
+
+/obj/item/weapon/storage/mrebag/menu5
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/taco)
+
+/obj/item/weapon/storage/mrebag/menu6
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatbread/filled)
+
+/obj/item/weapon/storage/mrebag/menu7
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad)
+
+/obj/item/weapon/storage/mrebag/menu8
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/hotchili)
+
+/obj/item/weapon/storage/mrebag/menu9
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/boiledrice)
+
+/obj/item/weapon/storage/mrebag/menu10
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube)
+
+/obj/item/weapon/storage/mrebag/side
+ name = "side dish"
+ desc = "A vacuum-sealed bag containing the MRE's side dish. Self-heats when opened."
+ icon_state = "pouch_small"
+ starts_with = list(/obj/random/mre/side)
+
+/obj/item/weapon/storage/mrebag/side/menu10
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube)
+
+/obj/item/weapon/storage/mrebag/dessert
+ name = "dessert"
+ desc = "A vacuum-sealed bag containing the MRE's dessert."
+ icon_state = "pouch_small"
+ starts_with = list(/obj/random/mre/dessert)
+
+/obj/item/weapon/storage/mrebag/dessert/menu9
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit)
+
+/obj/item/weapon/storage/mrebag/dessert/menu11
+ starts_with = list(/obj/item/weapon/pen/crayon/rainbow)
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 790e5471d6b..f9180c99f1d 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -540,3 +540,150 @@
var/possible_object_paths = list(/obj/item/weapon/paper/carbon/cursedform)
possible_object_paths |= subtypesof(/obj/item/clothing/head/psy_crown)
return pick(possible_object_paths)
+
+//Random MRE stuff
+
+/obj/random/mre
+ name = "random MRE"
+ desc = "This is a random single MRE."
+ icon = 'icons/obj/food.dmi'
+ icon_state = "mre"
+ drop_get_turf = FALSE
+
+/obj/random/mre/item_to_spawn()
+ return pick(/obj/item/weapon/storage/mre,
+ /obj/item/weapon/storage/mre/menu2,
+ /obj/item/weapon/storage/mre/menu3,
+ /obj/item/weapon/storage/mre/menu4,
+ /obj/item/weapon/storage/mre/menu5,
+ /obj/item/weapon/storage/mre/menu6,
+ /obj/item/weapon/storage/mre/menu7,
+ /obj/item/weapon/storage/mre/menu8,
+ /obj/item/weapon/storage/mre/menu9,
+ /obj/item/weapon/storage/mre/menu10)
+
+
+/obj/random/mre/main
+ name = "random MRE main course"
+ desc = "This is a random main course for MREs."
+ icon_state = "pouch"
+ drop_get_turf = FALSE
+
+/obj/random/mre/main/item_to_spawn()
+ return pick(/obj/item/weapon/storage/mrebag,
+ /obj/item/weapon/storage/mrebag/menu2,
+ /obj/item/weapon/storage/mrebag/menu3,
+ /obj/item/weapon/storage/mrebag/menu4,
+ /obj/item/weapon/storage/mrebag/menu5,
+ /obj/item/weapon/storage/mrebag/menu6,
+ /obj/item/weapon/storage/mrebag/menu7,
+ /obj/item/weapon/storage/mrebag/menu8)
+
+/obj/random/mre/side
+ name = "random MRE side dish"
+ desc = "This is a random side dish for MREs."
+ icon_state = "pouch"
+ drop_get_turf = FALSE
+
+/obj/random/mre/side/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad,
+ /obj/item/weapon/reagent_containers/food/snacks/boiledrice,
+ /obj/item/weapon/reagent_containers/food/snacks/poppypretzel,
+ /obj/item/weapon/reagent_containers/food/snacks/twobread,
+ /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast)
+
+/obj/random/mre/dessert
+ name = "random MRE dessert"
+ desc = "This is a random dessert for MREs."
+ icon_state = "pouch"
+ drop_get_turf = FALSE
+
+/obj/random/mre/dessert/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/snacks/candy,
+ /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/normal,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
+ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie)
+
+/obj/random/mre/dessert/vegan
+ name = "random vegan MRE dessert"
+ desc = "This is a random vegan dessert for MREs."
+
+/obj/random/mre/dessert/vegan/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/snacks/candy,
+ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
+ /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit)
+
+/obj/random/mre/drink
+ name = "random MRE drink"
+ desc = "This is a random drink for MREs."
+ icon_state = "packet"
+ drop_get_turf = FALSE
+
+/obj/random/mre/drink/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/tea,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/grape,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/orange,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/apple)
+
+/obj/random/mre/spread
+ name = "random MRE spread"
+ desc = "This is a random spread packet for MREs."
+ icon_state = "packet"
+ drop_get_turf = FALSE
+
+/obj/random/mre/spread/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/honey)
+
+/obj/random/mre/spread/vegan
+ name = "random vegan MRE spread"
+ desc = "This is a random vegan spread packet for MREs"
+
+/obj/random/mre/spread/vegan/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly)
+
+/obj/random/mre/sauce
+ name = "random MRE sauce"
+ desc = "This is a random sauce packet for MREs."
+ icon_state = "packet"
+ drop_get_turf = FALSE
+
+/obj/random/mre/sauce/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
+
+/obj/random/mre/sauce/vegan/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
+
+/obj/random/mre/sauce/sugarfree/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
+
+/obj/random/mre/sauce/crayon/item_to_spawn()
+ return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey,
+ /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index da686ad455f..43f50a83873 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -97,6 +97,7 @@
/obj/item/clothing/glasses/meson,
/obj/item/weapon/cartridge/engineering,
/obj/item/taperoll/engineering,
+ /obj/item/clothing/head/hardhat,
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering,
/obj/item/clothing/shoes/boots/winter/engineering,
/obj/item/weapon/tank/emergency/oxygen/engi,
@@ -125,6 +126,7 @@
starts_with = list(
/obj/item/clothing/accessory/storage/brown_vest,
/obj/item/clothing/suit/fire/firefighter,
+ /obj/item/clothing/head/hardhat/red,
/obj/item/device/flashlight,
/obj/item/weapon/extinguisher,
///obj/item/clamp, //VOREStation Removal: without leaks those are pointless,
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index aafa6f85f37..6517dda8f8b 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -346,7 +346,7 @@
desc = "A crate of emergency rations."
starts_with = list(
- /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4)
+ /obj/random/mre = 6)
/obj/structure/closet/crate/bin
diff --git a/code/global.dm b/code/global.dm
index a1ecb08cff5..e9bcbb49f49 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -53,7 +53,7 @@ var/list/lastsignalers = list() // Keeps last 100 signals here in format: "[src]
var/list/lawchanges = list() // Stores who uploaded laws to which silicon-based lifeform, and what the law was.
var/list/reg_dna = list()
-var/mouse_respawn_time = 5 // Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes.
+var/mouse_respawn_time = 2.5 // Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes. Vorestation Edit - Changed to 2.5 minutes, half of 5, in accordance with mouse nerfs and realignment.
var/list/monkeystart = list()
var/list/wizardstart = list()
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 3475e60314b..72e2b3b39b6 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -368,7 +368,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
var/location = alert(src,"Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel")
- if(!location)
+ if(location == "Cancel" || !location)
return
var/announce = alert(src,"Announce as if they had just arrived?", "Announce", "Yes", "No", "Cancel")
diff --git a/code/modules/catalogue/cataloguer_vr.dm b/code/modules/catalogue/cataloguer_vr.dm
new file mode 100644
index 00000000000..d1dfac5deac
--- /dev/null
+++ b/code/modules/catalogue/cataloguer_vr.dm
@@ -0,0 +1,56 @@
+/obj/item/device/cataloguer/compact
+ name = "compact cataloguer"
+ icon = 'icons/vore/custom_items_vr.dmi'
+ icon_state = "tricorder"
+ action_button_name = "Toggle Cataloguer"
+ var/deployed = TRUE
+ scan_range = 1
+ toolspeed = 1.2
+
+/obj/item/device/cataloguer/compact/update_icon()
+ if(busy)
+ icon_state = "[initial(icon_state)]_s"
+ else
+ icon_state = initial(icon_state)
+
+/obj/item/device/cataloguer/compact/ui_action_click()
+ toggle()
+
+/obj/item/device/cataloguer/compact/verb/toggle()
+ set name = "Toggle Cataloguer"
+ set category = "Object"
+
+ if(busy)
+ to_chat(usr, span("warning", "\The [src] is currently scanning something."))
+ return
+ deployed = !(deployed)
+ if(deployed)
+ w_class = ITEMSIZE_NORMAL
+ icon_state = "[initial(icon_state)]"
+ to_chat(usr, span("notice", "You flip open \the [src]."))
+ else
+ w_class = ITEMSIZE_SMALL
+ icon_state = "[initial(icon_state)]_closed"
+ to_chat(usr, span("notice", "You close \the [src]."))
+
+ if (ismob(usr))
+ var/mob/M = usr
+ M.update_action_buttons()
+
+/obj/item/device/cataloguer/compact/afterattack(atom/target, mob/user, proximity_flag)
+ if(!deployed)
+ to_chat(user, span("warning", "\The [src] is closed."))
+ return
+ return ..()
+
+/obj/item/device/cataloguer/compact/pulse_scan(mob/user)
+ if(!deployed)
+ to_chat(user, span("warning", "\The [src] is closed."))
+ return
+ return ..()
+
+/obj/item/device/cataloguer/compact/pathfinder
+ name = "pathfinder's cataloguer"
+ icon_state = "tricorder_med"
+ scan_range = 3
+ toolspeed = 1
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
index 719ba98a382..e7bb0493f32 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
@@ -1,9 +1,3 @@
-/datum/gear/suit/roles/poncho/cloak/research
- allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist", "Explorer", "Pathfinder")
-
-/datum/gear/suit/roles/poncho/cloak/medical
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic")
-
/datum/gear/suit/wintercoat/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic")
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index b5aa5d7594d..3f7a6598084 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -293,6 +293,17 @@
punch_force = initial(punch_force)
wearer = null
+/obj/item/clothing/gloves
+ var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack?
+ var/special_attack_type = null
+
+/obj/item/clothing/gloves/New()
+ ..()
+ if(special_attack_type && ispath(special_attack_type))
+ special_attack = new special_attack_type
+
+
+
/////////////////////////////////////////////////////////////////////
//Rings
diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm
index b65884d3f9c..8807fb93ad5 100644
--- a/code/modules/clothing/gloves/gauntlets.dm
+++ b/code/modules/clothing/gloves/gauntlets.dm
@@ -18,6 +18,10 @@
var/mob/living/carbon/human/H = user
if(H.gloves)
gloves = H.gloves
+ if(!istype(gloves))
+ to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
+ gloves = null
+ return 0
if(gloves.overgloves)
to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
gloves = null
diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm
index a6625ccf306..522f79b89b7 100644
--- a/code/modules/food/food/condiment.dm
+++ b/code/modules/food/food/condiment.dm
@@ -182,6 +182,198 @@
. = ..()
reagents.add_reagent("sugar", 20)
+//MRE condiments and drinks.
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet
+ icon_state = "packet_small"
+ w_class = ITEMSIZE_TINY
+ possible_transfer_amounts = "1;5;10"
+ amount_per_transfer_from_this = 1
+ volume = 5
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt
+ name = "salt packet"
+ desc = "Contains 5u of table salt."
+ icon_state = "packet_small_white"
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize()
+ . = ..()
+ reagents.add_reagent("sodiumchloride", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper
+ name = "pepper packet"
+ desc = "Contains 5u of black pepper."
+ icon_state = "packet_small_black"
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper/Initialize()
+ . = ..()
+ reagents.add_reagent("blackpepper", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar
+ name = "sugar packet"
+ desc = "Contains 5u of refined sugar."
+ icon_state = "packet_small_white"
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar/Initialize()
+ . = ..()
+ reagents.add_reagent("sugar", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly
+ name = "jelly packet"
+ desc = "Contains 10u of cherry jelly. Best used for spreading on crackers."
+ icon_state = "packet_medium"
+ volume = 10
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly/Initialize()
+ . = ..()
+ reagents.add_reagent("cherryjelly", 10)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey
+ name = "honey packet"
+ desc = "Contains 10u of honey."
+ icon_state = "packet_medium"
+ volume = 10
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey/Initialize()
+ . = ..()
+ reagents.add_reagent("honey", 10)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin
+ name = "hot sauce packet"
+ desc = "Contains 5u of hot sauce. Enjoy in moderation."
+ icon_state = "packet_small_red"
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin/Initialize()
+ . = ..()
+ reagents.add_reagent("capsaicin", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup
+ name = "ketchup packet"
+ desc = "Contains 5u of ketchup."
+ icon_state = "packet_small_red"
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup/Initialize()
+ . = ..()
+ reagents.add_reagent("ketchup", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo
+ name = "mayonnaise packet"
+ desc = "Contains 5u of mayonnaise."
+ icon_state = "packet_small_white"
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo/Initialize()
+ . = ..()
+ reagents.add_reagent("mayo", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy
+ name = "soy sauce packet"
+ desc = "Contains 5u of soy sauce."
+ icon_state = "packet_small_black"
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy/Initialize()
+ . = ..()
+ reagents.add_reagent("soysauce", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee
+ name = "coffee powder packet"
+ desc = "Contains 5u of coffee powder. Mix with 25u of water and heat."
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee/Initialize()
+ . = ..()
+ reagents.add_reagent("coffeepowder", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea
+ name = "tea powder packet"
+ desc = "Contains 5u of black tea powder. Mix with 25u of water and heat."
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea/Initialize()
+ . = ..()
+ reagents.add_reagent("tea", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa
+ name = "cocoa powder packet"
+ desc = "Contains 5u of cocoa powder. Mix with 25u of water and heat."
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa/Initialize()
+ . = ..()
+ reagents.add_reagent("coco", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape
+ name = "grape juice powder packet"
+ desc = "Contains 5u of powdered grape juice. Mix with 15u of water."
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape/Initialize()
+ . = ..()
+ reagents.add_reagent("instantgrape", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange
+ name = "orange juice powder packet"
+ desc = "Contains 5u of powdered orange juice. Mix with 15u of water."
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange/Initialize()
+ . = ..()
+ reagents.add_reagent("instantorange", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon
+ name = "watermelon juice powder packet"
+ desc = "Contains 5u of powdered watermelon juice. Mix with 15u of water."
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon/Initialize()
+ . = ..()
+ reagents.add_reagent("instantwatermelon", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple
+ name = "apple juice powder packet"
+ desc = "Contains 5u of powdered apple juice. Mix with 15u of water."
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple/Initialize()
+ . = ..()
+ reagents.add_reagent("instantapple", 5)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein
+ name = "protein powder packet"
+ desc = "Contains 10u of powdered protein. Mix with 20u of water."
+ icon_state = "packet_medium"
+ volume = 10
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein/Initialize()
+ . = ..()
+ reagents.add_reagent("protein", 10)
+
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon
+ name = "crayon powder packet"
+ desc = "Contains 10u of powdered crayon. Mix with 30u of water."
+ volume = 10
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust", 10)
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust_red", 10)
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust_orange", 10)
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust_yellow", 10)
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust_green", 10)
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust_blue", 10)
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust_purple", 10)
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust_grey", 10)
+/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown/Initialize()
+ . = ..()
+ reagents.add_reagent("crayon_dust_brown", 10)
+
+//End of MRE stuff.
+
/obj/item/weapon/reagent_containers/food/condiment/flour
name = "flour sack"
desc = "A big bag of flour. Good for baking!"
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index 4e6e2bfac8f..0906bf0c50c 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -21,12 +21,7 @@
/obj/item/weapon/reagent_containers/food/snacks/Initialize()
. = ..()
if(nutriment_amt)
- reagents.add_reagent("nutriment",nutriment_amt,nutriment_desc)
-
-/obj/item/weapon/reagent_containers/food/snacks/Initialize()
- . = ..()
- if(nutriment_amt)
- reagents.add_reagent("nutriment", nutriment_amt)
+ reagents.add_reagent("nutriment",(nutriment_amt*2),nutriment_desc)
//Placeholder for effect that trigger on eating that aren't tied to reagents.
/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M)
@@ -3088,6 +3083,7 @@
filling_color = "#F5DEB8"
center_of_mass = list("x"=16, "y"=6)
nutriment_desc = list("salt" = 1, "cracker" = 2)
+ w_class = ITEMSIZE_TINY
nutriment_amt = 1
@@ -3738,6 +3734,33 @@
reagents.add_reagent("iron", 3)
bitesize = 4
+/obj/item/weapon/reagent_containers/food/snacks/liquidprotein
+ name = "\improper LiquidProtein Ration"
+ desc = "A variant of the liquidfood ration, designed for obligate carnivore species. Only barely more appealing than regular liquidfood. Should this be crunchy?"
+ icon_state = "liquidprotein"
+ trash = /obj/item/trash/liquidprotein
+ filling_color = "#A8A8A8"
+ survivalfood = TRUE
+ center_of_mass = list("x"=16, "y"=15)
+
+/obj/item/weapon/reagent_containers/food/snacks/liquidprotein/Initialize()
+ ..()
+ reagents.add_reagent("protein", 30)
+ reagents.add_reagent("iron", 3)
+ bitesize = 4
+
+/obj/item/weapon/reagent_containers/food/snacks/meatcube
+ name = "cubed meat"
+ desc = "Fried, salted lean meat compressed into a cube. Not very appetizing."
+ icon_state = "meatcube"
+ filling_color = "#7a3d11"
+ center_of_mass = list("x"=16, "y"=16)
+
+/obj/item/weapon/reagent_containers/food/snacks/meatcube/Initialize()
+ . = ..()
+ reagents.add_reagent("protein", 15)
+ bitesize = 3
+
/obj/item/weapon/reagent_containers/food/snacks/tastybread
name = "bread tube"
desc = "Bread in a tube. Chewy...and surprisingly tasty."
diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm
index 8106c52dfd3..a283a6bafe5 100644
--- a/code/modules/food/food/snacks_vr.dm
+++ b/code/modules/food/food/snacks_vr.dm
@@ -607,19 +607,3 @@
/obj/item/pizzabox/meat/Initialize()
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo(src)
-
-/obj/item/weapon/reagent_containers/food/snacks/liquidprotein
- name = "\improper LiquidProtein Ration"
- desc = "A variant of the liquidfood ration, designed for obligate carnivore species. Only barely more appealing than regular liquidfood. Should this be crunchy?"
- icon = 'icons/obj/food_vr.dmi'
- icon_state = "liquidprotein"
- trash = /obj/item/trash/liquidprotein
- filling_color = "#A8A8A8"
- survivalfood = TRUE
- center_of_mass = list("x"=16, "y"=15)
-
-/obj/item/weapon/reagent_containers/food/snacks/liquidprotein/Initialize()
- ..()
- reagents.add_reagent("protein", 20)
- reagents.add_reagent("iron", 3)
- bitesize = 4
diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm
index 22b4b2e6c6d..c1c7ebedafa 100644
--- a/code/modules/holodeck/HolodeckObjects.dm
+++ b/code/modules/holodeck/HolodeckObjects.dm
@@ -126,6 +126,38 @@
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
)
item_state = "boxing"
+ special_attack_type = /datum/unarmed_attack/holopugilism
+
+datum/unarmed_attack/holopugilism
+ sparring_variant_type = /datum/unarmed_attack/holopugilism
+
+datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone)
+ user.do_attack_animation(src)
+ var/damage = rand(0, 9)
+ if(!damage)
+ playsound(target.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ target.visible_message("[user] has attempted to punch [target]!")
+ return TRUE
+ var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting))
+ var/armor_block = target.run_armor_check(affecting, "melee")
+ var/armor_soak = target.get_armor_soak(affecting, "melee")
+
+ if(HULK in user.mutations)
+ damage += 5
+
+ playsound(target.loc, "punch", 25, 1, -1)
+
+ target.visible_message("[user] has punched [target]!")
+
+ if(armor_soak >= damage)
+ return TRUE
+
+ target.apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak)
+ if(damage >= 9)
+ target.visible_message("[user] has weakened [target]!")
+ target.apply_effect(4, WEAKEN, armor_block)
+
+ return TRUE
/obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob)
if(!istype(W))
@@ -262,8 +294,8 @@
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
- return 1
- return 0
+ return TRUE
+ return FALSE
/obj/item/weapon/holo/esword/New()
item_color = pick("red","blue","green","purple")
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index b616d456b6b..c362054cfa3 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -438,7 +438,7 @@ var/list/name_to_material
// Very rare alloy that is reflective, should be used sparingly.
/material/durasteel
name = "durasteel"
- stack_type = /obj/item/stack/material/durasteel
+ stack_type = /obj/item/stack/material/durasteel/hull
integrity = 600
melting_point = 7000
icon_base = "metal"
@@ -460,6 +460,9 @@ var/list/name_to_material
explosion_resistance = 90
reflectivity = 0.9
+/material/durasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal durasteel sheets.
+ new /obj/item/stack/material/durasteel(target)
+
/material/plasteel/titanium
name = MAT_TITANIUM
stack_type = /obj/item/stack/material/titanium
@@ -475,6 +478,9 @@ var/list/name_to_material
icon_base = "hull"
icon_reinf = "reinf_mesh"
+/material/plasteel/titanium/hull/place_sheet(var/turf/target) //Deconstructed into normal titanium sheets.
+ new /obj/item/stack/material/titanium(target)
+
/material/glass
name = "glass"
stack_type = /obj/item/stack/material/glass
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 982ad0d8ad1..3da050bacb8 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -591,9 +591,9 @@ turf/simulated/mineral/floor/light_corner
if(is_clean)
X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type)
else
- X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type)
+ X = new /obj/item/weapon/strangerock(src, inside_item_type = F.find_type)
geologic_data.UpdateNearbyArtifactInfo(src)
- var/obj/item/weapon/ore/strangerock/SR = X
+ var/obj/item/weapon/strangerock/SR = X
SR.geologic_data = geologic_data
//some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index ad0ceb7f624..bee85326fcb 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -8,6 +8,14 @@
return soft_type
return src.default_attack
// VOREStation Edit - End
+ if(src.gloves)
+ var/obj/item/clothing/gloves/G = src.gloves
+ if(istype(G) && G.special_attack && G.special_attack.is_usable(src, target, hit_zone))
+ if(pulling_punches)
+ var/datum/unarmed_attack/soft_type = G.special_attack.get_sparring_variant()
+ if(soft_type)
+ return soft_type
+ return G.special_attack
for(var/datum/unarmed_attack/u_attack in species.unarmed_attacks)
if(u_attack.is_usable(src, target, hit_zone))
if(pulling_punches)
@@ -41,39 +49,11 @@
H.do_attack_animation(src)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("[H] reaches for [src], but misses!")
- return 0
+ return FALSE
if(H != src && check_shields(0, null, H, H.zone_sel.selecting, H.name))
H.do_attack_animation(src)
- return 0
-
- if(istype(H.gloves, /obj/item/clothing/gloves/boxing/hologlove))
- H.do_attack_animation(src)
- var/damage = rand(0, 9)
- if(!damage)
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- visible_message("[H] has attempted to punch [src]!")
- return 0
- var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
- var/armor_block = run_armor_check(affecting, "melee")
- var/armor_soak = get_armor_soak(affecting, "melee")
-
- if(HULK in H.mutations)
- damage += 5
-
- playsound(loc, "punch", 25, 1, -1)
-
- visible_message("[H] has punched [src]!")
-
- if(armor_soak >= damage)
- return
-
- apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak)
- if(damage >= 9)
- visible_message("[H] has weakened [src]!")
- apply_effect(4, WEAKEN, armor_block)
-
- return
+ return FALSE
if(istype(M,/mob/living/carbon))
var/mob/living/carbon/C = M
@@ -122,7 +102,7 @@
else if(!(M == src && apply_pressure(M, M.zone_sel.selecting)))
help_shake_act(M)
- return 1
+ return TRUE
if(I_GRAB)
if(M == src || anchored)
@@ -149,7 +129,7 @@
//VORESTATION EDIT
visible_message("[M] has grabbed [src] [(M.zone_sel.selecting == BP_L_HAND || M.zone_sel.selecting == BP_R_HAND)? "by [(gender==FEMALE)? "her" : ((gender==MALE)? "his": "their")] hands": "passively"]!")
//VORESTATION END END
- return 1
+ return TRUE
if(I_HURT)
@@ -175,7 +155,7 @@
if(!affecting || affecting.is_stump())
M << "They are missing that limb!"
- return 1
+ return TRUE
switch(src.a_intent)
if(I_HELP)
@@ -245,7 +225,10 @@
// See what attack they use
var/datum/unarmed_attack/attack = H.get_unarmed_attack(src, hit_zone)
if(!attack)
- return 0
+ return FALSE
+
+ if(attack.unarmed_override(H, src, hit_zone))
+ return FALSE
H.do_attack_animation(src)
if(!attack_message)
@@ -258,7 +241,7 @@
add_attack_logs(H,src,"Melee attacked with fists (miss/block)")
if(miss_type)
- return 0
+ return FALSE
var/real_damage = rand_damage
var/hit_dam_type = attack.damage_type
@@ -268,7 +251,7 @@
var/obj/item/clothing/gloves/G = H.gloves
real_damage += G.punch_force
hit_dam_type = G.punch_damtype
- if(H.pulling_punches) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN
+ if(H.pulling_punches && !attack.sharp && !attack.edge) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN, BUT YOU CAN'T "PULL" A KNIFE
hit_dam_type = AGONY
real_damage *= damage_multiplier
rand_damage *= damage_multiplier
@@ -359,7 +342,7 @@
var/armor_soak = get_armor_soak(affecting, armor_type, armor_pen)
apply_damage(damage, BRUTE, affecting, armor_block, armor_soak, sharp = a_sharp, edge = a_edge)
updatehealth()
- return 1
+ return TRUE
//Used to attack a joint through grabbing
/mob/living/carbon/human/proc/grab_joint(var/mob/living/user, var/def_zone)
@@ -370,43 +353,43 @@
break
if(!has_grab)
- return 0
+ return FALSE
if(!def_zone) def_zone = user.zone_sel.selecting
var/target_zone = check_zone(def_zone)
if(!target_zone)
- return 0
+ return FALSE
var/obj/item/organ/external/organ = get_organ(check_zone(target_zone))
if(!organ || organ.dislocated > 0 || organ.dislocated == -1) //don't use is_dislocated() here, that checks parent
- return 0
+ return FALSE
user.visible_message("[user] begins to dislocate [src]'s [organ.joint]!")
if(do_after(user, 100))
organ.dislocate(1)
src.visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!")
- return 1
- return 0
+ return TRUE
+ return FALSE
//Breaks all grips and pulls that the mob currently has.
/mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user)
- var/success = 0
+ var/success = FALSE
if(pulling)
visible_message("[user] has broken [src]'s grip on [pulling]!")
- success = 1
+ success = TRUE
stop_pulling()
if(istype(l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/lgrab = l_hand
if(lgrab.affecting)
visible_message("[user] has broken [src]'s grip on [lgrab.affecting]!")
- success = 1
+ success = TRUE
spawn(1)
qdel(lgrab)
if(istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/rgrab = r_hand
if(rgrab.affecting)
visible_message("[user] has broken [src]'s grip on [rgrab.affecting]!")
- success = 1
+ success = TRUE
spawn(1)
qdel(rgrab)
return success
@@ -421,11 +404,11 @@
/mob/living/carbon/human/proc/apply_pressure(mob/living/user, var/target_zone)
var/obj/item/organ/external/organ = get_organ(target_zone)
if(!organ || !(organ.status & ORGAN_BLEEDING) || (organ.robotic >= ORGAN_ROBOT))
- return 0
+ return FALSE
if(organ.applied_pressure)
user << "Someone is already applying pressure to [user == src? "your [organ.name]" : "[src]'s [organ.name]"]."
- return 0
+ return FALSE
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
@@ -446,4 +429,4 @@
else
user.visible_message("\The [user] stops applying pressure to [src]'s [organ.name]!", "You stop applying pressure to [src]'s [organ.name]!")
- return 1
+ return TRUE
diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm
index f3526983ef7..43a5ae66f24 100644
--- a/code/modules/mob/living/carbon/human/unarmed_attack.dm
+++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm
@@ -25,18 +25,18 @@ var/global/list/sparring_attack_cache = list()
/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if(user.restrained())
- return 0
+ return FALSE
// Check if they have a functioning hand.
var/obj/item/organ/external/E = user.organs_by_name["l_hand"]
if(E && !E.is_stump())
- return 1
+ return TRUE
E = user.organs_by_name["r_hand"]
if(E && !E.is_stump())
- return 1
+ return TRUE
- return 0
+ return FALSE
/datum/unarmed_attack/proc/get_unarmed_damage()
return damage
@@ -105,6 +105,9 @@ var/global/list/sparring_attack_cache = list()
return
user.visible_message("[user] attempts to press [TU.his] [eye_attack_text] into [target]'s eyes, but [TT.he] [TT.does]n't have any!")
+/datum/unarmed_attack/proc/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone)
+ return FALSE //return true if the unarmed override prevents further attacks
+
/datum/unarmed_attack/bite
attack_verb = list("bit")
attack_sound = 'sound/weapons/bite.ogg'
@@ -121,7 +124,7 @@ var/global/list/sparring_attack_cache = list()
return 0
if (user == target && (zone == BP_HEAD || zone == O_EYES || zone == O_MOUTH))
return 0
- return 1
+ return TRUE
/datum/unarmed_attack/punch
attack_verb = list("punched")
@@ -187,20 +190,20 @@ var/global/list/sparring_attack_cache = list()
/datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.legcuffed)
- return 0
+ return FALSE
if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", BP_GROIN)))
- return 0
+ return FALSE
var/obj/item/organ/external/E = user.organs_by_name["l_foot"]
if(E && !E.is_stump())
- return 1
+ return TRUE
E = user.organs_by_name["r_foot"]
if(E && !E.is_stump())
- return 1
+ return TRUE
- return 0
+ return FALSE
/datum/unarmed_attack/kick/get_unarmed_damage(var/mob/living/carbon/human/user)
var/obj/item/clothing/shoes = user.shoes
@@ -231,23 +234,23 @@ var/global/list/sparring_attack_cache = list()
/datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.legcuffed)
- return 0
+ return FALSE
if(!istype(target))
- return 0
+ return FALSE
if (!user.lying && (target.lying || (zone in list("l_foot", "r_foot"))))
if(target.grabbed_by == user && target.lying)
- return 0
+ return FALSE
var/obj/item/organ/external/E = user.organs_by_name["l_foot"]
if(E && !E.is_stump())
- return 1
+ return TRUE
E = user.organs_by_name["r_foot"]
if(E && !E.is_stump())
- return 1
+ return TRUE
- return 0
+ return FALSE
/datum/unarmed_attack/stomp/get_unarmed_damage(var/mob/living/carbon/human/user)
var/obj/item/clothing/shoes = user.shoes
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm
index 2ff8c55598c..4e86b1c68a4 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm
@@ -11,7 +11,7 @@
base_attack_cooldown = 10
projectilesound = 'sound/weapons/taser2.ogg'
- projectiletype = /obj/item/projectile/ion/small
+ projectiletype = /obj/item/projectile/ion/pistol
melee_damage_lower = 8
melee_damage_upper = 15
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
index 70afdaf910a..e1cb92ada30 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
@@ -112,4 +112,4 @@
/datum/say_list/mouse
speak = list("Squeek!","SQUEEK!","Squeek?")
emote_hear = list("squeeks","squeaks","squiks")
- emote_see = list("runs in a circle", "shakes", "scritches at something")
\ No newline at end of file
+ emote_see = list("runs in a circle", "shakes", "scritches at something")
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm
new file mode 100644
index 00000000000..4b4cdcade4a
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm
@@ -0,0 +1,18 @@
+/mob/living/simple_mob/animal/passive/mouse
+ no_vore = 1 //Mice can't eat others due to the amount of bugs caused by it.
+ vore_taste = "cheese"
+
+ can_pull_size = ITEMSIZE_TINY // Rykka - Uncommented these. Not sure why they were commented out in the original Polaris files, maybe a mob rework mistake?
+ can_pull_mobs = MOB_PULL_NONE // Rykka - Uncommented these. Not sure why they were commented out in the original Polaris files, maybe a mob rework mistake?
+
+ desc = "A small rodent, often seen hiding in maintenance areas and making a nuisance of itself. And stealing cheese, or annoying the chef. SQUEAK! <3"
+
+/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/living/hander)
+ if(hander.a_intent == I_HELP) //if lime intent
+ get_scooped(hander) //get scooped
+
+/obj/item/weapon/holder/mouse/attack_self(var/mob/U)
+ for(var/mob/living/simple_mob/M in src.contents)
+ if((I_HELP) && U.canClick()) //a little snowflakey, but makes it use the same cooldown as interacting with non-inventory objects
+ U.setClickCooldown(U.get_attack_speed()) //if there's a cleaner way in baycode, I'll change this
+ U.visible_message("[U] [M.response_help] \the [M].")
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm
index c821cf4a567..8507480f01b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm
@@ -18,6 +18,7 @@
see_in_dark = 5
mob_size = MOB_TINY
makes_dirt = FALSE // No more dirt
+ mob_bump_flag = 0
response_help = "scritches"
response_disarm = "bops"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm
index 4022198fdfe..9fbb2926bb3 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm
@@ -411,7 +411,7 @@
/obj/random/bomb_supply = 7,
/obj/random/contraband = 3,
/obj/random/unidentified_medicine/old_medicine = 7,
- /obj/item/weapon/ore/strangerock = 3,
+ /obj/item/weapon/strangerock = 3,
/obj/item/weapon/ore/phoron = 7,
/obj/random/handgun = 1,
/obj/random/toolbox = 4,
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
new file mode 100644
index 00000000000..0aa1b700a6e
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
@@ -0,0 +1,171 @@
+#define MORPH_COOLDOWN 50
+
+/mob/living/simple_mob/vore/hostile/morph
+ name = "morph"
+ real_name = "morph"
+ desc = "A revolting, pulsating pile of flesh."
+ tt_desc = "morphus shapeshiftus"
+ icon = 'icons/mob/animal_vr.dmi'
+ icon_state = "morph"
+ icon_living = "morph"
+ icon_dead = "morph_dead"
+ movement_cooldown = 1
+ status_flags = CANPUSH
+ pass_flags = PASSTABLE
+ mob_bump_flag = 0
+
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+
+ minbodytemp = 0
+ maxHealth = 150
+ health = 150
+ melee_damage_lower = 20
+ melee_damage_upper = 20
+ see_in_dark = 8
+ attacktext = "glomps"
+ attack_sound = 'sound/effects/blobattack.ogg'
+
+ meat_amount = 2
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
+
+ showvoreprefs = 0
+ vore_active = 1
+
+ var/morphed = FALSE
+ var/tooltip = TRUE
+ var/melee_damage_disguised = 0
+ var/eat_while_disguised = FALSE
+ var/atom/movable/form = null
+ var/morph_time = 0
+ var/our_size_multiplier = 1
+ var/static/list/blacklist_typecache = typecacheof(list(
+ /obj/screen,
+ /obj/singularity,
+ /mob/living/simple_mob/vore/hostile/morph,
+ /obj/effect))
+
+/mob/living/simple_mob/vore/hostile/morph/Initialize()
+ verbs += /mob/living/proc/ventcrawl
+ return ..()
+
+/mob/living/simple_mob/vore/hostile/morph/proc/allowed(atom/movable/A)
+ return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A))
+
+/mob/living/simple_mob/vore/hostile/morph/examine(mob/user)
+ if(morphed)
+ form.examine(user)
+ if(get_dist(user,src)<=3)
+ to_chat(user, "It doesn't look quite right...")
+ else
+ ..()
+ return
+
+/mob/living/simple_mob/vore/hostile/morph/ShiftClickOn(atom/movable/A)
+ if(Adjacent(A))
+ if(morph_time <= world.time && !stat)
+ if(A == src)
+ restore()
+ return
+ if(istype(A) && allowed(A))
+ assume(A)
+ else
+ to_chat(src, "Your chameleon skin is still repairing itself!")
+ else
+ ..()
+
+/mob/living/simple_mob/vore/hostile/morph/proc/assume(atom/movable/target)
+ if(morphed)
+ to_chat(src, "You must restore to your original form first!")
+ return
+ morphed = TRUE
+ form = target
+
+ visible_message("[src] suddenly twists and changes shape, becoming a copy of [target]!")
+ appearance = target.appearance
+ copy_overlays(target)
+ alpha = max(alpha, 150) //fucking chameleons
+ transform = initial(transform)
+ our_size_multiplier = size_multiplier
+ if(isobj(target))
+ size_multiplier = 1
+ icon_scale_x = target.icon_scale_x
+ icon_scale_y = target.icon_scale_y
+ update_transform()
+ else if(ismob(target))
+ var/mob/living/M = target
+ resize(M.size_multiplier)
+ pixel_y = initial(pixel_y)
+ pixel_x = initial(pixel_x)
+ density = target.density
+
+ //Morphed is weaker
+ melee_damage_lower = melee_damage_disguised
+ melee_damage_upper = melee_damage_disguised
+ movement_cooldown = 5
+
+ morph_time = world.time + MORPH_COOLDOWN
+ return
+
+/mob/living/simple_mob/vore/hostile/morph/proc/restore()
+ if(!morphed)
+ to_chat(src, "You're already in your normal form!")
+ return
+ morphed = FALSE
+ form = null
+ alpha = initial(alpha)
+ color = initial(color)
+ layer = initial(layer)
+ plane = initial(plane)
+ maptext = null
+
+ visible_message("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!")
+ name = initial(name)
+ desc = initial(desc)
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+ size_multiplier = 0
+ resize(our_size_multiplier)
+ overlays.Cut()
+ density = initial(density)
+
+ //Baseline stats
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ movement_cooldown = initial(movement_cooldown)
+
+ morph_time = world.time + MORPH_COOLDOWN
+
+/mob/living/simple_mob/vore/hostile/morph/death(gibbed)
+ if(morphed)
+ visible_message("[src] twists and dissolves into a pile of green flesh!")
+ restore()
+ ..()
+
+/mob/living/simple_mob/vore/hostile/morph/will_show_tooltip()
+ return (!morphed)
+
+/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE)
+ if(morphed && !ismob(form))
+ return
+ return ..()
+
+/mob/living/simple_mob/vore/hostile/morph/update_icons()
+ if(morphed)
+ return
+ return ..()
+
+/mob/living/simple_mob/vore/hostile/morph/update_transform()
+ if(morphed)
+ var/matrix/M = matrix()
+ M.Scale(icon_scale_x, icon_scale_y)
+ M.Turn(icon_rotation)
+ src.transform = M
+ else
+ ..()
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 441ee77234f..749a88dba6a 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -114,7 +114,7 @@
if(href_list["observe"])
- if(alert(src,"Are you sure you wish to observe? You will have to wait 5 minute before being able to respawn!","Player Setup","Yes","No") == "Yes") //Vorestation edit
+ if(alert(src,"Are you sure you wish to observe? You will have to wait 60 seconds before being able to respawn!","Player Setup","Yes","No") == "Yes") //Vorestation edit - Rykka corrected to 60 seconds to match current spawn time
if(!client) return 1
//Make a new mannequin quickly, and allow the observer to take the appearance
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index 0da87f2d0c1..48afe19b7e7 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -148,6 +148,24 @@
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/flour(T)
+/datum/reagent/nutriment/coffee
+ name = "Coffee Powder"
+ id = "coffeepowder"
+ description = "A bitter powder made by grinding coffee beans."
+ taste_description = "bitterness"
+ taste_mult = 1.3
+ nutriment_factor = 1
+ color = "#482000"
+
+/datum/reagent/nutriment/tea
+ name = "Tea Powder"
+ id = "teapowder"
+ description = "A dark, tart powder made from black tea leaves."
+ taste_description = "tartness"
+ taste_mult = 1.3
+ nutriment_factor = 1
+ color = "#101000"
+
/datum/reagent/nutriment/coco
name = "Coco Powder"
id = "coco"
@@ -158,6 +176,41 @@
nutriment_factor = 5
color = "#302000"
+/datum/reagent/nutriment/instantjuice
+ name = "Juice Powder"
+ id = "instantjuice"
+ description = "Dehydrated, powdered juice of some kind."
+ taste_mult = 1.3
+ nutriment_factor = 1
+
+/datum/reagent/nutriment/instantjuice/grape
+ name = "Grape Juice Powder"
+ id = "instantgrape"
+ description = "Dehydrated, powdered grape juice."
+ taste_description = "dry grapes"
+ color = "#863333"
+
+/datum/reagent/nutriment/instantjuice/orange
+ name = "Orange Juice Powder"
+ id = "instantorange"
+ description = "Dehydrated, powdered orange juice."
+ taste_description = "dry oranges"
+ color = "#e78108"
+
+/datum/reagent/nutriment/instantjuice/watermelon
+ name = "Watermelon Juice Powder"
+ id = "instantwatermelon"
+ description = "Dehydrated, powdered watermelon juice."
+ taste_description = "dry sweet watermelon"
+ color = "#b83333"
+
+/datum/reagent/nutriment/instantjuice/apple
+ name = "Apple Juice Powder"
+ id = "instantapple"
+ description = "Dehydrated, powdered apple juice."
+ taste_description = "dry sweet apples"
+ color = "#c07c40"
+
/datum/reagent/nutriment/soysauce
name = "Soysauce"
id = "soysauce"
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index a9034548014..01de315c2d4 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -1200,6 +1200,20 @@
new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location)
return
+/datum/chemical_reaction/drinks/coffee
+ name = "Coffee"
+ id = "coffee"
+ result = "coffee"
+ required_reagents = list("water" = 5, "coffeepowder" = 1)
+ result_amount = 5
+
+/datum/chemical_reaction/drinks/tea
+ name = "Black tea"
+ id = "tea"
+ result = "tea"
+ required_reagents = list("water" = 5, "teapowder" = 1)
+ result_amount = 5
+
/datum/chemical_reaction/drinks/hot_coco
name = "Hot Coco"
id = "hot_coco"
@@ -1214,6 +1228,34 @@
required_reagents = list("soymilk" = 4, "sacid" = 1)
result_amount = 5
+/datum/chemical_reaction/drinks/grapejuice
+ name = "Grape Juice"
+ id = "grapejuice"
+ result = "grapejuice"
+ required_reagents = list("water" = 3, "instantgrape" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/drinks/orangejuice
+ name = "Orange Juice"
+ id = "orangejuice"
+ result = "orangejuice"
+ required_reagents = list("water" = 3, "instantorange" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/drinks/watermelonjuice
+ name = "Watermelon Juice"
+ id = "watermelonjuice"
+ result = "watermelonjuice"
+ required_reagents = list("water" = 3, "instantwatermelon" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/drinks/applejuice
+ name = "Apple Juice"
+ id = "applejuice"
+ result = "applejuice"
+ required_reagents = list("water" = 3, "instantapple" = 1)
+ result_amount = 3
+
/datum/chemical_reaction/food/ketchup
name = "Ketchup"
id = "ketchup"
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 08d613ff1bb..3cc4395141b 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -1244,7 +1244,8 @@
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_ILLEGAL = 7)
- var/obj/item/weapon/cell/device/weapon/power_source
+ var/cell_type = /obj/item/weapon/cell/device/weapon
+ var/obj/item/weapon/cell/power_source
var/charge_cost = 800 // cell/device/weapon has 2400
var/list/beacons = list()
@@ -1259,7 +1260,10 @@
/obj/item/device/perfect_tele/New()
..()
flags |= NOBLUDGEON
- power_source = new (src)
+ if(cell_type)
+ power_source = new cell_type(src)
+ else
+ power_source = new /obj/item/weapon/cell/device(src)
spk = new(src)
spk.set_up(5, 0, src)
spk.attach(src)
@@ -1276,7 +1280,7 @@
/obj/item/device/perfect_tele/update_icon()
if(!power_source)
icon_state = "[initial(icon_state)]_o"
- else if(ready && power_source.check_charge(charge_cost))
+ else if(ready && (power_source.check_charge(charge_cost) || power_source.fully_charged()))
icon_state = "[initial(icon_state)]"
else
icon_state = "[initial(icon_state)]_w"
@@ -1338,7 +1342,7 @@
return
/obj/item/device/perfect_tele/attackby(obj/W, mob/user)
- if(istype(W,/obj/item/weapon/cell/device/weapon) && !power_source)
+ if(istype(W,cell_type) && !power_source)
power_source = W
power_source.update_icon() //Why doesn't a cell do this already? :|
user.unEquip(power_source)
@@ -1367,7 +1371,7 @@
return FALSE
//Check for charge
- if(!power_source.check_charge(charge_cost))
+ if((!power_source.check_charge(charge_cost)) && (!power_source.fully_charged()))
to_chat(user,"\The [src] does not have enough power left!")
return FALSE
@@ -1398,10 +1402,13 @@
//No, you can't port to or from away missions. Stupidly complicated check.
var/turf/uT = get_turf(user)
var/turf/dT = get_turf(destination)
+ var/list/dat = list()
+ dat["z_level_detection"] = using_map.get_map_levels(uT.z)
+
if(!uT || !dT)
return FALSE
- if( (uT.z != dT.z) && ( (uT.z > max_default_z_level() ) || (dT.z > max_default_z_level()) ) )
+ if( (uT.z != dT.z) && (!(dT.z in dat["z_level_detection"])) )
to_chat(user,"\The [src] can't teleport you that far!")
return FALSE
@@ -1562,14 +1569,17 @@
desc = "A more limited translocator with a single beacon, useful for some things, like setting the mining department on fire accidentally. Legal for use in the pursuit of NanoTrasen interests, namely mining and exploration."
icon_state = "minitrans"
beacons_left = 1 //Just one
- charge_cost = 2400 //One per
+ cell_type = /obj/item/weapon/cell/device
+ origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5)
+/*
/obj/item/device/perfect_tele/one_beacon/teleport_checks(mob/living/target,mob/living/user)
var/turf/T = get_turf(destination)
if(T && user.z != T.z)
to_chat(user,"\The [src] is too far away from the beacon. Try getting closer first!")
return FALSE
return ..()
+*/
//InterroLouis: Ruda Lizden
/obj/item/clothing/accessory/badge/holo/detective/ruda
@@ -2008,7 +2018,7 @@
/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask/fluff/viktor/Initialize()
..()
reagents.add_reagent("pwine", 60)
-
+
//RadiantAurora: Tiemli Kroto
/obj/item/clothing/glasses/welding/tiemgogs
name = "custom-fitted welding goggles"
diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm
index ab5d00e7861..8e89dcd9478 100644
--- a/code/modules/xenoarcheaology/finds/finds.dm
+++ b/code/modules/xenoarcheaology/finds/finds.dm
@@ -14,20 +14,22 @@
clearance_range = rand(4, 12)
dissonance_spread = rand(1500, 2500) / 100
-/obj/item/weapon/ore/strangerock
+/obj/item/weapon/strangerock
name = "Strange rock"
desc = "Seems to have some unusal strata evident throughout it."
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "strange"
+ var/datum/geosample/geologic_data
origin_tech = list(TECH_MATERIAL = 5)
-/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0)
- ..(loc)
+/obj/item/weapon/strangerock/New(loc, var/inside_item_type = 0)
+ pixel_x = rand(0,16)-8
+ pixel_y = rand(0,8)-8
if(inside_item_type)
new /obj/item/weapon/archaeological_find(src, new_item_type = inside_item_type)
-/obj/item/weapon/ore/strangerock/attackby(var/obj/item/I, var/mob/user)
+/obj/item/weapon/strangerock/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/weapon/pickaxe/brush))
var/obj/item/inside = locate() in src
if(inside)
diff --git a/icons/mob/animal_vr.dmi b/icons/mob/animal_vr.dmi
index 2d8cd7a6a1a..801f3ddf335 100644
Binary files a/icons/mob/animal_vr.dmi and b/icons/mob/animal_vr.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 65d92bbe67a..de2f69b813b 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/food_vr.dmi b/icons/obj/food_vr.dmi
index 7a6d3c52264..ea92af44933 100644
Binary files a/icons/obj/food_vr.dmi and b/icons/obj/food_vr.dmi differ
diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi
index 4585d41d70e..2fe1a91c984 100644
Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ
diff --git a/icons/obj/trash_vr.dmi b/icons/obj/trash_vr.dmi
index 17004c289db..2c7fed4c7ad 100644
Binary files a/icons/obj/trash_vr.dmi and b/icons/obj/trash_vr.dmi differ
diff --git a/maps/southern_cross/structures/closets/misc_vr.dm b/maps/southern_cross/structures/closets/misc_vr.dm
index 384aa93134a..033a5384ef1 100644
--- a/maps/southern_cross/structures/closets/misc_vr.dm
+++ b/maps/southern_cross/structures/closets/misc_vr.dm
@@ -61,7 +61,8 @@
/obj/item/taperoll/medical,
/obj/item/device/gps/medical,
/obj/item/device/geiger,
- /obj/item/bodybag/cryobag)
+ /obj/item/bodybag/cryobag,
+ /obj/item/device/cataloguer/compact)
/obj/structure/closet/secure_closet/pilot
starts_with = list(
@@ -83,7 +84,8 @@
/obj/item/weapon/storage/box/flare,
/obj/item/weapon/cell/device,
/obj/item/device/radio,
- /obj/item/device/gps/explorer)
+ /obj/item/device/gps/explorer,
+ /obj/item/device/cataloguer/compact)
/obj/structure/closet/secure_closet/pathfinder
name = "pathfinder locker"
@@ -118,7 +120,7 @@
/obj/item/clothing/accessory/holster/machete,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
- /obj/item/device/cataloguer)
+ /obj/item/device/cataloguer/compact/pathfinder)
/obj/structure/closet/secure_closet/pathfinder/Initialize()
if(prob(50))
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index a46007713ff..07a02ad7ade 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -4676,8 +4676,6 @@
/area/tether/surfacebase/north_stairs_one)
"aib" = (
/obj/structure/table/glass,
-/obj/item/weapon/storage/fancy/vials,
-/obj/item/device/reagent_scanner,
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 4
},
@@ -4690,6 +4688,7 @@
/obj/effect/floor_decal/corner/mauve/border{
dir = 8
},
+/obj/machinery/portable_atmospherics/powered/reagent_distillery,
/turf/simulated/floor/tiled/white,
/area/rnd/chemistry_lab)
"aic" = (
@@ -4900,8 +4899,6 @@
/area/tether/surfacebase/atrium_one)
"aip" = (
/obj/structure/table/glass,
-/obj/item/weapon/storage/box/beakers,
-/obj/item/clothing/glasses/science,
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
},
@@ -4911,6 +4908,9 @@
/obj/effect/floor_decal/corner/mauve/border{
dir = 8
},
+/obj/item/weapon/storage/fancy/vials,
+/obj/item/weapon/storage/box/beakers,
+/obj/item/clothing/glasses/science,
/turf/simulated/floor/tiled/white,
/area/rnd/chemistry_lab)
"aiq" = (
@@ -5091,14 +5091,15 @@
/area/rnd/chemistry_lab)
"aiJ" = (
/obj/structure/table/glass,
-/obj/item/weapon/storage/box/syringes,
-/obj/item/weapon/reagent_containers/spray/cleaner,
/obj/effect/floor_decal/borderfloor{
dir = 10
},
/obj/effect/floor_decal/corner/mauve/border{
dir = 10
},
+/obj/item/weapon/storage/box/syringes,
+/obj/item/device/reagent_scanner,
+/obj/item/weapon/reagent_containers/spray/cleaner,
/turf/simulated/floor/tiled/white,
/area/rnd/chemistry_lab)
"aiK" = (
diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm
index 4eda0973a83..e2fdc2a8675 100644
--- a/maps/tether/tether-05-station1.dmm
+++ b/maps/tether/tether-05-station1.dmm
@@ -22222,9 +22222,6 @@
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/simulated/floor/tiled,
/area/engineering/engine_eva)
-"cbM" = (
-/turf/simulated/mineral/vacuum,
-/area/space)
"cbY" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
@@ -26857,8 +26854,8 @@ aac
aac
aac
aac
-cbM
-cbM
+aac
+aac
ayp
ayp
ayp
diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm
index 251de4e3f16..eccdca65607 100644
--- a/maps/tether/tether-06-station2.dmm
+++ b/maps/tether/tether-06-station2.dmm
@@ -7210,9 +7210,9 @@
/area/tether/exploration/hallway)
"kC" = (
/obj/item/weapon/material/twohanded/spear/foam,
-/obj/item/weapon/storage/fancy/crayons{
+/obj/item/weapon/storage/mre/menu12{
desc = "Special food for special warriors of the expedition force.";
- name = "spearman ration"
+ name = "spearman MRE"
},
/turf/simulated/floor,
/area/tether/exploration/hallway)
diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm
index cebc9444282..c08a89bb3a7 100644
--- a/maps/tether/tether-07-station3.dmm
+++ b/maps/tether/tether-07-station3.dmm
@@ -28961,10 +28961,8 @@
dir = 1
},
/obj/structure/closet/crate/freezer/rations,
-/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
-/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
-/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
-/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
+/obj/item/weapon/storage/mre/menu11,
+/obj/item/weapon/storage/mre/menu10,
/turf/simulated/floor/tiled/techfloor/grid,
/area/shuttle/excursion/tether)
"Vi" = (
diff --git a/maps/tether/tether-10-colony.dmm b/maps/tether/tether-10-colony.dmm
index 517c9d7b215..d4e346d5bf3 100644
--- a/maps/tether/tether-10-colony.dmm
+++ b/maps/tether/tether-10-colony.dmm
@@ -414,18 +414,12 @@
/area/centcom/specops)
"aI" = (
/obj/structure/closet/crate/medical,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
-/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
+/obj/item/weapon/storage/mre/menu11,
+/obj/item/weapon/storage/mre/menu11,
+/obj/item/weapon/storage/mre/menu11,
+/obj/item/weapon/storage/mre/menu11,
+/obj/item/weapon/storage/mre/menu11,
+/obj/item/weapon/storage/mre/menu11,
/turf/unsimulated/floor{
icon_state = "vault";
dir = 5
@@ -471,6 +465,7 @@
/obj/item/bodybag/cryobag,
/obj/item/bodybag/cryobag,
/obj/item/weapon/reagent_containers/glass/beaker/large,
+/obj/item/weapon/reagent_containers/glass/beaker/large,
/turf/unsimulated/floor{
icon_state = "vault";
dir = 5
diff --git a/vorestation.dme b/vorestation.dme
index a12fd398043..60747a32eb8 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1173,6 +1173,7 @@
#include "code\game\objects\items\weapons\storage\laundry_basket.dm"
#include "code\game\objects\items\weapons\storage\lockbox.dm"
#include "code\game\objects\items\weapons\storage\misc.dm"
+#include "code\game\objects\items\weapons\storage\mre.dm"
#include "code\game\objects\items\weapons\storage\quickdraw.dm"
#include "code\game\objects\items\weapons\storage\secure.dm"
#include "code\game\objects\items\weapons\storage\storage.dm"
@@ -1535,6 +1536,7 @@
#include "code\modules\catalogue\catalogue_data_vr.dm"
#include "code\modules\catalogue\cataloguer.dm"
#include "code\modules\catalogue\cataloguer_visuals.dm"
+#include "code\modules\catalogue\cataloguer_vr.dm"
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\movement.dm"
@@ -2385,6 +2387,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\lizard.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\misc.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm"
@@ -2489,6 +2492,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\zz_vore_overrides.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\_defines.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm"