diff --git a/_maps/RandomRuins/SpaceRuins/scp_294.dmm b/_maps/RandomRuins/SpaceRuins/scp_294.dmm
new file mode 100644
index 0000000000..2808146f3e
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/scp_294.dmm
@@ -0,0 +1,670 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/turf/template_noop,
+/area/template_noop)
+"ab" = (
+/turf/closed/wall/r_wall,
+/area/ruin/space/has_grav/powered/scp_294)
+"ac" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"ad" = (
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg2"
+ },
+/area/ruin/space/has_grav/powered/scp_294)
+"ae" = (
+/obj/structure/lattice,
+/obj/item/soap,
+/turf/template_noop,
+/area/space/nearstation)
+"af" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 14
+ },
+/obj/structure/mirror{
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel/freezer/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"ag" = (
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/freezer/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"ah" = (
+/turf/open/floor/plasteel/freezer/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"ai" = (
+/obj/machinery/door/airlock{
+ name = "Bathroom"
+ },
+/turf/open/floor/plasteel/freezer/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aj" = (
+/obj/machinery/porta_turret/syndicate/energy/heavy{
+ desc = "An energy blaster auto-turret designed to contain and terminate in case of a breach in security.";
+ faction = "scp";
+ mode = 1;
+ name = "emergency containment breach turret"
+ },
+/obj/effect/turf_decal/box,
+/turf/open/floor/plasteel/dark{
+ initial_gas_mix = "TEMP=2.7"
+ },
+/area/ruin/space/has_grav/powered/scp_294)
+"ak" = (
+/obj/effect/turf_decal/tile/beige/corner{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/spawner/trap,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"al" = (
+/obj/structure/table,
+/obj/machinery/microwave,
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"am" = (
+/obj/structure/table,
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 1
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"an" = (
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 1
+ },
+/obj/machinery/chem_dispenser/scp_294,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"ao" = (
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 1
+ },
+/obj/machinery/vending/snack,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"ap" = (
+/obj/structure/table,
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aq" = (
+/obj/effect/turf_decal/tile/beige/corner{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/spawner/trap,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"ar" = (
+/obj/effect/turf_decal/tile/beige/corner{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"as" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/turf_decal/tile/beige/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"at" = (
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"au" = (
+/obj/effect/mob_spawn/human/corpse/nanotrasensoldier{
+ id_job = "Level Three Clearance Guard";
+ name = "Clearance Level Three Officer";
+ oxy_damage = 136
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/turf_decal/tile/beige/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"av" = (
+/obj/effect/turf_decal/tile/beige/corner{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aw" = (
+/obj/structure/lattice,
+/obj/item/shard,
+/turf/template_noop,
+/area/space/nearstation)
+"ax" = (
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 8
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"ay" = (
+/obj/effect/mob_spawn/human/corpse/nanotrasensoldier{
+ id_job = "Level Three Clearance Guard";
+ name = "Clearance Level Three Officer";
+ oxy_damage = 136
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"az" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aA" = (
+/obj/effect/turf_decal/tile/beige/corner{
+ dir = 9
+ },
+/mob/living/simple_animal/hostile/mimic{
+ faction = list("mimic","scp")
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aB" = (
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 1
+ },
+/obj/effect/spawner/trap,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aC" = (
+/obj/effect/turf_decal/tile/beige/corner{
+ dir = 5
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aD" = (
+/obj/item/trash/plate,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aE" = (
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 4
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aF" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aG" = (
+/obj/structure/girder,
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aH" = (
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aI" = (
+/obj/structure/fluff/broken_flooring{
+ icon_state = "corner";
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aJ" = (
+/obj/structure/table,
+/obj/item/trash/sosjerky,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aK" = (
+/obj/item/chair,
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 8
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aL" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 4
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aM" = (
+/obj/structure/table,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aN" = (
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 4
+ },
+/obj/structure/chair/office{
+ dir = 8
+ },
+/obj/item/shard,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aO" = (
+/obj/item/stack/rods,
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aP" = (
+/obj/structure/fluff/broken_flooring{
+ icon_state = "plating";
+ name = "broken plating"
+ },
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"aQ" = (
+/obj/structure/table_frame,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aR" = (
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg1"
+ },
+/area/ruin/space/has_grav/powered/scp_294)
+"aS" = (
+/obj/item/stack/tile/plasteel,
+/mob/living/simple_animal/hostile/mimic{
+ faction = list("mimic","scp")
+ },
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aT" = (
+/obj/structure/grille/broken,
+/obj/item/stack/rods,
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg1"
+ },
+/area/ruin/space/has_grav/powered/scp_294)
+"aU" = (
+/obj/item/shard,
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg1"
+ },
+/area/ruin/space/has_grav/powered/scp_294)
+"aV" = (
+/obj/structure/lattice,
+/obj/structure/fluff/broken_flooring{
+ icon_state = "singular"
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"aW" = (
+/obj/item/trash/cheesie,
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aX" = (
+/obj/effect/turf_decal/tile/beige/side{
+ dir = 4
+ },
+/obj/item/chair,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aY" = (
+/obj/item/stack/sheet/metal,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"aZ" = (
+/obj/effect/mob_spawn/human/corpse/assistant,
+/obj/structure/table_frame,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"ba" = (
+/obj/structure/grille/broken,
+/obj/item/shard,
+/obj/item/stack/rods,
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg1"
+ },
+/area/ruin/space/has_grav/powered/scp_294)
+"bb" = (
+/obj/item/stack/rods,
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg1"
+ },
+/area/ruin/space/has_grav/powered/scp_294)
+"bc" = (
+/obj/item/stack/tile/plasteel,
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"bd" = (
+/obj/structure/lattice,
+/obj/structure/fluff/broken_flooring{
+ icon_state = "singular";
+ dir = 4
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"be" = (
+/obj/structure/fluff/broken_flooring{
+ icon_state = "pile";
+ dir = 4
+ },
+/turf/template_noop,
+/area/template_noop)
+"bf" = (
+/obj/item/trash/chips,
+/turf/template_noop,
+/area/template_noop)
+"bg" = (
+/obj/effect/spawner/trap,
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg2"
+ },
+/area/ruin/space/has_grav/powered/scp_294)
+"bi" = (
+/obj/effect/spawner/trap,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"bj" = (
+/obj/effect/spawner/trap,
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+"bk" = (
+/obj/structure/table_frame,
+/obj/effect/spawner/trap,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/scp_294)
+
+(1,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ac
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(2,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ac
+ac
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(3,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+aG
+ac
+aV
+aa
+aa
+aa
+aa
+"}
+(4,1,1) = {"
+aa
+aa
+aa
+ab
+aj
+ar
+ax
+bj
+aP
+ac
+aa
+aa
+aa
+be
+"}
+(5,1,1) = {"
+aa
+aa
+ac
+ab
+ak
+as
+ay
+aI
+aH
+ac
+ac
+ac
+aa
+aa
+"}
+(6,1,1) = {"
+aa
+ac
+ac
+ab
+al
+at
+az
+aJ
+aQ
+bj
+ad
+aa
+aa
+bf
+"}
+(7,1,1) = {"
+ab
+ab
+ab
+ab
+am
+at
+aA
+aK
+aR
+aR
+ac
+ac
+aa
+aa
+"}
+(8,1,1) = {"
+ac
+ac
+ad
+ab
+an
+at
+aB
+at
+aS
+aW
+aH
+aP
+aa
+aa
+"}
+(9,1,1) = {"
+aa
+ae
+ac
+ab
+ao
+at
+aC
+aL
+aE
+aX
+aE
+ad
+bg
+aa
+"}
+(10,1,1) = {"
+ac
+bg
+ag
+ab
+ap
+bi
+az
+aM
+bk
+aY
+bc
+aR
+bd
+ac
+"}
+(11,1,1) = {"
+bg
+af
+ah
+ai
+aq
+au
+aD
+aM
+aM
+aZ
+aR
+ad
+aa
+aa
+"}
+(12,1,1) = {"
+ab
+ab
+ab
+ab
+aj
+av
+aE
+aN
+aH
+ad
+aH
+ac
+aa
+aa
+"}
+(13,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+ab
+aF
+aO
+aT
+ba
+ab
+ab
+aa
+aa
+"}
+(14,1,1) = {"
+aa
+aa
+aa
+aa
+ac
+ac
+ac
+ad
+aU
+bb
+ac
+ac
+aa
+aa
+"}
+(15,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aw
+ac
+ac
+bg
+ac
+aa
+ac
+aa
+aa
+"}
+(16,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+ac
+aa
+aa
+aw
+aa
+aa
+aa
+aa
+"}
+(17,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ac
+aa
+aa
+aa
+aa
+"}
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 1bf619735c..eed23e0711 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -269,9 +269,15 @@
name = "Whiteship Dock"
description = "An abandoned but functional vessel parked in deep space, ripe for the taking."
+/datum/map_template/ruin/space/scp_294
+ id = "scp_294"
+ suffix = "scp_294.dmm"
+ name = "SCP-294 Containment"
+ description = "An abandoned asteroid base that contains several EMP-proof turrets, and a valuable artifact. Should you get past the heavy laser turrets, a valuable treasure awaits."
+
/datum/map_template/ruin/space/cat_experiments
id = "meow"
suffix = "mrow_thats_right.dmm"
name = "Feline-Human Combination Den"
description = "With heated debates over the legality of the catperson and their status in the workforce, there's always a place for the blackmarket to slip in for some cash. Whether the results \
- are morally sound or not is another issue entirely."
+ are morally sound or not is another issue entirely."
\ No newline at end of file
diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm
index 32c8020e6d..0f57c0ce3b 100644
--- a/code/game/area/areas/ruins/space.dm
+++ b/code/game/area/areas/ruins/space.dm
@@ -462,4 +462,8 @@
/area/ruin/space/has_grav/listeningstation
name = "Listening Post"
+ icon_state = "yellow"
+
+/area/ruin/space/has_grav/powered/scp_294
+ name = "Abandoned SCP-294 Containment"
icon_state = "yellow"
\ No newline at end of file
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 99b951c32c..2a483cdf6e 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -592,6 +592,7 @@
lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg'
desc = "An energy blaster auto-turret."
+
/obj/machinery/porta_turret/syndicate/setup()
return
diff --git a/code/game/objects/effects/spawners/traps.dm b/code/game/objects/effects/spawners/traps.dm
new file mode 100644
index 0000000000..82cfe89662
--- /dev/null
+++ b/code/game/objects/effects/spawners/traps.dm
@@ -0,0 +1,10 @@
+/obj/effect/spawner/trap
+ name = "random trap"
+ icon = 'icons/obj/hand_of_god_structures.dmi'
+ icon_state = "trap_rand"
+
+/obj/effect/spawner/trap/Initialize(mapload)
+ ..()
+ var/new_type = pick(subtypesof(/obj/structure/trap) - typesof(/obj/structure/trap/ctf))
+ new new_type(get_turf(src))
+ return INITIALIZE_HINT_QDEL
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm
index 06a257686b..0de40d179e 100644
--- a/code/game/turfs/simulated/floor/plasteel_floor.dm
+++ b/code/game/turfs/simulated/floor/plasteel_floor.dm
@@ -318,6 +318,8 @@
/turf/open/floor/plasteel/freezer
icon_state = "freezerfloor"
+/turf/open/floor/plasteel/freezer/airless
+ initial_gas_mix = "TEMP=2.7"
/turf/open/floor/plasteel/bar
icon_state = "bar"
diff --git a/code/modules/reagents/chemistry/machinery/scp_294.dm b/code/modules/reagents/chemistry/machinery/scp_294.dm
new file mode 100644
index 0000000000..75f62dd4d1
--- /dev/null
+++ b/code/modules/reagents/chemistry/machinery/scp_294.dm
@@ -0,0 +1,84 @@
+//////////////////////////////////////////
+// SCP 294 //
+// //
+// This is a child of a chemistry //
+// dispenser. Info of how it works at //
+// http://www.scp-wiki.net/scp-294 //
+// //
+//////////////////////////////////////////
+
+/obj/machinery/chem_dispenser/scp_294
+ name = "\improper strange coffee machine"
+ desc = "It appears to be a standard coffee vending machine, the only noticeable difference being an entry touchpad with buttons corresponding to a Galactic Common QWERTY keyboard."
+ icon = 'icons/obj/scp.dmi'
+ icon_state = "294_bottom"
+ amount = 10
+ resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
+ var/static/list/shortcuts = list(
+ "meth" = "methamphetamine",
+ "tricord" = "tricordrazine"
+ )
+ var/mutable_appearance/top_overlay
+
+/obj/machinery/chem_dispenser/scp_294/Initialize()
+ . = ..()
+ GLOB.poi_list += src
+ top_overlay = mutable_appearance(icon, "294_top", layer = ABOVE_MOB_LAYER)
+ add_overlay(top_overlay)
+
+/obj/machinery/chem_dispenser/scp_294/Destroy()
+ . = ..()
+ GLOB.poi_list -= src
+ QDEL_NULL(top_overlay)
+
+/obj/machinery/chem_dispenser/scp_294/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "scp_294", name, 390, 315, master_ui, state)
+ ui.open()
+
+/obj/machinery/chem_dispenser/scp_294/ui_act(action, params)
+ if(..())
+ return
+ switch(action)
+ if("ejectBeaker")
+ if(beaker)
+ beaker.forceMove(drop_location())
+ if(Adjacent(usr) && !issilicon(usr))
+ usr.put_in_hands(beaker)
+ beaker = null
+ cut_overlays()
+ . = TRUE
+ if("input")
+ var/input_reagent = replacetext(lowertext(input("Enter the name of any liquid", "Input") as text), " ", "") //95% of the time, the reagent id is a lowercase/no spaces version of the name
+ if(shortcuts[input_reagent])
+ input_reagent = shortcuts[input_reagent]
+ else
+ input_reagent = find_reagent(input_reagent)
+ if(!input_reagent || !GLOB.chemical_reagents_list[input_reagent])
+ say("OUT OF RANGE")
+ return
+ else
+ if(!beaker)
+ return
+ else if(!beaker.reagents && !QDELETED(beaker))
+ beaker.create_reagents(beaker.volume)
+ beaker.reagents.add_reagent(input_reagent, 10)
+ if("makecup")
+ if(beaker)
+ return
+ beaker = new /obj/item/reagent_containers/food/drinks/sillycup(src)
+ visible_message("[src] dispenses a small, paper cup.")
+
+/obj/machinery/chem_dispenser/scp_294/proc/find_reagent(input)
+ . = FALSE
+ if(GLOB.chemical_reagents_list[input]) //prefer IDs!
+ var/datum/reagent/R = GLOB.chemical_reagents_list[input]
+ if(R.can_synth)
+ return input
+ else
+ for(var/X in GLOB.chemical_reagents_list)
+ var/datum/reagent/R = GLOB.chemical_reagents_list[X]
+ if(R.can_synth && input == replacetext(lowertext(R.name), " ", ""))
+ return X
\ No newline at end of file
diff --git a/icons/obj/hand_of_god_structures.dmi b/icons/obj/hand_of_god_structures.dmi
index 8ec5c7e005..4f18b2e68d 100644
Binary files a/icons/obj/hand_of_god_structures.dmi and b/icons/obj/hand_of_god_structures.dmi differ
diff --git a/icons/obj/scp.dmi b/icons/obj/scp.dmi
new file mode 100644
index 0000000000..4dfc4f1627
Binary files /dev/null and b/icons/obj/scp.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 6344f71e12..7926d78773 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -715,6 +715,7 @@
#include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\lootdrop.dm"
#include "code\game\objects\effects\spawners\structure.dm"
+#include "code\game\objects\effects\spawners\traps.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm"
#include "code\game\objects\effects\temporary_visuals\clockcult.dm"
@@ -2244,6 +2245,7 @@
#include "code\modules\reagents\chemistry\machinery\chem_master.dm"
#include "code\modules\reagents\chemistry\machinery\pandemic.dm"
#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm"
+#include "code\modules\reagents\chemistry\machinery\scp_294.dm"
#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm"
#include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\blob_reagents.dm"
diff --git a/tgui/package-lock.json b/tgui/package-lock.json
index 295a8cf315..5dba1c0774 100644
--- a/tgui/package-lock.json
+++ b/tgui/package-lock.json
@@ -260,9 +260,9 @@
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
},
"async-done": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.2.3.tgz",
- "integrity": "sha1-bHq8fWHKJ/5vHyujIG6prmCkOYM=",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.2.4.tgz",
+ "integrity": "sha512-mxc+yISkb0vjsuvG3dJCIZXzRWjKndQ9Zo9zNDJ1K2wh9eP0E0oGmOWm+4cFOvW4dA0tGFImTW5tQJHCtn1kIQ==",
"requires": {
"end-of-stream": "1.4.0",
"once": "1.4.0",
@@ -280,7 +280,7 @@
"resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
"integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
"requires": {
- "async-done": "1.2.3"
+ "async-done": "1.2.4"
}
},
"atob": {
@@ -1251,7 +1251,7 @@
"array-each": "1.0.1",
"array-initial": "1.1.0",
"array-last": "1.3.0",
- "async-done": "1.2.3",
+ "async-done": "1.2.4",
"async-settle": "1.0.0",
"now-and-later": "2.0.0"
}
@@ -1267,7 +1267,7 @@
"integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
"requires": {
"cache-base": "1.0.1",
- "class-utils": "0.3.5",
+ "class-utils": "0.3.6",
"component-emitter": "1.2.1",
"define-property": "1.0.0",
"isobject": "3.0.1",
@@ -1929,6 +1929,7 @@
"requires": {
"anymatch": "1.3.2",
"async-each": "1.0.1",
+ "fsevents": "1.1.3",
"glob-parent": "2.0.0",
"inherits": "2.0.3",
"is-binary-path": "1.0.1",
@@ -1955,14 +1956,13 @@
}
},
"class-utils": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.5.tgz",
- "integrity": "sha1-F+eTEDdQ+WJ7IXbqNM/RtWWQPIA=",
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
"requires": {
"arr-union": "3.1.0",
"define-property": "0.2.5",
"isobject": "3.0.1",
- "lazy-cache": "2.0.2",
"static-extend": "0.1.2"
},
"dependencies": {
@@ -2352,7 +2352,7 @@
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
"integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
"requires": {
- "es5-ext": "0.10.37"
+ "es5-ext": "0.10.38"
}
},
"date-now": {
@@ -2569,9 +2569,9 @@
}
},
"es5-ext": {
- "version": "0.10.37",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz",
- "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=",
+ "version": "0.10.38",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz",
+ "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==",
"requires": {
"es6-iterator": "2.0.3",
"es6-symbol": "3.1.1"
@@ -2583,7 +2583,7 @@
"integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.37",
+ "es5-ext": "0.10.38",
"es6-symbol": "3.1.1"
}
},
@@ -2598,7 +2598,7 @@
"integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.37"
+ "es5-ext": "0.10.38"
}
},
"es6-weak-map": {
@@ -2607,7 +2607,7 @@
"integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.37",
+ "es5-ext": "0.10.38",
"es6-iterator": "2.0.3",
"es6-symbol": "3.1.1"
}
@@ -2828,7 +2828,7 @@
"requires": {
"detect-file": "1.0.0",
"is-glob": "3.1.0",
- "micromatch": "3.1.4",
+ "micromatch": "3.1.5",
"resolve-dir": "1.0.1"
},
"dependencies": {
@@ -2885,9 +2885,9 @@
}
},
"extglob": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.3.tgz",
- "integrity": "sha512-AyptZexgu7qppEPq59DtN/XJGZDrLcVxSHai+4hdgMMS9EpF4GBvygcWWApno8lL9qSjVpYt7Raao28qzJX1ww==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
"requires": {
"array-unique": "0.3.2",
"define-property": "1.0.0",
@@ -3005,19 +3005,19 @@
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
},
"micromatch": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.4.tgz",
- "integrity": "sha512-kFRtviKYoAJT+t7HggMl0tBFGNAKLw/S7N+CO9qfEQyisob1Oy4pao+geRbkyeEd+V9aOkvZ4mhuyPvI/q9Sfg==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz",
+ "integrity": "sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA==",
"requires": {
"arr-diff": "4.0.0",
"array-unique": "0.3.2",
"braces": "2.3.0",
"define-property": "1.0.0",
"extend-shallow": "2.0.1",
- "extglob": "2.0.3",
+ "extglob": "2.0.4",
"fragment-cache": "0.2.1",
"kind-of": "6.0.2",
- "nanomatch": "1.2.6",
+ "nanomatch": "1.2.7",
"object.pick": "1.3.0",
"regex-not": "1.0.0",
"snapdragon": "0.8.1",
@@ -3114,6 +3114,795 @@
"map-cache": "0.2.2"
}
},
+ "fsevents": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
+ "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
+ "optional": true,
+ "requires": {
+ "nan": "2.8.0",
+ "node-pre-gyp": "0.6.39"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.0",
+ "bundled": true,
+ "optional": true
+ },
+ "ajv": {
+ "version": "4.11.8",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "co": "4.6.0",
+ "json-stable-stringify": "1.0.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ },
+ "aproba": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.2.9"
+ }
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "bundled": true,
+ "optional": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "bundled": true,
+ "optional": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "bundled": true,
+ "optional": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "bundled": true,
+ "optional": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "bundled": true,
+ "optional": true
+ },
+ "balanced-match": {
+ "version": "0.4.2",
+ "bundled": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "bundled": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.7",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "0.4.2",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer-shims": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "bundled": true,
+ "optional": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "bundled": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "bundled": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "bundled": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "debug": {
+ "version": "2.6.8",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true,
+ "optional": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "extsprintf": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "bundled": true,
+ "optional": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.15"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.1"
+ }
+ },
+ "fstream-ignore": {
+ "version": "1.0.5",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "fstream": "1.0.11",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4"
+ }
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.1.1",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "bundled": true
+ },
+ "har-schema": {
+ "version": "1.0.5",
+ "bundled": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "4.2.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "ajv": "4.11.8",
+ "har-schema": "1.0.5"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "bundled": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "bundled": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.0",
+ "sshpk": "1.13.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true
+ },
+ "ini": {
+ "version": "1.3.4",
+ "bundled": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "bundled": true,
+ "optional": true
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "bundled": true,
+ "optional": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "jsprim": {
+ "version": "1.4.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.0.2",
+ "json-schema": "0.2.3",
+ "verror": "1.3.6"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "mime-db": {
+ "version": "1.27.0",
+ "bundled": true
+ },
+ "mime-types": {
+ "version": "2.1.15",
+ "bundled": true,
+ "requires": {
+ "mime-db": "1.27.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "node-pre-gyp": {
+ "version": "0.6.39",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.2",
+ "hawk": "3.1.3",
+ "mkdirp": "0.5.1",
+ "nopt": "4.0.1",
+ "npmlog": "4.1.0",
+ "rc": "1.2.1",
+ "request": "2.81.0",
+ "rimraf": "2.6.1",
+ "semver": "5.3.0",
+ "tar": "2.2.1",
+ "tar-pack": "3.4.0"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.0",
+ "osenv": "0.1.4"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "bundled": true,
+ "optional": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "bundled": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "bundled": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "bundled": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.4.0",
+ "bundled": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.4",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.2.9",
+ "bundled": true,
+ "requires": {
+ "buffer-shims": "1.0.0",
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "1.0.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "request": {
+ "version": "2.81.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "4.2.1",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.15",
+ "oauth-sign": "0.8.2",
+ "performance-now": "0.2.0",
+ "qs": "6.4.0",
+ "safe-buffer": "5.0.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.2",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.0.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.1",
+ "bundled": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.0.1",
+ "bundled": true
+ },
+ "semver": {
+ "version": "5.3.0",
+ "bundled": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "bundled": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "sshpk": {
+ "version": "1.13.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jodid25519": "1.0.2",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "bundled": true,
+ "optional": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "2.2.1",
+ "bundled": true,
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.11",
+ "inherits": "2.0.3"
+ }
+ },
+ "tar-pack": {
+ "version": "3.4.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.8",
+ "fstream": "1.0.11",
+ "fstream-ignore": "1.0.5",
+ "once": "1.4.0",
+ "readable-stream": "2.2.9",
+ "rimraf": "2.6.1",
+ "tar": "2.2.1",
+ "uid-number": "0.0.6"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "bundled": true,
+ "optional": true
+ },
+ "uid-number": {
+ "version": "0.0.6",
+ "bundled": true,
+ "optional": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "uuid": {
+ "version": "3.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "verror": {
+ "version": "1.3.6",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "extsprintf": "1.0.2"
+ }
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true
+ }
+ }
+ },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -3227,7 +4016,7 @@
"resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-3.2.0.tgz",
"integrity": "sha1-/8Gi09B3g7Zy9eIXmaTQs/7ZLa8=",
"requires": {
- "async-done": "1.2.3",
+ "async-done": "1.2.4",
"chokidar": "1.7.0",
"lodash.debounce": "4.0.8",
"object.defaults": "1.1.0"
@@ -4717,10 +5506,16 @@
"resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz",
"integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0="
},
+ "nan": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
+ "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
+ "optional": true
+ },
"nanomatch": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.6.tgz",
- "integrity": "sha512-WJ6XTCbvWXUFPbi/bDwKcYkCeOGUHzaJj72KbuPqGn78Ba/F5Vu26Zlo6SuMQbCIst1RGKL1zfWBCOGAlbRLAg==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz",
+ "integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==",
"requires": {
"arr-diff": "4.0.0",
"array-unique": "0.3.2",
diff --git a/tgui/src/interfaces/scp_294.ract b/tgui/src/interfaces/scp_294.ract
new file mode 100644
index 0000000000..e2b36785a2
--- /dev/null
+++ b/tgui/src/interfaces/scp_294.ract
@@ -0,0 +1,21 @@
+
+
+ Eject
+ Input
+ Create Cup
+
+
+
+
+ {{#if data.isBeakerLoaded}}
+ {{Math.round(adata.beakerCurrentVolume)}}/{{data.beakerMaxVolume}} Units
+ {{#each adata.beakerContents}}
+ {{Math.fixed(volume, 2)}} units of {{name}}
+ {{else}}
+ Recipient Empty
+ {{/each}}
+ {{else}}
+ No Recipient
+ {{/if}}
+
+
\ No newline at end of file