diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
index ee1379ac28..5e62fe5802 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()
diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm
index a741869b5b..9938fa20eb 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 b77d442e82..bf5b8ba53b 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 613a01cfd4..9e4ee3879d 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/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index e9dbca2eea..b61ada6d18 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -573,4 +573,4 @@
for(var/reagent in S.processed_reagents)
S.reagents.add_reagent(reagent,amount)
S.chassis.use_power(energy_drain)
- return 1
+ return 1
\ No newline at end of file
diff --git a/code/game/mecha/equipment/tools/medical_tools_vr.dm b/code/game/mecha/equipment/tools/medical_tools_vr.dm
new file mode 100644
index 0000000000..19efa0a5fd
--- /dev/null
+++ b/code/game/mecha/equipment/tools/medical_tools_vr.dm
@@ -0,0 +1,10 @@
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun
+ equip_cooldown = 6
+ name = "\improper BL-3 \"Phoenix\" directed restoration system"
+ desc = "The BL-3 'Phoenix' is a portable medical system used to treat external injuries from afar."
+ icon_state = "mecha_medbeam"
+ energy_drain = 1000
+ projectile = /obj/item/projectile/beam/medigun
+ fire_sound = 'sound/weapons/eluger.ogg'
+ equip_type = EQUIP_UTILITY
+ origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6, TECH_POWER = 6)
\ No newline at end of file
diff --git a/code/game/mecha/micro/mechfab_designs_vr.dm b/code/game/mecha/micro/mechfab_designs_vr.dm
index 7a86d8d9ec..671e53b4da 100644
--- a/code/game/mecha/micro/mechfab_designs_vr.dm
+++ b/code/game/mecha/micro/mechfab_designs_vr.dm
@@ -185,3 +185,11 @@
id = "weasel_head"
build_path = /obj/item/mecha_parts/micro/part/weasel_head
materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2500)
+
+/datum/design/item/mecha/medigun
+ name = "BL-3/P directed restoration system"
+ desc = "A portable medical system used to treat external injuries from afar."
+ id = "mech_medigun"
+ req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6)
+ materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 1750, "diamond" = 1500, "phoron" = 4000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 3b1584ca19..8b8bba5a9d 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -53,7 +53,7 @@ var/global/list/image/splatter_cache=list()
blood_DNA |= B.blood_DNA.Copy()
qdel(B)
drytime = world.time + DRYING_TIME * (amount+1)
- START_PROCESSING(SSobj, src)
+ START_PROCESSING(SSobj, src)
/obj/effect/decal/cleanable/blood/process()
if(world.time > drytime)
@@ -93,7 +93,6 @@ var/global/list/image/splatter_cache=list()
S.overlays += S.blood_overlay
if(S.blood_overlay && S.blood_overlay.color != basecolor)
S.blood_overlay.color = basecolor
- S.overlays.Cut()
S.overlays += S.blood_overlay
S.blood_DNA |= blood_DNA.Copy()
perp.update_inv_shoes()
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 8a9220e87f..04046985c6 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -44,3 +44,14 @@
icon_state = "explosionfast"
duration = 4
// VOREStation Add End
+
+//VOREStation edit: medigun
+/obj/effect/temp_visual/heal
+ name = "healing glow"
+ icon_state = "heal"
+ duration = 15
+
+/obj/effect/temp_visual/heal/Initialize(mapload)
+ pixel_x = rand(-12, 12)
+ pixel_y = rand(-9, 0)
+//VOREStation edit ends
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
index 872c652356..d4f65fc9d1 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
@@ -79,3 +79,12 @@
light_range = 4
light_power = 3
light_color = "#3300ff"
+
+//VOREStation edit: medigun
+/obj/effect/projectile/impact/medigun
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "impact_medbeam"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#80F5FF"
+//VOREStation edit ends
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
index 42511e6577..d901aeaa61 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
@@ -91,3 +91,12 @@
light_range = 4
light_power = 3
light_color = "#3300ff"
+
+//VOREStation edit: medigun
+/obj/effect/projectile/muzzle/medigun
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "muzzle_medbeam"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#80F5FF"
+//VOREStation edit ends
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
index 54fa41265f..fe9a0213e3 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
@@ -107,3 +107,12 @@
light_range = 4
light_power = 3
light_color = "#3300ff"
+
+//VOREStation edit: medigun
+/obj/effect/projectile/tracer/medigun
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "medbeam"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#80F5FF"
+//VOREStation edit ends
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/temproary_visual.dm~1fb83e6... Merge pull request #5959 from elgeonmb_suit++ b/code/game/objects/effects/temporary_visuals/temproary_visual.dm~1fb83e6... Merge pull request #5959 from elgeonmb_suit++
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 3d9c4ea140..dd3ddb29ca 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 43cadda3f7..20f7e32c4c 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 7d754d8f14..1d1934bf8a 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 0000000000..c3adc484e0
--- /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 790e5471d6..b058a6b918 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -173,6 +173,7 @@
prob(3);/obj/item/weapon/reagent_containers/syringe/antiviral,
prob(5);/obj/item/weapon/reagent_containers/syringe/inaprovaline,
prob(1);/obj/item/weapon/reagent_containers/hypospray,
+ prob(1);/obj/item/weapon/storage/firstaid/ml3m_pack_med,
prob(1);/obj/item/weapon/storage/box/freezer,
prob(2);/obj/item/stack/nanopaste)
@@ -540,3 +541,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 da686ad455..43f50a8387 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 aafa6f85f3..6517dda8f8 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/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm
index f69d676ccd..d6e36b30e2 100644
--- a/code/game/turfs/flooring/flooring_decals.dm
+++ b/code/game/turfs/flooring/flooring_decals.dm
@@ -469,8 +469,8 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/grey/bordercorner
icon_state = "bordercolorcorner"
-/obj/effect/floor_decal/corner/grey/bordercorner
- icon_state = "bordercolorcorner"
+/obj/effect/floor_decal/corner/grey/bordercorner2
+ icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/grey/borderfull
icon_state = "bordercolorfull"
diff --git a/code/game/turfs/unsimulated/sky_vr.dm b/code/game/turfs/unsimulated/sky_vr.dm
index 8ba1cf0cb5..d012d08b6c 100644
--- a/code/game/turfs/unsimulated/sky_vr.dm
+++ b/code/game/turfs/unsimulated/sky_vr.dm
@@ -1,67 +1,69 @@
-///////////////////
-// Generic skyfall turf
-// Really only works well if the map doesn't have 'indoor' areas otherwise they can fall into one.
-// TODO: Fix that.
-/turf/unsimulated/floor/sky
- name = "the sky"
- desc = "It's the sky! Be careful!"
- icon = 'icons/turf/floors.dmi'
- icon_state = "sky_slow"
- dir = SOUTH
- initialized = FALSE
- var/does_skyfall = TRUE
- var/list/skyfall_levels
-
-/turf/unsimulated/floor/sky/Initialize()
- . = ..()
- if(does_skyfall && !LAZYLEN(skyfall_levels))
- error("[x],[y],[z], [get_area(src)] doesn't have skyfall_levels defined! Can't skyfall!")
- if(locate(/turf/simulated) in orange(src,1))
- set_light(2, 2, color)
-
-/turf/unsimulated/floor/sky/Entered(atom/movable/AM,atom/oldloc)
- . = ..()
- if(!does_skyfall)
- return //We don't do that
- if(isobserver(AM))
- return //Don't ghostport, very annoying
- if(AM.throwing)
- return //Being thrown over, not fallen yet
-
- var/mob/living/L
- if(isliving(AM))
- L = AM
- if(L.is_floating)
- return //Flyers/nograv can ignore it
-
- do_fall(AM)
-
-/turf/unsimulated/floor/sky/hitby(var/atom/movable/AM, var/speed)
- . = ..()
-
- if(!does_skyfall)
- return //We don't do that
-
- do_fall(AM)
-
-/turf/unsimulated/floor/sky/proc/do_fall(atom/movable/AM)
- //Bye
- var/attempts = 100
- var/turf/simulated/T
- while(attempts && !T)
- var/turf/simulated/candidate = locate(rand(5,world.maxx-5),rand(5,world.maxy-5),pick(skyfall_levels))
- if(candidate.density)
- attempts--
- continue
-
- T = candidate
- break
-
- if(!T)
- return
-
- AM.forceMove(T)
- if(isliving(AM))
- var/mob/living/L = AM
- message_admins("\The [AM] fell out of the sky.")
- L.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this.
+///////////////////
+// Generic skyfall turf
+// Really only works well if the map doesn't have 'indoor' areas otherwise they can fall into one.
+// TODO: Fix that.
+/turf/unsimulated/floor/sky
+ name = "the sky"
+ desc = "It's the sky! Be careful!"
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "sky_slow"
+ dir = SOUTH
+ initialized = FALSE
+ var/does_skyfall = TRUE
+ var/list/skyfall_levels
+
+/turf/unsimulated/floor/sky/Initialize()
+ . = ..()
+ if(does_skyfall && !LAZYLEN(skyfall_levels))
+ error("[x],[y],[z], [get_area(src)] doesn't have skyfall_levels defined! Can't skyfall!")
+ if(locate(/turf/simulated) in orange(src,1))
+ set_light(2, 2, color)
+
+/turf/unsimulated/floor/sky/Entered(atom/movable/AM,atom/oldloc)
+ . = ..()
+ if(!does_skyfall)
+ return //We don't do that
+ if(isobserver(AM))
+ return //Don't ghostport, very annoying
+ if(AM.throwing)
+ return //Being thrown over, not fallen yet
+ if(/obj/item/projectile)
+ return // Bullets/lasers/pewpew should not fall out of the sky. pew.
+
+ var/mob/living/L
+ if(isliving(AM))
+ L = AM
+ if(L.is_floating)
+ return //Flyers/nograv can ignore it
+
+ do_fall(AM)
+
+/turf/unsimulated/floor/sky/hitby(var/atom/movable/AM, var/speed)
+ . = ..()
+
+ if(!does_skyfall)
+ return //We don't do that
+
+ do_fall(AM)
+
+/turf/unsimulated/floor/sky/proc/do_fall(atom/movable/AM)
+ //Bye
+ var/attempts = 100
+ var/turf/simulated/T
+ while(attempts && !T)
+ var/turf/simulated/candidate = locate(rand(5,world.maxx-5),rand(5,world.maxy-5),pick(skyfall_levels))
+ if(candidate.density)
+ attempts--
+ continue
+
+ T = candidate
+ break
+
+ if(!T)
+ return
+
+ AM.forceMove(T)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ message_admins("\The [AM] fell out of the sky.")
+ L.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this.
diff --git a/code/global.dm b/code/global.dm
index b2ec06109d..5950ccfd14 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 3475e60314..72e2b3b39b 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 0000000000..d1dfac5dea
--- /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 719ba98a38..e7bb0493f3 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 a940620636..50dac4bb1d 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
@@ -502,6 +513,7 @@
if(usr.put_in_hands(holding))
usr.visible_message("\The [usr] pulls a knife out of their boot!")
holding = null
+ overlays -= image(icon, "[icon_state]_knife")
else
usr << "Your need an empty, unbroken hand to do that."
holding.forceMove(src)
@@ -546,7 +558,6 @@
update_icon()
/obj/item/clothing/shoes/update_icon()
- overlays.Cut()
if(holding)
overlays += image(icon, "[icon_state]_knife")
if(ismob(usr))
diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm
index b65884d3f9..8807fb93ad 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 a6625ccf30..522f79b89b 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 fc37fb2064..379a151051 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)
@@ -3087,6 +3082,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
@@ -3737,6 +3733,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 8106c52dfd..a283a6bafe 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 22b4b2e6c6..c1c7ebedaf 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 b616d456b6..c362054cfa 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 56abb25dd2..c771b53d6d 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -599,9 +599,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 3a26503f99..311e0976ca 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)
@@ -47,41 +55,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(lacertusol)
- damage = rand(5, 12)
- 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
@@ -130,7 +108,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)
@@ -157,7 +135,8 @@
//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)
@@ -185,7 +164,7 @@
if(!affecting || affecting.is_stump())
M << "They are missing that limb!"
- return 1
+ return TRUE
switch(src.a_intent)
if(I_HELP)
@@ -259,7 +238,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)
@@ -272,7 +254,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
@@ -282,7 +264,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
@@ -373,7 +355,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)
@@ -384,43 +366,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
@@ -435,11 +417,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()]
@@ -460,4 +442,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 f3526983ef..43a5ae66f2 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/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index ac2417a077..b6d4052a5f 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -35,7 +35,8 @@
"Fox" = "pai-fox",
"Parrot" = "pai-parrot",
"Rabbit" = "pai-rabbit",
- "Bear" = "pai-bear" //VOREStation Edit
+ "Bear" = "pai-bear", //VOREStation Edit
+ "Fennec" = "pai-fen" // VOREStation Edit - Rykka
)
var/global/list/possible_say_verbs = list(
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 2ff8c55598..4e86b1c68a 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 70afdaf910..e1cb92ada3 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 0000000000..4b4cdcade4
--- /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 c821cf4a56..8507480f01 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 4022198fdf..9fbb2926bb 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/mechanical/viscerator.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm
index 4098d9ff9c..3d6d43e575 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm
@@ -83,4 +83,6 @@
if(!.)
if(isrobot(L)) // They ignore synths.
return TRUE
+ if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards
+ return TRUE
return L.assess_perp(src, FALSE, FALSE, TRUE, FALSE) <= 3
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 0000000000..0aa1b700a6
--- /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 441ee77234..749a88dba6 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/projectiles/guns/energy/special_vr.dm b/code/modules/projectiles/guns/energy/special_vr.dm
index e1cfcaf5c9..73e878eed6 100644
--- a/code/modules/projectiles/guns/energy/special_vr.dm
+++ b/code/modules/projectiles/guns/energy/special_vr.dm
@@ -2,4 +2,26 @@
projectile_type = /obj/item/projectile/ion/pistol // still packs a punch but no AoE
/obj/item/weapon/gun/energy/ionrifle/weak
- projectile_type = /obj/item/projectile/ion/small
\ No newline at end of file
+ projectile_type = /obj/item/projectile/ion/small
+
+/obj/item/weapon/gun/energy/medigun //Adminspawn/ERT etc
+ name = "directed restoration system"
+ desc = "The BL-3 'Phoenix' is an adaptation on the ML-3 'Medbeam' design that channels the power of the beam into a single healing laser. It is highly energy-inefficient, but its medical power cannot be denied."
+ force = 5
+ icon_state = "medbeam"
+ item_state = "medbeam"
+ icon = 'icons/obj/gun_vr.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi',
+ )
+ slot_flags = SLOT_BELT
+ accuracy = 100
+ fire_delay = 12
+ fire_sound = 'sound/weapons/eluger.ogg'
+
+ projectile_type = /obj/item/projectile/beam/medigun
+
+ accept_cell_type = /obj/item/weapon/cell
+ cell_type = /obj/item/weapon/cell/high
+ charge_cost = 2500
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/beams_vr.dm b/code/modules/projectiles/projectile/beams_vr.dm
index b6ec5cbe0b..8930260e9e 100644
--- a/code/modules/projectiles/projectile/beams_vr.dm
+++ b/code/modules/projectiles/projectile/beams_vr.dm
@@ -41,3 +41,37 @@
muzzle_type = /obj/effect/projectile/muzzle/laser_blue
tracer_type = /obj/effect/projectile/tracer/laser_blue
impact_type = /obj/effect/projectile/impact/laser_blue
+
+/obj/item/projectile/beam/medigun
+ name = "healing beam"
+ icon_state = "healbeam"
+ damage = 0 //stops it damaging walls
+ nodamage = TRUE
+ no_attack_log = TRUE
+ damage_type = BURN
+ check_armour = "laser"
+ light_color = "#80F5FF"
+
+ combustion = FALSE
+
+ muzzle_type = /obj/effect/projectile/muzzle/medigun
+ tracer_type = /obj/effect/projectile/tracer/medigun
+ impact_type = /obj/effect/projectile/impact/medigun
+
+/obj/item/projectile/beam/medigun/on_hit(var/atom/target, var/blocked = 0)
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/M = target
+ if(M.health < M.maxHealth)
+ var/obj/effect/overlay/pulse = new /obj/effect/overlay(get_turf(M))
+ pulse.icon = 'icons/effects/effects.dmi'
+ pulse.icon_state = "heal"
+ pulse.name = "heal"
+ pulse.anchored = 1
+ spawn(20)
+ qdel(pulse)
+ to_chat(target, "As the beam strikes you, your injuries close up!")
+ M.adjustBruteLoss(-15)
+ M.adjustFireLoss(-15)
+ M.adjustToxLoss(-5)
+ M.adjustOxyLoss(-5)
+ return 1
\ No newline at end of file
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 0da87f2d0c..48afe19b7e 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 a903454801..01de315c2d 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_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm
index 7a0b26d176..f99910a123 100644
--- a/code/modules/vore/fluffstuff/custom_guns_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm
@@ -730,7 +730,7 @@
icon_state = "r357"
ammo_type = /obj/item/ammo_casing/a44/rubber
-//Expedition pistol
+//Expedition Frontier Phaser
/obj/item/weapon/gun/energy/frontier
name = "frontier phaser"
desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization."
@@ -746,6 +746,7 @@
unacidable = 1
var/recharging = 0
+ var/phase_power = 75
projectile_type = /obj/item/projectile/beam
firemodes = list(
@@ -764,7 +765,7 @@
if(!do_after(user, 10, src))
break
playsound(get_turf(src),'sound/items/change_drill.ogg',25,1)
- if(power_supply.give(60) < 60)
+ if(power_supply.give(phase_power) < phase_power)
break
recharging = 0
@@ -835,13 +836,14 @@
return
..()
-//Expeditionary Holdout Phaser
+//Expeditionary Holdout Phaser Pistol
/obj/item/weapon/gun/energy/frontier/locked/holdout
name = "holdout frontier phaser"
desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "holdoutkill"
item_state = null
+ phase_power = 100
w_class = ITEMSIZE_SMALL
charge_cost = 600
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index da0133d719..2f00fe479a 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -1243,7 +1243,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()
@@ -1258,7 +1259,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)
@@ -1275,7 +1279,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"
@@ -1337,7 +1341,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)
@@ -1366,7 +1370,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
@@ -1397,10 +1401,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
@@ -1561,14 +1568,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
@@ -2007,7 +2017,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/vore/fluffstuff/guns/nsfw.dm b/code/modules/vore/fluffstuff/guns/nsfw.dm
index 48e7f889f8..514fee5014 100644
--- a/code/modules/vore/fluffstuff/guns/nsfw.dm
+++ b/code/modules/vore/fluffstuff/guns/nsfw.dm
@@ -1,15 +1,11 @@
// -------------- NSFW -------------
-/obj/item/weapon/gun/projectile/nsfw
+/obj/item/weapon/gun/projectile/nsfw //this one can load both medical and security cells! for ERT/admin use.
name = "cell-loaded revolver"
- desc = "Variety is the spice of life! The KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \
- energy weapon that allows the user to mix and match their own fire modes. Up to three combinations of \
+ desc = "Variety is the spice of life! This weapon is a hybrid of the KHI-102b 'Nanotech Selectable-Fire Weapon' and the Vey-Med ML-3 'Medigun', dubbed the 'NSFW-ML3M'. \
+ It can fire both harmful and healing cells with an internal nanite fabricator and energy weapon cell loader. Up to three combinations of \
energy beams can be configured at once. Ammo not included."
catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
- description_info = "This gun is an energy weapon that uses interchangable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type."
- description_fluff = "The Kitsuhana 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding."
- description_antag = ""
-
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "nsfw"
@@ -142,14 +138,44 @@
charge_bar.color = batt_color
add_overlay(charge_bar)
+/obj/item/weapon/gun/projectile/nsfw/combat
+ name = "cell-loaded revolver"
+ desc = "Variety is the spice of life! The KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \
+ energy weapon that allows the user to mix and match their own fire modes. Up to three combinations of \
+ energy beams can be configured at once. Ammo not included."
+ catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
+
+ description_info = "This gun is an energy weapon that uses interchangable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type."
+ description_fluff = "The Kitsuhana 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding."
+ description_antag = ""
+ allowed_magazines = list(/obj/item/ammo_magazine/nsfw_mag/combat)
+
+
+/obj/item/weapon/gun/projectile/nsfw/medical
+ name = "\improper ML-3 \'Medigun\'"
+ desc = "The ML-3 'Medigun', or ML3M for short, is a powerful cell-based ranged healing device based on the KHI-102b NSFW. \
+ It uses an internal nanite fabricator, powered and controlled by discrete cells, to deliver a variety of effects at range. Up to three combinations of \
+ healing beams can be configured at once. Ammo not included."
+ catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
+
+ icon_state = "ml3m"
+ description_info = "This is a ranged healing device that uses interchangable nanite discharge cells in a magazine. Each cell is a different healing beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type."
+ description_fluff = "The Vey-Med ML-3 'Medigun' allows one to customize their loadout in the field, or before deploying, to allow emergency response personnel to deliver a variety of ranged healing options."
+ description_antag = ""
+ allowed_magazines = list(/obj/item/ammo_magazine/nsfw_mag/medical)
+
+/obj/item/weapon/gun/projectile/nsfw/medical/cmo
+ name = "\improper Advanced ML-3 \'Medigun\'"
+ desc = "This is a variation on the ML-3 'Medigun', a powerful cell-based ranged healing device based on the KHI-102b NSFW. \
+ It has an extended sight for increased accuracy, and is capable of holding large magazines. Ammo not included."
+
+ icon_state = "ml3m_cmo"
+
+
// The Magazine //
/obj/item/ammo_magazine/nsfw_mag
name = "microbattery magazine"
- desc = "A microbattery holder for the \'NSFW\'"
- catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
-
- description_info = "This magazine holds NSFW microbatteries to power the NSFW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger."
-
+ desc = "A microbattery holder for a cell-based variable weapon."
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "nsfw_mag"
caliber = "nsfw"
@@ -157,6 +183,9 @@
ammo_type = /obj/item/ammo_casing/nsfw_batt
initial_ammo = 0
max_ammo = 3
+ var/x_offset = 5 //for update_icon() shenanigans- moved here so it can be adjusted for bigger mags
+ var/capname = "nsfw_mag" //as above
+ var/chargename = "nsfw_mag" //as above
mag_type = MAGAZINE
var/list/modes = list()
@@ -166,24 +195,45 @@
if(!stored_ammo.len)
return //Why bother
- var/x_offset = 5
var/current = 0
for(var/B in stored_ammo)
var/obj/item/ammo_casing/nsfw_batt/batt = B
- var/image/cap = image(icon, icon_state = "[initial(icon_state)]_cap")
+ var/image/cap = image(icon, icon_state = "[capname]_cap")
cap.color = batt.type_color
cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset
add_overlay(cap)
if(batt.shots_left)
var/ratio = CEILING(((batt.shots_left / initial(batt.shots_left)) * 4), 1) //4 is how many lights we have a sprite for
- var/image/charge = image(icon, icon_state = "[initial(icon_state)]_charge-[ratio]")
+ var/image/charge = image(icon, icon_state = "[chargename]_charge-[ratio]")
charge.color = "#29EAF4" //Could use battery color but eh.
charge.pixel_x = current * x_offset
add_overlay(charge)
current++ //Increment for offsets
+/obj/item/ammo_magazine/nsfw_mag/combat //security
+ name = "microbattery magazine"
+ desc = "A microbattery holder for the \'NSFW\'"
+ catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
+ description_info = "This magazine holds NSFW microbatteries to power the NSFW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger."
+ ammo_type = /obj/item/ammo_casing/nsfw_batt/combat
+
+/obj/item/ammo_magazine/nsfw_mag/medical //medical
+ name = "nanite magazine"
+ desc = "A nanite fabrication magazine for the \'ML-3/M\'"
+ catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
+ description_info = "This magazine holds self-charging nanite fabricators to power the ML-3 'Medigun'. Up to three can be loaded at once, and each provides four shots of their respective healing type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger."
+ ammo_type = /obj/item/ammo_casing/nsfw_batt/medical
+ icon_state = "ml3m_mag"
+
+/obj/item/ammo_magazine/nsfw_mag/medical/advanced
+ name = "advanced nanite magazine"
+ desc = "A nanite discharge cell for the \'ML-3/M\'. This one is a more advanced version which can hold six individual nanite discharge cells."
+ max_ammo = 6
+ x_offset = 3
+ icon_state = "ml3m_mag_extended"
+
// The Casing //
/obj/item/ammo_casing/nsfw_batt
name = "\'NSFW\' microbattery - UNKNOWN"
@@ -194,10 +244,10 @@
slot_flags = SLOT_BELT | SLOT_EARS
throwforce = 1
w_class = ITEMSIZE_TINY
+ var/shots_left = 4
leaves_residue = 0
caliber = "nsfw"
- var/shots_left = 4
var/type_color = null
var/type_name = null
projectile_type = /obj/item/projectile/beam
@@ -219,31 +269,38 @@
shots_left--
// Specific batteries //
-/obj/item/ammo_casing/nsfw_batt/lethal
+// Security (Combat) //
+
+/obj/item/ammo_casing/nsfw_batt/combat
+ name = "\'NSFW\' microbattery - UNKNOWN"
+ desc = "A miniature battery for an energy weapon."
+ catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
+
+/obj/item/ammo_casing/nsfw_batt/combat/lethal
name = "\'NSFW\' microbattery - LETHAL"
type_color = "#bf3d3d"
type_name = "LETHAL"
projectile_type = /obj/item/projectile/beam
-/obj/item/ammo_casing/nsfw_batt/stun
+/obj/item/ammo_casing/nsfw_batt/combat/stun
name = "\'NSFW\' microbattery - STUN"
type_color = "#0f81bc"
type_name = "STUN"
projectile_type = /obj/item/projectile/beam/stun/blue
-/obj/item/ammo_casing/nsfw_batt/net
+/obj/item/ammo_casing/nsfw_batt/combat/net
name = "\'NSFW\' microbattery - NET"
type_color = "#43f136"
type_name = "NET"
projectile_type = /obj/item/projectile/beam/energy_net
-/obj/item/ammo_casing/nsfw_batt/xray
+/obj/item/ammo_casing/nsfw_batt/combat/xray
name = "\'NSFW\' microbattery - XRAY"
type_color = "#32c025"
type_name = "XRAY"
projectile_type = /obj/item/projectile/beam/xray
-/obj/item/ammo_casing/nsfw_batt/shotstun
+/obj/item/ammo_casing/nsfw_batt/combat/shotstun
name = "\'NSFW\' microbattery - SCATTERSTUN"
type_color = "#88ffff"
type_name = "SCATTERSTUN"
@@ -261,13 +318,13 @@
sharp = 0
check_armour = "melee"
-/obj/item/ammo_casing/nsfw_batt/ion
+/obj/item/ammo_casing/nsfw_batt/combat/ion
name = "\'NSFW\' microbattery - ION"
type_color = "#d084d6"
type_name = "ION"
projectile_type = /obj/item/projectile/ion/small
-/obj/item/ammo_casing/nsfw_batt/stripper
+/obj/item/ammo_casing/nsfw_batt/combat/stripper
name = "\'NSFW\' microbattery - STRIPPER"
type_color = "#fc8d0f"
type_name = "STRIPPER"
@@ -297,7 +354,7 @@
//Hats can stay! Most other things fall off with removing these.
..()
-/obj/item/ammo_casing/nsfw_batt/final
+/obj/item/ammo_casing/nsfw_batt/combat/final
name = "\'NSFW\' microbattery - FINAL OPTION"
type_color = "#fcfc0f"
type_name = "FINAL OPTION" //Doesn't look good in yellow in chat
@@ -327,45 +384,366 @@
L.gib()
..()
-/*
-/obj/item/ammo_casing/nsfw_batt/shrink
- name = "\'NSFW\' microbattery - SHRINK"
- type_color = "#910ffc"
- type_name = "SHRINK"
- projectile_type = /obj/item/projectile/beam/shrinklaser
-/obj/item/ammo_casing/nsfw_batt/grow
- name = "\'NSFW\' microbattery - GROW"
- type_color = "#fc0fdc"
- type_name = "GROW"
- projectile_type = /obj/item/projectile/beam/growlaser
-*/
/obj/item/weapon/storage/secure/briefcase/nsfw_pack
name = "\improper KHI-102b \'NSFW\' gun kit"
desc = "A storage case for a multi-purpose handgun. Variety hour!"
+ w_class = ITEMSIZE_NORMAL
max_w_class = ITEMSIZE_NORMAL
/obj/item/weapon/storage/secure/briefcase/nsfw_pack/New()
..()
- new /obj/item/weapon/gun/projectile/nsfw(src)
- new /obj/item/ammo_magazine/nsfw_mag(src)
- for(var/path in subtypesof(/obj/item/ammo_casing/nsfw_batt))
+ new /obj/item/weapon/gun/projectile/nsfw/combat(src)
+ new /obj/item/ammo_magazine/nsfw_mag/combat(src)
+ for(var/path in subtypesof(/obj/item/ammo_casing/nsfw_batt/combat))
new path(src)
/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos
name = "\improper KHI-102b \'NSFW\' gun kit"
desc = "A storage case for a multi-purpose handgun. Variety hour!"
+ w_class = ITEMSIZE_NORMAL
max_w_class = ITEMSIZE_NORMAL
/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos/New()
..()
- new /obj/item/weapon/gun/projectile/nsfw(src)
- new /obj/item/ammo_magazine/nsfw_mag(src)
- new /obj/item/ammo_magazine/nsfw_mag(src)
- new /obj/item/ammo_casing/nsfw_batt/lethal(src)
- new /obj/item/ammo_casing/nsfw_batt/lethal(src)
- new /obj/item/ammo_casing/nsfw_batt/stun(src)
- new /obj/item/ammo_casing/nsfw_batt/stun(src)
- new /obj/item/ammo_casing/nsfw_batt/net(src)
- new /obj/item/ammo_casing/nsfw_batt/ion(src)
+ new /obj/item/weapon/gun/projectile/nsfw/combat(src)
+ new /obj/item/ammo_magazine/nsfw_mag/combat(src)
+ new /obj/item/ammo_casing/nsfw_batt/combat/lethal(src)
+ new /obj/item/ammo_casing/nsfw_batt/combat/lethal(src)
+ new /obj/item/ammo_casing/nsfw_batt/combat/stun(src)
+ new /obj/item/ammo_casing/nsfw_batt/combat/stun(src)
+ new /obj/item/ammo_casing/nsfw_batt/combat/net(src)
+ new /obj/item/ammo_casing/nsfw_batt/combat/ion(src)
+/obj/item/weapon/storage/firstaid/ml3m_pack_med
+ name = "\improper ML-3 \'Medigun\' kit"
+ desc = "A storage case for a multi-purpose healing gun. Variety hour!"
+ w_class = ITEMSIZE_NORMAL
+ max_w_class = ITEMSIZE_NORMAL
+ icon_state = "pinky"
+
+/obj/item/weapon/storage/firstaid/ml3m_pack_med/New()
+ ..()
+ new /obj/item/weapon/gun/projectile/nsfw/medical(src)
+ new /obj/item/ammo_magazine/nsfw_mag/medical(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/brute(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/burn(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/stabilize(src)
+
+/obj/item/weapon/storage/firstaid/ml3m_pack_cmo
+ name = "\improper Advanced ML-3 \'Medigun\' kit"
+ desc = "A storage case for a multi-purpose healing gun. Variety hour!"
+ w_class = ITEMSIZE_NORMAL
+ max_w_class = ITEMSIZE_NORMAL
+ icon_state = "clottingkit"
+
+/obj/item/weapon/storage/firstaid/ml3m_pack_cmo/New()
+ ..()
+ new /obj/item/weapon/gun/projectile/nsfw/medical/cmo(src)
+ new /obj/item/ammo_magazine/nsfw_mag/medical/advanced(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/brute2(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/brute2(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/burn2(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/burn2(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/stabilize2(src)
+ new /obj/item/ammo_casing/nsfw_batt/medical/stabilize2(src)
+
+
+// Medical //
+
+/obj/item/ammo_casing/nsfw_batt/medical
+ name = "\'ML-3/M\' nanite cell - UNKNOWN"
+ desc = "A miniature nanite fabricator for a medigun."
+ catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
+ icon_state = "ml3m_batt"
+
+/obj/item/projectile/beam/ML3M
+ name = "\improper healing beam"
+ icon_state = "medbeam"
+ nodamage = 1
+ damage = 0
+ check_armour = "laser"
+ light_color = "#80F5FF"
+
+ combustion = FALSE
+
+ muzzle_type = /obj/effect/projectile/muzzle/medigun
+ tracer_type = /obj/effect/projectile/tracer/medigun
+ impact_type = /obj/effect/projectile/impact/medigun
+
+/obj/item/projectile/beam/ML3M/on_hit(var/mob/living/carbon/human/target) //what does it do when it hits someone?
+ return
+
+/obj/item/ammo_casing/nsfw_batt/medical/brute
+ name = "\'ML-3/M\' nanite cell - BRUTE"
+ type_color = "#BF0000"
+ type_name = "BRUTE"
+ projectile_type = /obj/item/projectile/beam/ML3M/brute
+
+/obj/item/projectile/beam/ML3M/brute/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustBruteLoss(-10)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/burn
+ name = "\'ML-3/M\' nanite cell - BURN"
+ type_color = "#FF8000"
+ type_name = "BURN"
+ projectile_type = /obj/item/projectile/beam/ML3M/burn
+
+/obj/item/projectile/beam/ML3M/burn/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustFireLoss(-10)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/stabilize
+ name = "\'ML-3/M\' nanite cell - STABILIZE" //Disinfects all open wounds, cures oxy damage
+ type_color = "#0080FF"
+ type_name = "STABILIZE"
+ projectile_type = /obj/item/projectile/beam/ML3M/stabilize
+
+/obj/item/projectile/beam/ML3M/stabilize/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustOxyLoss(-30)
+ for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
+ var/obj/item/organ/external/O = target.organs_by_name[name]
+ for (var/datum/wound/W in O.wounds)
+ if (W.internal)
+ continue
+ W.disinfect()
+ target.add_modifier(/datum/modifier/stabilize, 20 SECONDS)
+ else
+ return 1
+
+/datum/modifier/stabilize
+ name = "stabilize"
+ desc = "Your injuries are stabilized and your pain abates!"
+ mob_overlay_state = "cyan_sparkles"
+ stacks = MODIFIER_STACK_EXTEND
+ pain_immunity = TRUE
+ bleeding_rate_percent = 0.1 //only a little
+ incoming_oxy_damage_percent = 0
+
+/obj/item/ammo_casing/nsfw_batt/medical/tox
+ name = "\'ML-3/M\' nanite cell - TOX"
+ type_color = "#00A000"
+ type_name = "TOX"
+ projectile_type = /obj/item/projectile/beam/ML3M/tox
+
+/obj/item/projectile/beam/ML3M/tox/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustToxLoss(-10)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/omni
+ name = "\'ML-3/M\' nanite cell - OMNI"
+ type_color = "#8040FF"
+ type_name = "OMNI"
+ projectile_type = /obj/item/projectile/beam/ML3M/omni
+
+/obj/item/projectile/beam/ML3M/omni/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustBruteLoss(-5)
+ target.adjustFireLoss(-5)
+ target.adjustToxLoss(-5)
+ target.adjustOxyLoss(-15)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/antirad
+ name = "\'ML-3/M\' nanite cell - OMNI"
+ type_color = "#008000"
+ type_name = "ANTIRAD"
+ projectile_type = /obj/item/projectile/beam/ML3M/antirad
+
+/obj/item/projectile/beam/ML3M/antirad/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustToxLoss(-5)
+ target.radiation = max(target.radiation - 350, 0) //same as 5 units of arithrazine, sans the brute damage
+ else
+ return 1
+
+
+/obj/item/ammo_casing/nsfw_batt/medical/brute2
+ name = "\'ML-3/M\' nanite cell - BRUTE-II"
+ type_color = "#BF0000"
+ type_name = "BRUTE-II"
+ projectile_type = /obj/item/projectile/beam/ML3M/brute2
+
+/obj/item/projectile/beam/ML3M/brute2/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustBruteLoss(-20)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/burn2
+ name = "\'ML-3/M\' nanite cell - BURN-II"
+ type_color = "#FF8000"
+ type_name = "BURN-II"
+ projectile_type = /obj/item/projectile/beam/ML3M/burn2
+
+/obj/item/projectile/beam/ML3M/burn2/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustFireLoss(-20)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/stabilize2
+ name = "\'ML-3/M\' nanite cell - STABILIZE-II" //Disinfects and bandages all open wounds, cures all oxy damage
+ type_color = "#0080FF"
+ type_name = "STABILIZE-II"
+ projectile_type = /obj/item/projectile/beam/ML3M/stabilize2
+
+/obj/item/projectile/beam/ML3M/stabilize2/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustOxyLoss(-200)
+ for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
+ var/obj/item/organ/external/O = target.organs_by_name[name]
+ for (var/datum/wound/W in O.wounds)
+ if(W.internal)
+ continue
+ if(O.is_bandaged() == FALSE)
+ W.bandage()
+ if(O.is_salved() == FALSE)
+ W.salve()
+ W.disinfect()
+ target.add_modifier(/datum/modifier/stabilize, 20 SECONDS)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/omni2
+ name = "\'ML-3/M\' nanite cell - OMNI-II"
+ type_color = "#8040FF"
+ type_name = "OMNI-II"
+ projectile_type = /obj/item/projectile/beam/ML3M/omni2
+
+/obj/item/projectile/beam/ML3M/omni2/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustBruteLoss(-10)
+ target.adjustFireLoss(-10)
+ target.adjustToxLoss(-10)
+ target.adjustOxyLoss(-30)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/tox2
+ name = "\'ML-3/M\' nanite cell - TOX-II"
+ type_color = "#00A000"
+ type_name = "TOX-II"
+ projectile_type = /obj/item/projectile/beam/ML3M/tox2
+
+/obj/item/projectile/beam/ML3M/tox2/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.adjustToxLoss(-20)
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/haste
+ name = "\'ML-3/M\' nanite cell - HASTE"
+ type_color = "#FF3300"
+ type_name = "HASTE"
+ projectile_type = /obj/item/projectile/beam/ML3M/haste
+
+/obj/item/projectile/beam/ML3M/haste/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.add_modifier(/datum/modifier/ml3mhaste, 20 SECONDS)
+ else
+ return 1
+
+/datum/modifier/ml3mhaste
+ name = "haste"
+ desc = "You can move much faster!"
+ mob_overlay_state = "haste"
+ stacks = MODIFIER_STACK_EXTEND
+ slowdown = -1 //a little faster!
+ evasion = 1.25 //and a little harder to hit!
+
+/obj/item/ammo_casing/nsfw_batt/medical/resistance
+ name = "\'ML-3/M\' nanite cell - RESIST"
+ type_color = "#555555"
+ type_name = "RESIST"
+ projectile_type = /obj/item/projectile/beam/ML3M/resistance
+
+/obj/item/projectile/beam/ML3M/resistance/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.add_modifier(/datum/modifier/resistance, 20 SECONDS)
+ else
+ return 1
+
+/datum/modifier/resistance
+ name = "resistance"
+ desc = "You resist 25% of all incoming damage and stuns!"
+ mob_overlay_state = "repel_missiles"
+ stacks = MODIFIER_STACK_EXTEND
+ disable_duration_percent = 0.75
+ incoming_damage_percent = 0.75
+
+/obj/item/ammo_casing/nsfw_batt/medical/revival
+ name = "\'ML-3/M\' nanite cell - REVIVAL"
+ type_color = "#669900"
+ type_name = "REVIVAL"
+ projectile_type = /obj/item/projectile/beam/ML3M/revival
+
+/obj/item/projectile/beam/ML3M/revival/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ if(target.stat == DEAD)
+ target.adjustBruteLoss(-50)
+ target.adjustFireLoss(-50)
+ target.adjustToxLoss(-50)
+ target.adjustOxyLoss(-200)
+ else
+ return 1
+
+/datum/modifier/resistance
+ name = "resistance"
+ desc = "You resist 25% of all incoming damage and stuns!"
+ mob_overlay_state = "repel_missiles"
+ stacks = MODIFIER_STACK_EXTEND
+ disable_duration_percent = 0.75
+ incoming_damage_percent = 0.75
+
+// Illegal cells!
+/obj/item/ammo_casing/nsfw_batt/medical/shrink
+ name = "\'ML-3/M\' nanite cell - SHRINK"
+ type_color = "#910ffc"
+ type_name = "SHRINK"
+ projectile_type = /obj/item/projectile/beam/ML3M/shrink
+
+/obj/item/projectile/beam/ML3M/shrink/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.resize(0.5)
+ target.show_message(" The beam fires into your body, changing your size!")
+ target.updateicon()
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/grow
+ name = "\'ML-3/M\' nanite cell - GROW"
+ type_color = "#fc0fdc"
+ type_name = "GROW"
+ projectile_type = /obj/item/projectile/beam/ML3M/grow
+
+/obj/item/projectile/beam/ML3M/grow/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.resize(2.0)
+ target.show_message(" The beam fires into your body, changing your size!")
+ target.updateicon()
+ else
+ return 1
+
+/obj/item/ammo_casing/nsfw_batt/medical/normalsize
+ name = "\'ML-3/M\' nanite cell - NORMALSIZE"
+ type_color = "#C70FEC"
+ type_name = "NORMALSIZE"
+ projectile_type = /obj/item/projectile/beam/ML3M/normalsize
+
+/obj/item/projectile/beam/ML3M/normalsize/on_hit(var/mob/living/carbon/human/target)
+ if(istype(target, /mob/living/carbon/human))
+ target.resize(1)
+ target.show_message(" The beam fires into your body, changing your size!")
+ target.updateicon()
+ else
+ return 1
\ No newline at end of file
diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm
index 705bf3538d..984e05f8ed 100644
--- a/code/modules/vore/resizing/sizegun_vr.dm
+++ b/code/modules/vore/resizing/sizegun_vr.dm
@@ -82,3 +82,11 @@
H.updateicon()
else
return 1
+
+
+/obj/item/projectile/beam/sizelaser/shrink
+ set_size = 0.5 //50% of current size
+
+
+/obj/item/projectile/beam/sizelaser/grow
+ set_size = 2.0 //200% of current size
\ No newline at end of file
diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm
index ab5d00e786..8e89dcd947 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/html/changelogs/Novacat - MREs.yml b/html/changelogs/Novacat - MREs.yml
new file mode 100644
index 0000000000..869135e3fb
--- /dev/null
+++ b/html/changelogs/Novacat - MREs.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Novacat
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Ports MREs from Baystation, and adds a few supply crates with them to cargo."
+ - rscadd: "Adds liquidprotein rations, currently only found in emergency MREs."
\ No newline at end of file
diff --git a/icons/mecha/mecha_equipment_vr.dmi b/icons/mecha/mecha_equipment_vr.dmi
index 7bb519d706..ec23292b90 100644
Binary files a/icons/mecha/mecha_equipment_vr.dmi and b/icons/mecha/mecha_equipment_vr.dmi differ
diff --git a/icons/mob/animal_vr.dmi b/icons/mob/animal_vr.dmi
index 2d8cd7a6a1..801f3ddf33 100644
Binary files a/icons/mob/animal_vr.dmi and b/icons/mob/animal_vr.dmi differ
diff --git a/icons/mob/items/lefthand_guns_vr.dmi b/icons/mob/items/lefthand_guns_vr.dmi
index c64d1453e4..76ad8ebf31 100644
Binary files a/icons/mob/items/lefthand_guns_vr.dmi and b/icons/mob/items/lefthand_guns_vr.dmi differ
diff --git a/icons/mob/items/righthand_guns_vr.dmi b/icons/mob/items/righthand_guns_vr.dmi
index 193d6ee292..42d935f760 100644
Binary files a/icons/mob/items/righthand_guns_vr.dmi and b/icons/mob/items/righthand_guns_vr.dmi differ
diff --git a/icons/mob/pai_vr.dmi b/icons/mob/pai_vr.dmi
index e6591e1326..cb494851af 100644
Binary files a/icons/mob/pai_vr.dmi and b/icons/mob/pai_vr.dmi differ
diff --git a/icons/obj/ammo_vr.dmi b/icons/obj/ammo_vr.dmi
index b5defc3782..2fa66e4424 100644
Binary files a/icons/obj/ammo_vr.dmi and b/icons/obj/ammo_vr.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 65d92bbe67..de2f69b813 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 7a6d3c5226..ea92af4493 100644
Binary files a/icons/obj/food_vr.dmi and b/icons/obj/food_vr.dmi differ
diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi
index bb393fc1f7..ecb1e88d4b 100644
Binary files a/icons/obj/gun_vr.dmi and b/icons/obj/gun_vr.dmi differ
diff --git a/icons/obj/projectiles_vr.dmi b/icons/obj/projectiles_vr.dmi
index 91baf24807..ecc3445c92 100644
Binary files a/icons/obj/projectiles_vr.dmi and b/icons/obj/projectiles_vr.dmi differ
diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi
index 4585d41d70..2fe1a91c98 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 17004c289d..2c7fed4c7a 100644
Binary files a/icons/obj/trash_vr.dmi and b/icons/obj/trash_vr.dmi differ
diff --git a/icons/vore/custom_guns_vr.dmi b/icons/vore/custom_guns_vr.dmi
index c09ac65d22..2fa1627876 100644
Binary files a/icons/vore/custom_guns_vr.dmi and b/icons/vore/custom_guns_vr.dmi differ
diff --git a/maps/southern_cross/structures/closets/misc_vr.dm b/maps/southern_cross/structures/closets/misc_vr.dm
index 384aa93134..033a5384ef 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/submaps/beach/_beach.dm b/maps/tether/submaps/beach/_beach.dm
index 1759fb0f02..5650c8db96 100644
--- a/maps/tether/submaps/beach/_beach.dm
+++ b/maps/tether/submaps/beach/_beach.dm
@@ -155,6 +155,7 @@
//And some special areas, including our shuttle landing spot (must be unique)
/area/shuttle/excursion/away_beach
name = "\improper Excursion Shuttle - Beach"
+ base_turf = /turf/simulated/floor/beach/sand/desert
dynamic_lighting = 0
/area/tether_away/beach
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index a46007713f..b438943428 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -3603,6 +3603,9 @@
/obj/effect/floor_decal/borderfloor/corner2{
dir = 10
},
+/obj/effect/floor_decal/corner/grey/bordercorner2{
+ dir = 10
+ },
/turf/simulated/floor/tiled,
/area/crew_quarters/visitor_laundry)
"aga" = (
@@ -4676,8 +4679,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 +4691,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 +4902,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 +4911,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 +5094,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" = (
@@ -7498,6 +7502,26 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/mining_eva)
+"anr" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/grey/border{
+ icon_state = "bordercolor";
+ dir = 8
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 8
+ },
+/obj/machinery/disposal,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/grey/bordercorner2{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/crew_quarters/visitor_laundry)
"anw" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -25135,23 +25159,6 @@
},
/turf/simulated/floor/wood,
/area/crew_quarters/sleep/Dorm_7)
-"chl" = (
-/obj/effect/floor_decal/borderfloor{
- dir = 8
- },
-/obj/effect/floor_decal/corner/grey/border{
- icon_state = "bordercolor";
- dir = 8
- },
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 8
- },
-/obj/machinery/disposal,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/crew_quarters/visitor_laundry)
"chm" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 1
@@ -47242,7 +47249,7 @@ ceK
afZ
cfL
cgk
-chl
+anr
rEC
chO
cje
diff --git a/maps/tether/tether-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm
index 394dbcdc46..7e9c9b11f5 100644
--- a/maps/tether/tether-02-surface2.dmm
+++ b/maps/tether/tether-02-surface2.dmm
@@ -3475,64 +3475,51 @@
/turf/simulated/wall,
/area/tether/surfacebase/fish_farm)
"hE" = (
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 4
- },
-/obj/machinery/light_switch{
- dir = 1;
- pixel_x = 4;
- pixel_y = -24
- },
-/turf/simulated/floor/tiled,
-/area/tether/surfacebase/north_staires_two)
-"hF" = (
-/obj/machinery/alarm{
- dir = 1;
- pixel_y = -25
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
-/turf/simulated/floor/tiled,
-/area/tether/surfacebase/north_staires_two)
-"hG" = (
+/obj/structure/table/rack,
+/obj/item/weapon/material/fishing_rod/modern/cheap,
+/obj/item/weapon/material/fishing_rod/modern/cheap,
+/obj/item/weapon/material/fishing_rod/modern/cheap,
+/obj/item/weapon/material/fishing_rod/modern/cheap,
+/obj/item/weapon/material/fishing_rod/modern/cheap,
/obj/machinery/firealarm{
- dir = 1;
- pixel_x = 0;
- pixel_y = -25
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/door/firedoor/glass/hidden/steel{
- dir = 1
+ dir = 4;
+ pixel_x = 24
},
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/north_staires_two)
+/area/tether/surfacebase/fish_farm)
+"hF" = (
+/obj/structure/railing{
+ icon_state = "railing0";
+ dir = 4
+ },
+/turf/simulated/floor/water/deep/indoors,
+/area/tether/surfacebase/fish_farm)
+"hG" = (
+/obj/structure/table/rack,
+/obj/item/stack/cable_coil/pink,
+/obj/item/stack/cable_coil/pink,
+/obj/item/stack/cable_coil/pink,
+/obj/item/stack/cable_coil/pink,
+/obj/item/stack/cable_coil/pink,
+/obj/machinery/alarm{
+ dir = 8;
+ icon_state = "alarm0";
+ pixel_x = 24
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/fish_farm)
"hH" = (
/obj/structure/cable{
- icon_state = "0-4";
- d2 = 4
+ icon_state = "2-4"
},
-/obj/machinery/power/apc{
- dir = 2;
- name = "south bump";
- pixel_y = -28
+/obj/effect/floor_decal/borderfloor{
+ dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 9
},
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/north_staires_two)
+/area/tether/surfacebase/atrium_two)
"hI" = (
/obj/machinery/door/airlock/maintenance/common,
/obj/structure/cable{
@@ -3930,7 +3917,14 @@
/area/maintenance/lower/rnd)
"iy" = (
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 1;
+ pixel_y = 0
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/atrium_two)
@@ -3938,14 +3932,35 @@
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 1;
+ pixel_y = 0
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/atrium_two)
"iA" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/effect/floor_decal/borderfloor{
+ dir = 1;
+ pixel_y = 0
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/north_staires_two)
+/area/tether/surfacebase/atrium_two)
"iB" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -10041,16 +10056,27 @@
/turf/simulated/floor/tiled,
/area/engineering/lower/atmos_lockers)
"tU" = (
-/obj/effect/floor_decal/rust,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/effect/floor_decal/borderfloor{
+ dir = 1;
+ pixel_y = 0
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightgrey/bordercorner2{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/glass/hidden/steel{
+ dir = 2
+ },
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/atrium_two)
+/area/tether/surfacebase/north_staires_two)
"tV" = (
/turf/simulated/floor/tiled/monotile,
/area/engineering/atmos)
@@ -10104,7 +10130,9 @@
dir = 2
},
/obj/structure/cable{
- icon_state = "4-8"
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/north_staires_two)
@@ -10121,14 +10149,12 @@
/turf/simulated/floor/tiled/techmaint,
/area/tether/surfacebase/east_stairs_two)
"ue" = (
-/obj/structure/table/rack,
-/obj/item/weapon/material/fishing_rod/modern/cheap,
-/obj/item/weapon/material/fishing_rod/modern/cheap,
-/obj/item/weapon/material/fishing_rod/modern/cheap,
-/obj/item/weapon/material/fishing_rod/modern/cheap,
-/obj/item/weapon/material/fishing_rod/modern/cheap,
+/obj/effect/floor_decal/industrial/warning{
+ icon_state = "warning";
+ dir = 1
+ },
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/fish_farm)
+/area/tether/surfacebase/north_staires_two)
"uf" = (
/obj/effect/floor_decal/corner_techfloor_grid{
dir = 9
@@ -10204,9 +10230,7 @@
icon_state = "warning";
dir = 1
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
+/obj/effect/floor_decal/steeldecal/steel_decals4,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/north_staires_two)
"up" = (
@@ -10230,24 +10254,6 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/fish_farm)
"us" = (
-/obj/effect/floor_decal/industrial/warning{
- icon_state = "warning";
- dir = 1
- },
-/obj/effect/floor_decal/steeldecal/steel_decals6{
- dir = 10
- },
-/obj/structure/cable{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/turf/simulated/floor/tiled,
-/area/tether/surfacebase/north_staires_two)
-"ut" = (
-/turf/simulated/floor/tiled/techfloor,
-/area/tether/surfacebase/fish_farm)
-"uu" = (
/obj/structure/cable{
d1 = 1;
d2 = 2;
@@ -10257,9 +10263,18 @@
/obj/machinery/camera/network/tether{
dir = 4
},
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/atrium_two)
-"uv" = (
+"ut" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/tether/surfacebase/fish_farm)
+"uu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
},
@@ -10270,6 +10285,26 @@
dir = 4;
icon_state = "pipe-c"
},
+/obj/effect/floor_decal/borderfloor/corner,
+/obj/effect/floor_decal/corner/lightgrey/bordercorner,
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/atrium_two)
+"uv" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/machinery/alarm{
+ dir = 1;
+ pixel_y = -25
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/atrium_two)
"uw" = (
@@ -10295,14 +10330,20 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/fish_farm)
"uz" = (
-/obj/structure/table/rack,
-/obj/item/stack/cable_coil/pink,
-/obj/item/stack/cable_coil/pink,
-/obj/item/stack/cable_coil/pink,
-/obj/item/stack/cable_coil/pink,
-/obj/item/stack/cable_coil/pink,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 10
+ },
+/obj/structure/disposalpipe/junction,
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/fish_farm)
+/area/tether/surfacebase/atrium_two)
"uA" = (
/obj/structure/railing,
/obj/structure/railing{
@@ -10663,22 +10704,23 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_x = 4;
+ pixel_y = -24
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/atrium_two)
"vi" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 9;
- pixel_y = 0
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/machinery/door/firedoor/glass/hidden/steel{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 9
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/atrium_two)
+/area/tether/surfacebase/north_staires_two)
"vj" = (
/obj/effect/floor_decal/industrial/warning{
dir = 8
@@ -10695,18 +10737,17 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/fish_farm)
"vk" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 10
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/machinery/alarm{
+ dir = 1;
+ pixel_y = -25
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
- },
-/obj/structure/disposalpipe/junction,
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/atrium_two)
+/area/tether/surfacebase/north_staires_two)
"vl" = (
/obj/structure/railing{
icon_state = "railing0";
@@ -10780,14 +10821,25 @@
/turf/simulated/floor/tiled,
/area/engineering/lower/atmos_eva)
"vs" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/machinery/power/apc{
+ dir = 2;
+ name = "south bump";
+ pixel_y = -28
+ },
+/obj/structure/cable{
+ icon_state = "0-4";
+ d2 = 4
+ },
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/atrium_two)
+/area/tether/surfacebase/north_staires_two)
"vt" = (
/obj/effect/floor_decal/borderfloor{
dir = 6
@@ -10809,21 +10861,28 @@
/turf/simulated/floor/tiled,
/area/engineering/lower/atmos_eva)
"vu" = (
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_x = 0;
+ pixel_y = -25
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/glass/hidden/steel{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
/obj/structure/cable{
d1 = 4;
d2 = 8;
icon_state = "4-8";
pixel_x = 0
},
-/obj/effect/floor_decal/steeldecal/steel_decals6{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
- dir = 1
- },
/obj/structure/cable{
d1 = 1;
d2 = 4;
@@ -10931,20 +10990,26 @@
/turf/simulated/floor/tiled/monotile,
/area/engineering/atmos)
"vD" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/machinery/alarm{
+ dir = 1;
+ pixel_y = -25
+ },
/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- pixel_y = 0
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
/turf/simulated/floor/tiled,
-/area/tether/surfacebase/atrium_two)
+/area/tether/surfacebase/north_staires_two)
"vE" = (
/obj/machinery/light{
dir = 8
@@ -11012,14 +11077,13 @@
/turf/simulated/floor/plating,
/area/maintenance/engineering/pumpstation)
"vM" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/alarm{
+ dir = 4;
+ icon_state = "alarm0";
+ pixel_x = -22
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/tether/surfacebase/atrium_two)
+/turf/simulated/floor/tiled/techfloor,
+/area/tether/surfacebase/fish_farm)
"vN" = (
/obj/machinery/door/firedoor/glass,
/obj/machinery/door/airlock/maintenance/common,
@@ -11120,31 +11184,72 @@
/turf/simulated/floor/beach/sand/desert,
/area/tether/surfacebase/fish_farm)
"vX" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/disposalpipe/segment{
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 1;
+ pixel_y = 0
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/lightgrey/bordercorner2{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals4{
+ dir = 6
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/atrium_two)
"vY" = (
-/obj/structure/railing{
- icon_state = "railing0";
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/machinery/camera/network/civilian,
-/turf/simulated/floor/water/deep/indoors,
-/area/tether/surfacebase/fish_farm)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 1;
+ pixel_y = 0
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/atrium_two)
"vZ" = (
/obj/structure/cable{
- icon_state = "1-2"
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/plating,
-/area/maintenance/lower/rnd)
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey/bordercorner2{
+ dir = 9
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals4{
+ dir = 10
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/north_staires_two)
"wa" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -11389,18 +11494,43 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/fish_farm)
"wu" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/obj/machinery/light{
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/effect/floor_decal/borderfloor/corner{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightgrey/bordercorner{
dir = 1
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/atrium_two)
"wv" = (
-/obj/structure/disposalpipe/segment{
- dir = 8;
- icon_state = "pipe-c"
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9;
+ pixel_y = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 9
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 4
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/atrium_two)
@@ -11782,6 +11912,28 @@
},
/turf/simulated/floor/tiled,
/area/engineering/atmos)
+"wR" = (
+/obj/machinery/camera/network/tether{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/tether/surfacebase/fish_farm)
+"wS" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/effect/floor_decal/borderfloor/corner2,
+/obj/effect/floor_decal/corner/lightgrey/bordercorner2,
+/obj/effect/floor_decal/steeldecal/steel_decals4{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/atrium_two)
"wT" = (
/obj/effect/floor_decal/borderfloor{
dir = 1;
@@ -11882,6 +12034,17 @@
},
/turf/simulated/floor/tiled,
/area/engineering/atmos)
+"wX" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/atrium_two)
"wY" = (
/obj/structure/railing{
dir = 8
@@ -11894,6 +12057,30 @@
/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/techmaint,
/area/tether/surfacebase/east_stairs_two)
+"wZ" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/atrium_two)
+"xa" = (
+/obj/structure/disposalpipe/segment{
+ dir = 8;
+ icon_state = "pipe-c"
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/atrium_two)
"xb" = (
/obj/effect/floor_decal/borderfloor{
dir = 4
@@ -12012,6 +12199,16 @@
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/asmaint2)
+"xm" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/effect/floor_decal/rust,
+/turf/simulated/floor/plating,
+/area/maintenance/lower/rnd)
"xn" = (
/obj/structure/table/rack/shelf/steel,
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
@@ -25464,8 +25661,8 @@ ac
hD
vE
ut
-ut
-ut
+vM
+wR
ut
vE
hD
@@ -26030,7 +26227,7 @@ hs
hs
ho
ul
-vY
+hF
uB
uO
uO
@@ -28584,12 +28781,12 @@ cW
cW
hD
tR
-ue
+hE
ur
-uz
+hG
hD
-vs
-vM
+vX
+wS
dY
iO
je
@@ -28730,8 +28927,8 @@ hD
hD
hD
hD
-vs
-vM
+vY
+wX
dY
iB
jf
@@ -28870,10 +29067,10 @@ gK
gZ
ha
dY
-iy
-uu
-vD
-vX
+hH
+us
+wu
+wZ
dY
iP
iT
@@ -29012,10 +29209,10 @@ gL
ha
hm
dY
-iz
-uv
-vi
+iy
+uu
wv
+xa
dY
iP
jf
@@ -29154,8 +29351,8 @@ gM
gZ
hn
dY
-iz
-vh
+iy
+uv
dY
dY
dY
@@ -29296,7 +29493,7 @@ gN
hb
ap
dY
-wu
+iz
vh
dY
ii
@@ -29438,10 +29635,10 @@ gs
gF
gO
hI
-tU
-vk
+iA
+uz
vK
-vZ
+xm
we
iR
ji
@@ -29580,8 +29777,8 @@ ge
ge
ge
hc
-iA
-hf
+tU
+vi
wC
ii
wf
@@ -29723,7 +29920,7 @@ gt
gt
hd
iC
-hE
+vk
ge
ik
wj
@@ -29865,7 +30062,7 @@ gt
gP
gt
iD
-hF
+vs
ge
il
wk
@@ -30007,7 +30204,7 @@ ge
ge
he
uc
-hG
+vu
ge
im
wk
@@ -30148,8 +30345,8 @@ gu
ge
gQ
hf
-uo
-hH
+ue
+vD
ge
il
wl
@@ -30290,8 +30487,8 @@ gu
ge
gQ
hf
-us
-vu
+uo
+vZ
vN
wa
wn
diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm
index 4eda0973a8..e2fdc2a867 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 251de4e3f1..eccdca6560 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 cebc944428..c08a89bb3a 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 517c9d7b21..66fcd2daec 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
@@ -1281,14 +1276,14 @@
/area/centcom/specops)
"bW" = (
/obj/structure/table/reinforced,
-/obj/item/ammo_casing/nsfw_batt/stun,
-/obj/item/ammo_casing/nsfw_batt/stun,
-/obj/item/ammo_casing/nsfw_batt/stun,
-/obj/item/ammo_casing/nsfw_batt,
-/obj/item/ammo_casing/nsfw_batt,
-/obj/item/ammo_casing/nsfw_batt,
-/obj/item/ammo_casing/nsfw_batt/net,
-/obj/item/ammo_casing/nsfw_batt/net,
+/obj/item/ammo_casing/nsfw_batt/combat/stun,
+/obj/item/ammo_casing/nsfw_batt/combat/stun,
+/obj/item/ammo_casing/nsfw_batt/combat/stun,
+/obj/item/ammo_casing/nsfw_batt/medical/brute2,
+/obj/item/ammo_casing/nsfw_batt/medical/burn2,
+/obj/item/ammo_casing/nsfw_batt/medical/stabilize2,
+/obj/item/ammo_casing/nsfw_batt/combat/net,
+/obj/item/ammo_casing/nsfw_batt/combat/net,
/obj/item/ammo_magazine/nsfw_mag,
/obj/item/weapon/gun/projectile/nsfw,
/turf/unsimulated/floor/steel{
diff --git a/vorestation.dme b/vorestation.dme
index 354003ff55..53bbdeaaa5 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -881,6 +881,7 @@
#include "code\game\mecha\combat\phazon.dm"
#include "code\game\mecha\equipment\mecha_equipment.dm"
#include "code\game\mecha\equipment\tools\medical_tools.dm"
+#include "code\game\mecha\equipment\tools\medical_tools_vr.dm"
#include "code\game\mecha\equipment\tools\tools.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"
#include "code\game\mecha\medical\medical.dm"
@@ -1191,6 +1192,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"
@@ -1555,6 +1557,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"
@@ -2420,6 +2423,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"
@@ -2524,6 +2528,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"