diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm
index 6f6f4f9f0a..1531a67d5b 100644
--- a/code/_helpers/game.dm
+++ b/code/_helpers/game.dm
@@ -43,6 +43,18 @@
if (isarea(A))
return A
+
+/** Checks if any living humans are in a given area. */
+/proc/area_is_occupied(var/area/myarea)
+ // Testing suggests looping over human_mob_list is quicker than looping over area contents
+ for(var/mob/living/carbon/human/H in human_mob_list)
+ if(H.stat >= DEAD) //Conditions for exclusion here, like if disconnected people start blocking it.
+ continue
+ var/area/A = get_area(H)
+ if(A == myarea) //The loc of a turf is the area it is in.
+ return 1
+ return 0
+
/proc/in_range(source, user)
if(get_dist(source, user) <= 1)
return 1
diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm
new file mode 100644
index 0000000000..144df5163b
--- /dev/null
+++ b/code/datums/supplypacks/misc_vr.dm
@@ -0,0 +1,14 @@
+
+/datum/supply_packs/misc/beltminer
+ name = "Belt-miner gear crate"
+ contains = list(
+ /obj/item/weapon/gun/energy/particle = 2,
+ /obj/item/weapon/cell/device/weapon = 2,
+ /obj/item/weapon/storage/firstaid/regular = 1,
+ /obj/item/device/gps = 2,
+ /obj/item/weapon/storage/box/traumainjectors = 1
+ )
+ cost = 50
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "Belt-miner gear crate"
+ access = access_mining
\ No newline at end of file
diff --git a/code/game/machinery/doors/door_vr.dm b/code/game/machinery/doors/door_vr.dm
index e38dcd851d..1e0dd1d470 100644
--- a/code/game/machinery/doors/door_vr.dm
+++ b/code/game/machinery/doors/door_vr.dm
@@ -39,10 +39,8 @@
var/obj/item/stack/stack = I
var/transfer
var/amount_needed = 2
- if (stack.amount >= amount_needed)
- if(stat & BROKEN)
- user << "It looks like \the [src] is pretty busted. There's not much point reinforcing it."
- return 1
+ if(stat & BROKEN)
+ user << "It looks like \the [src] is pretty busted."
if (reinforcing)
transfer = stack.transfer_to(reinforcing, amount_needed - reinforcing.amount)
if (!transfer)
@@ -57,13 +55,50 @@
if (transfer)
user << "You fit [transfer] [stack.singular_name]\s to \the [src]."
return 1
- return 0
+
+ if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name())
+ if(stat & BROKEN)
+ if(health >= maxhealth && destroy_hits >= 10)
+ user << "The [src] is about as shored up as it's going to get."
+ return 1
+ if(!density)
+ user << "\The [src] must be closed before you can repair it."
+ return 1
+
+ //figure out how much metal we need
+ var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT
+ if (destroy_hits < 10)
+ amount_needed += (20*(10 - destroy_hits) / DOOR_REPAIR_AMOUNT)
+ amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc?
+
+ var/obj/item/stack/stack = I
+ var/transfer
+ if (repairing)
+ transfer = stack.transfer_to(repairing, amount_needed - repairing.amount)
+ if (!transfer)
+ user << "You must weld or remove \the [repairing] from \the [src] before you can add anything else."
+ else
+ repairing = stack.split(amount_needed)
+ if (repairing)
+ repairing.loc = src
+ transfer = repairing.amount
+
+ if (transfer)
+ user << "\The [src] is completely broken inside, but you manage to fit [transfer] [stack.singular_name]\s to shore it up."
+
+ return 1
+
+ return 0
+
if(reinforcing && istype(I, /obj/item/weapon/weldingtool))
+ var/amount_needed = 2
if(!density)
user << "\The [src] must be closed before you can repair it."
return 1
-
+ if (reinforcing.amount < amount_needed)
+ user << "You need [amount_needed] [reinforcing.singular_name]\s to reinforce \the [src]."
+ return 1
var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user))
user << "You start to weld \the [reinforcing] into place."
@@ -76,6 +111,28 @@
reinforcing = null
return 1
+ if(repairing && istype(I, /obj/item/weapon/weldingtool) && (stat & BROKEN))
+ if(!density)
+ user << "\The [src] must be closed before you can shore it up."
+ return 1
+
+ var/obj/item/weapon/weldingtool/welder = I
+ if(welder.remove_fuel(0,user))
+ user << "You start to weld \the [repairing] into place."
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ if(do_after(user, 5 * repairing.amount) && welder && welder.isOn())
+ user << "You finish shoring up \the [src]. It'll hold for at least a little while."
+ var/damagerepaired = repairing.amount*DOOR_REPAIR_AMOUNT
+ if (destroy_hits < 10)
+ var/severedamage = 10 - destroy_hits
+ destroy_hits = between(destroy_hits, destroy_hits + (damagerepaired)/20, 10)
+ damagerepaired -= 20 * severedamage
+ health = between(health, health + damagerepaired, maxhealth)
+ update_icon()
+ qdel(repairing)
+ repairing = null
+ return 1
+
if(reinforcing && istype(I, /obj/item/weapon/crowbar))
user << "You remove \the [reinforcing]."
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm
index 3ab4133bfb..d3d7dd1163 100644
--- a/code/game/machinery/vending_vr.dm
+++ b/code/game/machinery/vending_vr.dm
@@ -19,7 +19,7 @@
..()
/obj/machinery/vending/medical/New()
- products += list(/obj/item/weapon/storage/box/khcrystal = 4,/obj/item/weapon/storage/box/backup_kit = 2,
+ products += list(/obj/item/weapon/storage/box/khcrystal = 4,/obj/item/weapon/backup_implanter = 3,
/obj/item/clothing/glasses/omnihud/med = 2, /obj/item/device/glasses_kit = 1)
..()
diff --git a/code/modules/events/atmos_leak.dm b/code/modules/events/atmos_leak.dm
new file mode 100644
index 0000000000..46c28b7adf
--- /dev/null
+++ b/code/modules/events/atmos_leak.dm
@@ -0,0 +1,90 @@
+//
+// This event causes a gas leak of phoron, sleeping_agent, or carbon_dioxide in a random unoccupied area.
+// One wonders, where did the gas come from? Who knows! Its SPACE! But if you want something a touch
+// more "explainable" then check out the canister_leak event instead.
+//
+
+/datum/event/atmos_leak
+ startWhen = 5 // Nobody will actually be in the room, but still give a bit of warning.
+ var/area/target_area // Chosen target area
+ var/area/target_turf // Chosen target turf in target_area
+ var/gas_type // Chosen gas to release
+ // Exclude these types and sub-types from targeting eligibilty
+ var/list/area/excluded = list(
+ /area/shuttle,
+ /area/crew_quarters,
+ /area/holodeck,
+ /area/engineering/engine_room
+ )
+
+// Decide which area will be targeted!
+/datum/event/atmos_leak/setup()
+ var/gas_choices = list("carbon_dioxide", "sleeping_agent") // Annoying
+ if(severity >= EVENT_LEVEL_MODERATE)
+ gas_choices += "phoron" // Dangerous
+ if(severity >= EVENT_LEVEL_MAJOR)
+ gas_choices += "volatile_fuel" // Dangerous and no default atmos setup!
+ gas_type = pick(gas_choices)
+
+ // Assemble areas that all exists (See DM reference if you are confused about loop labels)
+ var/list/area/grand_list_of_areas = list()
+ looping_station_areas:
+ for(var/parentpath in global.the_station_areas)
+ // Check its not excluded
+ for(var/excluded_path in excluded)
+ if(ispath(parentpath, excluded_path))
+ continue looping_station_areas
+ // Otherwise add it and all subtypes that exist on the map to our grand list
+ for(var/areapath in typesof(parentpath))
+ var/area/A = locate(areapath) // Check if it actually exists
+ if(istype(A) && A.z in using_map.player_levels)
+ grand_list_of_areas += A
+
+ // Okay, now lets try and pick a target! Lets try 10 times, otherwise give up
+ for(var/i in 1 to 10)
+ var/area/A = pick(grand_list_of_areas)
+ if(is_area_occupied(A))
+ log_debug("atmos_leak event: Rejected [A] because it is occupied.")
+ continue
+ // A good area, great! Lets try and pick a turf
+ var/list/turfs = list()
+ for(var/turf/simulated/floor/F in A)
+ if(turf_clear(F))
+ turfs += F
+ if(turfs.len == 0)
+ log_debug("atmos_leak event: Rejected [A] because it has no clear turfs.")
+ continue
+ target_area = A
+ target_turf = pick(turfs)
+
+ // If we can't find a good target, give up
+ if(!target_area)
+ log_debug("atmos_leak event: Giving up after too many failures to pick target area")
+ kill()
+ return
+
+/** Checks if any living humans are in a given area! */
+/datum/event/atmos_leak/proc/is_area_occupied(var/area/myarea)
+ // Testing suggests looping over human_mob_list is quicker than looping over area contents
+ for(var/mob/living/carbon/human/H in human_mob_list)
+ if(H.stat >= DEAD) //Conditions for exclusion here, like if disconnected people start blocking it.
+ continue
+ var/area/A = get_area(H)
+ if(A == myarea) //The loc of a turf is the area it is in.
+ return 1
+ return 0
+
+/datum/event/atmos_leak/announce()
+ command_announcement.Announce("Warning, hazardous [gas_data.name[gas_type]] gas leak detected in \the [target_area], evacuate the area and contain the damage!", "Hazard Alert")
+
+/datum/event/atmos_leak/start()
+ // Okay, time to actually put the gas in the room!
+ // TODO - Would be nice to break a waste pipe perhaps?
+ // TODO - Maybe having it released from a single point and thus causing airflow to blow stuff around
+
+ // Fow now just add a bunch of it to the air
+ var/datum/gas_mixture/air_contents = new
+ air_contents.temperature = T20C + ((severity - 1) * rand(-50, 50))
+ air_contents.gas[gas_type] = 10 * MOLES_CELLSTANDARD
+ target_turf.assume_air(air_contents)
+ playsound(target_turf, 'sound/effects/smoke.ogg', 50, 1)
diff --git a/code/modules/events/canister_leak.dm b/code/modules/events/canister_leak.dm
new file mode 100644
index 0000000000..956d8a0940
--- /dev/null
+++ b/code/modules/events/canister_leak.dm
@@ -0,0 +1,30 @@
+//
+// This event chooses a random canister on player levels and breaks it, releasing its contents!
+// On severity EVENT_LEVEL_MUNDANE or below it checks to make sure nobody is in the area, otherwise... good luck.
+//
+
+/datum/event/canister_leak/start()
+ // List of all non-destroyed canisters on station levels
+ var/list/all_canisters = list()
+ for(var/obj/machinery/portable_atmospherics/canister/C in machines)
+ if(!C.destroyed && (C.z in using_map.station_levels))
+ all_canisters += C
+
+ for(var/i in 1 to 10)
+ var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters)
+ if(severity <= EVENT_LEVEL_MUNDANE && area_is_occupied(get_area(C)))
+ log_debug("canister_leak event: Rejecting canister [C] ([C.x],[C.y],[C.z]) because area is occupied")
+ continue
+ // Okay lets break it
+ break_canister(C)
+ return
+
+ // If we got to here we failed to find it
+ log_debug("canister_leak event: Giving up after too many failures to pick target canister")
+ kill()
+ return
+
+/datum/event/canister_leak/proc/break_canister(var/obj/machinery/portable_atmospherics/canister/C)
+ log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.")
+ C.health = 0
+ C.healthcheck()
diff --git a/code/modules/gamemaster/actions/canister_leak.dm b/code/modules/gamemaster/actions/canister_leak.dm
new file mode 100644
index 0000000000..ed55c0cded
--- /dev/null
+++ b/code/modules/gamemaster/actions/canister_leak.dm
@@ -0,0 +1,24 @@
+//
+// This event chooses a random canister on player levels and breaks it, releasing its contents!
+//
+
+/datum/gm_action/canister_leak
+ name = "Canister Leak"
+ departments = list(ROLE_ENGINEERING)
+ chaotic = 20
+
+/datum/gm_action/canister_leak/get_weight()
+ return metric.count_people_in_department(ROLE_ENGINEERING) * 30
+
+/datum/gm_action/canister_leak/start()
+ ..()
+ // List of all non-destroyed canisters on station levels
+ var/list/all_canisters = list()
+ for(var/obj/machinery/portable_atmospherics/canister/C in machines)
+ if(!C.destroyed && (C.z in using_map.station_levels))
+ all_canisters += C
+ var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters)
+ log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.")
+ C.health = 0
+ C.healthcheck()
+ return
diff --git a/code/modules/projectiles/guns/energy/particle.dm b/code/modules/projectiles/guns/energy/particle.dm
index ab20585b49..dc5a6669c7 100644
--- a/code/modules/projectiles/guns/energy/particle.dm
+++ b/code/modules/projectiles/guns/energy/particle.dm
@@ -1,5 +1,5 @@
/obj/item/weapon/gun/energy/particle //base gun, similar stats to an egun
- name = "Antiparticle projector pistol"
+ name = "Anti-particle projector pistol"
icon = 'icons/obj/gun_vr.dmi'
icon_state = "ppistol"
item_state = "ppistol_item"
@@ -18,27 +18,28 @@
slot_flags = SLOT_BELT
w_class = ITEMSIZE_NORMAL
projectile_type = /obj/item/projectile/bullet/particle
- origin_tech = null
+ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2, TECH_MATERIAL = 2)
fire_delay = 10
- charge_cost = 240 //same cost as lasers
+ charge_cost = 200 //slightly more shots than lasers
var/safetycatch = 0 //if 1, won't let you fire in pressurised environment, rather than malfunctioning
var/obj/item/pressurelock/attached_safety
/obj/item/weapon/gun/energy/particle/advanced //particle equivalent of AEG
- name = "Advanced antiparticle rifle"
+ name = "Advanced anti-particle rifle"
icon_state = "particle"
item_state = "particle_item"
desc = "An antiparticle projector gun with an enhanced power-generation unit."
slot_flags = SLOT_BELT
force = 8 //looks heavier than a pistol
w_class = ITEMSIZE_LARGE //bigger than a pistol, too.
+ origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 5, TECH_POWER = 3, TECH_MAGNET = 3)
fire_delay = 6 //This one's not a handgun, it should have the same fire delay as everything else
self_recharge = 1
modifystate = null
battery_lock = 1
- recharge_time = 15 // every 15 ticks, recharge 2 shots. Rather slower than AEG.
- charge_delay = 20 //Starts recharging faster after firing than an AEG, but much slower recharge rate. Balances out for a full charge.
+ recharge_time = 6 // every 6 ticks, recharge 2 shots. Slightly slower than AEG.
+ charge_delay = 10 //Starts recharging faster after firing than an AEG though.
/obj/item/weapon/gun/energy/particle/cannon //particle version of laser cannon
name = "Anti-particle cannon"
@@ -47,17 +48,18 @@
item_state = "heavyparticle_item"
fire_sound = 'sound/weapons/lasercannonfire.ogg'
slot_flags = SLOT_BACK
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_POWER = 4, TECH_MAGNET = 4)
projectile_type = /obj/item/projectile/bullet/particle/heavy
battery_lock = 1
- fire_delay = 20
+ fire_delay = 15 // fires faster than a laser cannon. c'mon, it's an awesome-but-impractical endgame gun.
w_class = ITEMSIZE_HUGE // So it can't fit in a backpack.
force = 10
- one_handed_penalty = 6 // The thing's heavy and huge.
+ one_handed_penalty = 8 // The thing's heavy and huge.
accuracy = 3
- charge_cost = 480 // 5 shots
+ charge_cost = 400 // 6 shots
self_recharge = 1
- charge_delay = 20 //won't start charging until it's ready to fire again
- recharge_time = 20 //100 ticks after that to refill the whole thing.
+ charge_delay = 15 //won't start charging until it's ready to fire again
+ recharge_time = 8 //40 ticks after that to refill the whole thing.
//special behaviours for particle guns below
@@ -161,7 +163,7 @@
icon_state = "pressurelock"
desc = "A safety interlock that can be installed in an antiparticle projector. It prevents the weapon from discharging in pressurised environments."
w_class = ITEMSIZE_TINY
-
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
// projectiles below
diff --git a/code/modules/reagents/reagent_containers/hypospray_vr.dm b/code/modules/reagents/reagent_containers/hypospray_vr.dm
index d306c97d33..bdf73bb0c2 100644
--- a/code/modules/reagents/reagent_containers/hypospray_vr.dm
+++ b/code/modules/reagents/reagent_containers/hypospray_vr.dm
@@ -48,3 +48,29 @@
user << "\The [src] already has a vial."
else
..()
+
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/beltminer
+ name = "Emergency trauma injector"
+ desc = "A rapid injector for emergency treatment of injuries. The warning label advises that it is not a substitute for proper medical treatment."
+ icon_state = "autoinjector"
+ item_state = "autoinjector"
+ amount_per_transfer_from_this = 10
+ volume = 10
+
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/beltminer/New()
+ ..()
+ reagents.add_reagent("bicaridine", 5)
+ reagents.add_reagent("tricordrazine", 3)
+ reagents.add_reagent("tramadol", 2)
+ update_icon()
+ return
+
+/obj/item/weapon/storage/box/traumainjectors
+ name = "box of emergency trauma injectors"
+ desc = "Contains emergency trauma autoinjectors."
+ icon_state = "syringe"
+
+/obj/item/weapon/storage/box/traumainjectors/New()
+ ..()
+ for (var/i = 1 to 7)
+ new /obj/item/weapon/reagent_containers/hypospray/autoinjector/beltminer(src)
diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm
index dee8eebc77..fc156ca245 100644
--- a/code/modules/research/designs_vr.dm
+++ b/code/modules/research/designs_vr.dm
@@ -8,27 +8,51 @@
build_path = /obj/item/weapon/pickaxe/excavationdrill
/datum/design/item/implant/language
- name = "language implant"
+ name = "Language implant"
id = "implant_language"
req_tech = list(TECH_MATERIAL = 5, TECH_BIO = 5, TECH_DATA = 4, TECH_ENGINEERING = 4) //This is not an easy to make implant.
materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000, "gold" = 2000, "diamond" = 3000)
build_path = /obj/item/weapon/implantcase/vrlanguage
/datum/design/item/implant/backup
- name = "backup implant"
+ name = "Backup implant"
id = "implant_backup"
req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_DATA = 4, TECH_ENGINEERING = 2)
materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000)
build_path = /obj/item/weapon/implantcase/backup
/datum/design/item/weapon/sizegun
- name = "shrink ray"
+ name = "Shrink ray"
id = "shrinkray"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000, "uranium" = 2000)
build_path = /obj/item/weapon/gun/energy/sizegun
sort_string = "TAAAB"
+/datum/design/item/item/pressureinterlock
+ name = "APP pressure interlock"
+ id = "pressureinterlock"
+ req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250)
+ build_path = /obj/item/pressurelock
+ sort_string = "TAADA"
+
+/datum/design/item/weapon/advparticle
+ name = "Advanced anti-particle rifle"
+ id = "advparticle"
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 5, TECH_POWER = 3, TECH_MAGNET = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "gold" = 1000, "uranium" = 750)
+ build_path = /obj/item/weapon/gun/energy/particle/advanced
+ sort_string = "TAADB"
+
+/datum/design/item/weapon/particlecannon
+ name = "Anti-particle cannon"
+ id = "particlecannon"
+ req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_POWER = 4, TECH_MAGNET = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1500, "gold" = 2000, "uranium" = 1000, "diamond" = 2000)
+ build_path = /obj/item/weapon/gun/energy/particle/cannon
+ sort_string = "TAADC"
+
/datum/design/item/hud/omni
name = "AR glasses"
id = "omnihud"
@@ -38,17 +62,24 @@
sort_string = "GAAFB"
/datum/design/item/translocator
- name = "personal translocator"
+ name = "Personal translocator"
id = "translocator"
req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_ILLEGAL = 7)
materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "uranium" = 4000, "diamond" = 2000)
build_path = /obj/item/device/perfect_tele
sort_string = "HABAF"
+/datum/design/item/translator
+ name = "handheld translator"
+ id = "translator"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000)
+ build_path = /obj/item/device/universal_trans
+ sort_string = "HABBA"
// Resleeving Circuitboards
-/datum/design/circuit/comm_server
+/datum/design/circuit/transhuman_clonepod
name = "grower pod"
id = "transhuman_clonepod"
req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
@@ -63,21 +94,21 @@
sort_string = "HAADB"
/datum/design/circuit/transhuman_resleever
- name = "resleeving pod"
+ name = "Resleeving pod"
id = "transhuman_resleever"
req_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4)
build_path = /obj/item/weapon/circuitboard/transhuman_resleever
sort_string = "HAADC"
/datum/design/circuit/resleeving_control
- name = "resleeving control console"
+ name = "Resleeving control console"
id = "resleeving_control"
req_tech = list(TECH_DATA = 5)
build_path = /obj/item/weapon/circuitboard/resleeving_control
sort_string = "HAADE"
/datum/design/circuit/partslathe
- name = "parts lathe"
+ name = "Parts lathe"
id = "partslathe"
req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
build_path = /obj/item/weapon/circuitboard/partslathe
diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm
index 3c3a6abddd..7c2e5e80c7 100644
--- a/code/modules/resleeving/implant.dm
+++ b/code/modules/resleeving/implant.dm
@@ -7,6 +7,8 @@
/obj/item/weapon/implant/backup
name = "backup implant"
desc = "A mindstate backup implant that occasionally stores a copy of one's mind on a central server for backup purposes."
+ icon = 'icons/vore/custom_items_vr.dmi'
+ icon_state = "backup_implant"
var/last_attempt
var/attempt_delay = 5 MINUTES
@@ -52,6 +54,90 @@
spawn(attempt_delay)
backup()
+//New, modern implanter instead of old style implanter.
+/obj/item/weapon/backup_implanter
+ name = "backup implanter"
+ desc = "After discovering that Nanotrasen was just re-using the same implanters over and over again on organics, leading to cross-contamination, Kitsuhana Heavy industries designed this self-cleaning model. Holds four backup implants at a time."
+ icon = 'icons/obj/device_alt.dmi'
+ icon_state = "bimplant"
+ item_state = "syringe_0"
+ throw_speed = 1
+ throw_range = 5
+ w_class = ITEMSIZE_SMALL
+ matter = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000)
+ var/obj/item/weapon/implant/backup/list/imps = list()
+ var/max_implants = 4 //Iconstates need to exist due to the update proc!
+
+/obj/item/weapon/backup_implanter/New()
+ ..()
+ for(var/i = 1 to max_implants)
+ var/obj/item/weapon/implant/backup/imp = new(src)
+ imps |= imp
+ imp.germ_level = 0
+ update()
+
+/obj/item/weapon/backup_implanter/proc/update()
+ icon_state = "[initial(icon_state)][imps.len]"
+ germ_level = 0
+
+/obj/item/weapon/backup_implanter/attack_self(mob/user as mob)
+ if(!istype(user))
+ return
+
+ if(imps.len)
+ user << "You eject a backup implant."
+ var/obj/item/weapon/implant/backup/imp = imps[imps.len]
+ imp.forceMove(get_turf(user))
+ imps -= imp
+ user.put_in_any_hand_if_possible(imp)
+ update()
+ else
+ user << "\The [src] is empty."
+
+ return
+
+/obj/item/weapon/backup_implanter/attackby(obj/W, mob/user)
+ if(istype(W,/obj/item/weapon/implant/backup))
+ if(imps.len < max_implants)
+ user.unEquip(W)
+ imps |= W
+ W.germ_level = 0
+ W.forceMove(src)
+ update()
+ user << "You load \the [W] into \the [src]."
+ else
+ user << "\The [src] is already full!"
+
+/obj/item/weapon/backup_implanter/attack(mob/M as mob, mob/user as mob)
+ if (!istype(M, /mob/living/carbon))
+ return
+ if (user && imps.len)
+ M.visible_message("[user] is injecting a backup implant into [M].")
+
+ user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
+ user.do_attack_animation(M)
+
+ var/turf/T1 = get_turf(M)
+ if (T1 && ((M == user) || do_after(user, 5 SECONDS)))
+ if(user && M && (get_turf(M) == T1) && src && src.imps.len)
+ M.visible_message("[M] has been backup implanted by [user].")
+
+ var/obj/item/weapon/implant/backup/imp = imps[imps.len]
+ if(imp.implanted(M))
+ imp.forceMove(M)
+ imps -= imp
+ imp.imp_in = M
+ imp.implanted = 1
+ admin_attack_log(user, M, "Implanted using \the [src.name] ([imp.name])", "Implanted with \the [src.name] ([imp.name])", "used an implanter, [src.name] ([imp.name]), on")
+ if (ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+ affected.implants += imp
+ imp.part = affected
+ BITSET(H.hud_updateflag, BACKUP_HUD)
+
+ update()
+
//The glass case for the implant
/obj/item/weapon/implantcase/backup
name = "glass case - 'backup'"
diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
index 34e63c1900..d358ac85ba 100644
--- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
@@ -981,6 +981,17 @@
M.update_inv_wear_mask()
usr.update_action_buttons()
+//Vorrarkul: Theodora Lindt
+/obj/item/clothing/suit/chococoat
+ name = "Chococoat"
+ desc = "A long coat designed to resemble Getmore Chocolate Corp's namesake chocolate bar wrapper." //A walking advertisement?
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_override = 'icons/vore/custom_clothes_vr.dmi'
+ item_state = "chococoat_on"
+ icon_state = "chococoat"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ allowed = list (/obj/item/weapon/material/knife)
+
/*
Departamental Swimsuits, for general use
*/
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 9b3bb82145..8da954056f 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -865,3 +865,60 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
B.internal_contents |= src
user.visible_message("[user] eats a telebeacon!","You eat the the beacon!")
playsound(user, B.vore_sound, 70, 1)
+
+//Universal translator
+/obj/item/device/universal_trans
+ name = "handheld translator"
+ desc = "This handy device appears to translate the languages it hears into onscreen text for a user."
+ icon = 'icons/obj/device_alt.dmi'
+ icon_state = "atmos"
+ w_class = ITEMSIZE_SMALL
+ origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
+ var/listening = 0
+ var/datum/language/langset
+
+/obj/item/device/universal_trans/attack_self(mob/user)
+ if(!listening) //Turning ON
+ langset = input(user,"Translate to which of your languages?","Language Selection") as anything|null in user.languages
+ if(langset)
+ listening = 1
+ listening_objects |= src
+ icon_state = "[initial(icon_state)]1"
+ user << "You enable \the [src], translating into [langset.name]."
+ else //Turning OFF
+ listening = 0
+ listening_objects -= src
+ langset = null
+ icon_state = "[initial(icon_state)]"
+ user << "You disable \the [src]."
+
+
+/obj/item/device/universal_trans/hear_talk(var/mob/speaker,var/message,var/vrb,var/datum/language/language)
+ if(!listening || !istype(speaker))
+ return
+
+ //Show the "I heard something" animation.
+ flick("[initial(icon_state)]2",src)
+
+ //Handheld or pocket only.
+ if(!isliving(loc))
+ return
+
+ var/mob/living/L = loc
+
+ if (language && (language.flags & NONVERBAL))
+ return //Not gonna translate sign language
+
+ //Only translate if they can't understand, otherwise pointlessly spammy
+ //I'll just assume they don't look at the screen in that case
+
+ //They don't understand the spoken language we're translating FROM
+ if(!L.say_understands(speaker,language))
+
+ //They understand the PRINTED language
+ if(L.say_understands(null,langset))
+ L << "[src] displays, \"[message]\""
+
+ //They don't understand the PRINTED language
+ else
+ L << "[src] displays, \"[langset.scramble(message)]\""
diff --git a/config/custom_items.txt b/config/custom_items.txt
index d2fe38c36d..c48a65c04b 100644
--- a/config/custom_items.txt
+++ b/config/custom_items.txt
@@ -478,6 +478,12 @@ character_name: Nyssa Brennan
item_path: /obj/item/clothing/suit/storage/hooded/wintercoat/cargo
}
+{
+ckey: vorrarkul
+character_name: Theodora Lindt
+item_path: /obj/item/clothing/suit/chococoat
+}
+
{
ckey: Viveret
character_name: Keturah
diff --git a/icons/obj/device_alt.dmi b/icons/obj/device_alt.dmi
index a6ab695e74..11d92f2845 100644
Binary files a/icons/obj/device_alt.dmi and b/icons/obj/device_alt.dmi differ
diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi
index 042094e67d..919ada16ca 100644
Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ
diff --git a/icons/vore/custom_items_vr.dmi b/icons/vore/custom_items_vr.dmi
index 9fc8d80f99..20f983f1c1 100644
Binary files a/icons/vore/custom_items_vr.dmi and b/icons/vore/custom_items_vr.dmi differ
diff --git a/maps/virgo/virgo-1.dmm b/maps/virgo/virgo-1.dmm
index 7017d55fea..754f1b441a 100644
--- a/maps/virgo/virgo-1.dmm
+++ b/maps/virgo/virgo-1.dmm
@@ -682,7 +682,7 @@
"anf" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/obj/item/clothing/shoes/boots/jackboots/toeless,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"ang" = (/obj/structure/closet/secure_closet/security,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/obj/item/clothing/suit/armor/vest/wolftaur,/obj/item/clothing/shoes/boots/jackboots/toeless,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"anh" = (/obj/structure/closet/wardrobe/red,/obj/effect/floor_decal/corner/red/full{dir = 8},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_lockerroom)
-"ani" = (/obj/structure/table/standard,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/megaphone,/obj/item/weapon/packageWrap,/obj/item/weapon/storage/box,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/effect/floor_decal/corner/red/full{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/item/weapon/hand_labeler,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
+"ani" = (/obj/structure/table/standard,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/megaphone,/obj/item/weapon/packageWrap,/obj/item/weapon/storage/box,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/effect/floor_decal/corner/red/full{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/item/weapon/hand_labeler,/obj/item/device/universal_trans,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"anj" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom)
"ank" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom)
"anl" = (/obj/structure/table/standard,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/soap/nanotrasen,/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom)
@@ -3044,7 +3044,7 @@
"bgB" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bgC" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bgD" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
-"bgE" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/item/weapon/reagent_containers/food/drinks/britcup,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
+"bgE" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/device/universal_trans,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bgF" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/item/weapon/deck/cards,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bgG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bgH" = (/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/medbay{c_tag = "MED - Break Room"; dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
@@ -3752,7 +3752,7 @@
"buh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"bui" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"buj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
-"buk" = (/obj/item/weapon/stool/padded,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/storage/box/backup_kit,/turf/simulated/floor/tiled/white,/area/medical/reception)
+"buk" = (/obj/structure/table/standard,/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access = list(5)},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/item/weapon/backup_implanter,/turf/simulated/floor/tiled/white,/area/medical/reception)
"bul" = (/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/medical/morgue)
"bum" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
"bun" = (/obj/structure/closet/secure_closet{name = "Psychiatrist's Locker"; req_access = list(64)},/obj/item/clothing/suit/straight_jacket{layer = 3},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/tiled,/area/medical/morgue)
@@ -3800,7 +3800,7 @@
"bvd" = (/turf/simulated/wall,/area/medical/reception)
"bve" = (/obj/structure/bed/chair{dir = 4},/obj/structure/sign/nosmoking_1{pixel_x = -32},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bvf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/reception)
-"bvg" = (/obj/structure/table/standard,/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access = list(5)},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/reception)
+"bvg" = (/obj/item/weapon/stool/padded,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bvh" = (/obj/structure/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bvi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/reception)
"bvj" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/medical/reception)
@@ -3967,7 +3967,7 @@
"byo" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two)
"byp" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/reception)
"byq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/reception)
-"byr" = (/obj/structure/table/standard,/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access = list(5)},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/reception)
+"byr" = (/obj/structure/table/standard,/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access = list(5)},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/item/weapon/backup_implanter,/turf/simulated/floor/tiled/white,/area/medical/reception)
"bys" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/reception)
"byt" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/tiled/white,/area/medical/reception)
"byu" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage)
@@ -4258,7 +4258,7 @@
"bDT" = (/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics)
"bDU" = (/obj/effect/floor_decal/corner/lime{dir = 5},/obj/machinery/alarm{pixel_y = 22},/obj/structure/closet/crate/hydroponics{desc = "All you need to start your own honey farm."; name = "beekeeping crate"},/obj/item/beehive_assembly,/obj/item/bee_smoker,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/bee_pack,/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/hydroponics)
"bDV" = (/turf/simulated/wall/r_wall,/area/maintenance/research_shuttle)
-"bDW" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/recharger,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
+"bDW" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/recharger,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bDX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bDY" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/sign/directions/medical{dir = 4; pixel_x = 32; pixel_y = 0},/obj/structure/sign/directions/cargo{dir = 2; pixel_x = 32; pixel_z = 8},/obj/structure/sign/directions/engineering{dir = 2; pixel_x = 32; pixel_z = -8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two)
"bDZ" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/effect/floor_decal/corner/paleblue{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/reception)
@@ -4367,7 +4367,7 @@
"bFY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bFZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bGa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/sleeper)
-"bGb" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
+"bGb" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bGc" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 4; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "resleeve_tint"},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced/polarized{dir = 1; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{id = "resleeve_tint"},/turf/simulated/floor/plating,/area/medical/resleeving)
"bGd" = (/obj/structure/bed/chair,/obj/effect/floor_decal/corner/paleblue{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving)
"bGe" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/structure/bed/chair,/turf/simulated/floor/tiled/white,/area/medical/resleeving)
@@ -4803,7 +4803,7 @@
"bOs" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/structure/closet/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay)
"bOt" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/medbay{c_tag = "MED - Resleeving"; dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving)
"bOu" = (/turf/simulated/floor/carpet/blue,/area/medical/psych)
-"bOv" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/structure/table/standard,/obj/item/weapon/storage/box/backup_kit,/obj/item/weapon/storage/box/backup_kit,/turf/simulated/floor/tiled/white,/area/medical/resleeving)
+"bOv" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/structure/table/standard,/obj/item/weapon/backup_implanter,/obj/item/weapon/backup_implanter,/obj/item/weapon/backup_implanter,/turf/simulated/floor/tiled/white,/area/medical/resleeving)
"bOw" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/resleeving)
"bOx" = (/obj/effect/floor_decal/corner/pink/full,/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/medical/patient_a)
"bOy" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/medical/patient_a)
@@ -5296,7 +5296,7 @@
"bXR" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/medical_emergency_hallway)
"bXS" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/bed/chair/office/light,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Room C"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_a)
"bXT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Patient Room A"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_a)
-"bXU" = (/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/obj/structure/table/steel,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/item/weapon/storage/box/backup_kit,/turf/simulated/floor/tiled/dark,/area/medical/biostorage)
+"bXU" = (/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/obj/structure/table/steel,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/item/weapon/storage/box/backup_kit,/obj/item/weapon/backup_implanter,/turf/simulated/floor/tiled/dark,/area/medical/biostorage)
"bXV" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/circuitboard/autolathe,/obj/machinery/light/small{dir = 1},/obj/item/weapon/circuitboard/partslathe,/turf/simulated/floor,/area/storage/tech)
"bXW" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/button/windowtint{id = "pr5_window_tint"; pixel_y = 26},/turf/simulated/floor/tiled/white,/area/medical/patient_c)
"bXX" = (/obj/structure/window/reinforced/polarized{dir = 1; id = "pr4_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/polarized{dir = 2; id = "pr4_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr4_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "pr4_window_tint"},/turf/simulated/floor,/area/medical/patient_d)
@@ -10105,8 +10105,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaX
aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaayaaaaaeaaaaaaaaaaaaaaeaaeaaaaaaaaeaaeaaaaaeaaeaaeaaaaaeaaeaaeaaaaayaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpWaaiaaibpXblmblnbrubrvblmbrwblqbikbikbikbrxblqbikbiybvSbjQbfEbgTbgUbgVbgWbgXbgYbgZbfEdIXbcEbqhbaZbqibqjbqkbqkbqlbqmbqnbqoboObqpboQbqqbqrbqsboUbqtbquaaiaaiaWEaVGaZhbeIaWEaaiaaiaaiaaiaaiaaiaafaafbhrbhrbnibnjbqvbnlbqwbnlbnkbnjbnmbhrbhraafaafaVeaVOaVeaaiaVPbawaYebqxbdWbnnbqybcXbqzaYjaYjaYjbqybcXbqzbiTbdSbphaYebawaVPaaiaVWaUubbyaPRbplaaiaaibckbckbqAbckbckbjebjebjebqBbqBbqBbqBbqCbqDbqBbqBbqEbqFbqGbqHbqHbqIbqJbqFbqKbqLbqMbpJbqObqPbqQbIZbmobpKbqNbpLbqSbqRbIZaXCaVnaafbdzbqWbqXbkYbqYblabqZblabrabjEbrbbjEbrcbdzbrdbfCbrebrfbrgbrhbribdzaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaayaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaaaayaaeaaeaaaaaaaaaaaaaaaaaabrmbrnbrobrpaaaaaabrqbrrbrsbrqbrqbrtbjGbjHbjIbjHbjGbikaaiaaiaaiaaiaaiaaibrmbsZbrzbtabfEbipbiqbirbisbitbiubivbiwdIZdIYdJabmZbrEbrFbrGbnabrHbbLbrIbrJbrKbrLbrMbrNbrNbrNbrObrPbrQaaiaaiaWEaVGaZhbeIaWEaaiaaiaaiaaiaaiaafaafaafbhrbhrbrRbrSbrTbnlbnlbnlbrUbrVbrWbhrbhraafaafaVeaVOaVeaaiaaiaYqaXdaYebqxbdWbrXbrYbrZbdabdabdabrXbrYbrZbdSbphaYeaWPaYdaaiaaiaXebaAbaBbsabplaaiaaibsbbscbsdbsebsfbsgbshbsibqBbsjbskbslbsmbsnbsobspbsqbsrbssbstbsubsvbqJbqTbsxbsybszbsAbsBbsybsAbIZbqVbqUbOubswbOubOubIZaXCaVnaafbdzbdzbfybsIbicbmsbsJbjEbjxbjEbjEbrhbsKbdzbsLbsMbsNbsObpRbsPbdzbdzaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaayaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaeaazaaaaaeaaeaaaaaaaaaaaaaaabrmbrmbsRbsSbrmbsTbsUbsVbsWbsXbsYbikbikabxabxbilbikbikcxVcxVaaiaaiaaiaaibrmbrmbrzbuJbfEbjKbjLbgVbjMbjNbjObjPbfEdJbbtcbtdboHbtebtfbtgbthbmZbtibtjbtkbtlbtmbtnbtobtpbtqbtrbtsbiHaaiaaiaWAaVGbttbeIaWAaaiaaiaaiaafaafaafaafaafaafbhrbhrbtubrSbtvbtwbtxbtybtzbhrbhraafaafaafaVeaVOaVeaaiaaiaaiaYqaVSbaxbdUbdUbtAbtBbtCbtDbtCbtEbtFbdUbdUbtGaVQaYdaaiaaiaaiaYraUubtHaPRbtIaaiaaibtJbtKbsdbtLbtMbtNbtObtPbqBbtQbtRbtSbtTbtTbtUbtVbtWbtXbtYbtZbtZbuabubbucbudbuebufbugbuhbuibujbIZbsDbsCbsFbsEbsEbsGbIZaXCaVnaafaafbdzbdzbdzbdzbuqburbusbjxbutbuubuvbdzbdzbiebdzbuxbuybuzbdzbdzaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaayaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaeaaeaaaaaaaaaaaabrmbuAbuBbuCbrmbuDbuEbuFbuGbuHbuIdIScxVaaiaaiaaiaaicxVcxVaaiaaiaaiaaiaaiaaibrmbrzdIRbfEbfEbfEbfEbfEbfEbfEbfEbfEdJcbuMbuNbaZbuObuPbuQbuRboHbuSbrIbqhbrKbuTbuUbuVbiHbuWbuXbuWbiHaaibbkbbkbiIbiJbiKaXOaaiaaiaafaafaafaafaafaafaafbhrbhrbhrbuYbuZbvabvbbvcbhrbhrbhraafaafaVeaVeaVOaVeaVeaaiaaiaaiaVPaVQaVRaVSaVPaVPaVQaVRaVSaVPaVPaVQaVRaVSaVPaaiaaiaaiaaiaOKaVkbiVaVmaOKaOKaaibvdbvebvfbtNbvgbvhbvibvjbqBbvkbvlbvmbvnbtTbtTbvobnHbvpbvqbqLbqLbvrbqJbvsbvtbvubvvbvwbvxbvybvzbIZbIZbIZbIZbsHbIZbIZbIZaXCaVnaafaafaafaafaafbdzbvBbvCbdzbvDbdzbvBbvEbdzbvFbvGbdzbvHbvIbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaaaaeaaeaaaaaaaaabrmbvJbvKbvLbrmbvMbvNbvObvPbvQbvRbrqaafaafaafaaiaaiaaiaaiaaiaaiaaiaaiaafaafbrmbvSbuKbuKbvTbvUbvVbvWbvXbvYbvZbuKdJdbwbbwcbaZbwdbwebwfbwgbaZbwhbrIbwibwjbwjbwjbwjbwjbwkbwlbwmbwjbcJbbkbwnaVGaZhbwoaXOaVeaafaafaafaafaafaafaafaafaafbhrbhrbhrbwpbhrbhrbhrbhrbhraafaafaVeaVeaVNaVOaVNaVeaVeaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaVeaOKaUubwqbgibwraOKbwsbwtbwubwvbwwbwxbwybukbwAbwBbwCbwDbwEbwFbtTbwGbqBcsVbqFbwIbwJbwKbwLbwMbwNbwObwPbwQbwRbwSbwTbwUbwVbulbwZbumbwZbwZbunbwVaXCaVnaafaafaafaafaafbdzbxcbxdbxebxfbxgbxhbxibxjbxkbxlbdzbxmbxnbxobdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaayaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaeaaeaaaaaaaaaaaabrmbuAbuBbuCbrmbuDbuEbuFbuGbuHbuIdIScxVaaiaaiaaiaaicxVcxVaaiaaiaaiaaiaaiaaibrmbrzdIRbfEbfEbfEbfEbfEbfEbfEbfEbfEdJcbuMbuNbaZbuObuPbuQbuRboHbuSbrIbqhbrKbuTbuUbuVbiHbuWbuXbuWbiHaaibbkbbkbiIbiJbiKaXOaaiaaiaafaafaafaafaafaafaafbhrbhrbhrbuYbuZbvabvbbvcbhrbhrbhraafaafaVeaVeaVOaVeaVeaaiaaiaaiaVPaVQaVRaVSaVPaVPaVQaVRaVSaVPaVPaVQaVRaVSaVPaaiaaiaaiaaiaOKaVkbiVaVmaOKaOKaaibvdbvebvfbtNbukbvhbvibvjbqBbvkbvlbvmbvnbtTbtTbvobnHbvpbvqbqLbqLbvrbqJbvsbvtbvubvvbvwbvxbvybvzbIZbIZbIZbIZbsHbIZbIZbIZaXCaVnaafaafaafaafaafbdzbvBbvCbdzbvDbdzbvBbvEbdzbvFbvGbdzbvHbvIbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaaaaeaaeaaaaaaaaabrmbvJbvKbvLbrmbvMbvNbvObvPbvQbvRbrqaafaafaafaaiaaiaaiaaiaaiaaiaaiaaiaafaafbrmbvSbuKbuKbvTbvUbvVbvWbvXbvYbvZbuKdJdbwbbwcbaZbwdbwebwfbwgbaZbwhbrIbwibwjbwjbwjbwjbwjbwkbwlbwmbwjbcJbbkbwnaVGaZhbwoaXOaVeaafaafaafaafaafaafaafaafaafbhrbhrbhrbwpbhrbhrbhrbhrbhraafaafaVeaVeaVNaVOaVNaVeaVeaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaVeaOKaUubwqbgibwraOKbwsbwtbwubwvbwwbwxbwybvgbwAbwBbwCbwDbwEbwFbtTbwGbqBcsVbqFbwIbwJbwKbwLbwMbwNbwObwPbwQbwRbwSbwTbwUbwVbulbwZbumbwZbwZbunbwVaXCaVnaafaafaafaafaafbdzbxcbxdbxebxfbxgbxhbxibxjbxkbxlbdzbxmbxnbxobdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaaeaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaaaaaaaebxpbxqbxqbxqbxqbxrbrmbrmbrqbxsbxtbxubxvbxwbrqaafaafaafaafaaiaaiaaiaaiaaiaaiaafaafaafbrmbvSbuKbxxbxybxzbxAbxBbxCbxDbxEbxFdJebxHbxIbxJbxKbxLbxMbxNbxObxPbxQbxRbxSbxTbxUbxVbxSbxWbxXbxYbxZbyabybbbiaWBbeHbeIbycaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaafaafbydbyebydbydaVeaVeaVeaVeaVeaVebyfbygbyhbyiaVNaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVebyjbykbylbymaPQbynbyobypbtNbyqbtNbyrbvhbysbytbspbyubyvbywbyxbyybyzbspbyAbyBbnMbyCbyCbyDbqJbyEbudbyFbyGbyHbvybyIbyJbwVbwVbwVbwVbuobwVbwVbwVbyOaVnaafaafaafaafaafbdzbdzbyPbyQbyRbySbyTbyUbyVbyWbyXbyYbyZbzabzbbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaeaaaaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaeaaaaaabzdbzebzebzfbzgbzhbzibzjbzkbzlbzmbrqbznbzobzpbzqbzrbrqaafaafaafaafaafaaiaaiaaiaaiaafaafaafaafbrmbvSbuKbzsbxzbztbzubzvbzwbzxbzwbzybzzbzAbzBbzCbhebzDbhebzEbhebhebzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzTbzUbzVbzWbzXbzYbzZbzZbzZbzZbAabzZbAbaVeaVeaVeaVebAcaVeaVeaVebAdbAebAebAebAebAebAfbAgbAhbAibAibAibAibAibAibAibAjbAibAibAibAkbAlbAlbAlbAlbAlbAlbAlbAlbAmbAlbAnbAobApbAqbAraYvbAsbAtbAubAvbAwbtLbAxbtNbAybAzbtVbAAbupbACbADbAEbAFbtVbAGbAHbAIbAJbAJbAKbALbAMbvtbANbAObAPbAQbARbwVbwVbwzbvAbwXbwWbxabwYbwVbyOaVnaafaafaafaafaafaafbdzbdzbdzbAWbAXbdzbdzbdzbdzbdzbdzbAYbAZbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaebBabBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBbbBdbBebBfbBgbBhbBibBjbBkbBlbBmbBnbBobrqbrqbBpbrqbrqbBqbrqaafaafaafaafaafaafaafaaiaaiaafaafaafaafbrmbvSbuKbBrbBsbBtbBubBvbBwbBxbBybuKbBzbBAbBBbBCbBDbBEbBFbBGbBHbBIbBJbBKbwjbBLbBMbBNbBObBPbBQbxYbxZbyabybbbibbibBRbBSbBTaVebBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfbCgbzZbzZbzZbChaVeaVeaVeaVeaVNbCibCjbCkbClbClbClbClbClbClbClbCmbClbClbClbCnbCobCobCobCobCobCobCobFpbfYbhtaVebCqaUubbybCraQIbCsbCtbCubCvbCwbCxbCybCzbCAbCBbqBbqCbqDbCCbqCbCDbqDbqBbCEbqFbwIbwJbwKbCFbqJbCGbsxbCHbCIbsxbwVbwVbwVbCJbyKbxbbxbbCNbwZbyLbwVbyOaVnaafaafaafaafaafaafaafbdzbCObCPbCQbdzaafaafaafaafbdzbdzbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/vorestation.dme b/vorestation.dme
index a3378dab18..41376b6842 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -234,6 +234,7 @@
#include "code\datums\supplypacks\materials.dm"
#include "code\datums\supplypacks\medical.dm"
#include "code\datums\supplypacks\misc.dm"
+#include "code\datums\supplypacks\misc_vr.dm"
#include "code\datums\supplypacks\munitions.dm"
#include "code\datums\supplypacks\recreation.dm"
#include "code\datums\supplypacks\robotics.dm"
@@ -1392,9 +1393,11 @@
#include "code\modules\error_handler\error_viewer.dm"
#include "code\modules\error_handler\~defines.dm"
#include "code\modules\events\apc_damage.dm"
+#include "code\modules\events\atmos_leak.dm"
#include "code\modules\events\blob.dm"
#include "code\modules\events\brand_intelligence.dm"
#include "code\modules\events\camera_damage.dm"
+#include "code\modules\events\canister_leak.dm"
#include "code\modules\events\carp_migration.dm"
#include "code\modules\events\comms_blackout.dm"
#include "code\modules\events\communications_blackout.dm"
@@ -1454,6 +1457,7 @@
#include "code\modules\gamemaster\game_master.dm"
#include "code\modules\gamemaster\helpers.dm"
#include "code\modules\gamemaster\actions\action.dm"
+#include "code\modules\gamemaster\actions\canister_leak.dm"
#include "code\modules\gamemaster\actions\carp_migration.dm"
#include "code\modules\gamemaster\actions\comms_blackout.dm"
#include "code\modules\gamemaster\actions\dust.dm"